3 * Copyright (c) 1996-2001, Nick Ing-Simmons
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
17 #define PERLIO_NOT_STDIO 0
18 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
19 /* #define PerlIO FILE */
22 * This file provides those parts of PerlIO abstraction
23 * which are not #defined in perlio.h.
24 * Which these are depends on various Configure #ifdef's
28 #define PERL_IN_PERLIO_C
31 #undef PerlMemShared_calloc
32 #define PerlMemShared_calloc(x,y) calloc(x,y)
33 #undef PerlMemShared_free
34 #define PerlMemShared_free(x) free(x)
37 perlsio_binmode(FILE *fp, int iotype, int mode)
39 /* This used to be contents of do_binmode in doio.c */
41 # if defined(atarist) || defined(__MINT__)
44 ((FILE*)fp)->_flag |= _IOBIN;
46 ((FILE*)fp)->_flag &= ~ _IOBIN;
52 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
53 # if defined(WIN32) && defined(__BORLANDC__)
54 /* The translation mode of the stream is maintained independent
55 * of the translation mode of the fd in the Borland RTL (heavy
56 * digging through their runtime sources reveal). User has to
57 * set the mode explicitly for the stream (though they don't
58 * document this anywhere). GSAR 97-5-24
64 fp->flags &= ~ _F_BIN;
72 # if defined(USEMYBINMODE)
73 if (my_binmode(fp, iotype, mode) != FALSE)
85 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
87 if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
91 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
102 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
104 return perlsio_binmode(fp,iotype,mode);
107 /* De-mux PerlIO_openn() into fdopen, freopen and fopen type entries */
110 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
114 if (*args == &PL_sv_undef)
115 return PerlIO_tmpfile();
118 char *name = SvPV_nolen(*args);
121 fd = PerlLIO_open3(name,imode,perm);
123 return PerlIO_fdopen(fd,(char *)mode+1);
127 return PerlIO_reopen(name,mode,old);
131 return PerlIO_open(name,mode);
137 return PerlIO_fdopen(fd,(char *)mode);
145 #ifdef PERLIO_IS_STDIO
150 /* Does nothing (yet) except force this file to be included
151 in perl binary. That allows this file to force inclusion
152 of other functions that may be required by loadable
153 extensions e.g. for FileHandle::tmpfile
157 #undef PerlIO_tmpfile
164 #else /* PERLIO_IS_STDIO */
171 /* This section is just to make sure these functions
172 get pulled in from libsfio.a
175 #undef PerlIO_tmpfile
185 /* Force this file to be included in perl binary. Which allows
186 * this file to force inclusion of other functions that may be
187 * required by loadable extensions e.g. for FileHandle::tmpfile
191 * sfio does its own 'autoflush' on stdout in common cases.
192 * Flush results in a lot of lseek()s to regular files and
193 * lot of small writes to pipes.
195 sfset(sfstdout,SF_SHARE,0);
199 /*======================================================================================*/
200 /* Implement all the PerlIO interface ourselves.
205 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
210 #include <sys/mman.h>
215 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
218 PerlIO_debug(const char *fmt,...)
226 char *s = PerlEnv_getenv("PERLIO_DEBUG");
228 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
235 SV *sv = newSVpvn("",0);
238 s = CopFILE(PL_curcop);
241 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
242 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
245 PerlLIO_write(dbg,s,len);
251 /*--------------------------------------------------------------------------------------*/
253 /* Inner level routines */
255 /* Table of pointers to the PerlIO structs (malloc'ed) */
256 PerlIO *_perlio = NULL;
257 #define PERLIO_TABLE_SIZE 64
262 PerlIO_allocate(pTHX)
264 /* Find a free slot in the table, allocating new table as necessary */
271 last = (PerlIO **)(f);
272 for (i=1; i < PERLIO_TABLE_SIZE; i++)
280 f = PerlMemShared_calloc(PERLIO_TABLE_SIZE,sizeof(PerlIO));
290 PerlIO_cleantable(pTHX_ PerlIO **tablep)
292 PerlIO *table = *tablep;
296 PerlIO_cleantable(aTHX_ (PerlIO **) &(table[0]));
297 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
305 PerlMemShared_free(table);
314 PerlIO_cleanup_layers(pTHXo_ void *data)
316 PerlIO_layer_hv = Nullhv;
317 PerlIO_layer_av = Nullav;
324 PerlIO_cleantable(aTHX_ &_perlio);
328 PerlIO_destruct(pTHX)
330 PerlIO **table = &_perlio;
335 table = (PerlIO **)(f++);
336 for (i=1; i < PERLIO_TABLE_SIZE; i++)
342 if (l->tab->kind & PERLIO_K_DESTRUCT)
344 PerlIO_debug("Destruct popping %s\n",l->tab->name);
359 PerlIO_pop(pTHX_ PerlIO *f)
364 PerlIO_debug("PerlIO_pop f=%p %s\n",f,l->tab->name);
366 (*l->tab->Popped)(f);
368 PerlMemShared_free(l);
372 /*--------------------------------------------------------------------------------------*/
373 /* XS Interface for perl code */
376 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
380 if ((SSize_t) len <= 0)
382 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
383 if (!svp && load && PL_subname && PerlIO_layer_av && av_len(PerlIO_layer_av)+1 >= 2)
385 SV *pkgsv = newSVpvn("PerlIO",6);
386 SV *layer = newSVpvn(name,len);
388 /* The two SVs are magically freed by load_module */
389 Perl_load_module(aTHX_ 0, pkgsv, Nullsv, layer, Nullsv);
391 /* Say this is lvalue so we get an 'undef' if still not there */
392 svp = hv_fetch(PerlIO_layer_hv,name,len,1);
394 if (svp && (sv = *svp))
404 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
408 IO *io = GvIOn((GV *)SvRV(sv));
409 PerlIO *ifp = IoIFP(io);
410 PerlIO *ofp = IoOFP(io);
411 Perl_warn(aTHX_ "set %"SVf" %p %p %p",sv,io,ifp,ofp);
417 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
421 IO *io = GvIOn((GV *)SvRV(sv));
422 PerlIO *ifp = IoIFP(io);
423 PerlIO *ofp = IoOFP(io);
424 Perl_warn(aTHX_ "get %"SVf" %p %p %p",sv,io,ifp,ofp);
430 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
432 Perl_warn(aTHX_ "clear %"SVf,sv);
437 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
439 Perl_warn(aTHX_ "free %"SVf,sv);
443 MGVTBL perlio_vtab = {
451 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
454 SV *sv = SvRV(ST(1));
459 sv_magic(sv, (SV *)av, PERL_MAGIC_ext, NULL, 0);
461 mg = mg_find(sv, PERL_MAGIC_ext);
462 mg->mg_virtual = &perlio_vtab;
464 Perl_warn(aTHX_ "attrib %"SVf,sv);
465 for (i=2; i < items; i++)
468 const char *name = SvPV(ST(i),len);
469 SV *layer = PerlIO_find_layer(aTHX_ name,len,1);
472 av_push(av,SvREFCNT_inc(layer));
485 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
487 HV *stash = gv_stashpv("PerlIO::Layer", TRUE);
488 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
493 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
495 if (!PerlIO_layer_hv)
497 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
499 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),PerlIO_tab_sv(aTHX_ tab),0);
500 PerlIO_debug("define %s %p\n",tab->name,tab);
504 PerlIO_parse_layers(pTHX_ AV *av, const char *names)
508 const char *s = names;
511 while (isSPACE(*s) || *s == ':')
517 const char *as = Nullch;
521 /* Message is consistent with how attribute lists are passed.
522 Even though this means "foo : : bar" is seen as an invalid separator
524 char q = ((*s == '\'') ? '"' : '\'');
525 Perl_warn(aTHX_ "perlio: invalid separator character %c%c%c in layer specification list", q, *s, q);
531 } while (isALNUM(*e));
549 /* It's a nul terminated string, not allowed to \ the terminating null.
550 Anything other character is passed over. */
558 Perl_warn(aTHX_ "perlio: argument list not closed for layer \"%.*s\"",(int)(e - s),s);
568 SV *layer = PerlIO_find_layer(aTHX_ s,llen,1);
571 av_push(av,SvREFCNT_inc(layer));
572 av_push(av,(as) ? newSVpvn(as,alen) : &PL_sv_undef);
575 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)llen,s);
587 PerlIO_default_buffer(pTHX_ AV *av)
589 PerlIO_funcs *tab = &PerlIO_perlio;
590 if (O_BINARY != O_TEXT)
596 if (PerlIO_stdio.Set_ptrcnt)
601 PerlIO_debug("Pushing %s\n",tab->name);
602 av_push(av,SvREFCNT_inc(PerlIO_find_layer(aTHX_ tab->name,0,0)));
603 av_push(av,&PL_sv_undef);
607 PerlIO_arg_fetch(pTHX_ AV *av,IV n)
609 SV **svp = av_fetch(av,n,FALSE);
610 return (svp) ? *svp : Nullsv;
614 PerlIO_layer_fetch(pTHX_ AV *av,IV n,PerlIO_funcs *def)
616 SV **svp = av_fetch(av,n,FALSE);
618 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
620 /* PerlIO_debug("Layer %d is %s\n",n/2,tab->name); */
621 return INT2PTR(PerlIO_funcs *, SvIV(layer));
624 Perl_croak(aTHX_ "panic:PerlIO layer array corrupt");
629 PerlIO_default_layers(pTHX)
632 if (!PerlIO_layer_av)
634 const char *s = (PL_tainting) ? Nullch : PerlEnv_getenv("PERLIO");
635 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
637 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
639 PerlIO_define_layer(aTHX_ &PerlIO_raw);
640 PerlIO_define_layer(aTHX_ &PerlIO_unix);
641 PerlIO_define_layer(aTHX_ &PerlIO_perlio);
642 PerlIO_define_layer(aTHX_ &PerlIO_stdio);
643 PerlIO_define_layer(aTHX_ &PerlIO_crlf);
645 PerlIO_define_layer(aTHX_ &PerlIO_mmap);
647 PerlIO_define_layer(aTHX_ &PerlIO_utf8);
648 PerlIO_define_layer(aTHX_ &PerlIO_byte);
649 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(aTHX_ PerlIO_unix.name,0,0)));
650 av_push(PerlIO_layer_av,&PL_sv_undef);
653 PerlIO_parse_layers(aTHX_ PerlIO_layer_av,s);
657 PerlIO_default_buffer(aTHX_ PerlIO_layer_av);
660 len = av_len(PerlIO_layer_av)+1;
663 PerlIO_default_buffer(aTHX_ PerlIO_layer_av);
664 len = av_len(PerlIO_layer_av);
666 return PerlIO_layer_av;
671 PerlIO_default_layer(pTHX_ I32 n)
673 AV *av = PerlIO_default_layers(aTHX);
676 n += av_len(PerlIO_layer_av)+1;
677 return PerlIO_layer_fetch(aTHX_ av,n, &PerlIO_stdio);
680 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
681 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
684 PerlIO_stdstreams(pTHX)
688 PerlIO_allocate(aTHX);
689 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
690 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
691 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
696 PerlIO_push(pTHX_ PerlIO *f,PerlIO_funcs *tab,const char *mode,SV *arg)
699 l = PerlMemShared_calloc(tab->size,sizeof(char));
702 Zero(l,tab->size,char);
706 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",f,tab->name,
707 (mode) ? mode : "(Null)",arg);
708 if ((*l->tab->Pushed)(f,mode,arg) != 0)
718 PerlIOPop_pushed(PerlIO *f, const char *mode, SV *arg)
732 PerlIORaw_pushed(PerlIO *f, const char *mode, SV *arg)
734 /* Remove the dummy layer */
737 /* Pop back to bottom layer */
741 while (!(PerlIOBase(f)->tab->kind & PERLIO_K_RAW))
749 /* Nothing bellow - push unix on top then remove it */
750 if (PerlIO_push(aTHX_ f,PerlIO_default_btm(),mode,arg))
752 PerlIO_pop(aTHX_ PerlIONext(f));
757 PerlIO_debug(":raw f=%p :%s\n",f,PerlIOBase(f)->tab->name);
764 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode, AV *layers, IV n)
766 IV max = av_len(layers)+1;
770 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers,n,NULL);
773 if (!PerlIO_push(aTHX_ f,tab,mode,PerlIOArg))
785 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
790 AV *layers = newAV();
791 code = PerlIO_parse_layers(aTHX_ layers,names);
794 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0);
796 SvREFCNT_dec((SV *) layers);
802 /*--------------------------------------------------------------------------------------*/
803 /* Given the abstraction above the public API functions */
806 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
808 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
809 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
810 if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY)))
816 if (PerlIOBase(top)->tab == &PerlIO_crlf)
819 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
822 top = PerlIONext(top);
825 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
830 PerlIO__close(PerlIO *f)
833 return (*PerlIOBase(f)->tab->Close)(f);
836 SETERRNO(EBADF,SS$_IVCHAN);
841 #undef PerlIO_fdupopen
843 PerlIO_fdupopen(pTHX_ PerlIO *f)
848 int fd = PerlLIO_dup(PerlIO_fileno(f));
849 PerlIO *new = PerlIO_fdopen(fd,PerlIO_modestr(f,buf));
852 Off_t posn = PerlIO_tell(f);
853 PerlIO_seek(new,posn,SEEK_SET);
859 SETERRNO(EBADF,SS$_IVCHAN);
866 PerlIO_close(PerlIO *f)
872 code = (*PerlIOBase(f)->tab->Close)(f);
883 PerlIO_fileno(PerlIO *f)
886 return (*PerlIOBase(f)->tab->Fileno)(f);
889 SETERRNO(EBADF,SS$_IVCHAN);
895 PerlIO_context_layers(pTHX_ const char *mode)
897 const char *type = NULL;
898 /* Need to supply default layer info from open.pm */
901 SV *layers = PL_curcop->cop_io;
905 type = SvPV(layers,len);
906 if (type && mode[0] != 'r')
908 /* Skip to write part */
909 const char *s = strchr(type,0);
910 if (s && (s-type) < len)
921 PerlIO_layer_from_ref(pTHX_ SV *sv)
923 /* For any scalar type load the handler which is bundled with perl */
924 if (SvTYPE(sv) < SVt_PVAV)
925 return PerlIO_find_layer(aTHX_ "Scalar",6, 1);
927 /* For other types allow if layer is known but don't try and load it */
931 return PerlIO_find_layer(aTHX_ "Array",5, 0);
933 return PerlIO_find_layer(aTHX_ "Hash",4, 0);
935 return PerlIO_find_layer(aTHX_ "Code",4, 0);
937 return PerlIO_find_layer(aTHX_ "Glob",4, 0);
943 PerlIO_resolve_layers(pTHX_ const char *layers,const char *mode,int narg, SV **args)
945 AV *def = PerlIO_default_layers(aTHX);
948 PerlIO_stdstreams(aTHX);
952 /* If it is a reference but not an object see if we have a handler for it */
953 if (SvROK(arg) && !sv_isobject(arg))
955 SV *handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
959 av_push(def,SvREFCNT_inc(handler));
960 av_push(def,&PL_sv_undef);
963 /* Don't fail if handler cannot be found
964 * :Via(...) etc. may do something sensible
965 * else we will just stringfy and open resulting string.
970 layers = PerlIO_context_layers(aTHX_ mode);
971 if (layers && *layers)
976 IV n = av_len(def)+1;
980 SV **svp = av_fetch(def,n,0);
981 av_store(av,n,(svp) ? SvREFCNT_inc(*svp) : &PL_sv_undef);
988 PerlIO_parse_layers(aTHX_ av,layers);
1000 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1002 if (!f && narg == 1 && *args == &PL_sv_undef)
1004 if ((f = PerlIO_tmpfile()))
1007 layers = PerlIO_context_layers(aTHX_ mode);
1008 if (layers && *layers)
1009 PerlIO_apply_layers(aTHX_ f,mode,layers);
1016 PerlIO_funcs *tab = NULL;
1019 /* This is "reopen" - it is not tested as perl does not use it yet */
1024 SV *arg = (l->tab->Getarg) ? (*l->tab->Getarg)(&l) : &PL_sv_undef;
1025 av_unshift(layera,2);
1026 av_store(layera,0,PerlIO_tab_sv(aTHX_ l->tab));
1027 av_store(layera,1,arg);
1028 l = *PerlIONext(&l);
1033 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1035 n = av_len(layera)-1;
1038 PerlIO_funcs *t = PerlIO_layer_fetch(aTHX_ layera,n,NULL);
1048 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1049 tab->name,layers,mode,fd,imode,perm,f,narg,args);
1050 f = (*tab->Open)(aTHX_ tab, layera, n, mode,fd,imode,perm,f,narg,args);
1053 if (n+2 < av_len(layera)+1)
1055 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n+2) != 0)
1062 SvREFCNT_dec(layera);
1068 #undef PerlIO_fdopen
1070 PerlIO_fdopen(int fd, const char *mode)
1073 return PerlIO_openn(aTHX_ Nullch,mode,fd,0,0,NULL,0,NULL);
1078 PerlIO_open(const char *path, const char *mode)
1081 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
1082 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,NULL,1,&name);
1085 #undef PerlIO_reopen
1087 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
1090 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
1091 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,f,1,&name);
1096 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
1099 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
1102 SETERRNO(EBADF,SS$_IVCHAN);
1107 #undef PerlIO_unread
1109 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
1112 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
1115 SETERRNO(EBADF,SS$_IVCHAN);
1122 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
1125 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
1128 SETERRNO(EBADF,SS$_IVCHAN);
1135 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
1138 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
1141 SETERRNO(EBADF,SS$_IVCHAN);
1148 PerlIO_tell(PerlIO *f)
1151 return (*PerlIOBase(f)->tab->Tell)(f);
1154 SETERRNO(EBADF,SS$_IVCHAN);
1161 PerlIO_flush(PerlIO *f)
1167 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1168 if (tab && tab->Flush)
1170 return (*tab->Flush)(f);
1174 PerlIO_debug("Cannot flush f=%p :%s\n",f,tab->name);
1175 SETERRNO(EBADF,SS$_IVCHAN);
1181 PerlIO_debug("Cannot flush f=%p\n",f);
1182 SETERRNO(EBADF,SS$_IVCHAN);
1188 /* Is it good API design to do flush-all on NULL,
1189 * a potentially errorneous input? Maybe some magical
1190 * value (PerlIO* PERLIO_FLUSH_ALL = (PerlIO*)-1;)?
1191 * Yes, stdio does similar things on fflush(NULL),
1192 * but should we be bound by their design decisions?
1194 PerlIO **table = &_perlio;
1196 while ((f = *table))
1199 table = (PerlIO **)(f++);
1200 for (i=1; i < PERLIO_TABLE_SIZE; i++)
1202 if (*f && PerlIO_flush(f) != 0)
1212 PerlIOBase_flush_linebuf()
1214 PerlIO **table = &_perlio;
1216 while ((f = *table))
1219 table = (PerlIO **)(f++);
1220 for (i=1; i < PERLIO_TABLE_SIZE; i++)
1222 if (*f && (PerlIOBase(f)->flags & (PERLIO_F_LINEBUF|PERLIO_F_CANWRITE))
1223 == (PERLIO_F_LINEBUF|PERLIO_F_CANWRITE))
1232 PerlIO_fill(PerlIO *f)
1235 return (*PerlIOBase(f)->tab->Fill)(f);
1238 SETERRNO(EBADF,SS$_IVCHAN);
1243 #undef PerlIO_isutf8
1245 PerlIO_isutf8(PerlIO *f)
1248 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1251 SETERRNO(EBADF,SS$_IVCHAN);
1258 PerlIO_eof(PerlIO *f)
1261 return (*PerlIOBase(f)->tab->Eof)(f);
1264 SETERRNO(EBADF,SS$_IVCHAN);
1271 PerlIO_error(PerlIO *f)
1274 return (*PerlIOBase(f)->tab->Error)(f);
1277 SETERRNO(EBADF,SS$_IVCHAN);
1282 #undef PerlIO_clearerr
1284 PerlIO_clearerr(PerlIO *f)
1287 (*PerlIOBase(f)->tab->Clearerr)(f);
1289 SETERRNO(EBADF,SS$_IVCHAN);
1292 #undef PerlIO_setlinebuf
1294 PerlIO_setlinebuf(PerlIO *f)
1297 (*PerlIOBase(f)->tab->Setlinebuf)(f);
1299 SETERRNO(EBADF,SS$_IVCHAN);
1302 #undef PerlIO_has_base
1304 PerlIO_has_base(PerlIO *f)
1306 if (f && *f) { return (PerlIOBase(f)->tab->Get_base != NULL); }
1310 #undef PerlIO_fast_gets
1312 PerlIO_fast_gets(PerlIO *f)
1314 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS))
1316 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1317 return (tab->Set_ptrcnt != NULL);
1322 #undef PerlIO_has_cntptr
1324 PerlIO_has_cntptr(PerlIO *f)
1328 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1329 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1334 #undef PerlIO_canset_cnt
1336 PerlIO_canset_cnt(PerlIO *f)
1340 PerlIOl *l = PerlIOBase(f);
1341 return (l->tab->Set_ptrcnt != NULL);
1346 #undef PerlIO_get_base
1348 PerlIO_get_base(PerlIO *f)
1351 return (*PerlIOBase(f)->tab->Get_base)(f);
1355 #undef PerlIO_get_bufsiz
1357 PerlIO_get_bufsiz(PerlIO *f)
1360 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
1364 #undef PerlIO_get_ptr
1366 PerlIO_get_ptr(PerlIO *f)
1368 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1369 if (tab->Get_ptr == NULL)
1371 return (*tab->Get_ptr)(f);
1374 #undef PerlIO_get_cnt
1376 PerlIO_get_cnt(PerlIO *f)
1378 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1379 if (tab->Get_cnt == NULL)
1381 return (*tab->Get_cnt)(f);
1384 #undef PerlIO_set_cnt
1386 PerlIO_set_cnt(PerlIO *f,int cnt)
1388 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
1391 #undef PerlIO_set_ptrcnt
1393 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
1395 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1396 if (tab->Set_ptrcnt == NULL)
1399 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
1401 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
1404 /*--------------------------------------------------------------------------------------*/
1405 /* utf8 and raw dummy layers */
1408 PerlIOUtf8_pushed(PerlIO *f, const char *mode, SV *arg)
1413 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1414 PerlIO_pop(aTHX_ f);
1415 if (tab->kind & PERLIO_K_UTF8)
1416 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1418 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1424 PerlIO_funcs PerlIO_utf8 = {
1427 PERLIO_K_DUMMY|PERLIO_F_UTF8,
1445 NULL, /* get_base */
1446 NULL, /* get_bufsiz */
1449 NULL, /* set_ptrcnt */
1452 PerlIO_funcs PerlIO_byte = {
1473 NULL, /* get_base */
1474 NULL, /* get_bufsiz */
1477 NULL, /* set_ptrcnt */
1481 PerlIORaw_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n,const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
1483 PerlIO_funcs *tab = PerlIO_default_btm();
1484 return (*tab->Open)(aTHX_ tab,layers,n-2,mode,fd,imode,perm,old,narg,args);
1487 PerlIO_funcs PerlIO_raw = {
1508 NULL, /* get_base */
1509 NULL, /* get_bufsiz */
1512 NULL, /* set_ptrcnt */
1514 /*--------------------------------------------------------------------------------------*/
1515 /*--------------------------------------------------------------------------------------*/
1516 /* "Methods" of the "base class" */
1519 PerlIOBase_fileno(PerlIO *f)
1521 return PerlIO_fileno(PerlIONext(f));
1525 PerlIO_modestr(PerlIO *f,char *buf)
1528 IV flags = PerlIOBase(f)->flags;
1529 if (flags & PERLIO_F_APPEND)
1532 if (flags & PERLIO_F_CANREAD)
1537 else if (flags & PERLIO_F_CANREAD)
1540 if (flags & PERLIO_F_CANWRITE)
1543 else if (flags & PERLIO_F_CANWRITE)
1546 if (flags & PERLIO_F_CANREAD)
1551 #if O_TEXT != O_BINARY
1552 if (!(flags & PERLIO_F_CRLF))
1560 PerlIOBase_pushed(PerlIO *f, const char *mode, SV *arg)
1562 PerlIOl *l = PerlIOBase(f);
1564 const char *omode = mode;
1567 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1568 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
1569 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1570 if (tab->Set_ptrcnt != NULL)
1571 l->flags |= PERLIO_F_FASTGETS;
1574 if (*mode == '#' || *mode == 'I')
1579 l->flags |= PERLIO_F_CANREAD;
1582 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
1585 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
1588 SETERRNO(EINVAL,LIB$_INVARG);
1596 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
1599 l->flags &= ~PERLIO_F_CRLF;
1602 l->flags |= PERLIO_F_CRLF;
1605 SETERRNO(EINVAL,LIB$_INVARG);
1614 l->flags |= l->next->flags &
1615 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1619 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08"UVxf" (%s)\n",
1620 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
1621 l->flags,PerlIO_modestr(f,temp));
1627 PerlIOBase_popped(PerlIO *f)
1633 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1636 Off_t old = PerlIO_tell(f);
1638 PerlIO_push(aTHX_ f,&PerlIO_pending,"r",Nullsv);
1639 done = PerlIOBuf_unread(f,vbuf,count);
1640 PerlIOSelf(f,PerlIOBuf)->posn = old - done;
1645 PerlIOBase_read(PerlIO *f, void *vbuf, Size_t count)
1647 STDCHAR *buf = (STDCHAR *) vbuf;
1650 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1654 SSize_t avail = PerlIO_get_cnt(f);
1657 take = (count < avail) ? count : avail;
1660 STDCHAR *ptr = PerlIO_get_ptr(f);
1661 Copy(ptr,buf,take,STDCHAR);
1662 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
1666 if (count > 0 && avail <= 0)
1668 if (PerlIO_fill(f) != 0)
1672 return (buf - (STDCHAR *) vbuf);
1678 PerlIOBase_noop_ok(PerlIO *f)
1684 PerlIOBase_noop_fail(PerlIO *f)
1690 PerlIOBase_close(PerlIO *f)
1693 PerlIO *n = PerlIONext(f);
1694 if (PerlIO_flush(f) != 0)
1696 if (n && *n && (*PerlIOBase(n)->tab->Close)(n) != 0)
1698 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1703 PerlIOBase_eof(PerlIO *f)
1707 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1713 PerlIOBase_error(PerlIO *f)
1717 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1723 PerlIOBase_clearerr(PerlIO *f)
1727 PerlIO *n = PerlIONext(f);
1728 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1735 PerlIOBase_setlinebuf(PerlIO *f)
1739 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
1743 /*--------------------------------------------------------------------------------------*/
1744 /* Bottom-most level for UNIX-like case */
1748 struct _PerlIO base; /* The generic part */
1749 int fd; /* UNIX like file descriptor */
1750 int oflags; /* open/fcntl flags */
1754 PerlIOUnix_oflags(const char *mode)
1769 oflags = O_CREAT|O_TRUNC;
1780 oflags = O_CREAT|O_APPEND;
1796 else if (*mode == 't')
1799 oflags &= ~O_BINARY;
1802 /* Always open in binary mode */
1804 if (*mode || oflags == -1)
1806 SETERRNO(EINVAL,LIB$_INVARG);
1813 PerlIOUnix_fileno(PerlIO *f)
1815 return PerlIOSelf(f,PerlIOUnix)->fd;
1819 PerlIOUnix_pushed(PerlIO *f, const char *mode, SV *arg)
1821 IV code = PerlIOBase_pushed(f,mode,arg);
1824 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1825 s->fd = PerlIO_fileno(PerlIONext(f));
1826 s->oflags = PerlIOUnix_oflags(mode);
1828 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1833 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1837 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1838 (*PerlIOBase(f)->tab->Close)(f);
1842 char *path = SvPV_nolen(*args);
1847 imode = PerlIOUnix_oflags(mode);
1852 fd = PerlLIO_open3(path,imode,perm);
1862 f = PerlIO_allocate(aTHX);
1863 s = PerlIOSelf(PerlIO_push(aTHX_ f,self,mode,PerlIOArg),PerlIOUnix);
1866 s = PerlIOSelf(f,PerlIOUnix);
1869 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1876 /* FIXME: pop layers ??? */
1883 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1886 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1887 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1891 SSize_t len = PerlLIO_read(fd,vbuf,count);
1892 if (len >= 0 || errno != EINTR)
1895 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1896 else if (len == 0 && count != 0)
1897 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1905 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1908 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1911 SSize_t len = PerlLIO_write(fd,vbuf,count);
1912 if (len >= 0 || errno != EINTR)
1915 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1923 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1926 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1927 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1928 return (new == (Off_t) -1) ? -1 : 0;
1932 PerlIOUnix_tell(PerlIO *f)
1935 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1939 PerlIOUnix_close(PerlIO *f)
1942 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1944 while (PerlLIO_close(fd) != 0)
1955 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1960 PerlIO_funcs PerlIO_unix = {
1975 PerlIOBase_noop_ok, /* flush */
1976 PerlIOBase_noop_fail, /* fill */
1979 PerlIOBase_clearerr,
1980 PerlIOBase_setlinebuf,
1981 NULL, /* get_base */
1982 NULL, /* get_bufsiz */
1985 NULL, /* set_ptrcnt */
1988 /*--------------------------------------------------------------------------------------*/
1989 /* stdio as a layer */
1993 struct _PerlIO base;
1994 FILE * stdio; /* The stream */
1998 PerlIOStdio_fileno(PerlIO *f)
2001 return PerlSIO_fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
2005 PerlIOStdio_mode(const char *mode,char *tmode)
2012 if (O_BINARY != O_TEXT)
2020 /* This isn't used yet ... */
2022 PerlIOStdio_pushed(PerlIO *f, const char *mode, SV *arg)
2027 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
2029 FILE *stdio = PerlSIO_fdopen(PerlIO_fileno(PerlIONext(f)),mode = PerlIOStdio_mode(mode,tmode));
2035 return PerlIOBase_pushed(f,mode,arg);
2038 #undef PerlIO_importFILE
2040 PerlIO_importFILE(FILE *stdio, int fl)
2046 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),&PerlIO_stdio,"r+",Nullsv),PerlIOStdio);
2053 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2058 char *path = SvPV_nolen(*args);
2059 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
2060 FILE *stdio = PerlSIO_freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
2070 char *path = SvPV_nolen(*args);
2074 fd = PerlLIO_open3(path,imode,perm);
2078 FILE *stdio = PerlSIO_fopen(path,mode);
2081 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)), self,
2082 (mode = PerlIOStdio_mode(mode,tmode)),PerlIOArg),
2103 stdio = PerlSIO_stdin;
2106 stdio = PerlSIO_stdout;
2109 stdio = PerlSIO_stderr;
2115 stdio = PerlSIO_fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
2119 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),self,mode,PerlIOArg),PerlIOStdio);
2129 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
2132 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
2136 STDCHAR *buf = (STDCHAR *) vbuf;
2137 /* Perl is expecting PerlIO_getc() to fill the buffer
2138 * Linux's stdio does not do that for fread()
2140 int ch = PerlSIO_fgetc(s);
2148 got = PerlSIO_fread(vbuf,1,count,s);
2153 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
2156 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
2157 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
2161 int ch = *buf-- & 0xff;
2162 if (PerlSIO_ungetc(ch,s) != ch)
2171 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
2174 return PerlSIO_fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
2178 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
2181 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2182 return PerlSIO_fseek(stdio,offset,whence);
2186 PerlIOStdio_tell(PerlIO *f)
2189 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2190 return PerlSIO_ftell(stdio);
2194 PerlIOStdio_close(PerlIO *f)
2197 #ifdef SOCKS5_VERSION_NAME
2199 Sock_size_t optlen = sizeof(int);
2201 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2203 #ifdef SOCKS5_VERSION_NAME
2204 (getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (void *)&optval, &optlen) < 0) ?
2205 PerlSIO_fclose(stdio) :
2206 close(PerlIO_fileno(f))
2208 PerlSIO_fclose(stdio)
2215 PerlIOStdio_flush(PerlIO *f)
2218 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2219 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
2221 return PerlSIO_fflush(stdio);
2226 /* FIXME: This discards ungetc() and pre-read stuff which is
2227 not right if this is just a "sync" from a layer above
2228 Suspect right design is to do _this_ but not have layer above
2229 flush this layer read-to-read
2231 /* Not writeable - sync by attempting a seek */
2233 if (PerlSIO_fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
2241 PerlIOStdio_fill(PerlIO *f)
2244 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2246 /* fflush()ing read-only streams can cause trouble on some stdio-s */
2247 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2249 if (PerlSIO_fflush(stdio) != 0)
2252 c = PerlSIO_fgetc(stdio);
2253 if (c == EOF || PerlSIO_ungetc(c,stdio) != c)
2259 PerlIOStdio_eof(PerlIO *f)
2262 return PerlSIO_feof(PerlIOSelf(f,PerlIOStdio)->stdio);
2266 PerlIOStdio_error(PerlIO *f)
2269 return PerlSIO_ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
2273 PerlIOStdio_clearerr(PerlIO *f)
2276 PerlSIO_clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
2280 PerlIOStdio_setlinebuf(PerlIO *f)
2283 #ifdef HAS_SETLINEBUF
2284 PerlSIO_setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
2286 PerlSIO_setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
2292 PerlIOStdio_get_base(PerlIO *f)
2295 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2296 return PerlSIO_get_base(stdio);
2300 PerlIOStdio_get_bufsiz(PerlIO *f)
2303 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2304 return PerlSIO_get_bufsiz(stdio);
2308 #ifdef USE_STDIO_PTR
2310 PerlIOStdio_get_ptr(PerlIO *f)
2313 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2314 return PerlSIO_get_ptr(stdio);
2318 PerlIOStdio_get_cnt(PerlIO *f)
2321 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2322 return PerlSIO_get_cnt(stdio);
2326 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
2329 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2332 #ifdef STDIO_PTR_LVALUE
2333 PerlSIO_set_ptr(stdio,ptr);
2334 #ifdef STDIO_PTR_LVAL_SETS_CNT
2335 if (PerlSIO_get_cnt(stdio) != (cnt))
2338 assert(PerlSIO_get_cnt(stdio) == (cnt));
2341 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
2342 /* Setting ptr _does_ change cnt - we are done */
2345 #else /* STDIO_PTR_LVALUE */
2347 #endif /* STDIO_PTR_LVALUE */
2349 /* Now (or only) set cnt */
2350 #ifdef STDIO_CNT_LVALUE
2351 PerlSIO_set_cnt(stdio,cnt);
2352 #else /* STDIO_CNT_LVALUE */
2353 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
2354 PerlSIO_set_ptr(stdio,PerlSIO_get_ptr(stdio)+(PerlSIO_get_cnt(stdio)-cnt));
2355 #else /* STDIO_PTR_LVAL_SETS_CNT */
2357 #endif /* STDIO_PTR_LVAL_SETS_CNT */
2358 #endif /* STDIO_CNT_LVALUE */
2363 PerlIO_funcs PerlIO_stdio = {
2365 sizeof(PerlIOStdio),
2382 PerlIOStdio_clearerr,
2383 PerlIOStdio_setlinebuf,
2385 PerlIOStdio_get_base,
2386 PerlIOStdio_get_bufsiz,
2391 #ifdef USE_STDIO_PTR
2392 PerlIOStdio_get_ptr,
2393 PerlIOStdio_get_cnt,
2394 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
2395 PerlIOStdio_set_ptrcnt
2396 #else /* STDIO_PTR_LVALUE */
2398 #endif /* STDIO_PTR_LVALUE */
2399 #else /* USE_STDIO_PTR */
2403 #endif /* USE_STDIO_PTR */
2406 #undef PerlIO_exportFILE
2408 PerlIO_exportFILE(PerlIO *f, int fl)
2412 stdio = fdopen(PerlIO_fileno(f),"r+");
2416 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ f,&PerlIO_stdio,"r+",Nullsv),PerlIOStdio);
2422 #undef PerlIO_findFILE
2424 PerlIO_findFILE(PerlIO *f)
2429 if (l->tab == &PerlIO_stdio)
2431 PerlIOStdio *s = PerlIOSelf(&l,PerlIOStdio);
2434 l = *PerlIONext(&l);
2436 return PerlIO_exportFILE(f,0);
2439 #undef PerlIO_releaseFILE
2441 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2445 /*--------------------------------------------------------------------------------------*/
2446 /* perlio buffer layer */
2449 PerlIOBuf_pushed(PerlIO *f, const char *mode, SV *arg)
2451 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2452 int fd = PerlIO_fileno(f);
2455 if (fd >= 0 && PerlLIO_isatty(fd))
2457 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF|PERLIO_F_TTY;
2459 posn = PerlIO_tell(PerlIONext(f));
2460 if (posn != (Off_t) -1)
2464 return PerlIOBase_pushed(f,mode,arg);
2468 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2472 PerlIO *next = PerlIONext(f);
2473 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n-2, PerlIOBase(next)->tab);
2474 next = (*tab->Open)(aTHX_ tab, layers, n-2, mode,fd,imode,perm,next,narg,args);
2475 if (!next || (*PerlIOBase(f)->tab->Pushed)(f,mode,PerlIOArg) != 0)
2482 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n-2, PerlIO_default_btm());
2489 f = (*tab->Open)(aTHX_ tab, layers, n-2, mode,fd,imode,perm,NULL,narg,args);
2492 PerlIO_push(aTHX_ f,self,mode,PerlIOArg);
2493 fd = PerlIO_fileno(f);
2494 #if O_BINARY != O_TEXT
2495 /* do something about failing setmode()? --jhi */
2496 PerlLIO_setmode(fd , O_BINARY);
2498 if (init && fd == 2)
2500 /* Initial stderr is unbuffered */
2501 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2508 /* This "flush" is akin to sfio's sync in that it handles files in either
2512 PerlIOBuf_flush(PerlIO *f)
2514 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2516 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2518 /* write() the buffer */
2519 STDCHAR *buf = b->buf;
2521 PerlIO *n = PerlIONext(f);
2524 SSize_t count = PerlIO_write(n,p,b->ptr - p);
2529 else if (count < 0 || PerlIO_error(n))
2531 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2536 b->posn += (p - buf);
2538 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2540 STDCHAR *buf = PerlIO_get_base(f);
2541 /* Note position change */
2542 b->posn += (b->ptr - buf);
2543 if (b->ptr < b->end)
2545 /* We did not consume all of it */
2546 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
2548 b->posn = PerlIO_tell(PerlIONext(f));
2552 b->ptr = b->end = b->buf;
2553 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2554 /* FIXME: Is this right for read case ? */
2555 if (PerlIO_flush(PerlIONext(f)) != 0)
2561 PerlIOBuf_fill(PerlIO *f)
2563 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2564 PerlIO *n = PerlIONext(f);
2566 /* FIXME: doing the down-stream flush is a bad idea if it causes
2567 pre-read data in stdio buffer to be discarded
2568 but this is too simplistic - as it skips _our_ hosekeeping
2569 and breaks tell tests.
2570 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2574 if (PerlIO_flush(f) != 0)
2576 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
2577 PerlIOBase_flush_linebuf();
2580 PerlIO_get_base(f); /* allocate via vtable */
2582 b->ptr = b->end = b->buf;
2583 if (PerlIO_fast_gets(n))
2585 /* Layer below is also buffered
2586 * We do _NOT_ want to call its ->Read() because that will loop
2587 * till it gets what we asked for which may hang on a pipe etc.
2588 * Instead take anything it has to hand, or ask it to fill _once_.
2590 avail = PerlIO_get_cnt(n);
2593 avail = PerlIO_fill(n);
2595 avail = PerlIO_get_cnt(n);
2598 if (!PerlIO_error(n) && PerlIO_eof(n))
2604 STDCHAR *ptr = PerlIO_get_ptr(n);
2605 SSize_t cnt = avail;
2606 if (avail > b->bufsiz)
2608 Copy(ptr,b->buf,avail,STDCHAR);
2609 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
2614 avail = PerlIO_read(n,b->ptr,b->bufsiz);
2619 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2621 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2624 b->end = b->buf+avail;
2625 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2630 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
2632 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2637 return PerlIOBase_read(f,vbuf,count);
2643 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
2645 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2646 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2649 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2655 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2657 avail = (b->ptr - b->buf);
2662 b->end = b->buf + avail;
2664 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2665 b->posn -= b->bufsiz;
2667 if (avail > (SSize_t) count)
2675 Copy(buf,b->ptr,avail,STDCHAR);
2679 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2686 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2688 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2689 const STDCHAR *buf = (const STDCHAR *) vbuf;
2693 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2697 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2698 if ((SSize_t) count < avail)
2700 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2701 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2721 Copy(buf,b->ptr,avail,STDCHAR);
2728 if (b->ptr >= (b->buf + b->bufsiz))
2731 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2737 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2740 if ((code = PerlIO_flush(f)) == 0)
2742 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2743 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2744 code = PerlIO_seek(PerlIONext(f),offset,whence);
2747 b->posn = PerlIO_tell(PerlIONext(f));
2754 PerlIOBuf_tell(PerlIO *f)
2756 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2757 Off_t posn = b->posn;
2759 posn += (b->ptr - b->buf);
2764 PerlIOBuf_close(PerlIO *f)
2767 IV code = PerlIOBase_close(f);
2768 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2769 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2771 PerlMemShared_free(b->buf);
2774 b->ptr = b->end = b->buf;
2775 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2780 PerlIOBuf_get_ptr(PerlIO *f)
2782 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2789 PerlIOBuf_get_cnt(PerlIO *f)
2791 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2794 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2795 return (b->end - b->ptr);
2800 PerlIOBuf_get_base(PerlIO *f)
2802 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2808 b->buf = PerlMemShared_calloc(b->bufsiz,sizeof(STDCHAR));
2811 b->buf = (STDCHAR *)&b->oneword;
2812 b->bufsiz = sizeof(b->oneword);
2821 PerlIOBuf_bufsiz(PerlIO *f)
2823 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2826 return (b->end - b->buf);
2830 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2832 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2836 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2839 assert(PerlIO_get_cnt(f) == cnt);
2840 assert(b->ptr >= b->buf);
2842 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2845 PerlIO_funcs PerlIO_perlio = {
2864 PerlIOBase_clearerr,
2865 PerlIOBase_setlinebuf,
2870 PerlIOBuf_set_ptrcnt,
2873 /*--------------------------------------------------------------------------------------*/
2874 /* Temp layer to hold unread chars when cannot do it any other way */
2877 PerlIOPending_fill(PerlIO *f)
2879 /* Should never happen */
2885 PerlIOPending_close(PerlIO *f)
2887 /* A tad tricky - flush pops us, then we close new top */
2889 return PerlIO_close(f);
2893 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
2895 /* A tad tricky - flush pops us, then we seek new top */
2897 return PerlIO_seek(f,offset,whence);
2902 PerlIOPending_flush(PerlIO *f)
2905 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2906 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2908 PerlMemShared_free(b->buf);
2911 PerlIO_pop(aTHX_ f);
2916 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2924 PerlIOBuf_set_ptrcnt(f,ptr,cnt);
2929 PerlIOPending_pushed(PerlIO *f,const char *mode,SV *arg)
2931 IV code = PerlIOBase_pushed(f,mode,arg);
2932 PerlIOl *l = PerlIOBase(f);
2933 /* Our PerlIO_fast_gets must match what we are pushed on,
2934 or sv_gets() etc. get muddled when it changes mid-string
2937 l->flags = (l->flags & ~(PERLIO_F_FASTGETS|PERLIO_F_UTF8)) |
2938 (PerlIOBase(PerlIONext(f))->flags & (PERLIO_F_FASTGETS|PERLIO_F_UTF8));
2943 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
2945 SSize_t avail = PerlIO_get_cnt(f);
2950 got = PerlIOBuf_read(f,vbuf,avail);
2951 if (got >= 0 && got < count)
2953 SSize_t more = PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
2954 if (more >= 0 || got == 0)
2960 PerlIO_funcs PerlIO_pending = {
2964 PerlIOPending_pushed,
2974 PerlIOPending_close,
2975 PerlIOPending_flush,
2979 PerlIOBase_clearerr,
2980 PerlIOBase_setlinebuf,
2985 PerlIOPending_set_ptrcnt,
2990 /*--------------------------------------------------------------------------------------*/
2991 /* crlf - translation
2992 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
2993 to hand back a line at a time and keeping a record of which nl we "lied" about.
2994 On write translate "\n" to CR,LF
2999 PerlIOBuf base; /* PerlIOBuf stuff */
3000 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
3004 PerlIOCrlf_pushed(PerlIO *f, const char *mode,SV *arg)
3007 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
3008 code = PerlIOBuf_pushed(f,mode,arg);
3010 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n",
3011 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
3012 PerlIOBase(f)->flags);
3019 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
3021 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3027 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3028 return PerlIOBuf_unread(f,vbuf,count);
3031 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
3032 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3034 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3040 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3042 b->end = b->ptr = b->buf + b->bufsiz;
3043 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3044 b->posn -= b->bufsiz;
3046 while (count > 0 && b->ptr > b->buf)
3051 if (b->ptr - 2 >= b->buf)
3077 PerlIOCrlf_get_cnt(PerlIO *f)
3079 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3082 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
3084 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3085 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
3087 STDCHAR *nl = b->ptr;
3089 while (nl < b->end && *nl != 0xd)
3091 if (nl < b->end && *nl == 0xd)
3103 /* Not CR,LF but just CR */
3110 /* Blast - found CR as last char in buffer */
3113 /* They may not care, defer work as long as possible */
3114 return (nl - b->ptr);
3120 b->ptr++; /* say we have read it as far as flush() is concerned */
3121 b->buf++; /* Leave space an front of buffer */
3122 b->bufsiz--; /* Buffer is thus smaller */
3123 code = PerlIO_fill(f); /* Fetch some more */
3124 b->bufsiz++; /* Restore size for next time */
3125 b->buf--; /* Point at space */
3126 b->ptr = nl = b->buf; /* Which is what we hand off */
3127 b->posn--; /* Buffer starts here */
3128 *nl = 0xd; /* Fill in the CR */
3130 goto test; /* fill() call worked */
3131 /* CR at EOF - just fall through */
3136 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
3142 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
3144 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3145 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3146 IV flags = PerlIOBase(f)->flags;
3156 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
3163 /* Test code - delete when it works ... */
3170 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
3178 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08"UVxf" nl=%p e=%p for %d",
3179 ptr, chk, flags, c->nl, b->end, cnt);
3186 /* They have taken what we lied about */
3193 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3197 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
3199 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3200 return PerlIOBuf_write(f,vbuf,count);
3203 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3204 const STDCHAR *buf = (const STDCHAR *) vbuf;
3205 const STDCHAR *ebuf = buf+count;
3208 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3212 STDCHAR *eptr = b->buf+b->bufsiz;
3213 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3214 while (buf < ebuf && b->ptr < eptr)
3218 if ((b->ptr + 2) > eptr)
3220 /* Not room for both */
3226 *(b->ptr)++ = 0xd; /* CR */
3227 *(b->ptr)++ = 0xa; /* LF */
3229 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
3248 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
3250 return (buf - (STDCHAR *) vbuf);
3255 PerlIOCrlf_flush(PerlIO *f)
3257 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3263 return PerlIOBuf_flush(f);
3266 PerlIO_funcs PerlIO_crlf = {
3269 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
3271 PerlIOBase_noop_ok, /* popped */
3275 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
3276 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
3277 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
3285 PerlIOBase_clearerr,
3286 PerlIOBase_setlinebuf,
3291 PerlIOCrlf_set_ptrcnt,
3295 /*--------------------------------------------------------------------------------------*/
3296 /* mmap as "buffer" layer */
3300 PerlIOBuf base; /* PerlIOBuf stuff */
3301 Mmap_t mptr; /* Mapped address */
3302 Size_t len; /* mapped length */
3303 STDCHAR *bbuf; /* malloced buffer if map fails */
3306 static size_t page_size = 0;
3309 PerlIOMmap_map(PerlIO *f)
3312 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3313 IV flags = PerlIOBase(f)->flags;
3317 if (flags & PERLIO_F_CANREAD)
3319 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3320 int fd = PerlIO_fileno(f);
3322 code = fstat(fd,&st);
3323 if (code == 0 && S_ISREG(st.st_mode))
3325 SSize_t len = st.st_size - b->posn;
3330 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
3332 SETERRNO(0,SS$_NORMAL);
3333 # ifdef _SC_PAGESIZE
3334 page_size = sysconf(_SC_PAGESIZE);
3336 page_size = sysconf(_SC_PAGE_SIZE);
3338 if ((long)page_size < 0) {
3343 (void)SvUPGRADE(error, SVt_PV);
3344 msg = SvPVx(error, n_a);
3345 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
3348 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
3352 # ifdef HAS_GETPAGESIZE
3353 page_size = getpagesize();
3355 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
3356 page_size = PAGESIZE; /* compiletime, bad */
3360 if ((IV)page_size <= 0)
3361 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
3365 /* This is a hack - should never happen - open should have set it ! */
3366 b->posn = PerlIO_tell(PerlIONext(f));
3368 posn = (b->posn / page_size) * page_size;
3369 len = st.st_size - posn;
3370 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
3371 if (m->mptr && m->mptr != (Mmap_t) -1)
3373 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
3374 madvise(m->mptr, len, MADV_SEQUENTIAL);
3376 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
3377 madvise(m->mptr, len, MADV_WILLNEED);
3379 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
3380 b->end = ((STDCHAR *)m->mptr) + len;
3381 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
3392 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
3394 b->ptr = b->end = b->ptr;
3403 PerlIOMmap_unmap(PerlIO *f)
3405 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3406 PerlIOBuf *b = &m->base;
3412 code = munmap(m->mptr, m->len);
3416 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
3419 b->ptr = b->end = b->buf;
3420 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
3426 PerlIOMmap_get_base(PerlIO *f)
3428 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3429 PerlIOBuf *b = &m->base;
3430 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3432 /* Already have a readbuffer in progress */
3437 /* We have a write buffer or flushed PerlIOBuf read buffer */
3438 m->bbuf = b->buf; /* save it in case we need it again */
3439 b->buf = NULL; /* Clear to trigger below */
3443 PerlIOMmap_map(f); /* Try and map it */
3446 /* Map did not work - recover PerlIOBuf buffer if we have one */
3450 b->ptr = b->end = b->buf;
3453 return PerlIOBuf_get_base(f);
3457 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
3459 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3460 PerlIOBuf *b = &m->base;
3461 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3463 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
3466 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
3471 /* Loose the unwritable mapped buffer */
3473 /* If flush took the "buffer" see if we have one from before */
3474 if (!b->buf && m->bbuf)
3478 PerlIOBuf_get_base(f);
3482 return PerlIOBuf_unread(f,vbuf,count);
3486 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
3488 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3489 PerlIOBuf *b = &m->base;
3490 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
3492 /* No, or wrong sort of, buffer */
3495 if (PerlIOMmap_unmap(f) != 0)
3498 /* If unmap took the "buffer" see if we have one from before */
3499 if (!b->buf && m->bbuf)
3503 PerlIOBuf_get_base(f);
3507 return PerlIOBuf_write(f,vbuf,count);
3511 PerlIOMmap_flush(PerlIO *f)
3513 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3514 PerlIOBuf *b = &m->base;
3515 IV code = PerlIOBuf_flush(f);
3516 /* Now we are "synced" at PerlIOBuf level */
3521 /* Unmap the buffer */
3522 if (PerlIOMmap_unmap(f) != 0)
3527 /* We seem to have a PerlIOBuf buffer which was not mapped
3528 * remember it in case we need one later
3537 PerlIOMmap_fill(PerlIO *f)
3539 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3540 IV code = PerlIO_flush(f);
3541 if (code == 0 && !b->buf)
3543 code = PerlIOMmap_map(f);
3545 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3547 code = PerlIOBuf_fill(f);
3553 PerlIOMmap_close(PerlIO *f)
3555 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3556 PerlIOBuf *b = &m->base;
3557 IV code = PerlIO_flush(f);
3562 b->ptr = b->end = b->buf;
3564 if (PerlIOBuf_close(f) != 0)
3570 PerlIO_funcs PerlIO_mmap = {
3589 PerlIOBase_clearerr,
3590 PerlIOBase_setlinebuf,
3591 PerlIOMmap_get_base,
3595 PerlIOBuf_set_ptrcnt,
3598 #endif /* HAS_MMAP */
3604 call_atexit(PerlIO_cleanup_layers, NULL);
3608 atexit(&PerlIO_cleanup);
3620 PerlIO_stdstreams(aTHX);
3625 #undef PerlIO_stdout
3632 PerlIO_stdstreams(aTHX);
3637 #undef PerlIO_stderr
3644 PerlIO_stdstreams(aTHX);
3649 /*--------------------------------------------------------------------------------------*/
3651 #undef PerlIO_getname
3653 PerlIO_getname(PerlIO *f, char *buf)
3658 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
3659 if (stdio) name = fgetname(stdio, buf);
3661 Perl_croak(aTHX_ "Don't know how to get file name");
3667 /*--------------------------------------------------------------------------------------*/
3668 /* Functions which can be called on any kind of PerlIO implemented
3674 PerlIO_getc(PerlIO *f)
3677 SSize_t count = PerlIO_read(f,buf,1);
3680 return (unsigned char) buf[0];
3685 #undef PerlIO_ungetc
3687 PerlIO_ungetc(PerlIO *f, int ch)
3692 if (PerlIO_unread(f,&buf,1) == 1)
3700 PerlIO_putc(PerlIO *f, int ch)
3703 return PerlIO_write(f,&buf,1);
3708 PerlIO_puts(PerlIO *f, const char *s)
3710 STRLEN len = strlen(s);
3711 return PerlIO_write(f,s,len);
3714 #undef PerlIO_rewind
3716 PerlIO_rewind(PerlIO *f)
3718 PerlIO_seek(f,(Off_t)0,SEEK_SET);
3722 #undef PerlIO_vprintf
3724 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3727 SV *sv = newSVpvn("",0);
3733 Perl_va_copy(ap, apc);
3734 sv_vcatpvf(sv, fmt, &apc);
3736 sv_vcatpvf(sv, fmt, &ap);
3739 wrote = PerlIO_write(f,s,len);
3744 #undef PerlIO_printf
3746 PerlIO_printf(PerlIO *f,const char *fmt,...)
3751 result = PerlIO_vprintf(f,fmt,ap);
3756 #undef PerlIO_stdoutf
3758 PerlIO_stdoutf(const char *fmt,...)
3763 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
3768 #undef PerlIO_tmpfile
3770 PerlIO_tmpfile(void)
3772 /* I have no idea how portable mkstemp() is ... */
3773 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
3776 FILE *stdio = PerlSIO_tmpfile();
3779 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),&PerlIO_stdio,"w+",Nullsv),PerlIOStdio);
3785 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
3786 int fd = mkstemp(SvPVX(sv));
3790 f = PerlIO_fdopen(fd,"w+");
3793 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
3795 PerlLIO_unlink(SvPVX(sv));
3805 #endif /* USE_SFIO */
3806 #endif /* PERLIO_IS_STDIO */
3808 /*======================================================================================*/
3809 /* Now some functions in terms of above which may be needed even if
3810 we are not in true PerlIO mode
3814 #undef PerlIO_setpos
3816 PerlIO_setpos(PerlIO *f, SV *pos)
3822 Off_t *posn = (Off_t *) SvPV(pos,len);
3823 if (f && len == sizeof(Off_t))
3824 return PerlIO_seek(f,*posn,SEEK_SET);
3826 SETERRNO(EINVAL,SS$_IVCHAN);
3830 #undef PerlIO_setpos
3832 PerlIO_setpos(PerlIO *f, SV *pos)
3838 Fpos_t *fpos = (Fpos_t *) SvPV(pos,len);
3839 if (f && len == sizeof(Fpos_t))
3841 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3842 return fsetpos64(f, fpos);
3844 return fsetpos(f, fpos);
3848 SETERRNO(EINVAL,SS$_IVCHAN);
3854 #undef PerlIO_getpos
3856 PerlIO_getpos(PerlIO *f, SV *pos)
3859 Off_t posn = PerlIO_tell(f);
3860 sv_setpvn(pos,(char *)&posn,sizeof(posn));
3861 return (posn == (Off_t)-1) ? -1 : 0;
3864 #undef PerlIO_getpos
3866 PerlIO_getpos(PerlIO *f, SV *pos)
3871 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3872 code = fgetpos64(f, &fpos);
3874 code = fgetpos(f, &fpos);
3876 sv_setpvn(pos,(char *)&fpos,sizeof(fpos));
3881 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
3884 vprintf(char *pat, char *args)
3886 _doprnt(pat, args, stdout);
3887 return 0; /* wrong, but perl doesn't use the return value */
3891 vfprintf(FILE *fd, char *pat, char *args)
3893 _doprnt(pat, args, fd);
3894 return 0; /* wrong, but perl doesn't use the return value */
3899 #ifndef PerlIO_vsprintf
3901 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
3903 int val = vsprintf(s, fmt, ap);
3906 if (strlen(s) >= (STRLEN)n)
3909 (void)PerlIO_puts(Perl_error_log,
3910 "panic: sprintf overflow - memory corrupted!\n");
3918 #ifndef PerlIO_sprintf
3920 PerlIO_sprintf(char *s, int n, const char *fmt,...)
3925 result = PerlIO_vsprintf(s, n, fmt, ap);