[pod] [xml]

NAME

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

SYNOPSIS

    #define PERLIO_NOT_STDIO 0    /* For co-existence with stdio only */
    #include <perlio.h>           /* Usually via #include <perl.h> */
    PerlIO *PerlIO_stdin(void);
    PerlIO *PerlIO_stdout(void);
    PerlIO *PerlIO_stderr(void);
    PerlIO *PerlIO_open(const char *path,const char *mode);
    PerlIO *PerlIO_fdopen(int fd, const char *mode);
    PerlIO *PerlIO_reopen(const char *path, const char *mode, PerlIO *old);  /* deprecated */
    int     PerlIO_close(PerlIO *f);
    int     PerlIO_stdoutf(const char *fmt,...)
    int     PerlIO_puts(PerlIO *f,const char *string);
    int     PerlIO_putc(PerlIO *f,int ch);
    int     PerlIO_write(PerlIO *f,const void *buf,size_t numbytes);
    int     PerlIO_printf(PerlIO *f, const char *fmt,...);
    int     PerlIO_vprintf(PerlIO *f, const char *fmt, va_list args);
    int     PerlIO_flush(PerlIO *f);
    int     PerlIO_eof(PerlIO *f);
    int     PerlIO_error(PerlIO *f);
    void    PerlIO_clearerr(PerlIO *f);
    int     PerlIO_getc(PerlIO *d);
    int     PerlIO_ungetc(PerlIO *f,int ch);
    int     PerlIO_read(PerlIO *f, void *buf, size_t numbytes);
    int     PerlIO_fileno(PerlIO *f);
    void    PerlIO_setlinebuf(PerlIO *f);
    Off_t   PerlIO_tell(PerlIO *f);
    int     PerlIO_seek(PerlIO *f, Off_t offset, int whence);
    void    PerlIO_rewind(PerlIO *f);
    int     PerlIO_getpos(PerlIO *f, SV *save);        /* prototype changed */
    int     PerlIO_setpos(PerlIO *f, SV *saved);       /* prototype changed */
    int     PerlIO_fast_gets(PerlIO *f);
    int     PerlIO_has_cntptr(PerlIO *f);
    int     PerlIO_get_cnt(PerlIO *f);
    char   *PerlIO_get_ptr(PerlIO *f);
    void    PerlIO_set_ptrcnt(PerlIO *f, char *ptr, int count);
    int     PerlIO_canset_cnt(PerlIO *f);              /* deprecated */
    void    PerlIO_set_cnt(PerlIO *f, int count);      /* deprecated */
    int     PerlIO_has_base(PerlIO *f);
    char   *PerlIO_get_base(PerlIO *f);
    int     PerlIO_get_bufsiz(PerlIO *f);
    PerlIO *PerlIO_importFILE(FILE *stdio, const char *mode);
    FILE   *PerlIO_exportFILE(PerlIO *f, int flags);
    FILE   *PerlIO_findFILE(PerlIO *f);
    void    PerlIO_releaseFILE(PerlIO *f,FILE *stdio);
    int     PerlIO_apply_layers(PerlIO *f, const char *mode, const char *layers);
    int     PerlIO_binmode(PerlIO *f, int ptype, int imode, const char *layers);
    void    PerlIO_debug(const char *fmt,...)

DESCRIPTION

Perl のソースコードと、最大の移植性を求めるエクステンションでは、 ANSI C の stdio.h にある関数ではなく上記の関数を使うべきです。 perl のヘッダ (特に "perlio.h") が Configure の実行時に選択した I/O 機構へ #define します。

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

PerlIO * は FILE * のようなものです。 FILE * と同様に、これは不透明なものとして扱われます(これを何かへの ポインタとして仮定することはおそらく安全です)。

現在のところ 3 つの実装があります:

  1. USE_STDIO

    上記の全ては stdio 関数への #define か、stdio を呼び出すためのありふれた ラッパ関数です。 この場合 のみ、PerlIO * は FILE * です。 抽象化が導入された perl5.003_02 以来、これがデフォルトの実装でした。

  2. USE_SFIO

    "sfio" ライブラリに関して、「レガシーな」実装です。 Unix マシンでの特殊なアプリケーションで使われています ("sfio" Unix 以外にはあまり移植されていません)。 上記のほとんどは sfio 関数への #define です。 この場合、PerlIO * は Sfio_t * です。

  3. USE_PERLIO

    これはperl5.7.0 の直後に導入され、上述の抽象化の再実装です; これによって IO を OS と C ライブラリが物事を行うための選択と切り離すために、 IO がどのように行われるかを perl がより制御できるようになります。 USE_PERLIO では、PerlIO * は間接化の追加の層を持ちます - これは点対点です。 これにより、PerlIO * は既知の値のまま、基礎となる実装を 実行時に 交換することができます。 この場合上述の全ては基礎となる実装を呼び出す本当の(しかしとても単純な) 関数です。

    これは PerlIO_apply_layers() が何か「興味ある」ことを行う唯一の 実装です。

    USE_PERLIO 実装については perliol に記述されています。

"perlio.h" は(効率のために)薄い層になっているので、これらの関数の意味は 基礎となる実装に若干依存しています。 変化があると分かっているところは以下に言及しています。

特に注意がなければ、関数は成功時に 0 を返し、エラー時には負数(普通は -1 の値を持つ EOF)を返して errno をセットします。

Co-existence with stdio

(stdio との共存)

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

最初のステップは以下の行を追加することです:

   #define PERLIO_NOT_STDIO 0

あらゆる perl ヘッダファイルをインクルードする に行います。 (これはおそらくある時点でデフォルトになります。) これにより "perlio.h" が stdio を PerlIO 関数に #define しようとするのを 妨げます。

XS コードは、もし FILE * 引数を想定しているなら、おそらく"typemap" を 使ったほうがよいでしょう。 標準の typemap は、この分野でのあらゆる変更を把握するために調整されます。

"Fast gets" Functions

("Fast gets" 関数)

上述した標準風の API に加えて、perl が PerlIO の内部で扱うことが できるようにする「実装」インターフェースがあります。 以下に挙げる呼び出しは、それぞれ Configure (あるいはその他の実装では これと等価なもの) で定義される FILE_xxx マクロに対応しています。 このセクションでは、perl-core の振る舞いの詳細、PerlIO のマッピングの実装、 また perl がする同じ方法で IO システムによって行われている 「先行読み込み」を使えるようなコードを書くことについてのみ注目します。 これらのインターフェースを使うコードは、もしハンドルがこれらに 対応していないなら、伝統的な方法で準備しておく必要があることに 注意してください。

Other Functions

(その他の関数)