perlapio - perlの入出力抽象インターフェース
PerlIO *PerlIO_stdin(void);
PerlIO *PerlIO_stdout(void);
PerlIO *PerlIO_stderr(void);
PerlIO *PerlIO_open(const char *,const char *);
int PerlIO_close(PerlIO *);
int PerlIO_stdoutf(const char *,...)
int PerlIO_puts(PerlIO *,const char *);
int PerlIO_putc(PerlIO *,int);
int PerlIO_write(PerlIO *,const void *,size_t);
int PerlIO_printf(PerlIO *, const char *,...);
int PerlIO_vprintf(PerlIO *, const char *, va_list);
int PerlIO_flush(PerlIO *);
int PerlIO_eof(PerlIO *);
int PerlIO_error(PerlIO *);
void PerlIO_clearerr(PerlIO *);
int PerlIO_getc(PerlIO *);
int PerlIO_ungetc(PerlIO *,int);
int PerlIO_read(PerlIO *,void *,size_t);
int PerlIO_fileno(PerlIO *);
PerlIO *PerlIO_fdopen(int, const char *);
PerlIO *PerlIO_importFILE(FILE *, int flags);
FILE *PerlIO_exportFILE(PerlIO *, int flags);
FILE *PerlIO_findFILE(PerlIO *);
void PerlIO_releaseFILE(PerlIO *,FILE *);
void PerlIO_setlinebuf(PerlIO *);
long PerlIO_tell(PerlIO *);
int PerlIO_seek(PerlIO *,off_t,int);
int PerlIO_getpos(PerlIO *,Fpos_t *)
int PerlIO_setpos(PerlIO *,Fpos_t *)
void PerlIO_rewind(PerlIO *);
int PerlIO_has_base(PerlIO *);
int PerlIO_has_cntptr(PerlIO *);
int PerlIO_fast_gets(PerlIO *);
int PerlIO_canset_cnt(PerlIO *);
char *PerlIO_get_ptr(PerlIO *);
int PerlIO_get_cnt(PerlIO *);
void PerlIO_set_cnt(PerlIO *,int);
void PerlIO_set_ptrcnt(PerlIO *,char *,int);
char *PerlIO_get_base(PerlIO *);
int PerlIO_get_bufsiz(PerlIO *);
Perlのソースコードでは、ANSI Cのstdio.hにある関数ではなく上記 の関数を使うべきであり、perlio.hがConfigureの実行時に選択した I/O機構へ#defineします。
これらの関数はstdio.hにあるものがモデルになっていますが、それ に渡すパラメーターは“ちょっとばかし整頓”されています。
これはFILE *と似たものではありますが、FILE *と異なるのはこれが不 透明 なものであるように扱うべきだということです(これが何かに対す るポインターであると仮定するのが安全でしょう)。
stdin, stdout, stderrの代わりに使ってください。これらは
変数でなく“関数呼び出し”のように記述されていますが、これは、使
用するプラットフォームにおいてロードモジュールに対するデータのエ
クスポートができなかったり、あるいは異なる“スレッド”が異なる値
を持つ可能性があるといったときに、これらをB<関数呼び出しにする> のが簡単になるからです。
対応する fopen()/fdopen() と同じ引数を取ります。
fprintf()/vfprintf と等価です。
これはprintf()と等価です。printfはこの関数に対する#definedとなっ
ていますから、(現時点では)Perlのソースコード中でprintf(fmt,...)
とすることは合法です。
fread() および
fwrite()に対応します。これらの引数がそれとは異な
り、“count”は一つだけしかなくて“file”が先頭であるということ
に注意してください。
fputs() および
fputc()に対応します。最初の引数に“file”が来ると
いうことに注意してください。
ungetc()に対応します。最初の引数に“file”が来るということに注意
してください。
getc()に対応します。
feof()に対応します。
ferror()に対応します。
fileno()に対応します。一部のプラットフォームにおいては、“fileno”
の意味するところがUNIXとは違うということに注意してください。
clearerr()に対応し、“ストリーム”の`eof'や`error'といったフラグ
をクリアします。
fflush()に対応します。
ftell()に対応します。
fseek()に対応します。
それぞれftgetpos()とfsetpos()に対応します。プラットフォームがstdio
呼び出しを持っていない場合にはこれらの関数はPerlIO_tell()、
PerlIO_seek()によって実装されます。
rewind()に対応します。一部の状況においてはこれはPerlIO_seek()に
よって再定義されている可能性があるので注意してください。
tmpfile()に対応し、クローズ時に自動的に削除される無名
PerlIOを返 します。
PerlIOとstdioとの共存をサポートするためのアウトラインがあります。 PerlIOがstdioを使って実装されているのであれば、問題はありません。 しかし、perlioが sfioのの上に実装されているのであればstdio呼び出 しを使おうとするライブラリコードに渡すことができるFILE *を作成す る機構がなければなりません。
FILE *からPerlIO *を得るのに使います。検討されている インターフ ェースの引数を追加することができます。
PerlIO *を取り、ANSI Cのstdio.hのルーチンに渡して使われる ‘ネイティブ’な FILE * 構造体を返します。
‘export’された FILE *は記録され、それ以後のオリジナルの PerlIO *に対するPerlIO操作に影響を及ぼす可能性があります。
直前の`export'されたFILE *を(もしあれば)返します。インターフェー スが完全に定義されるまではこれはプレースホルダーです。
PerlIO_releaseFILE は、PerlIOにすべてのFILE *の使用が完了したこ とを知らせます。完了したものは‘export’された FILE *のリストか ら削除されます。そして、それに結び付けられている PerlIO * は元々 の振る舞いに戻ります。
これはsetlinebuf()に対応します。これを使うことは現時点では避けて ください。(Perl coreは“dumping”が$| の自動フラッシュに関係して いないときにのみこれを使います)。
上述した ユーザーAPIに加えて、perlが、PerlIOの内部で扱うことがで きるようにする“implementation”インターフェースがあります。以下 に挙げる呼び出しは、それぞれConfigureで定義されるFILE_xxxマクロ に対応しています。このセクションでは、perlプログラムの振る舞いや PerlIOのマッピングの詳細についてのみ注目します。
“バッファー”中のカレントポジションへのポインターと バッファにあるバイト数を返すことのできる実装です。
バッファ中にある次の読み出し可能バイトへのポインターを 返します。
バッファ中の読み出すことのできるバイト数を返します。
バッファにあるバイト数を調整することのできる 実装です。
<FILE>機構を取り扱うためのperlのfast codeを許すのに要求されるイ ンターフェースのすべてを実装しています。
PerlIO_fast_gets(f) = PerlIO_has_cntptr(f) && ¥
PerlIO_canset_cnt(f) && ¥
`Can set pointer into buffer'
ポインターをバッファーにセットし、バッファにあるバイト数はそのま まです。以前のPerlIO_get_ptr と PerlIO_get_cntの呼び出しか ら推測される範囲内のポインターをセットすることのみに使うべきでし ょう。
不明瞭 - バッファにあるバイト数をセットします。使うのはお薦めで きません。現在これは、doio.cでのみ count < -1 を 強制的に-1にす るために使われています。おそらくPerlIO_set_emptyやそれに類する ものがあるべきでしょう。この呼び出しは、“count”がポインターと “limit”から導き出される場合には実際にはなにもしません。
バッファーを持っていて、バッファー全体へのポインターや その大きさを返すことができる実装です。-T/-Bテストのためにperlに よって使われます。そのほかのものは非常にはっきりしない形で使われ ます…
バッファーの開始位置を返します。
バッファーのトータルサイズを返します。