argra****@users*****
argra****@users*****
2013年 4月 3日 (水) 04:38:27 JST
Index: docs/perl/5.10.1/perliol.pod diff -u /dev/null docs/perl/5.10.1/perliol.pod:1.1 --- /dev/null Wed Apr 3 04:38:27 2013 +++ docs/perl/5.10.1/perliol.pod Wed Apr 3 04:38:27 2013 @@ -0,0 +1,2401 @@ + +=encoding euc-jp + +=head1 NAME + +=begin original + +perliol - C API for Perl's implementation of IO in Layers. + +=end original + +perliol - IO 層の Perl 実装への C API + +=head1 SYNOPSIS + + /* Defining a layer ... */ + #include <perliol.h> + +=head1 DESCRIPTION + +=begin original + +This document describes the behavior and implementation of the PerlIO +abstraction described in L<perlapio> when C<USE_PERLIO> is defined (and +C<USE_SFIO> is not). + +=end original + +This document describes the behavior and implementation of the PerlIO +abstraction described in L<perlapio> when C<USE_PERLIO> is defined (and +C<USE_SFIO> is not). +(TBT) + +=head2 History and Background + +=begin original + +The PerlIO abstraction was introduced in perl5.003_02 but languished as +just an abstraction until perl5.7.0. However during that time a number +of perl extensions switched to using it, so the API is mostly fixed to +maintain (source) compatibility. + +=end original + +The PerlIO abstraction was introduced in perl5.003_02 but languished as +just an abstraction until perl5.7.0. However during that time a number +of perl extensions switched to using it, so the API is mostly fixed to +maintain (source) compatibility. +(TBT) + +=begin original + +The aim of the implementation is to provide the PerlIO API in a flexible +and platform neutral manner. It is also a trial of an "Object Oriented +C, with vtables" approach which may be applied to Perl 6. + +=end original + +The aim of the implementation is to provide the PerlIO API in a flexible +and platform neutral manner. It is also a trial of an "Object Oriented +C, with vtables" approach which may be applied to Perl 6. +(TBT) + +=head2 Basic Structure + +=begin original + +PerlIO is a stack of layers. + +=end original + +PerlIO は層のスタックです。 + +=begin original + +The low levels of the stack work with the low-level operating system +calls (file descriptors in C) getting bytes in and out, the higher +layers of the stack buffer, filter, and otherwise manipulate the I/O, +and return characters (or bytes) to Perl. Terms I<above> and I<below> +are used to refer to the relative positioning of the stack layers. + +=end original + +The low levels of the stack work with the low-level operating system +calls (file descriptors in C) getting bytes in and out, the higher +layers of the stack buffer, filter, and otherwise manipulate the I/O, +and return characters (or bytes) to Perl. Terms I<above> and I<below> +are used to refer to the relative positioning of the stack layers. +(TBT) + +=begin original + +A layer contains a "vtable", the table of I/O operations (at C level +a table of function pointers), and status flags. The functions in the +vtable implement operations like "open", "read", and "write". + +=end original + +A layer contains a "vtable", the table of I/O operations (at C level +a table of function pointers), and status flags. The functions in the +vtable implement operations like "open", "read", and "write". +(TBT) + +=begin original + +When I/O, for example "read", is requested, the request goes from Perl +first down the stack using "read" functions of each layer, then at the +bottom the input is requested from the operating system services, then +the result is returned up the stack, finally being interpreted as Perl +data. + +=end original + +When I/O, for example "read", is requested, the request goes from Perl +first down the stack using "read" functions of each layer, then at the +bottom the input is requested from the operating system services, then +the result is returned up the stack, finally being interpreted as Perl +data. +(TBT) + +=begin original + +The requests do not necessarily go always all the way down to the +operating system: that's where PerlIO buffering comes into play. + +=end original + +The requests do not necessarily go always all the way down to the +operating system: that's where PerlIO buffering comes into play. +(TBT) + +=begin original + +When you do an open() and specify extra PerlIO layers to be deployed, +the layers you specify are "pushed" on top of the already existing +default stack. One way to see it is that "operating system is +on the left" and "Perl is on the right". + +=end original + +When you do an open() and specify extra PerlIO layers to be deployed, +the layers you specify are "pushed" on top of the already existing +default stack. One way to see it is that "operating system is +on the left" and "Perl is on the right". +(TBT) + +=begin original + +What exact layers are in this default stack depends on a lot of +things: your operating system, Perl version, Perl compile time +configuration, and Perl runtime configuration. See L<PerlIO>, +L<perlrun/PERLIO>, and L<open> for more information. + +=end original + +What exact layers are in this default stack depends on a lot of +things: your operating system, Perl version, Perl compile time +configuration, and Perl runtime configuration. See L<PerlIO>, +L<perlrun/PERLIO>, and L<open> for more information. +(TBT) + +=begin original + +binmode() operates similarly to open(): by default the specified +layers are pushed on top of the existing stack. + +=end original + +binmode() operates similarly to open(): by default the specified +layers are pushed on top of the existing stack. +(TBT) + +=begin original + +However, note that even as the specified layers are "pushed on top" +for open() and binmode(), this doesn't mean that the effects are +limited to the "top": PerlIO layers can be very 'active' and inspect +and affect layers also deeper in the stack. As an example there +is a layer called "raw" which repeatedly "pops" layers until +it reaches the first layer that has declared itself capable of +handling binary data. The "pushed" layers are processed in left-to-right +order. + +=end original + +However, note that even as the specified layers are "pushed on top" +for open() and binmode(), this doesn't mean that the effects are +limited to the "top": PerlIO layers can be very 'active' and inspect +and affect layers also deeper in the stack. As an example there +is a layer called "raw" which repeatedly "pops" layers until +it reaches the first layer that has declared itself capable of +handling binary data. The "pushed" layers are processed in left-to-right +order. +(TBT) + +=begin original + +sysopen() operates (unsurprisingly) at a lower level in the stack than +open(). For example in UNIX or UNIX-like systems sysopen() operates +directly at the level of file descriptors: in the terms of PerlIO +layers, it uses only the "unix" layer, which is a rather thin wrapper +on top of the UNIX file descriptors. + +=end original + +sysopen() operates (unsurprisingly) at a lower level in the stack than +open(). For example in UNIX or UNIX-like systems sysopen() operates +directly at the level of file descriptors: in the terms of PerlIO +layers, it uses only the "unix" layer, which is a rather thin wrapper +on top of the UNIX file descriptors. +(TBT) + +=head2 Layers vs Disciplines + +=begin original + +Initial discussion of the ability to modify IO streams behaviour used +the term "discipline" for the entities which were added. This came (I +believe) from the use of the term in "sfio", which in turn borrowed it +from "line disciplines" on Unix terminals. However, this document (and +the C code) uses the term "layer". + +=end original + +Initial discussion of the ability to modify IO streams behaviour used +the term "discipline" for the entities which were added. This came (I +believe) from the use of the term in "sfio", which in turn borrowed it +from "line disciplines" on Unix terminals. However, this document (and +the C code) uses the term "layer". +(TBT) + +=begin original + +This is, I hope, a natural term given the implementation, and should +avoid connotations that are inherent in earlier uses of "discipline" +for things which are rather different. + +=end original + +This is, I hope, a natural term given the implementation, and should +avoid connotations that are inherent in earlier uses of "discipline" +for things which are rather different. +(TBT) + +=head2 Data Structures + +=begin original + +The basic data structure is a PerlIOl: + +=end original + +基本データ構造体は PerlIOl です: + + typedef struct _PerlIO PerlIOl; + typedef struct _PerlIO_funcs PerlIO_funcs; + typedef PerlIOl *PerlIO; + + struct _PerlIO + { + PerlIOl * next; /* Lower layer */ + PerlIO_funcs * tab; /* Functions for this layer */ + IV flags; /* Various flags for state */ + }; + +=begin original + +A C<PerlIOl *> is a pointer to the struct, and the I<application> +level C<PerlIO *> is a pointer to a C<PerlIOl *> - i.e. a pointer +to a pointer to the struct. This allows the application level C<PerlIO *> +to remain constant while the actual C<PerlIOl *> underneath +changes. (Compare perl's C<SV *> which remains constant while its +C<sv_any> field changes as the scalar's type changes.) An IO stream is +then in general represented as a pointer to this linked-list of +"layers". + +=end original + +A C<PerlIOl *> is a pointer to the struct, and the I<application> +level C<PerlIO *> is a pointer to a C<PerlIOl *> - i.e. a pointer +to a pointer to the struct. This allows the application level C<PerlIO *> +to remain constant while the actual C<PerlIOl *> underneath +changes. (Compare perl's C<SV *> which remains constant while its +C<sv_any> field changes as the scalar's type changes.) An IO stream is +then in general represented as a pointer to this linked-list of +"layers". +(TBT) + +=begin original + +It should be noted that because of the double indirection in a C<PerlIO *>, +a C<< &(perlio->next) >> "is" a C<PerlIO *>, and so to some degree +at least one layer can use the "standard" API on the next layer down. + +=end original + +It should be noted that because of the double indirection in a C<PerlIO *>, +a C<< &(perlio->next) >> "is" a C<PerlIO *>, and so to some degree +at least one layer can use the "standard" API on the next layer down. +(TBT) + +=begin original + +A "layer" is composed of two parts: + +=end original + +一つの「層」は二つの部分から構成されます: + +=over 4 + +=item 1. + +=begin original + +The functions and attributes of the "layer class". + +=end original + +「層クラス」の関数と属性。 + +=item 2. + +=begin original + +The per-instance data for a particular handle. + +=end original + +特定のハンドルのためのインスタンス単位のデータ。 + +=back + +=head2 Functions and Attributes + +=begin original + +The functions and attributes are accessed via the "tab" (for table) +member of C<PerlIOl>. The functions (methods of the layer "class") are +fixed, and are defined by the C<PerlIO_funcs> type. They are broadly the +same as the public C<PerlIO_xxxxx> functions: + +=end original + +The functions and attributes are accessed via the "tab" (for table) +member of C<PerlIOl>. The functions (methods of the layer "class") are +fixed, and are defined by the C<PerlIO_funcs> type. They are broadly the +same as the public C<PerlIO_xxxxx> functions: +(TBT) + + struct _PerlIO_funcs + { + Size_t fsize; + char * name; + Size_t size; + IV kind; + IV (*Pushed)(pTHX_ PerlIO *f,const char *mode,SV *arg, PerlIO_funcs *tab); + IV (*Popped)(pTHX_ PerlIO *f); + PerlIO * (*Open)(pTHX_ PerlIO_funcs *tab, + PerlIO_list_t *layers, IV n, + const char *mode, + int fd, int imode, int perm, + PerlIO *old, + int narg, SV **args); + IV (*Binmode)(pTHX_ PerlIO *f); + SV * (*Getarg)(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags) + IV (*Fileno)(pTHX_ PerlIO *f); + PerlIO * (*Dup)(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags) + /* Unix-like functions - cf sfio line disciplines */ + SSize_t (*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count); + SSize_t (*Unread)(pTHX_ PerlIO *f, const void *vbuf, Size_t count); + SSize_t (*Write)(pTHX_ PerlIO *f, const void *vbuf, Size_t count); + IV (*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence); + Off_t (*Tell)(pTHX_ PerlIO *f); + IV (*Close)(pTHX_ PerlIO *f); + /* Stdio-like buffered IO functions */ + IV (*Flush)(pTHX_ PerlIO *f); + IV (*Fill)(pTHX_ PerlIO *f); + IV (*Eof)(pTHX_ PerlIO *f); + IV (*Error)(pTHX_ PerlIO *f); + void (*Clearerr)(pTHX_ PerlIO *f); + void (*Setlinebuf)(pTHX_ PerlIO *f); + /* Perl's snooping functions */ + STDCHAR * (*Get_base)(pTHX_ PerlIO *f); + Size_t (*Get_bufsiz)(pTHX_ PerlIO *f); + STDCHAR * (*Get_ptr)(pTHX_ PerlIO *f); + SSize_t (*Get_cnt)(pTHX_ PerlIO *f); + void (*Set_ptrcnt)(pTHX_ PerlIO *f,STDCHAR *ptr,SSize_t cnt); + }; + +=begin original + +The first few members of the struct give a function table size for +compatibility check "name" for the layer, the size to C<malloc> for the per-instance data, +and some flags which are attributes of the class as whole (such as whether it is a buffering +layer), then follow the functions which fall into four basic groups: + +=end original + +The first few members of the struct give a function table size for +compatibility check "name" for the layer, the size to C<malloc> for the per-instance data, +and some flags which are attributes of the class as whole (such as whether it is a buffering +layer), then follow the functions which fall into four basic groups: +(TBT) + +=over 4 + +=item 1. + +=begin original + +Opening and setup functions + +=end original + +Opening and setup functions +(TBT) + +=item 2. + +=begin original + +Basic IO operations + +=end original + +基本 IO 操作 +(TBT) + +=item 3. + +=begin original + +Stdio class buffering options. + +=end original + +Stdio クラスバッファリングオプション。 +(TBT) + +=item 4. + +=begin original + +Functions to support Perl's traditional "fast" access to the buffer. + +=end original + +Perl の伝統的なバッファへの「高速」アクセスに体操する関数。 + +=back + +=begin original + +A layer does not have to implement all the functions, but the whole +table has to be present. Unimplemented slots can be NULL (which will +result in an error when called) or can be filled in with stubs to +"inherit" behaviour from a "base class". This "inheritance" is fixed +for all instances of the layer, but as the layer chooses which stubs +to populate the table, limited "multiple inheritance" is possible. + +=end original + +A layer does not have to implement all the functions, but the whole +table has to be present. Unimplemented slots can be NULL (which will +result in an error when called) or can be filled in with stubs to +"inherit" behaviour from a "base class". This "inheritance" is fixed +for all instances of the layer, but as the layer chooses which stubs +to populate the table, limited "multiple inheritance" is possible. +(TBT) + +=head2 Per-instance Data + +=begin original + +The per-instance data are held in memory beyond the basic PerlIOl +struct, by making a PerlIOl the first member of the layer's struct +thus: + +=end original + +The per-instance data are held in memory beyond the basic PerlIOl +struct, by making a PerlIOl the first member of the layer's struct +thus: +(TBT) + + typedef struct + { + struct _PerlIO base; /* Base "class" info */ + STDCHAR * buf; /* Start of buffer */ + STDCHAR * end; /* End of valid part of buffer */ + STDCHAR * ptr; /* Current position in buffer */ + Off_t posn; /* Offset of buf into the file */ + Size_t bufsiz; /* Real size of buffer */ + IV oneword; /* Emergency buffer */ + } PerlIOBuf; + +=begin original + +In this way (as for perl's scalars) a pointer to a PerlIOBuf can be +treated as a pointer to a PerlIOl. + +=end original + +In this way (as for perl's scalars) a pointer to a PerlIOBuf can be +treated as a pointer to a PerlIOl. +(TBT) + +=head2 Layers in action. + + table perlio unix + | | + +-----------+ +----------+ +--------+ + PerlIO ->| |--->| next |--->| NULL | + +-----------+ +----------+ +--------+ + | | | buffer | | fd | + +-----------+ | | +--------+ + | | +----------+ + +=begin original + +The above attempts to show how the layer scheme works in a simple case. +The application's C<PerlIO *> points to an entry in the table(s) +representing open (allocated) handles. For example the first three slots +in the table correspond to C<stdin>,C<stdout> and C<stderr>. The table +in turn points to the current "top" layer for the handle - in this case +an instance of the generic buffering layer "perlio". That layer in turn +points to the next layer down - in this case the low-level "unix" layer. + +=end original + +The above attempts to show how the layer scheme works in a simple case. +The application's C<PerlIO *> points to an entry in the table(s) +representing open (allocated) handles. For example the first three slots +in the table correspond to C<stdin>,C<stdout> and C<stderr>. The table +in turn points to the current "top" layer for the handle - in this case +an instance of the generic buffering layer "perlio". That layer in turn +points to the next layer down - in this case the low-level "unix" layer. +(TBT) + +=begin original + +The above is roughly equivalent to a "stdio" buffered stream, but with +much more flexibility: + +=end original + +The above is roughly equivalent to a "stdio" buffered stream, but with +much more flexibility: +(TBT) + +=over 4 + +=item * + +=begin original + +If Unix level C<read>/C<write>/C<lseek> is not appropriate for (say) +sockets then the "unix" layer can be replaced (at open time or even +dynamically) with a "socket" layer. + +=end original + +If Unix level C<read>/C<write>/C<lseek> is not appropriate for (say) +sockets then the "unix" layer can be replaced (at open time or even +dynamically) with a "socket" layer. +(TBT) + +=item * + +=begin original + +Different handles can have different buffering schemes. The "top" +layer could be the "mmap" layer if reading disk files was quicker +using C<mmap> than C<read>. An "unbuffered" stream can be implemented +simply by not having a buffer layer. + +=end original + +Different handles can have different buffering schemes. The "top" +layer could be the "mmap" layer if reading disk files was quicker +using C<mmap> than C<read>. An "unbuffered" stream can be implemented +simply by not having a buffer layer. +(TBT) + +=item * + +=begin original + +Extra layers can be inserted to process the data as it flows through. +This was the driving need for including the scheme in perl 5.7.0+ - we +needed a mechanism to allow data to be translated between perl's +internal encoding (conceptually at least Unicode as UTF-8), and the +"native" format used by the system. This is provided by the +":encoding(xxxx)" layer which typically sits above the buffering layer. + +=end original + +Extra layers can be inserted to process the data as it flows through. +This was the driving need for including the scheme in perl 5.7.0+ - we +needed a mechanism to allow data to be translated between perl's +internal encoding (conceptually at least Unicode as UTF-8), and the +"native" format used by the system. This is provided by the +":encoding(xxxx)" layer which typically sits above the buffering layer. +(TBT) + +=item * + +=begin original + +A layer can be added that does "\n" to CRLF translation. This layer +can be used on any platform, not just those that normally do such +things. + +=end original + +A layer can be added that does "\n" to CRLF translation. This layer +can be used on any platform, not just those that normally do such +things. +(TBT) + +=back + +=head2 Per-instance flag bits + +=begin original + +The generic flag bits are a hybrid of C<O_XXXXX> style flags deduced +from the mode string passed to C<PerlIO_open()>, and state bits for +typical buffer layers. + +=end original + +The generic flag bits are a hybrid of C<O_XXXXX> style flags deduced +from the mode string passed to C<PerlIO_open()>, and state bits for +typical buffer layers. +(TBT) + +=over 4 + +=item PERLIO_F_EOF + +=begin original + +End of file. + +=end original + +ファイルの末尾。 + +=item PERLIO_F_CANWRITE + +=begin original + +Writes are permitted, i.e. opened as "w" or "r+" or "a", etc. + +=end original + +書き込みが許可されている; つまり "w", "r+", "a" などとして開かれている。 + +=item PERLIO_F_CANREAD + +=begin original + +Reads are permitted i.e. opened "r" or "w+" (or even "a+" - ick). + +=end original + +読み込みが許可されている; "r", "w+" (または "a+" 的) として開かれている。 + +=item PERLIO_F_ERROR + +=begin original + +An error has occurred (for C<PerlIO_error()>). + +=end original + +(C<PerlIO_error()> のための) エラーが発生した。 + +=item PERLIO_F_TRUNCATE + +=begin original + +Truncate file suggested by open mode. + +=end original + +オープンモードで提案されたファイルを切り詰める。 + +=item PERLIO_F_APPEND + +=begin original + +All writes should be appends. + +=end original + +全ての書き込みは追記される。 + +=item PERLIO_F_CRLF + +=begin original + +Layer is performing Win32-like "\n" mapped to CR,LF for output and CR,LF +mapped to "\n" for input. Normally the provided "crlf" layer is the only +layer that need bother about this. C<PerlIO_binmode()> will mess with this +flag rather than add/remove layers if the C<PERLIO_K_CANCRLF> bit is set +for the layers class. + +=end original + +Layer is performing Win32-like "\n" mapped to CR,LF for output and CR,LF +mapped to "\n" for input. Normally the provided "crlf" layer is the only +layer that need bother about this. C<PerlIO_binmode()> will mess with this +flag rather than add/remove layers if the C<PERLIO_K_CANCRLF> bit is set +for the layers class. +(TBT) + +=item PERLIO_F_UTF8 + +=begin original + +Data written to this layer should be UTF-8 encoded; data provided +by this layer should be considered UTF-8 encoded. Can be set on any layer +by ":utf8" dummy layer. Also set on ":encoding" layer. + +=end original + +Data written to this layer should be UTF-8 encoded; data provided +by this layer should be considered UTF-8 encoded. Can be set on any layer +by ":utf8" dummy layer. Also set on ":encoding" layer. +(TBT) + +=item PERLIO_F_UNBUF + +=begin original + +Layer is unbuffered - i.e. write to next layer down should occur for +each write to this layer. + +=end original + +Layer is unbuffered - i.e. write to next layer down should occur for +each write to this layer. +(TBT) + +=item PERLIO_F_WRBUF + +=begin original + +The buffer for this layer currently holds data written to it but not sent +to next layer. + +=end original + +The buffer for this layer currently holds data written to it but not sent +to next layer. +(TBT) + +=item PERLIO_F_RDBUF + +=begin original + +The buffer for this layer currently holds unconsumed data read from +layer below. + +=end original + +The buffer for this layer currently holds unconsumed data read from +layer below. +(TBT) + +=item PERLIO_F_LINEBUF + +=begin original + +Layer is line buffered. Write data should be passed to next layer down +whenever a "\n" is seen. Any data beyond the "\n" should then be +processed. + +=end original + +Layer is line buffered. Write data should be passed to next layer down +whenever a "\n" is seen. Any data beyond the "\n" should then be +processed. +(TBT) + +=item PERLIO_F_TEMP + +=begin original + +File has been C<unlink()>ed, or should be deleted on C<close()>. + +=end original + +ファイルが C<unlink()> されている、または C<close()> で削除されるべき。 + +=item PERLIO_F_OPEN + +=begin original + +Handle is open. + +=end original + +ハンドルが開いている。 + +=item PERLIO_F_FASTGETS + +=begin original + +This instance of this layer supports the "fast C<gets>" interface. +Normally set based on C<PERLIO_K_FASTGETS> for the class and by the +existence of the function(s) in the table. However a class that +normally provides that interface may need to avoid it on a +particular instance. The "pending" layer needs to do this when +it is pushed above a layer which does not support the interface. +(Perl's C<sv_gets()> does not expect the streams fast C<gets> behaviour +to change during one "get".) + +=end original + +This instance of this layer supports the "fast C<gets>" interface. +Normally set based on C<PERLIO_K_FASTGETS> for the class and by the +existence of the function(s) in the table. However a class that +normally provides that interface may need to avoid it on a +particular instance. The "pending" layer needs to do this when +it is pushed above a layer which does not support the interface. +(Perl's C<sv_gets()> does not expect the streams fast C<gets> behaviour +to change during one "get".) +(TBT) + +=back + +=head2 Methods in Detail + +=over 4 + +=item fsize + + Size_t fsize; + +=begin original + +Size of the function table. This is compared against the value PerlIO +code "knows" as a compatibility check. Future versions I<may> be able +to tolerate layers compiled against an old version of the headers. + +=end original + +Size of the function table. This is compared against the value PerlIO +code "knows" as a compatibility check. Future versions I<may> be able +to tolerate layers compiled against an old version of the headers. +(TBT) + +=item name + + char * name; + +=begin original + +The name of the layer whose open() method Perl should invoke on +open(). For example if the layer is called APR, you will call: + +=end original + +The name of the layer whose open() method Perl should invoke on +open(). For example if the layer is called APR, you will call: +(TBT) + + open $fh, ">:APR", ... + +=begin original + +and Perl knows that it has to invoke the PerlIOAPR_open() method +implemented by the APR layer. + +=end original + +and Perl knows that it has to invoke the PerlIOAPR_open() method +implemented by the APR layer. +(TBT) + +=item size + + Size_t size; + +=begin original + +The size of the per-instance data structure, e.g.: + +=end original + +インスタンス単位のデータ構造体のサイズ; つまり: + + sizeof(PerlIOAPR) + +=begin original + +If this field is zero then C<PerlIO_pushed> does not malloc anything +and assumes layer's Pushed function will do any required layer stack +manipulation - used to avoid malloc/free overhead for dummy layers. +If the field is non-zero it must be at least the size of C<PerlIOl>, +C<PerlIO_pushed> will allocate memory for the layer's data structures +and link new layer onto the stream's stack. (If the layer's Pushed +method returns an error indication the layer is popped again.) + +=end original + +If this field is zero then C<PerlIO_pushed> does not malloc anything +and assumes layer's Pushed function will do any required layer stack +manipulation - used to avoid malloc/free overhead for dummy layers. +If the field is non-zero it must be at least the size of C<PerlIOl>, +C<PerlIO_pushed> will allocate memory for the layer's data structures +and link new layer onto the stream's stack. (If the layer's Pushed +method returns an error indication the layer is popped again.) +(TBT) + +=item kind + + IV kind; + +=over 4 + +=item * PERLIO_K_BUFFERED + +=begin original + +The layer is buffered. + +=end original + +層がバッファリングされている。 +(TBT) + +=item * PERLIO_K_RAW + +=begin original + +The layer is acceptable to have in a binmode(FH) stack - i.e. it does not +(or will configure itself not to) transform bytes passing through it. + +=end original + +The layer is acceptable to have in a binmode(FH) stack - i.e. it does not +(or will configure itself not to) transform bytes passing through it. +(TBT) + +=item * PERLIO_K_CANCRLF + +=begin original + +Layer can translate between "\n" and CRLF line ends. + +=end original + +層は "\n" と CRLF 行末を変換できる。 + +=item * PERLIO_K_FASTGETS + +=begin original + +Layer allows buffer snooping. + +=end original + +層はバッファを覗くことを許可している。 + +=item * PERLIO_K_MULTIARG + +=begin original + +Used when the layer's open() accepts more arguments than usual. The +extra arguments should come not before the C<MODE> argument. When this +flag is used it's up to the layer to validate the args. + +=end original + +Used when the layer's open() accepts more arguments than usual. The +extra arguments should come not before the C<MODE> argument. When this +flag is used it's up to the layer to validate the args. +(TBT) + +=back + +=item Pushed + + IV (*Pushed)(pTHX_ PerlIO *f,const char *mode, SV *arg); + +=begin original + +The only absolutely mandatory method. Called when the layer is pushed +onto the stack. The C<mode> argument may be NULL if this occurs +post-open. The C<arg> will be non-C<NULL> if an argument string was +passed. In most cases this should call C<PerlIOBase_pushed()> to +convert C<mode> into the appropriate C<PERLIO_F_XXXXX> flags in +addition to any actions the layer itself takes. If a layer is not +expecting an argument it need neither save the one passed to it, nor +provide C<Getarg()> (it could perhaps C<Perl_warn> that the argument +was un-expected). + +=end original + +The only absolutely mandatory method. Called when the layer is pushed +onto the stack. The C<mode> argument may be NULL if this occurs +post-open. The C<arg> will be non-C<NULL> if an argument string was +passed. In most cases this should call C<PerlIOBase_pushed()> to +convert C<mode> into the appropriate C<PERLIO_F_XXXXX> flags in +addition to any actions the layer itself takes. If a layer is not +expecting an argument it need neither save the one passed to it, nor +provide C<Getarg()> (it could perhaps C<Perl_warn> that the argument +was un-expected). +(TBT) + +=begin original + +Returns 0 on success. On failure returns -1 and should set errno. + +=end original + +成功時は 0 を返します。 +失敗時には -1 を返して errno が設定されます。 + + +=item Popped + + IV (*Popped)(pTHX_ PerlIO *f); + +=begin original + +Called when the layer is popped from the stack. A layer will normally +be popped after C<Close()> is called. But a layer can be popped +without being closed if the program is dynamically managing layers on +the stream. In such cases C<Popped()> should free any resources +(buffers, translation tables, ...) not held directly in the layer's +struct. It should also C<Unread()> any unconsumed data that has been +read and buffered from the layer below back to that layer, so that it +can be re-provided to what ever is now above. + +=end original + +Called when the layer is popped from the stack. A layer will normally +be popped after C<Close()> is called. But a layer can be popped +without being closed if the program is dynamically managing layers on +the stream. In such cases C<Popped()> should free any resources +(buffers, translation tables, ...) not held directly in the layer's +struct. It should also C<Unread()> any unconsumed data that has been +read and buffered from the layer below back to that layer, so that it +can be re-provided to what ever is now above. +(TBT) + +=begin original + +Returns 0 on success and failure. If C<Popped()> returns I<true> then +I<perlio.c> assumes that either the layer has popped itself, or the +layer is super special and needs to be retained for other reasons. +In most cases it should return I<false>. + +=end original + +Returns 0 on success and failure. If C<Popped()> returns I<true> then +I<perlio.c> assumes that either the layer has popped itself, or the +layer is super special and needs to be retained for other reasons. +In most cases it should return I<false>. +(TBT) + +=item Open + + PerlIO * (*Open)(...); + +=begin original + +The C<Open()> method has lots of arguments because it combines the +functions of perl's C<open>, C<PerlIO_open>, perl's C<sysopen>, +C<PerlIO_fdopen> and C<PerlIO_reopen>. The full prototype is as +follows: + +=end original + +The C<Open()> method has lots of arguments because it combines the +functions of perl's C<open>, C<PerlIO_open>, perl's C<sysopen>, +C<PerlIO_fdopen> and C<PerlIO_reopen>. The full prototype is as +follows: +(TBT) + + PerlIO * (*Open)(pTHX_ PerlIO_funcs *tab, + PerlIO_list_t *layers, IV n, + const char *mode, + int fd, int imode, int perm, + PerlIO *old, + int narg, SV **args); + +=begin original + +Open should (perhaps indirectly) call C<PerlIO_allocate()> to allocate +a slot in the table and associate it with the layers information for +the opened file, by calling C<PerlIO_push>. The I<layers> is an +array of all the layers destined for the C<PerlIO *>, and any +arguments passed to them, I<n> is the index into that array of the +layer being called. The macro C<PerlIOArg> will return a (possibly +C<NULL>) SV * for the argument passed to the layer. + +=end original + +Open should (perhaps indirectly) call C<PerlIO_allocate()> to allocate +a slot in the table and associate it with the layers information for +the opened file, by calling C<PerlIO_push>. The I<layers> is an +array of all the layers destined for the C<PerlIO *>, and any +arguments passed to them, I<n> is the index into that array of the +layer being called. The macro C<PerlIOArg> will return a (possibly +C<NULL>) SV * for the argument passed to the layer. +(TBT) + +=begin original + +The I<mode> string is an "C<fopen()>-like" string which would match +the regular expression C</^[I#]?[rwa]\+?[bt]?$/>. + +=end original + +The I<mode> string is an "C<fopen()>-like" string which would match +the regular expression C</^[I#]?[rwa]\+?[bt]?$/>. +(TBT) + +=begin original + +The C<'I'> prefix is used during creation of C<stdin>..C<stderr> via +special C<PerlIO_fdopen> calls; the C<'#'> prefix means that this is +C<sysopen> and that I<imode> and I<perm> should be passed to +C<PerlLIO_open3>; C<'r'> means B<r>ead, C<'w'> means B<w>rite and +C<'a'> means B<a>ppend. The C<'+'> suffix means that both reading and +writing/appending are permitted. The C<'b'> suffix means file should +be binary, and C<'t'> means it is text. (Almost all layers should do +the IO in binary mode, and ignore the b/t bits. The C<:crlf> layer +should be pushed to handle the distinction.) + +=end original + +The C<'I'> prefix is used during creation of C<stdin>..C<stderr> via +special C<PerlIO_fdopen> calls; the C<'#'> prefix means that this is +C<sysopen> and that I<imode> and I<perm> should be passed to +C<PerlLIO_open3>; C<'r'> means B<r>ead, C<'w'> means B<w>rite and +C<'a'> means B<a>ppend. The C<'+'> suffix means that both reading and +writing/appending are permitted. The C<'b'> suffix means file should +be binary, and C<'t'> means it is text. (Almost all layers should do +the IO in binary mode, and ignore the b/t bits. The C<:crlf> layer +should be pushed to handle the distinction.) +(TBT) + +=begin original + +If I<old> is not C<NULL> then this is a C<PerlIO_reopen>. Perl itself +does not use this (yet?) and semantics are a little vague. + +=end original + +If I<old> is not C<NULL> then this is a C<PerlIO_reopen>. Perl itself +does not use this (yet?) and semantics are a little vague. +(TBT) + +=begin original + +If I<fd> not negative then it is the numeric file descriptor I<fd>, +which will be open in a manner compatible with the supplied mode +string, the call is thus equivalent to C<PerlIO_fdopen>. In this case +I<nargs> will be zero. + +=end original + +If I<fd> not negative then it is the numeric file descriptor I<fd>, +which will be open in a manner compatible with the supplied mode +string, the call is thus equivalent to C<PerlIO_fdopen>. In this case +I<nargs> will be zero. +(TBT) + +=begin original + +If I<nargs> is greater than zero then it gives the number of arguments +passed to C<open>, otherwise it will be 1 if for example +C<PerlIO_open> was called. In simple cases SvPV_nolen(*args) is the +pathname to open. + +=end original + +If I<nargs> is greater than zero then it gives the number of arguments +passed to C<open>, otherwise it will be 1 if for example +C<PerlIO_open> was called. In simple cases SvPV_nolen(*args) is the +pathname to open. +(TBT) + +=begin original + +Having said all that translation-only layers do not need to provide +C<Open()> at all, but rather leave the opening to a lower level layer +and wait to be "pushed". If a layer does provide C<Open()> it should +normally call the C<Open()> method of next layer down (if any) and +then push itself on top if that succeeds. + +=end original + +Having said all that translation-only layers do not need to provide +C<Open()> at all, but rather leave the opening to a lower level layer +and wait to be "pushed". If a layer does provide C<Open()> it should +normally call the C<Open()> method of next layer down (if any) and +then push itself on top if that succeeds. +(TBT) + +=begin original + +If C<PerlIO_push> was performed and open has failed, it must +C<PerlIO_pop> itself, since if it's not, the layer won't be removed +and may cause bad problems. + +=end original + +If C<PerlIO_push> was performed and open has failed, it must +C<PerlIO_pop> itself, since if it's not, the layer won't be removed +and may cause bad problems. +(TBT) + +=begin original + +Returns C<NULL> on failure. + +=end original + +失敗時には C<NULL> を返します。 + +=item Binmode + + IV (*Binmode)(pTHX_ PerlIO *f); + +=begin original + +Optional. Used when C<:raw> layer is pushed (explicitly or as a result +of binmode(FH)). If not present layer will be popped. If present +should configure layer as binary (or pop itself) and return 0. +If it returns -1 for error C<binmode> will fail with layer +still on the stack. + +=end original + +Optional. Used when C<:raw> layer is pushed (explicitly or as a result +of binmode(FH)). If not present layer will be popped. If present +should configure layer as binary (or pop itself) and return 0. +If it returns -1 for error C<binmode> will fail with layer +still on the stack. +(TBT) + +=item Getarg + + SV * (*Getarg)(pTHX_ PerlIO *f, + CLONE_PARAMS *param, int flags); + +=begin original + +Optional. If present should return an SV * representing the string +argument passed to the layer when it was +pushed. e.g. ":encoding(ascii)" would return an SvPV with value +"ascii". (I<param> and I<flags> arguments can be ignored in most +cases) + +=end original + +Optional. If present should return an SV * representing the string +argument passed to the layer when it was +pushed. e.g. ":encoding(ascii)" would return an SvPV with value +"ascii". (I<param> and I<flags> arguments can be ignored in most +cases) +(TBT) + +=begin original + +C<Dup> uses C<Getarg> to retrieve the argument originally passed to +C<Pushed>, so you must implement this function if your layer has an +extra argument to C<Pushed> and will ever be C<Dup>ed. + +=end original + +C<Dup> uses C<Getarg> to retrieve the argument originally passed to +C<Pushed>, so you must implement this function if your layer has an +extra argument to C<Pushed> and will ever be C<Dup>ed. +(TBT) + +=item Fileno + + IV (*Fileno)(pTHX_ PerlIO *f); + +=begin original + +Returns the Unix/Posix numeric file descriptor for the handle. Normally +C<PerlIOBase_fileno()> (which just asks next layer down) will suffice +for this. + +=end original + +Returns the Unix/Posix numeric file descriptor for the handle. Normally +C<PerlIOBase_fileno()> (which just asks next layer down) will suffice +for this. +(TBT) + +=begin original + +Returns -1 on error, which is considered to include the case where the +layer cannot provide such a file descriptor. + +=end original + +Returns -1 on error, which is considered to include the case where the +layer cannot provide such a file descriptor. +(TBT) + +=item Dup + + PerlIO * (*Dup)(pTHX_ PerlIO *f, PerlIO *o, + CLONE_PARAMS *param, int flags); + +=begin original + +XXX: Needs more docs. + +=end original + +XXX: もっと文書が必要です。 + +=begin original + +Used as part of the "clone" process when a thread is spawned (in which +case param will be non-NULL) and when a stream is being duplicated via +'&' in the C<open>. + +=end original + +Used as part of the "clone" process when a thread is spawned (in which +case param will be non-NULL) and when a stream is being duplicated via +'&' in the C<open>. +(TBT) + +=begin original + +Similar to C<Open>, returns PerlIO* on success, C<NULL> on failure. + +=end original + +C<Open> と同様ですが、正常時には PerlIO* を返し、失敗時には C<NULL> を +返します。 + +=item Read + + SSize_t (*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count); + +=begin original + +Basic read operation. + +=end original + +基本読み込み操作です。 + +=begin original + +Typically will call C<Fill> and manipulate pointers (possibly via the +API). C<PerlIOBuf_read()> may be suitable for derived classes which +provide "fast gets" methods. + +=end original + +Typically will call C<Fill> and manipulate pointers (possibly via the +API). C<PerlIOBuf_read()> may be suitable for derived classes which +provide "fast gets" methods. +(TBT) + +=begin original + +Returns actual bytes read, or -1 on an error. + +=end original + +実際に読み込まれたバイト数か、エラー時には -1 を返します。 + +=item Unread + + SSize_t (*Unread)(pTHX_ PerlIO *f, + const void *vbuf, Size_t count); + +=begin original + +A superset of stdio's C<ungetc()>. Should arrange for future reads to +see the bytes in C<vbuf>. If there is no obviously better implementation +then C<PerlIOBase_unread()> provides the function by pushing a "fake" +"pending" layer above the calling layer. + +=end original + +A superset of stdio's C<ungetc()>. Should arrange for future reads to +see the bytes in C<vbuf>. If there is no obviously better implementation +then C<PerlIOBase_unread()> provides the function by pushing a "fake" +"pending" layer above the calling layer. +(TBT) + +=begin original + +Returns the number of unread chars. + +=end original + +まだ読み込んでいない文字の数を返します。 + +=item Write + + SSize_t (*Write)(PerlIO *f, const void *vbuf, Size_t count); + +=begin original + +Basic write operation. + +=end original + +基本書き込み操作です。 + +=begin original + +Returns bytes written or -1 on an error. + +=end original + +書き込まれたバイト数か、エラー時には -1 を返します。 + +=item Seek + + IV (*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence); + +=begin original + +Position the file pointer. Should normally call its own C<Flush> +method and then the C<Seek> method of next layer down. + +=end original + +Position the file pointer. Should normally call its own C<Flush> +method and then the C<Seek> method of next layer down. +(TBT) + +=begin original + +Returns 0 on success, -1 on failure. + +=end original + +成功時には 0 を、失敗時には -1 を返します。 + +=item Tell + + Off_t (*Tell)(pTHX_ PerlIO *f); + +=begin original + +Return the file pointer. May be based on layers cached concept of +position to avoid overhead. + +=end original + +Return the file pointer. May be based on layers cached concept of +position to avoid overhead. +(TBT) + +=begin original + +Returns -1 on failure to get the file pointer. + +=end original + +ファイルポインタヲ得るのに失敗した場合は -1 を返します。 + +=item Close + + IV (*Close)(pTHX_ PerlIO *f); + +=begin original + +Close the stream. Should normally call C<PerlIOBase_close()> to flush +itself and close layers below, and then deallocate any data structures +(buffers, translation tables, ...) not held directly in the data +structure. + +=end original + +Close the stream. Should normally call C<PerlIOBase_close()> to flush +itself and close layers below, and then deallocate any data structures +(buffers, translation tables, ...) not held directly in the data +structure. +(TBT) + +=begin original + +Returns 0 on success, -1 on failure. + +=end original + +成功時には 0 を、失敗時には -1 を返します。 + +=item Flush + + IV (*Flush)(pTHX_ PerlIO *f); + +=begin original + +Should make stream's state consistent with layers below. That is, any +buffered write data should be written, and file position of lower layers +adjusted for data read from below but not actually consumed. +(Should perhaps C<Unread()> such data to the lower layer.) + +=end original + +Should make stream's state consistent with layers below. That is, any +buffered write data should be written, and file position of lower layers +adjusted for data read from below but not actually consumed. +(Should perhaps C<Unread()> such data to the lower layer.) +(TBT) + +=begin original + +Returns 0 on success, -1 on failure. + +=end original + +成功時には 0 を、失敗時には -1 を返します。 + +=item Fill + + IV (*Fill)(pTHX_ PerlIO *f); + +=begin original + +The buffer for this layer should be filled (for read) from layer +below. When you "subclass" PerlIOBuf layer, you want to use its +I<_read> method and to supply your own fill method, which fills the +PerlIOBuf's buffer. + +=end original + +The buffer for this layer should be filled (for read) from layer +below. When you "subclass" PerlIOBuf layer, you want to use its +I<_read> method and to supply your own fill method, which fills the +PerlIOBuf's buffer. +(TBT) + +=begin original + +Returns 0 on success, -1 on failure. + +=end original + +成功時には 0 を、失敗時には -1 を返します。 + +=item Eof + + IV (*Eof)(pTHX_ PerlIO *f); + +=begin original + +Return end-of-file indicator. C<PerlIOBase_eof()> is normally sufficient. + +=end original + +Return end-of-file indicator. C<PerlIOBase_eof()> is normally sufficient. +(TBT) + +=begin original + +Returns 0 on end-of-file, 1 if not end-of-file, -1 on error. + +=end original + +ファイル末尾では 0 を、ファイル末尾でなければ 1 を、エラー時には -1 を +返します。 + +=item Error + + IV (*Error)(pTHX_ PerlIO *f); + +=begin original + +Return error indicator. C<PerlIOBase_error()> is normally sufficient. + +=end original + +Return error indicator. C<PerlIOBase_error()> is normally sufficient. +(TBT) + +=begin original + +Returns 1 if there is an error (usually when C<PERLIO_F_ERROR> is set, +0 otherwise. + +=end original + +Returns 1 if there is an error (usually when C<PERLIO_F_ERROR> is set, +0 otherwise. +(TBT) + +=item Clearerr + + void (*Clearerr)(pTHX_ PerlIO *f); + +=begin original + +Clear end-of-file and error indicators. Should call C<PerlIOBase_clearerr()> +to set the C<PERLIO_F_XXXXX> flags, which may suffice. + +=end original + +Clear end-of-file and error indicators. Should call C<PerlIOBase_clearerr()> +to set the C<PERLIO_F_XXXXX> flags, which may suffice. +(TBT) + +=item Setlinebuf + + void (*Setlinebuf)(pTHX_ PerlIO *f); + +=begin original + +Mark the stream as line buffered. C<PerlIOBase_setlinebuf()> sets the +PERLIO_F_LINEBUF flag and is normally sufficient. + +=end original + +Mark the stream as line buffered. C<PerlIOBase_setlinebuf()> sets the +PERLIO_F_LINEBUF flag and is normally sufficient. +(TBT) + +=item Get_base + + STDCHAR * (*Get_base)(pTHX_ PerlIO *f); + +=begin original + +Allocate (if not already done so) the read buffer for this layer and +return pointer to it. Return NULL on failure. + +=end original + +Allocate (if not already done so) the read buffer for this layer and +return pointer to it. Return NULL on failure. +(TBT) + +=item Get_bufsiz + + Size_t (*Get_bufsiz)(pTHX_ PerlIO *f); + +=begin original + +Return the number of bytes that last C<Fill()> put in the buffer. + +=end original + +Return the number of bytes that last C<Fill()> put in the buffer. +(TBT) + +=item Get_ptr + + STDCHAR * (*Get_ptr)(pTHX_ PerlIO *f); + +=begin original + +Return the current read pointer relative to this layer's buffer. + +=end original + +Return the current read pointer relative to this layer's buffer. +(TBT) + +=item Get_cnt + + SSize_t (*Get_cnt)(pTHX_ PerlIO *f); + +=begin original + +Return the number of bytes left to be read in the current buffer. + +=end original + +Return the number of bytes left to be read in the current buffer. +(TBT) + +=item Set_ptrcnt + + void (*Set_ptrcnt)(pTHX_ PerlIO *f, + STDCHAR *ptr, SSize_t cnt); + +=begin original + +Adjust the read pointer and count of bytes to match C<ptr> and/or C<cnt>. +The application (or layer above) must ensure they are consistent. +(Checking is allowed by the paranoid.) + +=end original + +Adjust the read pointer and count of bytes to match C<ptr> and/or C<cnt>. +The application (or layer above) must ensure they are consistent. +(Checking is allowed by the paranoid.) +(TBT) + +=back + +=head2 Utilities + +=begin original + +To ask for the next layer down use PerlIONext(PerlIO *f). + +=end original + +To ask for the next layer down use PerlIONext(PerlIO *f). +(TBT) + +=begin original + +To check that a PerlIO* is valid use PerlIOValid(PerlIO *f). (All +this does is really just to check that the pointer is non-NULL and +that the pointer behind that is non-NULL.) + +=end original + +To check that a PerlIO* is valid use PerlIOValid(PerlIO *f). (All +this does is really just to check that the pointer is non-NULL and +that the pointer behind that is non-NULL.) +(TBT) + +=begin original + +PerlIOBase(PerlIO *f) returns the "Base" pointer, or in other words, +the C<PerlIOl*> pointer. + +=end original + +PerlIOBase(PerlIO *f) returns the "Base" pointer, or in other words, +the C<PerlIOl*> pointer. +(TBT) + +=begin original + +PerlIOSelf(PerlIO* f, type) return the PerlIOBase cast to a type. + +=end original + +PerlIOSelf(PerlIO* f, type) return the PerlIOBase cast to a type. +(TBT) + +=begin original + +Perl_PerlIO_or_Base(PerlIO* f, callback, base, failure, args) either +calls the I<callback> from the functions of the layer I<f> (just by +the name of the IO function, like "Read") with the I<args>, or if +there is no such callback, calls the I<base> version of the callback +with the same args, or if the f is invalid, set errno to EBADF and +return I<failure>. + +=end original + +Perl_PerlIO_or_Base(PerlIO* f, callback, base, failure, args) either +calls the I<callback> from the functions of the layer I<f> (just by +the name of the IO function, like "Read") with the I<args>, or if +there is no such callback, calls the I<base> version of the callback +with the same args, or if the f is invalid, set errno to EBADF and +return I<failure>. +(TBT) + +=begin original + +Perl_PerlIO_or_fail(PerlIO* f, callback, failure, args) either calls +the I<callback> of the functions of the layer I<f> with the I<args>, +or if there is no such callback, set errno to EINVAL. Or if the f is +invalid, set errno to EBADF and return I<failure>. + +=end original + +Perl_PerlIO_or_fail(PerlIO* f, callback, failure, args) either calls +the I<callback> of the functions of the layer I<f> with the I<args>, +or if there is no such callback, set errno to EINVAL. Or if the f is +invalid, set errno to EBADF and return I<failure>. +(TBT) + +=begin original + +Perl_PerlIO_or_Base_void(PerlIO* f, callback, base, args) either calls +the I<callback> of the functions of the layer I<f> with the I<args>, +or if there is no such callback, calls the I<base> version of the +callback with the same args, or if the f is invalid, set errno to +EBADF. + +=end original + +Perl_PerlIO_or_Base_void(PerlIO* f, callback, base, args) either calls +the I<callback> of the functions of the layer I<f> with the I<args>, +or if there is no such callback, calls the I<base> version of the +callback with the same args, or if the f is invalid, set errno to +EBADF. +(TBT) + +=begin original + +Perl_PerlIO_or_fail_void(PerlIO* f, callback, args) either calls the +I<callback> of the functions of the layer I<f> with the I<args>, or if +there is no such callback, set errno to EINVAL. Or if the f is +invalid, set errno to EBADF. + +=end original + +Perl_PerlIO_or_fail_void(PerlIO* f, callback, args) either calls the +I<callback> of the functions of the layer I<f> with the I<args>, or if +there is no such callback, set errno to EINVAL. Or if the f is +invalid, set errno to EBADF. +(TBT) + +=head2 Implementing PerlIO Layers + +=begin original + +If you find the implementation document unclear or not sufficient, +look at the existing PerlIO layer implementations, which include: + +=end original + +If you find the implementation document unclear or not sufficient, +look at the existing PerlIO layer implementations, which include: +(TBT) + +=over + +=item * C implementations + +=begin original + +The F<perlio.c> and F<perliol.h> in the Perl core implement the +"unix", "perlio", "stdio", "crlf", "utf8", "byte", "raw", "pending" +layers, and also the "mmap" and "win32" layers if applicable. +(The "win32" is currently unfinished and unused, to see what is used +instead in Win32, see L<PerlIO/"Querying the layers of filehandles"> .) + +=end original + +The F<perlio.c> and F<perliol.h> in the Perl core implement the +"unix", "perlio", "stdio", "crlf", "utf8", "byte", "raw", "pending" +layers, and also the "mmap" and "win32" layers if applicable. +(The "win32" is currently unfinished and unused, to see what is used +instead in Win32, see L<PerlIO/"Querying the layers of filehandles"> .) +(TBT) + +=begin original + +PerlIO::encoding, PerlIO::scalar, PerlIO::via in the Perl core. + +=end original + +PerlIO::encoding, PerlIO::scalar, PerlIO::via in the Perl core. +(TBT) + +=begin original + +PerlIO::gzip and APR::PerlIO (mod_perl 2.0) on CPAN. + +=end original + +PerlIO::gzip and APR::PerlIO (mod_perl 2.0) on CPAN. +(TBT) + +=item * Perl implementations + +=begin original + +PerlIO::via::QuotedPrint in the Perl core and PerlIO::via::* on CPAN. + +=end original + +PerlIO::via::QuotedPrint in the Perl core and PerlIO::via::* on CPAN. +(TBT) + +=back + +=begin original + +If you are creating a PerlIO layer, you may want to be lazy, in other +words, implement only the methods that interest you. The other methods +you can either replace with the "blank" methods + +=end original + +If you are creating a PerlIO layer, you may want to be lazy, in other +words, implement only the methods that interest you. The other methods +you can either replace with the "blank" methods +(TBT) + + PerlIOBase_noop_ok + PerlIOBase_noop_fail + +=begin original + +(which do nothing, and return zero and -1, respectively) or for +certain methods you may assume a default behaviour by using a NULL +method. The Open method looks for help in the 'parent' layer. +The following table summarizes the behaviour: + +=end original + +(which do nothing, and return zero and -1, respectively) or for +certain methods you may assume a default behaviour by using a NULL +method. The Open method looks for help in the 'parent' layer. +The following table summarizes the behaviour: +(TBT) + + method behaviour with NULL + + Clearerr PerlIOBase_clearerr + Close PerlIOBase_close + Dup PerlIOBase_dup + Eof PerlIOBase_eof + Error PerlIOBase_error + Fileno PerlIOBase_fileno + Fill FAILURE + Flush SUCCESS + Getarg SUCCESS + Get_base FAILURE + Get_bufsiz FAILURE + Get_cnt FAILURE + Get_ptr FAILURE + Open INHERITED + Popped SUCCESS + Pushed SUCCESS + Read PerlIOBase_read + Seek FAILURE + Set_cnt FAILURE + Set_ptrcnt FAILURE + Setlinebuf PerlIOBase_setlinebuf + Tell FAILURE + Unread PerlIOBase_unread + Write FAILURE + + FAILURE Set errno (to EINVAL in UNIXish, to LIB$_INVARG in VMS) and + return -1 (for numeric return values) or NULL (for pointers) + INHERITED Inherited from the layer below + SUCCESS Return 0 (for numeric return values) or a pointer + +=head2 Core Layers + +=begin original + +The file C<perlio.c> provides the following layers: + +=end original + +The file C<perlio.c> provides the following layers: +(TBT) + +=over 4 + +=item "unix" + +=begin original + +A basic non-buffered layer which calls Unix/POSIX C<read()>, C<write()>, +C<lseek()>, C<close()>. No buffering. Even on platforms that distinguish +between O_TEXT and O_BINARY this layer is always O_BINARY. + +=end original + +A basic non-buffered layer which calls Unix/POSIX C<read()>, C<write()>, +C<lseek()>, C<close()>. No buffering. Even on platforms that distinguish +between O_TEXT and O_BINARY this layer is always O_BINARY. +(TBT) + +=item "perlio" + +=begin original + +A very complete generic buffering layer which provides the whole of +PerlIO API. It is also intended to be used as a "base class" for other +layers. (For example its C<Read()> method is implemented in terms of +the C<Get_cnt()>/C<Get_ptr()>/C<Set_ptrcnt()> methods). + +=end original + +A very complete generic buffering layer which provides the whole of +PerlIO API. It is also intended to be used as a "base class" for other +layers. (For example its C<Read()> method is implemented in terms of +the C<Get_cnt()>/C<Get_ptr()>/C<Set_ptrcnt()> methods). +(TBT) + +=begin original + +"perlio" over "unix" provides a complete replacement for stdio as seen +via PerlIO API. This is the default for USE_PERLIO when system's stdio +does not permit perl's "fast gets" access, and which do not +distinguish between C<O_TEXT> and C<O_BINARY>. + +=end original + +"perlio" over "unix" provides a complete replacement for stdio as seen +via PerlIO API. This is the default for USE_PERLIO when system's stdio +does not permit perl's "fast gets" access, and which do not +distinguish between C<O_TEXT> and C<O_BINARY>. +(TBT) + +=item "stdio" + +=begin original + +A layer which provides the PerlIO API via the layer scheme, but +implements it by calling system's stdio. This is (currently) the default +if system's stdio provides sufficient access to allow perl's "fast gets" +access and which do not distinguish between C<O_TEXT> and C<O_BINARY>. + +=end original + +A layer which provides the PerlIO API via the layer scheme, but +implements it by calling system's stdio. This is (currently) the default +if system's stdio provides sufficient access to allow perl's "fast gets" +access and which do not distinguish between C<O_TEXT> and C<O_BINARY>. +(TBT) + +=item "crlf" + +=begin original + +A layer derived using "perlio" as a base class. It provides Win32-like +"\n" to CR,LF translation. Can either be applied above "perlio" or serve +as the buffer layer itself. "crlf" over "unix" is the default if system +distinguishes between C<O_TEXT> and C<O_BINARY> opens. (At some point +"unix" will be replaced by a "native" Win32 IO layer on that platform, +as Win32's read/write layer has various drawbacks.) The "crlf" layer is +a reasonable model for a layer which transforms data in some way. + +=end original + +A layer derived using "perlio" as a base class. It provides Win32-like +"\n" to CR,LF translation. Can either be applied above "perlio" or serve +as the buffer layer itself. "crlf" over "unix" is the default if system +distinguishes between C<O_TEXT> and C<O_BINARY> opens. (At some point +"unix" will be replaced by a "native" Win32 IO layer on that platform, +as Win32's read/write layer has various drawbacks.) The "crlf" layer is +a reasonable model for a layer which transforms data in some way. +(TBT) + +=item "mmap" + +=begin original + +If Configure detects C<mmap()> functions this layer is provided (with +"perlio" as a "base") which does "read" operations by mmap()ing the +file. Performance improvement is marginal on modern systems, so it is +mainly there as a proof of concept. It is likely to be unbundled from +the core at some point. The "mmap" layer is a reasonable model for a +minimalist "derived" layer. + +=end original + +If Configure detects C<mmap()> functions this layer is provided (with +"perlio" as a "base") which does "read" operations by mmap()ing the +file. Performance improvement is marginal on modern systems, so it is +mainly there as a proof of concept. It is likely to be unbundled from +the core at some point. The "mmap" layer is a reasonable model for a +minimalist "derived" layer. +(TBT) + +=item "pending" + +=begin original + +An "internal" derivative of "perlio" which can be used to provide +Unread() function for layers which have no buffer or cannot be +bothered. (Basically this layer's C<Fill()> pops itself off the stack +and so resumes reading from layer below.) + +=end original + +An "internal" derivative of "perlio" which can be used to provide +Unread() function for layers which have no buffer or cannot be +bothered. (Basically this layer's C<Fill()> pops itself off the stack +and so resumes reading from layer below.) +(TBT) + +=item "raw" + +=begin original + +A dummy layer which never exists on the layer stack. Instead when +"pushed" it actually pops the stack removing itself, it then calls +Binmode function table entry on all the layers in the stack - normally +this (via PerlIOBase_binmode) removes any layers which do not have +C<PERLIO_K_RAW> bit set. Layers can modify that behaviour by defining +their own Binmode entry. + +=end original + +A dummy layer which never exists on the layer stack. Instead when +"pushed" it actually pops the stack removing itself, it then calls +Binmode function table entry on all the layers in the stack - normally +this (via PerlIOBase_binmode) removes any layers which do not have +C<PERLIO_K_RAW> bit set. Layers can modify that behaviour by defining +their own Binmode entry. +(TBT) + +=item "utf8" + +=begin original + +Another dummy layer. When pushed it pops itself and sets the +C<PERLIO_F_UTF8> flag on the layer which was (and now is once more) +the top of the stack. + +=end original + +Another dummy layer. When pushed it pops itself and sets the +C<PERLIO_F_UTF8> flag on the layer which was (and now is once more) +the top of the stack. +(TBT) + +=back + +=begin original + +In addition F<perlio.c> also provides a number of C<PerlIOBase_xxxx()> +functions which are intended to be used in the table slots of classes +which do not need to do anything special for a particular method. + +=end original + +In addition F<perlio.c> also provides a number of C<PerlIOBase_xxxx()> +functions which are intended to be used in the table slots of classes +which do not need to do anything special for a particular method. +(TBT) + +=head2 Extension Layers + +=begin original + +Layers can made available by extension modules. When an unknown layer +is encountered the PerlIO code will perform the equivalent of : + +=end original + +Layers can made available by extension modules. When an unknown layer +is encountered the PerlIO code will perform the equivalent of : +(TBT) + + use PerlIO 'layer'; + +=begin original + +Where I<layer> is the unknown layer. F<PerlIO.pm> will then attempt to: + +=end original + +Where I<layer> is the unknown layer. F<PerlIO.pm> will then attempt to: +(TBT) + + require PerlIO::layer; + +=begin original + +If after that process the layer is still not defined then the C<open> +will fail. + +=end original + +If after that process the layer is still not defined then the C<open> +will fail. +(TBT) + +=begin original + +The following extension layers are bundled with perl: + +=end original + +The following extension layers are bundled with perl: +(TBT) + +=over 4 + +=item ":encoding" + + use Encoding; + +=begin original + +makes this layer available, although F<PerlIO.pm> "knows" where to +find it. It is an example of a layer which takes an argument as it is +called thus: + +=end original + +makes this layer available, although F<PerlIO.pm> "knows" where to +find it. It is an example of a layer which takes an argument as it is +called thus: +(TBT) + + open( $fh, "<:encoding(iso-8859-7)", $pathname ); + +=item ":scalar" + +=begin original + +Provides support for reading data from and writing data to a scalar. + +=end original + +Provides support for reading data from and writing data to a scalar. +(TBT) + + open( $fh, "+<:scalar", \$scalar ); + +=begin original + +When a handle is so opened, then reads get bytes from the string value +of I<$scalar>, and writes change the value. In both cases the position +in I<$scalar> starts as zero but can be altered via C<seek>, and +determined via C<tell>. + +=end original + +When a handle is so opened, then reads get bytes from the string value +of I<$scalar>, and writes change the value. In both cases the position +in I<$scalar> starts as zero but can be altered via C<seek>, and +determined via C<tell>. +(TBT) + +=begin original + +Please note that this layer is implied when calling open() thus: + +=end original + +Please note that this layer is implied when calling open() thus: +(TBT) + + open( $fh, "+<", \$scalar ); + +=item ":via" + +=begin original + +Provided to allow layers to be implemented as Perl code. For instance: + +=end original + +Provided to allow layers to be implemented as Perl code. For instance: +(TBT) + + use PerlIO::via::StripHTML; + open( my $fh, "<:via(StripHTML)", "index.html" ); + +=begin original + +See L<PerlIO::via> for details. + +=end original + +See L<PerlIO::via> for details. +(TBT) + +=back + +=head1 TODO + +=begin original + +Things that need to be done to improve this document. + +=end original + +Things that need to be done to improve this document. +(TBT) + +=over + +=item * + +=begin original + +Explain how to make a valid fh without going through open()(i.e. apply +a layer). For example if the file is not opened through perl, but we +want to get back a fh, like it was opened by Perl. + +=end original + +Explain how to make a valid fh without going through open()(i.e. apply +a layer). For example if the file is not opened through perl, but we +want to get back a fh, like it was opened by Perl. +(TBT) + +=begin original + +How PerlIO_apply_layera fits in, where its docs, was it made public? + +=end original + +How PerlIO_apply_layera fits in, where its docs, was it made public? +(TBT) + +=begin original + +Currently the example could be something like this: + +=end original + +Currently the example could be something like this: +(TBT) + + PerlIO *foo_to_PerlIO(pTHX_ char *mode, ...) + { + char *mode; /* "w", "r", etc */ + const char *layers = ":APR"; /* the layer name */ + PerlIO *f = PerlIO_allocate(aTHX); + if (!f) { + return NULL; + } + + PerlIO_apply_layers(aTHX_ f, mode, layers); + + if (f) { + PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); + /* fill in the st struct, as in _open() */ + st->file = file; + PerlIOBase(f)->flags |= PERLIO_F_OPEN; + + return f; + } + return NULL; + } + +=item * + +=begin original + +fix/add the documentation in places marked as XXX. + +=end original + +fix/add the documentation in places marked as XXX. +(TBT) + +=item * + +=begin original + +The handling of errors by the layer is not specified. e.g. when $! +should be set explicitly, when the error handling should be just +delegated to the top layer. + +=end original + +The handling of errors by the layer is not specified. e.g. when $! +should be set explicitly, when the error handling should be just +delegated to the top layer. +(TBT) + +=begin original + +Probably give some hints on using SETERRNO() or pointers to where they +can be found. + +=end original + +Probably give some hints on using SETERRNO() or pointers to where they +can be found. +(TBT) + +=item * + +=begin original + +I think it would help to give some concrete examples to make it easier +to understand the API. Of course I agree that the API has to be +concise, but since there is no second document that is more of a +guide, I think that it'd make it easier to start with the doc which is +an API, but has examples in it in places where things are unclear, to +a person who is not a PerlIO guru (yet). + +=end original + +I think it would help to give some concrete examples to make it easier +to understand the API. Of course I agree that the API has to be +concise, but since there is no second document that is more of a +guide, I think that it'd make it easier to start with the doc which is +an API, but has examples in it in places where things are unclear, to +a person who is not a PerlIO guru (yet). +(TBT) + +=back + +=begin meta + +Translate: SHIRAKATA Kentaro <argra****@ub32*****> +Status: in progress + +=end meta + +=cut +