NAME

perlapio - perlの入出力抽象インターフェース


SYNOPSIS

    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 *);


DESCRIPTION

Perlのソースコードでは、ANSI Cのstdio.hにある関数ではなく上記 の関数を使うべきであり、perlio.hがConfigureの実行時に選択した I/O機構へ#defineします。

これらの関数はstdio.hにあるものがモデルになっていますが、それ に渡すパラメーターは“ちょっとばかし整頓”されています。

PerlIO *

これはFILE *と似たものではありますが、FILE *と異なるのはこれが不 透明 なものであるように扱うべきだということです(これが何かに対す るポインターであると仮定するのが安全でしょう)。

PerlIO_stdin(), PerlIO_stdout(), PerlIO_stderr()

stdin, stdout, stderrの代わりに使ってください。これらは 変数でなく“関数呼び出し”のように記述されていますが、これは、使 用するプラットフォームにおいてロードモジュールに対するデータのエ クスポートができなかったり、あるいは異なる“スレッド”が異なる値 を持つ可能性があるといったときに、これらをB<関数呼び出しにする> のが簡単になるからです。

PerlIO_open(path, mode), PerlIO_fdopen(fd,mode)

対応する fopen()/fdopen() と同じ引数を取ります。

PerlIO_printf(f,fmt,...), PerlIO_vprintf(f,fmt,a)

fprintf()/vfprintf と等価です。

PerlIO_stdoutf(fmt,...)

これはprintf()と等価です。printfはこの関数に対する#definedとなっ ていますから、(現時点では)Perlのソースコード中でprintf(fmt,...) とすることは合法です。

PerlIO_read(f,buf,count), PerlIO_write(f,buf,count)

fread() および fwrite()に対応します。これらの引数がそれとは異な り、“count”は一つだけしかなくて“file”が先頭であるということ に注意してください。

PerlIO_close(f)
PerlIO_puts(s,f), PerlIO_putc(c,f)

fputs() および fputc()に対応します。最初の引数に“file”が来ると いうことに注意してください。

PerlIO_ungetc(c,f)

ungetc()に対応します。最初の引数に“file”が来るということに注意 してください。

PerlIO_getc(f)

getc()に対応します。

PerlIO_eof(f)

feof()に対応します。

PerlIO_error(f)

ferror()に対応します。

PerlIO_fileno(f)

fileno()に対応します。一部のプラットフォームにおいては、“fileno” の意味するところがUNIXとは違うということに注意してください。

PerlIO_clearerr(f)

clearerr()に対応し、“ストリーム”の`eof'や`error'といったフラグ をクリアします。

PerlIO_flush(f)

fflush()に対応します。

PerlIO_tell(f)

ftell()に対応します。

PerlIO_seek(f,o,w)

fseek()に対応します。

PerlIO_getpos(f,p), PerlIO_setpos(f,p)

それぞれftgetpos()とfsetpos()に対応します。プラットフォームがstdio 呼び出しを持っていない場合にはこれらの関数はPerlIO_tell()、 PerlIO_seek()によって実装されます。

PerlIO_rewind(f)

rewind()に対応します。一部の状況においてはこれはPerlIO_seek()に よって再定義されている可能性があるので注意してください。

PerlIO_tmpfile()

tmpfile()に対応し、クローズ時に自動的に削除される無名 PerlIOを返 します。


Co-existence with stdio stdioとの共存

PerlIOとstdioとの共存をサポートするためのアウトラインがあります。 PerlIOがstdioを使って実装されているのであれば、問題はありません。 しかし、perlioが sfioのの上に実装されているのであればstdio呼び出 しを使おうとするライブラリコードに渡すことができるFILE *を作成す る機構がなければなりません。

PerlIO_importFILE(f,flags)

FILE *からPerlIO *を得るのに使います。検討されている インターフ ェースの引数を追加することができます。

PerlIO_exportFILE(f,flags)

PerlIO *を取り、ANSI Cのstdio.hのルーチンに渡して使われる ‘ネイティブ’な FILE * 構造体を返します。

‘export’された FILE *は記録され、それ以後のオリジナルの PerlIO *に対するPerlIO操作に影響を及ぼす可能性があります。

PerlIO_findFILE(f)

直前の`export'されたFILE *を(もしあれば)返します。インターフェー スが完全に定義されるまではこれはプレースホルダーです。

PerlIO_releaseFILE(p,f)

PerlIO_releaseFILE は、PerlIOにすべてのFILE *の使用が完了したこ とを知らせます。完了したものは‘export’された FILE *のリストか ら削除されます。そして、それに結び付けられている PerlIO * は元々 の振る舞いに戻ります。

PerlIO_setlinebuf(f)

これはsetlinebuf()に対応します。これを使うことは現時点では避けて ください。(Perl coreは“dumping”が$| の自動フラッシュに関係して いないときにのみこれを使います)。

上述した ユーザーAPIに加えて、perlが、PerlIOの内部で扱うことがで きるようにする“implementation”インターフェースがあります。以下 に挙げる呼び出しは、それぞれConfigureで定義されるFILE_xxxマクロ に対応しています。このセクションでは、perlプログラムの振る舞いや PerlIOのマッピングの詳細についてのみ注目します。

PerlIO_has_cntptr(f)

“バッファー”中のカレントポジションへのポインターと バッファにあるバイト数を返すことのできる実装です。

PerlIO_get_ptr(f)

バッファ中にある次の読み出し可能バイトへのポインターを 返します。

PerlIO_get_cnt(f)

バッファ中の読み出すことのできるバイト数を返します。

PerlIO_canset_cnt(f)

バッファにあるバイト数を調整することのできる 実装です。

PerlIO_fast_gets(f)

<FILE>機構を取り扱うためのperlのfast codeを許すのに要求されるイ ンターフェースのすべてを実装しています。

  PerlIO_fast_gets(f) = PerlIO_has_cntptr(f) && ¥
                        PerlIO_canset_cnt(f) && ¥
                        `Can set pointer into buffer'
PerlIO_set_ptrcnt(f,p,c)

ポインターをバッファーにセットし、バッファにあるバイト数はそのま まです。以前のPerlIO_get_ptrPerlIO_get_cntの呼び出しか ら推測される範囲内のポインターをセットすることのみに使うべきでし ょう。

PerlIO_set_cnt(f,c)

不明瞭 - バッファにあるバイト数をセットします。使うのはお薦めで きません。現在これは、doio.cでのみ count < -1 を 強制的に-1にす るために使われています。おそらくPerlIO_set_emptyやそれに類する ものがあるべきでしょう。この呼び出しは、“count”がポインターと “limit”から導き出される場合には実際にはなにもしません。

PerlIO_has_base(f)

バッファーを持っていて、バッファー全体へのポインターや その大きさを返すことができる実装です。-T/-Bテストのためにperlに よって使われます。そのほかのものは非常にはっきりしない形で使われ ます…

PerlIO_get_base(f)

バッファーの開始位置を返します。

PerlIO_get_bufsiz(f)

バッファーのトータルサイズを返します。