APIの再検討中

iconv互換が使いやすいというご意見がありました。

iconv


iconvはあまり詳しくありませんが、

iconv_t iconv_open(const char *tocode, const char *fromcode);
で入出力の符号を指定してディスクリプタを得て

size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);

で実際の変換処理

int iconv_close(iconv_t cd);
で後始末

と、なるようです。


検討


現時点では、ディスクリプタを用いてどうこう、という処理にはなっていないので、改造は大規模になりそうです。
漠然と案は浮かんでいるので、そう遠くないうちに何とかできるかと思います。


gnuiconvの場合、細かい設定は
int iconvctl (iconv_t cd, int request, void* argument);
で行なうらしい。

gtefでは、コマンドラインから与えられた引数をそのままargc/argvでgtef.dllに与えることで、gtef.dll内でオプション解析を実行しているわけですが、似たような方法にするとなると、CUIアプリ側にオプション解析を移さないといけなくなりそうですね。その方が良いのかも知れませんが。

引数がポインタだと面倒なんで、引数も数値で扱うことにする予定。


また、オプションを認識するのはgtef.dllだけではなく、ここから呼び出される実際の変換DLLもそうですので、この辺の管理をどうするかを再考する必要がありそうです。

ただ、このままだと現在のファイル→ファイルにある、入出力の符号名を返す機能と、メッセージを返す機能がなくなってしまいます。
ファイル→ファイルの場合でもgtef_openから始める必要が出てきますが、ファイルの場合は別の関数を用意するのが無難でしょうかね。

漠然と考えた想定仕様では

typedef void *gtef_t;

gtef_t gtef_open(
 const char *tocode,
 const char *fromcode);

int gtef_stream(
 gtef_t cd,
 const char *tofilename,
 const char *fromfilename);

int gtefctl (
 gtef_t cd,
 u_long request,
 u_long argument);

long gtef(
 gtef_t cd,
 char **inbuf, size_t *inbufen,
 char **outbuf, size_t *outbuflen)

long gtefmsg(
 gtef_t cd,
 char **inbuf, size_t *inbufen,
 char **outbuf, size_t *outbuflen,
 char *encbuf, size_t encbuflen,
 char *msgbuf, size_t msgbuflen
)

int gtef_close(gtef_t cd);

といったあたりでしょうか。実際にこの通りに作れるかどうかは分かりませんが。
gtef.soだけでなく、gtef.a と gtef.h も用意した方が良さそうですね。

変換関数は、size_t を返してエラーは errno にしようかとも思いましたが、少なくともWindowsで試した範囲では、DLLでerrnoを設定しても呼出元でその値が参照できなかったので、諦めました。

仕方がないので、long >= 0 で正常、long < 0 ならエラーということにする予定。


また、マルチスレッドでの動作は最初から想定していないので、gtef_open で返される構造体は、内部では一つ固定で持って、このポインタを gtef_t * として返すことにしようと思っております。


あとiconvには、変換できない符号があった場合は、その符号位置をポインタで返す、という機能もあるようです。
gTefの場合は U+FFFD や ? で置き換えることで自動で片付けてしまう仕様ですが、途中で止めてしまうような実装は需要があるのでしょうか。

現時点では変換エラーの存在自体がアプリに返されない不親切仕様なので、この辺は改善が必要とは前々から考えてはいるのですが。

続き→


2009/09/01(火)14:48 |Comments(0) |Trackback(0)

製造開発 | ソフトウェア開発 | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

APIの仕様変更 ホーム メモリー間変換
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR