1N/A#define PERL_NO_GET_CONTEXT
1N/A#include "EXTERN.h"
1N/A#include "perl.h"
1N/A#include "XSUB.h"
1N/A#ifdef PERLIO_LAYERS
1N/A
1N/A#include "perliol.h"
1N/A
1N/Atypedef struct
1N/A{
1N/A struct _PerlIO base; /* Base "class" info */
1N/A HV * stash;
1N/A SV * obj;
1N/A SV * var;
1N/A SSize_t cnt;
1N/A IO * io;
1N/A SV * fh;
1N/A CV *PUSHED;
1N/A CV *POPPED;
1N/A CV *OPEN;
1N/A CV *FDOPEN;
1N/A CV *SYSOPEN;
1N/A CV *GETARG;
1N/A CV *FILENO;
1N/A CV *READ;
1N/A CV *WRITE;
1N/A CV *FILL;
1N/A CV *CLOSE;
1N/A CV *SEEK;
1N/A CV *TELL;
1N/A CV *UNREAD;
1N/A CV *FLUSH;
1N/A CV *SETLINEBUF;
1N/A CV *CLEARERR;
1N/A CV *mERROR;
1N/A CV *mEOF;
1N/A CV *BINMODE;
1N/A CV *UTF8;
1N/A} PerlIOVia;
1N/A
1N/A#define MYMethod(x) #x,&s->x
1N/A
1N/ACV *
1N/APerlIOVia_fetchmethod(pTHX_ PerlIOVia * s, char *method, CV ** save)
1N/A{
1N/A GV *gv = gv_fetchmeth(s->stash, method, strlen(method), 0);
1N/A#if 0
1N/A Perl_warn(aTHX_ "Lookup %s::%s => %p", HvNAME(s->stash), method, gv);
1N/A#endif
1N/A if (gv) {
1N/A return *save = GvCV(gv);
1N/A }
1N/A else {
1N/A return *save = (CV *) - 1;
1N/A }
1N/A}
1N/A
1N/A/*
1N/A * Try and call method, possibly via cached lookup.
1N/A * If method does not exist return Nullsv (caller may fallback to another approach
1N/A * If method does exist call it with flags passing variable number of args
1N/A * Last arg is a "filehandle" to layer below (if present)
1N/A * Returns scalar returned by method (if any) otherwise sv_undef
1N/A */
1N/A
1N/ASV *
1N/APerlIOVia_method(pTHX_ PerlIO * f, char *method, CV ** save, int flags,
1N/A ...)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A CV *cv =
1N/A (*save) ? *save : PerlIOVia_fetchmethod(aTHX_ s, method, save);
1N/A SV *result = Nullsv;
1N/A va_list ap;
1N/A va_start(ap, flags);
1N/A if (cv != (CV *) - 1) {
1N/A IV count;
1N/A dSP;
1N/A SV *arg;
1N/A PUSHSTACKi(PERLSI_MAGIC);
1N/A ENTER;
1N/A SPAGAIN;
1N/A PUSHMARK(sp);
1N/A XPUSHs(s->obj);
1N/A while ((arg = va_arg(ap, SV *))) {
1N/A XPUSHs(arg);
1N/A }
1N/A if (*PerlIONext(f)) {
1N/A if (!s->fh) {
1N/A GV *gv = newGVgen(HvNAME(s->stash));
1N/A GvIOp(gv) = newIO();
1N/A s->fh = newRV_noinc((SV *) gv);
1N/A s->io = GvIOp(gv);
1N/A }
1N/A IoIFP(s->io) = PerlIONext(f);
1N/A IoOFP(s->io) = PerlIONext(f);
1N/A XPUSHs(s->fh);
1N/A }
1N/A else {
1N/A PerlIO_debug("No next\n");
1N/A /* FIXME: How should this work for OPEN etc? */
1N/A }
1N/A PUTBACK;
1N/A count = call_sv((SV *) cv, flags);
1N/A if (count) {
1N/A SPAGAIN;
1N/A result = POPs;
1N/A PUTBACK;
1N/A }
1N/A else {
1N/A result = &PL_sv_undef;
1N/A }
1N/A LEAVE;
1N/A POPSTACK;
1N/A }
1N/A va_end(ap);
1N/A return result;
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg,
1N/A PerlIO_funcs * tab)
1N/A{
1N/A IV code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
1N/A if (code == 0) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A if (!arg) {
1N/A if (ckWARN(WARN_LAYER))
1N/A Perl_warner(aTHX_ packWARN(WARN_LAYER),
1N/A "No package specified");
1N/A errno = EINVAL;
1N/A code = -1;
1N/A }
1N/A else {
1N/A STRLEN pkglen = 0;
1N/A char *pkg = SvPV(arg, pkglen);
1N/A s->obj = SvREFCNT_inc(arg);
1N/A s->stash = gv_stashpvn(pkg, pkglen, FALSE);
1N/A if (!s->stash) {
1N/A s->obj =
1N/A newSVpvn(Perl_form(aTHX_ "PerlIO::via::%s", pkg),
1N/A pkglen + 13);
1N/A SvREFCNT_dec(arg);
1N/A s->stash = gv_stashpvn(SvPVX(s->obj), pkglen + 13, FALSE);
1N/A }
1N/A if (s->stash) {
1N/A char lmode[8];
1N/A SV *modesv;
1N/A SV *result;
1N/A if (!mode) {
1N/A /* binmode() passes NULL - so find out what mode is */
1N/A mode = PerlIO_modestr(f,lmode);
1N/A }
1N/A modesv = sv_2mortal(newSVpvn(mode, strlen(mode)));
1N/A result = PerlIOVia_method(aTHX_ f, MYMethod(PUSHED), G_SCALAR,
1N/A modesv, Nullsv);
1N/A if (result) {
1N/A if (sv_isobject(result)) {
1N/A s->obj = SvREFCNT_inc(result);
1N/A SvREFCNT_dec(arg);
1N/A }
1N/A else if (SvIV(result) != 0)
1N/A return SvIV(result);
1N/A }
1N/A else {
1N/A goto push_failed;
1N/A }
1N/A modesv = (*PerlIONext(f) && (PerlIOBase(PerlIONext(f))->flags & PERLIO_F_UTF8))
1N/A ? &PL_sv_yes : &PL_sv_no;
1N/A result = PerlIOVia_method(aTHX_ f, MYMethod(UTF8), G_SCALAR, modesv, Nullsv);
1N/A if (result && SvTRUE(result)) {
1N/A PerlIOBase(f)->flags |= ~PERLIO_F_UTF8;
1N/A }
1N/A else {
1N/A PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1N/A }
1N/A if (PerlIOVia_fetchmethod(aTHX_ s, MYMethod(FILL)) ==
1N/A (CV *) - 1)
1N/A PerlIOBase(f)->flags &= ~PERLIO_F_FASTGETS;
1N/A else
1N/A PerlIOBase(f)->flags |= PERLIO_F_FASTGETS;
1N/A }
1N/A else {
1N/A if (ckWARN(WARN_LAYER))
1N/A Perl_warner(aTHX_ packWARN(WARN_LAYER),
1N/A "Cannot find package '%.*s'", (int) pkglen,
1N/A pkg);
1N/Apush_failed:
1N/A#ifdef ENOSYS
1N/A errno = ENOSYS;
1N/A#else
1N/A#ifdef ENOENT
1N/A errno = ENOENT;
1N/A#endif
1N/A#endif
1N/A code = -1;
1N/A }
1N/A }
1N/A }
1N/A return code;
1N/A}
1N/A
1N/APerlIO *
1N/APerlIOVia_open(pTHX_ PerlIO_funcs * self, PerlIO_list_t * layers,
1N/A IV n, const char *mode, int fd, int imode, int perm,
1N/A PerlIO * f, int narg, SV ** args)
1N/A{
1N/A if (!f) {
1N/A f = PerlIO_push(aTHX_ PerlIO_allocate(aTHX), self, mode,
1N/A PerlIOArg);
1N/A }
1N/A else {
1N/A /* Reopen */
1N/A if (!PerlIO_push(aTHX_ f, self, mode, PerlIOArg))
1N/A return NULL;
1N/A }
1N/A if (f) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result = Nullsv;
1N/A if (fd >= 0) {
1N/A SV *fdsv = sv_2mortal(newSViv(fd));
1N/A result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(FDOPEN), G_SCALAR, fdsv,
1N/A Nullsv);
1N/A }
1N/A else if (narg > 0) {
1N/A if (*mode == '#') {
1N/A SV *imodesv = sv_2mortal(newSViv(imode));
1N/A SV *permsv = sv_2mortal(newSViv(perm));
1N/A result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(SYSOPEN), G_SCALAR,
1N/A *args, imodesv, permsv, Nullsv);
1N/A }
1N/A else {
1N/A result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(OPEN), G_SCALAR,
1N/A *args, Nullsv);
1N/A }
1N/A }
1N/A if (result) {
1N/A if (sv_isobject(result))
1N/A s->obj = SvREFCNT_inc(result);
1N/A else if (!SvTRUE(result)) {
1N/A return NULL;
1N/A }
1N/A }
1N/A else {
1N/A /* Required open method not present */
1N/A PerlIO_funcs *tab = NULL;
1N/A IV m = n - 1;
1N/A while (m >= 0) {
1N/A PerlIO_funcs *t =
1N/A PerlIO_layer_fetch(aTHX_ layers, m, NULL);
1N/A if (t && t->Open) {
1N/A tab = t;
1N/A break;
1N/A }
1N/A n--;
1N/A }
1N/A if (tab) {
1N/A if ((*tab->Open) (aTHX_ tab, layers, m, mode, fd, imode,
1N/A perm, PerlIONext(f), narg, args)) {
1N/A PerlIO_debug("Opened with %s => %p->%p\n", tab->name,
1N/A PerlIONext(f), *PerlIONext(f));
1N/A if (m + 1 < n) {
1N/A /*
1N/A * More layers above the one that we used to open -
1N/A * apply them now
1N/A */
1N/A if (PerlIO_apply_layera
1N/A (aTHX_ PerlIONext(f), mode, layers, m + 1,
1N/A n) != 0) {
1N/A /* If pushing layers fails close the file */
1N/A PerlIO_close(f);
1N/A f = NULL;
1N/A }
1N/A }
1N/A /* FIXME - Call an OPENED method here ? */
1N/A return f;
1N/A }
1N/A else {
1N/A PerlIO_debug("Open fail %s => %p->%p\n", tab->name,
1N/A PerlIONext(f), *PerlIONext(f));
1N/A /* Sub-layer open failed */
1N/A }
1N/A }
1N/A else {
1N/A PerlIO_debug("Nothing to open with");
1N/A /* Nothing to do the open */
1N/A }
1N/A PerlIO_pop(aTHX_ f);
1N/A return NULL;
1N/A }
1N/A }
1N/A return f;
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_popped(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A PerlIOVia_method(aTHX_ f, MYMethod(POPPED), G_VOID, Nullsv);
1N/A if (s->var) {
1N/A SvREFCNT_dec(s->var);
1N/A s->var = Nullsv;
1N/A }
1N/A
1N/A if (s->io) {
1N/A IoIFP(s->io) = NULL;
1N/A IoOFP(s->io) = NULL;
1N/A }
1N/A if (s->fh) {
1N/A SvREFCNT_dec(s->fh);
1N/A s->fh = Nullsv;
1N/A s->io = NULL;
1N/A }
1N/A if (s->obj) {
1N/A SvREFCNT_dec(s->obj);
1N/A s->obj = Nullsv;
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_close(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A IV code = PerlIOBase_close(aTHX_ f);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(CLOSE), G_SCALAR, Nullsv);
1N/A if (result && SvIV(result) != 0)
1N/A code = SvIV(result);
1N/A PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
1N/A return code;
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_fileno(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(FILENO), G_SCALAR, Nullsv);
1N/A return (result) ? SvIV(result) : PerlIO_fileno(PerlIONext(f));
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_binmode(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(BINMODE), G_SCALAR, Nullsv);
1N/A if (!result || !SvOK(result)) {
1N/A PerlIO_pop(aTHX_ f);
1N/A return 0;
1N/A }
1N/A return SvIV(result);
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_seek(pTHX_ PerlIO * f, Off_t offset, int whence)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *offsv = sv_2mortal(sizeof(Off_t) > sizeof(IV)
1N/A ? newSVnv((NV)offset) : newSViv((IV)offset));
1N/A SV *whsv = sv_2mortal(newSViv(whence));
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(SEEK), G_SCALAR, offsv, whsv,
1N/A Nullsv);
1N/A#if Off_t_size == 8 && defined(CONDOP_SIZE) && CONDOP_SIZE < Off_t_size
1N/A if (result)
1N/A return (Off_t) SvIV(result);
1N/A else
1N/A return (Off_t) -1;
1N/A#else
1N/A return (result) ? SvIV(result) : -1;
1N/A#endif
1N/A}
1N/A
1N/AOff_t
1N/APerlIOVia_tell(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(TELL), G_SCALAR, Nullsv);
1N/A return (result)
1N/A ? (SvNOK(result) ? (Off_t)SvNV(result) : (Off_t)SvIV(result))
1N/A : (Off_t) - 1;
1N/A}
1N/A
1N/ASSize_t
1N/APerlIOVia_unread(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *buf = sv_2mortal(newSVpvn((char *) vbuf, count));
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(UNREAD), G_SCALAR, buf, Nullsv);
1N/A if (result)
1N/A return (SSize_t) SvIV(result);
1N/A else {
1N/A return PerlIOBase_unread(aTHX_ f, vbuf, count);
1N/A }
1N/A}
1N/A
1N/ASSize_t
1N/APerlIOVia_read(pTHX_ PerlIO * f, void *vbuf, Size_t count)
1N/A{
1N/A SSize_t rd = 0;
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
1N/A if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
1N/A rd = PerlIOBase_read(aTHX_ f, vbuf, count);
1N/A }
1N/A else {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *buf = sv_2mortal(newSV(count));
1N/A SV *n = sv_2mortal(newSViv(count));
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(READ), G_SCALAR, buf, n,
1N/A Nullsv);
1N/A if (result) {
1N/A rd = (SSize_t) SvIV(result);
1N/A Move(SvPVX(buf), vbuf, rd, char);
1N/A return rd;
1N/A }
1N/A }
1N/A }
1N/A return rd;
1N/A}
1N/A
1N/ASSize_t
1N/APerlIOVia_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
1N/A{
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *buf = newSVpvn((char *) vbuf, count);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(WRITE), G_SCALAR, buf,
1N/A Nullsv);
1N/A SvREFCNT_dec(buf);
1N/A if (result)
1N/A return (SSize_t) SvIV(result);
1N/A return -1;
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_fill(pTHX_ PerlIO * f)
1N/A{
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(FILL), G_SCALAR, Nullsv);
1N/A if (s->var) {
1N/A SvREFCNT_dec(s->var);
1N/A s->var = Nullsv;
1N/A }
1N/A if (result && SvOK(result)) {
1N/A STRLEN len = 0;
1N/A char *p = SvPV(result, len);
1N/A s->var = newSVpvn(p, len);
1N/A s->cnt = SvCUR(s->var);
1N/A return 0;
1N/A }
1N/A else
1N/A PerlIOBase(f)->flags |= PERLIO_F_EOF;
1N/A }
1N/A return -1;
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_flush(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, MYMethod(FLUSH), G_SCALAR, Nullsv);
1N/A if (s->var && s->cnt > 0) {
1N/A SvREFCNT_dec(s->var);
1N/A s->var = Nullsv;
1N/A }
1N/A return (result) ? SvIV(result) : 0;
1N/A}
1N/A
1N/ASTDCHAR *
1N/APerlIOVia_get_base(pTHX_ PerlIO * f)
1N/A{
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A if (s->var) {
1N/A return (STDCHAR *) SvPVX(s->var);
1N/A }
1N/A }
1N/A return (STDCHAR *) Nullch;
1N/A}
1N/A
1N/ASTDCHAR *
1N/APerlIOVia_get_ptr(pTHX_ PerlIO * f)
1N/A{
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A if (s->var) {
1N/A STDCHAR *p = (STDCHAR *) (SvEND(s->var) - s->cnt);
1N/A return p;
1N/A }
1N/A }
1N/A return (STDCHAR *) Nullch;
1N/A}
1N/A
1N/ASSize_t
1N/APerlIOVia_get_cnt(pTHX_ PerlIO * f)
1N/A{
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A if (s->var) {
1N/A return s->cnt;
1N/A }
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/ASize_t
1N/APerlIOVia_bufsiz(pTHX_ PerlIO * f)
1N/A{
1N/A if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A if (s->var)
1N/A return SvCUR(s->var);
1N/A }
1N/A return 0;
1N/A}
1N/A
1N/Avoid
1N/APerlIOVia_set_ptrcnt(pTHX_ PerlIO * f, STDCHAR * ptr, SSize_t cnt)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A s->cnt = cnt;
1N/A}
1N/A
1N/Avoid
1N/APerlIOVia_setlinebuf(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A PerlIOVia_method(aTHX_ f, MYMethod(SETLINEBUF), G_VOID, Nullsv);
1N/A PerlIOBase_setlinebuf(aTHX_ f);
1N/A}
1N/A
1N/Avoid
1N/APerlIOVia_clearerr(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A PerlIOVia_method(aTHX_ f, MYMethod(CLEARERR), G_VOID, Nullsv);
1N/A PerlIOBase_clearerr(aTHX_ f);
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_error(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, "ERROR", &s->mERROR, G_SCALAR, Nullsv);
1N/A return (result) ? SvIV(result) : PerlIOBase_error(aTHX_ f);
1N/A}
1N/A
1N/AIV
1N/APerlIOVia_eof(pTHX_ PerlIO * f)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A SV *result =
1N/A PerlIOVia_method(aTHX_ f, "EOF", &s->mEOF, G_SCALAR, Nullsv);
1N/A return (result) ? SvIV(result) : PerlIOBase_eof(aTHX_ f);
1N/A}
1N/A
1N/ASV *
1N/APerlIOVia_getarg(pTHX_ PerlIO * f, CLONE_PARAMS * param, int flags)
1N/A{
1N/A PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
1N/A return PerlIOVia_method(aTHX_ f, MYMethod(GETARG), G_SCALAR, Nullsv);
1N/A}
1N/A
1N/APerlIO *
1N/APerlIOVia_dup(pTHX_ PerlIO * f, PerlIO * o, CLONE_PARAMS * param,
1N/A int flags)
1N/A{
1N/A if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
1N/A /* Most of the fields will lazily set themselves up as needed
1N/A stash and obj have been set up by the implied push
1N/A */
1N/A }
1N/A return f;
1N/A}
1N/A
1N/A
1N/A
1N/APerlIO_funcs PerlIO_object = {
1N/A sizeof(PerlIO_funcs),
1N/A "via",
1N/A sizeof(PerlIOVia),
1N/A PERLIO_K_BUFFERED|PERLIO_K_DESTRUCT,
1N/A PerlIOVia_pushed,
1N/A PerlIOVia_popped,
1N/A PerlIOVia_open, /* NULL, */
1N/A PerlIOVia_binmode, /* NULL, */
1N/A PerlIOVia_getarg,
1N/A PerlIOVia_fileno,
1N/A PerlIOVia_dup,
1N/A PerlIOVia_read,
1N/A PerlIOVia_unread,
1N/A PerlIOVia_write,
1N/A PerlIOVia_seek,
1N/A PerlIOVia_tell,
1N/A PerlIOVia_close,
1N/A PerlIOVia_flush,
1N/A PerlIOVia_fill,
1N/A PerlIOVia_eof,
1N/A PerlIOVia_error,
1N/A PerlIOVia_clearerr,
1N/A PerlIOVia_setlinebuf,
1N/A PerlIOVia_get_base,
1N/A PerlIOVia_bufsiz,
1N/A PerlIOVia_get_ptr,
1N/A PerlIOVia_get_cnt,
1N/A PerlIOVia_set_ptrcnt,
1N/A};
1N/A
1N/A
1N/A#endif /* Layers available */
1N/A
1N/AMODULE = PerlIO::via PACKAGE = PerlIO::via
1N/APROTOTYPES: ENABLE;
1N/A
1N/ABOOT:
1N/A{
1N/A#ifdef PERLIO_LAYERS
1N/A PerlIO_define_layer(aTHX_ &PerlIO_object);
1N/A#endif
1N/A}
1N/A
1N/A
1N/A
1N/A
1N/A