----Next_Part(Tue_Jul_20_02_40_15_2004_551)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

さかいです。

先日のRHG読颪任發舛腓辰範辰泙靴燭;第癈諷跛蕷護のIconvモジュールの
実装があんまりにもあんまりだったので、FFIの勉強を兼ねて試しにちょっと
い討澆泙靴拭
蓴磴覆里如hsc2hsで.hscから.hsに変換した上でコンパイルして下さい。

インターフェースも実装もかなりテキトーですが、ストリームをlazyに変換
来るようにしたかったので、convert関数はunsafePerformIOを使ってっぽ
く動作するように工夫してみました。正しいかどうかは自信がないですが (^^;

P.S.
あと、これをい討い 蜀蒹遶繻黼 がネストするとインデントが深くなっ
て嫌だったのですが、こういうときにインデントをあまり深くしないような
き方ってないでしょうか?

--
酒井 政裕 / Masahiro Sakai


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/
----Next_Part(Tue_Jul_20_02_40_15_2004_551)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Iconv.hsc"

-- -*- mode: haskell -*-
{-# OPTIONS -fglasgow-exts #-}
-----------------------------------------------------------------------------
-- |
-- Module      : Iconv
-- Copyright   : (c) Masahiro Sakai 2004
-- License     : BSD-style
--
-- Maintainer  : sakai / tom.sfc.keio.ac.jp
-- Stability   : experimental
-- Portability : non-portable (FFI extensions, UNIX98)
--
-- This module provides an interface to the iconv(3) functionality
--
-----------------------------------------------------------------------------

#include <iconv.h>

module Iconv
    ( Iconv
    , Error(..)
    , open
    , close
    , reset
    , iconv
    , convert

    , list
    ) where

import Foreign
import Foreign.C
import Foreign.Marshal.Array
import Data.IORef
import System.IO.Unsafe (unsafePerformIO)
import Monad (liftM)

-- I believe ONE CHARACTER never exceed this.
bufSize :: Int
bufSize  096

-----------------------------------------------------------------------------
-- basic interface
-----------------------------------------------------------------------------

data Iconv
     conv !Iconv_t
            !(Ptr Word8)
            !(Ptr Word8)

data Error
     nknownError                -- ^Unknown error
    | UnsupportedConversion       -- ^The choosen conversion is not supported
    | IncompleteSequence ![Word8] -- ^There was an incomplete input sequence at
                                  --  the end of the input, rest of input
                                  --  sequence.
    | IllegalSequence ![Word8]    -- ^There was an illegal input sequence,
                                  --  the rest of input sequence.

open :: String -> String -> IO (Either Error Iconv)
open tocode fromcode withCString tocode   $ \tocode_c ->
    withCString fromcode $ \fromcode_c ->
        do cd <- _iconv_open tocode_c fromcode_c
           if isError cd
              then do errno <- getErrno
                      return (Left (errnoToError errno))
              else do inbuf  <- mallocArray bufSize
                      outbuf <- mallocArray bufSize
                      return (Right (Iconv cd inbuf outbuf))
    where errnoToError errno
	      | errnoノホヨチフ  テ
	             ナ

 ココ ノ ュセ ノマ ィゥ
 ィノ   ゥ  ゜゜ 
        
        
        ィゥ

ュュ   
 ココ ノ ュセ ノマ ィロラクンャ ヘ ナゥ
 ィノ  ゜ ゥ  、 ワミ ュセ
     、 ワミ ュセ
          ミ 
            ミ ィナ モゥ
            シュ ゜  ミ ミ ミ ミ
             ュア
                 シュ ナ
                       ィロンャ ハ ィヤナ ゥゥ
                 シュ ヘ ナ ィ ミゥ
                       シュ チ ィモ ュ ゥ 
                       ィャ ホゥ
     ヤナ 
	       ノホヨチフ  モ ロン
	       ノフモナム  モ ロン
	             ナ

 ココ ノ ュセ ロラクン ュセ ノマ ィロラクンャ ヘ ナゥ
 ィノ   ゥ   、 ワミ ュセ
     、 ワミ ュセ
     、 ワミ ュセ
     、 ワミ ュセ
        フ  
                   
                  ミ ミ
                  ミ ミ

フ ココ ノ゜ ュセ ロラクン ュセ
             ミ ラク ュセ ミ ラク ュセ
             ミ ィミ ラクゥ ュセ ミ ィミ ラクゥ ュセ
             ミ テノ ュセ ミ テノ ュセ
             ノマ ィロラクンャ ヘ ナゥ
フ  
           
          ミ ミ
          ミ ミ
       ロン
         
               シュ  ィ モ ゥ
                
               シュ  ィ ゥ
              チ  
               ミ 
               ミ ィナ ゥ
              
               ミ 
               ミ ィナ モゥ
              
               シュ ゜ 
                            ミ ミ
                            ミ ミ
                シュ ヘ ナ ィ ミゥ
               シュ ヘ ナ ィ ミゥ
              
               シュ チ ィモ ュ ゥ 
              ァ シュ  ィ ォォ ゥ
              ァ  シュ  ィ ィ ュ ゥ ゥ
              
                ュア
                  
                     シュ ナ
                      イツノヌ
                         ァ ァ
                          ノフモナム
                              ィァャ ハ ィノモ  ァゥゥ
                               ノホヨチフ
                                    
                                      ロン ュセ  ィァャ ハ ィノモ ァゥゥ
                                      ゜  ュセ  ァ ァ
                                   ィァャ ハ ユナゥ
                   ァ 
                      ロン ュセ  ィァャ ホゥ
                      ゜  ュセ  ァ ァ

ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ
ュュ   
ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ

モ ココ ノ
モ  モ

ュュ 
ュュ テ         
 ココ モ ュセ モ ュセ ロラクン ュセ ィロラクンャ ヘ ナゥ
     ミノマ ィ  ゥ 
        フ    ュセ ィロンャ ハ ゥ
        メ  ュセ   
       ロン     ミノマ ィ ゥ
              チ モ  
              ィャ ゥ ュセ
                   ミノマ ィ  ゥ 
                  ィャ ゥ ュセ 
                        
                      ホ ュセ
                           ィイャイゥ    
                           ィォォイャ イゥ
                      ハ ィノモ イゥ ュセ
			   ィミノマ 、  ゥ
                              ィャ ハ ィノモ ィイォォゥゥゥ
                      ハ ィノモ イゥ ュセ
			        ュュ リリリ
			       ィミノマ 、  ゥ
			              ィャ ハ ィノモ ィイォォゥゥゥ
			       ィイャ イゥ    ィイォォゥ
                                   ィォォイャ イゥ
                      ゜ ュセ ィャ ゥ

ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ
ュュ  
ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ

ュュ           
ュュ     ィュアゥ  

ュュ リリリ
ュュ  ノ゜  」 ゜ゥ
ュュ  ノ゜  ノカエ
 ノ゜  ノ

ナ ココ ノ゜ ュセ ツ
ナ    ィュアゥ

    「ョ ゜「
  ゜゜ ココ ミ テテ ュセ ミ テテ ュセ ノマ ノ゜
    「ョ ゜「
  ゜゜ ココ ノ゜ ュセ ノマ テノ
    「ョ 「
  ゜ ココ ノ゜
         ュセ ミ ィミ ラクゥ ュセ ミ テノ
         ュセ ミ ィミ ラクゥ ュセ ミ テノ
         ュセ ノマ テモ

ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ
ュュ ュ
ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ

 ココ ノマ ィヘ ロモンゥ

」 ゜フノツノテマホヨ゜ネ

   シュ ノマメ ロン
        シュ フテ ィワ  ゜ ュセ
                                    ァ シュ チ ィナ ゥ 
                                       シュ ヘ テモ ァ
                                      ノマメ  ィォォゥ
                                       ーゥ
       ゜  ミ
       ネニミ 
       ヘ ハ ィノマメ ゥ       

   「ョ 「
  ゜ ココ ニミ ィテユノ ュセ ミ ィミ テテゥ ュセ ミ  ュセ ノマ テノゥ ュセ
                ミ  ュセ ノマ ィゥ

   「「
  フテ ココ ィテユノ ュセ ミ ィミ テテゥ ュセ ミ  ュセ ノマ テノゥ ュセ
                    ノマ ィニミ ィテユノ ュセ ミ ィミ テテゥ ュセ ミ  ュセ ノマ テノゥゥ

」

   ホ

」

ュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ

ュュュュポミィヤ゜パイー゜ーイ゜エー゜アオ゜イーーエ゜オオアゥュュュュ