Internal.txt (C)Copyright 1999 by Hiroshi Takekawa Last Modified: Thu Dec 30 01:18:12 1999. $Id: Internal.txt,v 1.4 2000/01/08 19:22:00 sian Exp $ 内部の覚え書きのようなものです。 -- pluginを作る際には返り値とメモリリークに十分注意してください。 warningもできるだけなくしてください。 endianに依存しないコードにしてください。 ローダからar->fpを参照してはいけません。 -- pluginから利用可能なEnfleが用意している関数群 archive layer関数 必要なinclude file: archive.h Archive *archive_open(Dlist *p, char *filename); filenameで指定されたアーカイブを開いて、Archive構造体を返す。失敗した らNULLを返す。開く際、pで示されたplugin群を利用する。Enfle本体しか使 わない。loader pluginはopenされたArchiveを渡される。 int archive_seek(Archive *ar, long pos, int whence); 現在選択されているアーカイブ内のファイルの中でseekを行う。成功したら0、 失敗したら-1を返す。第2引数以降はfseekと同じ。 int archive_tell(Archive *); 現在選択されているアーカイブ内のファイルの中での現在のポインタの位置 を返す。 int archive_read(Archive *ar, unsigned char *buf, int size); アーカイブからbufが指すメモリにsizeまでデータを読んで、実際に読みこん だbyte数を返す。 int archive_getc(Archive *); アーカイブから1文字読みこむ。失敗したら-1を返す。エラーがチェックでき る点でread_uchar()よりこちらを推奨する。 unsigned char *archive_gets(Archive *, unsigned char *, int); アーカイブから文字列を読みこむ。fgets()と同様の動作をする。 int archive_select(Archive *ar, int index); アーカイブ内の複数のファイルから対象となるindex番目のファイルを選択する。 int archive_close(Archive *); アーカイブを閉じる。 Archive *archive_open_from_plugin(char *filename, char *format); archiver plugin内からアーカイブを開く。開くfilenameと呼びだし側の pluginのformat名を引数として呼びだす。tar.gz、tar.bz2の対応に使う。 archiver pluginは再帰的な無限ループに陥らないようにする必要がある。そ のためこの関数を呼ぶ前に、ar->formatが自分自身を指していないか確認し て、指していたらreturnする必要がある。 ユーティリティ関数 必要なinclude file: utils.h unsigned long read_little_dword(Archive *); unsigned short read_little_word(Archive *); little endianとして次のdword(4bytes)、word(2bytes)をArchiveから読みこ む。 unsigned char read_uchar(Archive *); 次の1byteをArchiveから読みこむ。archive_getc()を推奨。使用してる pluginを総書きかえしてdeprecateする予定。 unsigned long get_little_dword(void *); unsigned short get_little_word(void *); void *の指すメモリからlittle endianとしてdword、wordをそれぞれ読みこ む。 void put_little_dword(void *, unsigned long); void put_little_word(void *, unsigned short); void *の指すメモリにlittle endianとしてdword、wordの値をそれぞれ書き こむ。 -- キーに関数を割りあてるには、action_register_by_key()を使います。関数の プロトタイプは Event func(Info *, Binfo *, Image *, Dlist_data *); でなければなりません。 例:action_register_by_key(info->act_hash, XK_hogehoge, 0, function); 標準の機能はbrowseaction.cに書かれています。そちらも参考にしてください。 --