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);
97 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
99 return perlsio_binmode(fp,iotype,mode);
102 /* De-mux PerlIO_openn() into fdopen, freopen and fopen type entries */
105 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
109 char *name = SvPV_nolen(*args);
112 fd = PerlLIO_open3(name,imode,perm);
114 return PerlIO_fdopen(fd,mode+1);
118 return PerlIO_reopen(name,mode,old);
122 return PerlIO_open(name,mode);
127 return PerlIO_fdopen(fd,mode);
135 #ifdef PERLIO_IS_STDIO
140 /* Does nothing (yet) except force this file to be included
141 in perl binary. That allows this file to force inclusion
142 of other functions that may be required by loadable
143 extensions e.g. for FileHandle::tmpfile
147 #undef PerlIO_tmpfile
154 #else /* PERLIO_IS_STDIO */
161 /* This section is just to make sure these functions
162 get pulled in from libsfio.a
165 #undef PerlIO_tmpfile
175 /* Force this file to be included in perl binary. Which allows
176 * this file to force inclusion of other functions that may be
177 * required by loadable extensions e.g. for FileHandle::tmpfile
181 * sfio does its own 'autoflush' on stdout in common cases.
182 * Flush results in a lot of lseek()s to regular files and
183 * lot of small writes to pipes.
185 sfset(sfstdout,SF_SHARE,0);
189 /*======================================================================================*/
190 /* Implement all the PerlIO interface ourselves.
195 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
200 #include <sys/mman.h>
205 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
208 PerlIO_debug(const char *fmt,...)
216 char *s = PerlEnv_getenv("PERLIO_DEBUG");
218 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
225 SV *sv = newSVpvn("",0);
228 s = CopFILE(PL_curcop);
231 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
232 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
235 PerlLIO_write(dbg,s,len);
241 /*--------------------------------------------------------------------------------------*/
243 /* Inner level routines */
245 /* Table of pointers to the PerlIO structs (malloc'ed) */
246 PerlIO *_perlio = NULL;
247 #define PERLIO_TABLE_SIZE 64
250 PerlIO_allocate(pTHX)
252 /* Find a free slot in the table, allocating new table as necessary */
259 last = (PerlIO **)(f);
260 for (i=1; i < PERLIO_TABLE_SIZE; i++)
268 f = PerlMemShared_calloc(PERLIO_TABLE_SIZE,sizeof(PerlIO));
278 PerlIO_cleantable(pTHX_ PerlIO **tablep)
280 PerlIO *table = *tablep;
284 PerlIO_cleantable(aTHX_ (PerlIO **) &(table[0]));
285 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
293 PerlMemShared_free(table);
305 PerlIO_cleantable(aTHX_ &_perlio);
309 PerlIO_pop(PerlIO *f)
315 PerlIO_debug("PerlIO_pop f=%p %s\n",f,l->tab->name);
317 (*l->tab->Popped)(f);
319 PerlMemShared_free(l);
323 /*--------------------------------------------------------------------------------------*/
324 /* XS Interface for perl code */
330 char *s = GvNAME(gv);
331 STRLEN l = GvNAMELEN(gv);
332 PerlIO_debug("%.*s\n",(int) l,s);
336 XS(XS_perlio_unimport)
340 char *s = GvNAME(gv);
341 STRLEN l = GvNAMELEN(gv);
342 PerlIO_debug("%.*s\n",(int) l,s);
347 PerlIO_find_layer(const char *name, STRLEN len)
352 if ((SSize_t) len <= 0)
354 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
355 if (svp && (sv = *svp) && SvROK(sv))
362 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
366 IO *io = GvIOn((GV *)SvRV(sv));
367 PerlIO *ifp = IoIFP(io);
368 PerlIO *ofp = IoOFP(io);
369 AV *av = (AV *) mg->mg_obj;
370 Perl_warn(aTHX_ "set %"SVf" %p %p %p",sv,io,ifp,ofp);
376 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
380 IO *io = GvIOn((GV *)SvRV(sv));
381 PerlIO *ifp = IoIFP(io);
382 PerlIO *ofp = IoOFP(io);
383 AV *av = (AV *) mg->mg_obj;
384 Perl_warn(aTHX_ "get %"SVf" %p %p %p",sv,io,ifp,ofp);
390 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
392 Perl_warn(aTHX_ "clear %"SVf,sv);
397 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
399 Perl_warn(aTHX_ "free %"SVf,sv);
403 MGVTBL perlio_vtab = {
411 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
414 SV *sv = SvRV(ST(1));
419 sv_magic(sv, (SV *)av, '~', NULL, 0);
421 mg = mg_find(sv,'~');
422 mg->mg_virtual = &perlio_vtab;
424 Perl_warn(aTHX_ "attrib %"SVf,sv);
425 for (i=2; i < items; i++)
428 const char *name = SvPV(ST(i),len);
429 SV *layer = PerlIO_find_layer(name,len);
432 av_push(av,SvREFCNT_inc(layer));
445 PerlIO_define_layer(PerlIO_funcs *tab)
448 HV *stash = gv_stashpv("perlio::Layer", TRUE);
449 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
450 if (!PerlIO_layer_hv)
452 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
454 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
455 PerlIO_debug("define %s %p\n",tab->name,tab);
459 PerlIO_default_buffer(pTHX)
461 PerlIO_funcs *tab = &PerlIO_perlio;
462 if (O_BINARY != O_TEXT)
468 if (PerlIO_stdio.Set_ptrcnt)
473 PerlIO_debug("Pushing %s\n",tab->name);
474 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(tab->name,0)));
479 PerlIO_default_layer(I32 n)
484 PerlIO_funcs *tab = &PerlIO_stdio;
486 if (!PerlIO_layer_av)
488 const char *s = PerlEnv_getenv("PERLIO");
489 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
490 newXS("perlio::import",XS_perlio_import,__FILE__);
491 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
493 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
495 PerlIO_define_layer(&PerlIO_raw);
496 PerlIO_define_layer(&PerlIO_unix);
497 PerlIO_define_layer(&PerlIO_perlio);
498 PerlIO_define_layer(&PerlIO_stdio);
499 PerlIO_define_layer(&PerlIO_crlf);
501 PerlIO_define_layer(&PerlIO_mmap);
503 PerlIO_define_layer(&PerlIO_utf8);
504 PerlIO_define_layer(&PerlIO_byte);
505 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
511 while (*s && isSPACE((unsigned char)*s))
517 while (*e && !isSPACE((unsigned char)*e))
521 layer = PerlIO_find_layer(s,e-s);
524 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
525 if ((tab->kind & PERLIO_K_DUMMY) && (tab->kind & PERLIO_K_BUFFERED))
528 PerlIO_default_buffer(aTHX);
530 PerlIO_debug("Pushing %.*s\n",(e-s),s);
531 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
532 buffered |= (tab->kind & PERLIO_K_BUFFERED);
535 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
541 len = av_len(PerlIO_layer_av);
544 PerlIO_default_buffer(aTHX);
545 len = av_len(PerlIO_layer_av);
549 svp = av_fetch(PerlIO_layer_av,n,0);
550 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
552 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
554 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
558 #define PerlIO_default_top() PerlIO_default_layer(-1)
559 #define PerlIO_default_btm() PerlIO_default_layer(0)
567 PerlIO_allocate(aTHX);
568 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
569 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
570 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
575 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode,const char *arg,STRLEN len)
579 l = PerlMemShared_calloc(tab->size,sizeof(char));
582 Zero(l,tab->size,char);
586 PerlIO_debug("PerlIO_push f=%p %s %s '%.*s'\n",
587 f,tab->name,(mode) ? mode : "(Null)",(int) len,arg);
588 if ((*l->tab->Pushed)(f,mode,arg,len) != 0)
598 PerlIOPop_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
611 PerlIORaw_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
613 /* Remove the dummy layer */
615 /* Pop back to bottom layer */
620 while (!(PerlIOBase(f)->tab->kind & PERLIO_K_RAW))
628 /* Nothing bellow - push unix on top then remove it */
629 if (PerlIO_push(f,PerlIO_default_btm(),mode,arg,len))
631 PerlIO_pop(PerlIONext(f));
636 PerlIO_debug(":raw f=%p :%s\n",f,PerlIOBase(f)->tab->name);
643 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
647 const char *s = names;
650 while (isSPACE(*s) || *s == ':')
656 const char *as = Nullch;
660 /* Message is consistent with how attribute lists are passed.
661 Even though this means "foo : : bar" is seen as an invalid separator
663 char q = ((*s == '\'') ? '"' : '\'');
664 Perl_warn(aTHX_ "perlio: invalid separator character %c%c%c in layer specification list", q, *s, q);
670 } while (isALNUM(*e));
688 /* It's a nul terminated string, not allowed to \ the terminating null.
689 Anything other character is passed over. */
697 Perl_warn(aTHX_ "perlio: argument list not closed for layer \"%.*s\"",(int)(e - s),s);
707 SV *layer = PerlIO_find_layer(s,llen);
710 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
713 if (!PerlIO_push(f,tab,mode,as,alen))
718 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)llen,s);
731 /*--------------------------------------------------------------------------------------*/
732 /* Given the abstraction above the public API functions */
735 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
737 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
738 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
739 if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY)))
745 if (PerlIOBase(top)->tab == &PerlIO_crlf)
748 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
751 top = PerlIONext(top);
754 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
759 PerlIO__close(PerlIO *f)
761 return (*PerlIOBase(f)->tab->Close)(f);
764 #undef PerlIO_fdupopen
766 PerlIO_fdupopen(pTHX_ PerlIO *f)
769 int fd = PerlLIO_dup(PerlIO_fileno(f));
770 PerlIO *new = PerlIO_fdopen(fd,PerlIO_modestr(f,buf));
773 Off_t posn = PerlIO_tell(f);
774 PerlIO_seek(new,posn,SEEK_SET);
781 PerlIO_close(PerlIO *f)
783 int code = (*PerlIOBase(f)->tab->Close)(f);
793 PerlIO_fileno(PerlIO *f)
795 return (*PerlIOBase(f)->tab->Fileno)(f);
799 PerlIO_top_layer(pTHX_ const char *layers)
802 return PerlIO_default_top();
806 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
808 PerlIO_funcs *tab = (f && *f) ? PerlIOBase(f)->tab : PerlIO_top_layer(aTHX_ layers);
811 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
812 tab->name,layers,mode,fd,imode,perm,f,narg,args);
813 f = (*tab->Open)(aTHX_ tab,mode,fd,imode,perm,f,narg,args);
816 if (layers && *layers)
817 PerlIO_apply_layers(aTHX_ f,mode,layers);
825 PerlIO_fdopen(int fd, const char *mode)
828 return PerlIO_openn(aTHX_ Nullch,mode,fd,0,0,NULL,0,NULL);
833 PerlIO_open(const char *path, const char *mode)
836 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
837 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,NULL,1,&name);
842 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
845 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
846 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,f,1,&name);
851 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
853 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
858 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
860 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
865 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
867 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
872 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
874 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
879 PerlIO_tell(PerlIO *f)
881 return (*PerlIOBase(f)->tab->Tell)(f);
886 PerlIO_flush(PerlIO *f)
890 PerlIO_funcs *tab = PerlIOBase(f)->tab;
891 if (tab && tab->Flush)
893 return (*tab->Flush)(f);
897 PerlIO_debug("Cannot flush f=%p :%s\n",f,tab->name);
904 PerlIO **table = &_perlio;
909 table = (PerlIO **)(f++);
910 for (i=1; i < PERLIO_TABLE_SIZE; i++)
912 if (*f && PerlIO_flush(f) != 0)
923 PerlIO_fill(PerlIO *f)
925 return (*PerlIOBase(f)->tab->Fill)(f);
930 PerlIO_isutf8(PerlIO *f)
932 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
937 PerlIO_eof(PerlIO *f)
939 return (*PerlIOBase(f)->tab->Eof)(f);
944 PerlIO_error(PerlIO *f)
946 return (*PerlIOBase(f)->tab->Error)(f);
949 #undef PerlIO_clearerr
951 PerlIO_clearerr(PerlIO *f)
954 (*PerlIOBase(f)->tab->Clearerr)(f);
957 #undef PerlIO_setlinebuf
959 PerlIO_setlinebuf(PerlIO *f)
961 (*PerlIOBase(f)->tab->Setlinebuf)(f);
964 #undef PerlIO_has_base
966 PerlIO_has_base(PerlIO *f)
970 return (PerlIOBase(f)->tab->Get_base != NULL);
975 #undef PerlIO_fast_gets
977 PerlIO_fast_gets(PerlIO *f)
979 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS))
981 PerlIO_funcs *tab = PerlIOBase(f)->tab;
982 return (tab->Set_ptrcnt != NULL);
987 #undef PerlIO_has_cntptr
989 PerlIO_has_cntptr(PerlIO *f)
993 PerlIO_funcs *tab = PerlIOBase(f)->tab;
994 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
999 #undef PerlIO_canset_cnt
1001 PerlIO_canset_cnt(PerlIO *f)
1005 PerlIOl *l = PerlIOBase(f);
1006 return (l->tab->Set_ptrcnt != NULL);
1011 #undef PerlIO_get_base
1013 PerlIO_get_base(PerlIO *f)
1015 return (*PerlIOBase(f)->tab->Get_base)(f);
1018 #undef PerlIO_get_bufsiz
1020 PerlIO_get_bufsiz(PerlIO *f)
1022 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
1025 #undef PerlIO_get_ptr
1027 PerlIO_get_ptr(PerlIO *f)
1029 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1030 if (tab->Get_ptr == NULL)
1032 return (*tab->Get_ptr)(f);
1035 #undef PerlIO_get_cnt
1037 PerlIO_get_cnt(PerlIO *f)
1039 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1040 if (tab->Get_cnt == NULL)
1042 return (*tab->Get_cnt)(f);
1045 #undef PerlIO_set_cnt
1047 PerlIO_set_cnt(PerlIO *f,int cnt)
1049 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
1052 #undef PerlIO_set_ptrcnt
1054 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
1056 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1057 if (tab->Set_ptrcnt == NULL)
1060 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
1062 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
1065 /*--------------------------------------------------------------------------------------*/
1066 /* utf8 and raw dummy layers */
1069 PerlIOUtf8_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
1073 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1075 if (tab->kind & PERLIO_K_UTF8)
1076 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1078 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1085 PerlIOUtf8_open(pTHX_ PerlIO_funcs *self, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
1087 PerlIO_funcs *tab = PerlIO_default_layer(-2);
1088 PerlIO *f = (*tab->Open)(aTHX_ tab,mode,fd,imode,perm,old,narg,args);
1091 PerlIOl *l = PerlIOBase(f);
1092 if (tab->kind & PERLIO_K_UTF8)
1093 l->flags |= PERLIO_F_UTF8;
1095 l->flags &= ~PERLIO_F_UTF8;
1100 PerlIO_funcs PerlIO_utf8 = {
1103 PERLIO_K_DUMMY|PERLIO_F_UTF8,
1120 NULL, /* get_base */
1121 NULL, /* get_bufsiz */
1124 NULL, /* set_ptrcnt */
1127 PerlIO_funcs PerlIO_byte = {
1147 NULL, /* get_base */
1148 NULL, /* get_bufsiz */
1151 NULL, /* set_ptrcnt */
1155 PerlIORaw_open(pTHX_ PerlIO_funcs *self, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
1157 PerlIO_funcs *tab = PerlIO_default_btm();
1158 return (*tab->Open)(aTHX_ tab,mode,fd,imode,perm,old,narg,args);
1161 PerlIO_funcs PerlIO_raw = {
1181 NULL, /* get_base */
1182 NULL, /* get_bufsiz */
1185 NULL, /* set_ptrcnt */
1187 /*--------------------------------------------------------------------------------------*/
1188 /*--------------------------------------------------------------------------------------*/
1189 /* "Methods" of the "base class" */
1192 PerlIOBase_fileno(PerlIO *f)
1194 return PerlIO_fileno(PerlIONext(f));
1198 PerlIO_modestr(PerlIO *f,char *buf)
1201 IV flags = PerlIOBase(f)->flags;
1202 if (flags & PERLIO_F_APPEND)
1205 if (flags & PERLIO_F_CANREAD)
1210 else if (flags & PERLIO_F_CANREAD)
1213 if (flags & PERLIO_F_CANWRITE)
1216 else if (flags & PERLIO_F_CANWRITE)
1219 if (flags & PERLIO_F_CANREAD)
1224 #if O_TEXT != O_BINARY
1225 if (!(flags & PERLIO_F_CRLF))
1233 PerlIOBase_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
1235 PerlIOl *l = PerlIOBase(f);
1236 const char *omode = mode;
1238 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1239 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
1240 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1241 if (tab->Set_ptrcnt != NULL)
1242 l->flags |= PERLIO_F_FASTGETS;
1248 l->flags |= PERLIO_F_CANREAD;
1251 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
1254 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
1265 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
1268 l->flags &= ~PERLIO_F_CRLF;
1271 l->flags |= PERLIO_F_CRLF;
1283 l->flags |= l->next->flags &
1284 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1288 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08"UVxf" (%s)\n",
1289 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
1290 l->flags,PerlIO_modestr(f,temp));
1296 PerlIOBase_popped(PerlIO *f)
1302 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1304 Off_t old = PerlIO_tell(f);
1306 PerlIO_push(f,&PerlIO_pending,"r",Nullch,0);
1307 done = PerlIOBuf_unread(f,vbuf,count);
1308 PerlIOSelf(f,PerlIOBuf)->posn = old - done;
1313 PerlIOBase_noop_ok(PerlIO *f)
1319 PerlIOBase_noop_fail(PerlIO *f)
1325 PerlIOBase_close(PerlIO *f)
1328 PerlIO *n = PerlIONext(f);
1329 if (PerlIO_flush(f) != 0)
1331 if (n && (*PerlIOBase(n)->tab->Close)(n) != 0)
1333 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1338 PerlIOBase_eof(PerlIO *f)
1342 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1348 PerlIOBase_error(PerlIO *f)
1352 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1358 PerlIOBase_clearerr(PerlIO *f)
1362 PerlIO *n = PerlIONext(f);
1363 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1370 PerlIOBase_setlinebuf(PerlIO *f)
1375 /*--------------------------------------------------------------------------------------*/
1376 /* Bottom-most level for UNIX-like case */
1380 struct _PerlIO base; /* The generic part */
1381 int fd; /* UNIX like file descriptor */
1382 int oflags; /* open/fcntl flags */
1386 PerlIOUnix_oflags(const char *mode)
1401 oflags = O_CREAT|O_TRUNC;
1412 oflags = O_CREAT|O_APPEND;
1428 else if (*mode == 't')
1431 oflags &= ~O_BINARY;
1434 /* Always open in binary mode */
1436 if (*mode || oflags == -1)
1445 PerlIOUnix_fileno(PerlIO *f)
1447 return PerlIOSelf(f,PerlIOUnix)->fd;
1451 PerlIOUnix_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
1453 IV code = PerlIOBase_pushed(f,mode,arg,len);
1456 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1457 s->fd = PerlIO_fileno(PerlIONext(f));
1458 s->oflags = PerlIOUnix_oflags(mode);
1460 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1465 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1473 int oflags = PerlIOUnix_oflags(mode);
1476 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOUnix);
1485 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1489 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1490 (*PerlIOBase(f)->tab->Close)(f);
1494 char *path = SvPV_nolen(*args);
1499 imode = PerlIOUnix_oflags(mode);
1504 fd = PerlLIO_open3(path,imode,perm);
1514 f = PerlIO_allocate(aTHX);
1515 s = PerlIOSelf(PerlIO_push(f,self,mode,Nullch,0),PerlIOUnix);
1518 s = PerlIOSelf(f,PerlIOUnix);
1521 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1528 /* FIXME: pop layers ??? */
1535 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1538 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1539 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1543 SSize_t len = PerlLIO_read(fd,vbuf,count);
1544 if (len >= 0 || errno != EINTR)
1547 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1548 else if (len == 0 && count != 0)
1549 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1557 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1560 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1563 SSize_t len = PerlLIO_write(fd,vbuf,count);
1564 if (len >= 0 || errno != EINTR)
1567 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1575 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1578 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1579 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1580 return (new == (Off_t) -1) ? -1 : 0;
1584 PerlIOUnix_tell(PerlIO *f)
1587 Off_t posn = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1588 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1592 PerlIOUnix_close(PerlIO *f)
1595 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1597 while (PerlLIO_close(fd) != 0)
1608 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1613 PerlIO_funcs PerlIO_unix = {
1627 PerlIOBase_noop_ok, /* flush */
1628 PerlIOBase_noop_fail, /* fill */
1631 PerlIOBase_clearerr,
1632 PerlIOBase_setlinebuf,
1633 NULL, /* get_base */
1634 NULL, /* get_bufsiz */
1637 NULL, /* set_ptrcnt */
1640 /*--------------------------------------------------------------------------------------*/
1641 /* stdio as a layer */
1645 struct _PerlIO base;
1646 FILE * stdio; /* The stream */
1650 PerlIOStdio_fileno(PerlIO *f)
1653 return PerlSIO_fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1657 PerlIOStdio_mode(const char *mode,char *tmode)
1664 if (O_BINARY != O_TEXT)
1673 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1681 /* This isn't used yet ... */
1683 PerlIOStdio_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
1688 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1690 FILE *stdio = PerlSIO_fdopen(PerlIO_fileno(PerlIONext(f)),mode = PerlIOStdio_mode(mode,tmode));
1696 return PerlIOBase_pushed(f,mode,arg,len);
1699 #undef PerlIO_importFILE
1701 PerlIO_importFILE(FILE *stdio, int fl)
1707 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"r+",Nullch,0),PerlIOStdio);
1714 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1719 char *path = SvPV_nolen(*args);
1720 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1721 FILE *stdio = PerlSIO_freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
1731 char *path = SvPV_nolen(*args);
1735 fd = PerlLIO_open3(path,imode,perm);
1739 FILE *stdio = PerlSIO_fopen(path,mode);
1742 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX), self,
1743 (mode = PerlIOStdio_mode(mode,tmode)),Nullch,0),
1764 stdio = PerlSIO_stdin;
1767 stdio = PerlSIO_stdout;
1770 stdio = PerlSIO_stderr;
1776 stdio = PerlSIO_fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
1780 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOStdio);
1790 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1793 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1797 STDCHAR *buf = (STDCHAR *) vbuf;
1798 /* Perl is expecting PerlIO_getc() to fill the buffer
1799 * Linux's stdio does not do that for fread()
1801 int ch = PerlSIO_fgetc(s);
1809 got = PerlSIO_fread(vbuf,1,count,s);
1814 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1817 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1818 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1822 int ch = *buf-- & 0xff;
1823 if (PerlSIO_ungetc(ch,s) != ch)
1832 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1835 return PerlSIO_fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1839 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1842 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1843 return PerlSIO_fseek(stdio,offset,whence);
1847 PerlIOStdio_tell(PerlIO *f)
1850 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1851 return PerlSIO_ftell(stdio);
1855 PerlIOStdio_close(PerlIO *f)
1858 #ifdef HAS_SOCKS5_INIT
1859 int optval, optlen = sizeof(int);
1861 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1863 #ifdef HAS_SOCKS5_INIT
1864 (getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (char *)&optval, &optlen) < 0) ?
1865 PerlSIO_fclose(stdio) :
1866 close(PerlIO_fileno(f))
1868 PerlSIO_fclose(stdio)
1875 PerlIOStdio_flush(PerlIO *f)
1878 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1879 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
1881 return PerlSIO_fflush(stdio);
1886 /* FIXME: This discards ungetc() and pre-read stuff which is
1887 not right if this is just a "sync" from a layer above
1888 Suspect right design is to do _this_ but not have layer above
1889 flush this layer read-to-read
1891 /* Not writeable - sync by attempting a seek */
1893 if (PerlSIO_fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
1901 PerlIOStdio_fill(PerlIO *f)
1904 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1906 /* fflush()ing read-only streams can cause trouble on some stdio-s */
1907 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1909 if (PerlSIO_fflush(stdio) != 0)
1912 c = PerlSIO_fgetc(stdio);
1913 if (c == EOF || PerlSIO_ungetc(c,stdio) != c)
1919 PerlIOStdio_eof(PerlIO *f)
1922 return PerlSIO_feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1926 PerlIOStdio_error(PerlIO *f)
1929 return PerlSIO_ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1933 PerlIOStdio_clearerr(PerlIO *f)
1936 PerlSIO_clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1940 PerlIOStdio_setlinebuf(PerlIO *f)
1943 #ifdef HAS_SETLINEBUF
1944 PerlSIO_setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1946 PerlSIO_setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1952 PerlIOStdio_get_base(PerlIO *f)
1955 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1956 return PerlSIO_get_base(stdio);
1960 PerlIOStdio_get_bufsiz(PerlIO *f)
1963 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1964 return PerlSIO_get_bufsiz(stdio);
1968 #ifdef USE_STDIO_PTR
1970 PerlIOStdio_get_ptr(PerlIO *f)
1973 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1974 return PerlSIO_get_ptr(stdio);
1978 PerlIOStdio_get_cnt(PerlIO *f)
1981 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1982 return PerlSIO_get_cnt(stdio);
1986 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1989 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1992 #ifdef STDIO_PTR_LVALUE
1993 PerlSIO_set_ptr(stdio,ptr);
1994 #ifdef STDIO_PTR_LVAL_SETS_CNT
1995 if (PerlSIO_get_cnt(stdio) != (cnt))
1998 assert(PerlSIO_get_cnt(stdio) == (cnt));
2001 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
2002 /* Setting ptr _does_ change cnt - we are done */
2005 #else /* STDIO_PTR_LVALUE */
2007 #endif /* STDIO_PTR_LVALUE */
2009 /* Now (or only) set cnt */
2010 #ifdef STDIO_CNT_LVALUE
2011 PerlSIO_set_cnt(stdio,cnt);
2012 #else /* STDIO_CNT_LVALUE */
2013 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
2014 PerlSIO_set_ptr(stdio,PerlSIO_get_ptr(stdio)+(PerlSIO_get_cnt(stdio)-cnt));
2015 #else /* STDIO_PTR_LVAL_SETS_CNT */
2017 #endif /* STDIO_PTR_LVAL_SETS_CNT */
2018 #endif /* STDIO_CNT_LVALUE */
2023 PerlIO_funcs PerlIO_stdio = {
2025 sizeof(PerlIOStdio),
2041 PerlIOStdio_clearerr,
2042 PerlIOStdio_setlinebuf,
2044 PerlIOStdio_get_base,
2045 PerlIOStdio_get_bufsiz,
2050 #ifdef USE_STDIO_PTR
2051 PerlIOStdio_get_ptr,
2052 PerlIOStdio_get_cnt,
2053 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
2054 PerlIOStdio_set_ptrcnt
2055 #else /* STDIO_PTR_LVALUE */
2057 #endif /* STDIO_PTR_LVALUE */
2058 #else /* USE_STDIO_PTR */
2062 #endif /* USE_STDIO_PTR */
2065 #undef PerlIO_exportFILE
2067 PerlIO_exportFILE(PerlIO *f, int fl)
2071 stdio = fdopen(PerlIO_fileno(f),"r+");
2074 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f,&PerlIO_stdio,"r+",Nullch,0),PerlIOStdio);
2080 #undef PerlIO_findFILE
2082 PerlIO_findFILE(PerlIO *f)
2087 if (l->tab == &PerlIO_stdio)
2089 PerlIOStdio *s = PerlIOSelf(&l,PerlIOStdio);
2092 l = *PerlIONext(&l);
2094 return PerlIO_exportFILE(f,0);
2097 #undef PerlIO_releaseFILE
2099 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2103 /*--------------------------------------------------------------------------------------*/
2104 /* perlio buffer layer */
2107 PerlIOBuf_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
2109 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2110 int fd = PerlIO_fileno(f);
2112 if (fd >= 0 && PerlLIO_isatty(fd))
2114 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
2116 posn = PerlIO_tell(PerlIONext(f));
2117 if (posn != (Off_t) -1)
2121 return PerlIOBase_pushed(f,mode,arg,len);
2125 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2129 PerlIO *next = PerlIONext(f);
2130 PerlIO_funcs *tab = PerlIOBase(next)->tab;
2131 next = (*tab->Open)(aTHX_ tab,mode,fd,imode,perm,next,narg,args);
2132 if (!next || (*PerlIOBase(f)->tab->Pushed)(f,mode,Nullch,0) != 0)
2139 PerlIO_funcs *tab = PerlIO_default_btm();
2146 f = (*tab->Open)(aTHX_ tab,mode,fd,imode,perm,NULL,narg,args);
2149 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode,Nullch,0),PerlIOBuf);
2150 fd = PerlIO_fileno(f);
2151 #if O_BINARY != O_TEXT
2152 /* do something about failing setmode()? --jhi */
2153 PerlLIO_setmode(fd , O_BINARY);
2155 if (init && fd == 2)
2157 /* Initial stderr is unbuffered */
2158 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2165 /* This "flush" is akin to sfio's sync in that it handles files in either
2169 PerlIOBuf_flush(PerlIO *f)
2171 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2173 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2175 /* write() the buffer */
2176 STDCHAR *buf = b->buf;
2178 PerlIO *n = PerlIONext(f);
2181 SSize_t count = PerlIO_write(n,p,b->ptr - p);
2186 else if (count < 0 || PerlIO_error(n))
2188 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2193 b->posn += (p - buf);
2195 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2197 STDCHAR *buf = PerlIO_get_base(f);
2198 /* Note position change */
2199 b->posn += (b->ptr - buf);
2200 if (b->ptr < b->end)
2202 /* We did not consume all of it */
2203 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
2205 b->posn = PerlIO_tell(PerlIONext(f));
2209 b->ptr = b->end = b->buf;
2210 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2211 /* FIXME: Is this right for read case ? */
2212 if (PerlIO_flush(PerlIONext(f)) != 0)
2218 PerlIOBuf_fill(PerlIO *f)
2220 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2221 PerlIO *n = PerlIONext(f);
2223 /* FIXME: doing the down-stream flush is a bad idea if it causes
2224 pre-read data in stdio buffer to be discarded
2225 but this is too simplistic - as it skips _our_ hosekeeping
2226 and breaks tell tests.
2227 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2231 if (PerlIO_flush(f) != 0)
2235 PerlIO_get_base(f); /* allocate via vtable */
2237 b->ptr = b->end = b->buf;
2238 if (PerlIO_fast_gets(n))
2240 /* Layer below is also buffered
2241 * We do _NOT_ want to call its ->Read() because that will loop
2242 * till it gets what we asked for which may hang on a pipe etc.
2243 * Instead take anything it has to hand, or ask it to fill _once_.
2245 avail = PerlIO_get_cnt(n);
2248 avail = PerlIO_fill(n);
2250 avail = PerlIO_get_cnt(n);
2253 if (!PerlIO_error(n) && PerlIO_eof(n))
2259 STDCHAR *ptr = PerlIO_get_ptr(n);
2260 SSize_t cnt = avail;
2261 if (avail > b->bufsiz)
2263 Copy(ptr,b->buf,avail,STDCHAR);
2264 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
2269 avail = PerlIO_read(n,b->ptr,b->bufsiz);
2274 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2276 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2279 b->end = b->buf+avail;
2280 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2285 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
2287 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2288 STDCHAR *buf = (STDCHAR *) vbuf;
2293 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
2297 SSize_t avail = PerlIO_get_cnt(f);
2298 SSize_t take = (count < avail) ? count : avail;
2301 STDCHAR *ptr = PerlIO_get_ptr(f);
2302 Copy(ptr,buf,take,STDCHAR);
2303 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
2307 if (count > 0 && avail <= 0)
2309 if (PerlIO_fill(f) != 0)
2313 return (buf - (STDCHAR *) vbuf);
2319 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
2321 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2322 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2325 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2331 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2333 avail = (b->ptr - b->buf);
2338 b->end = b->buf + avail;
2340 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2341 b->posn -= b->bufsiz;
2343 if (avail > (SSize_t) count)
2351 Copy(buf,b->ptr,avail,STDCHAR);
2355 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2362 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2364 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2365 const STDCHAR *buf = (const STDCHAR *) vbuf;
2369 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2373 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2374 if ((SSize_t) count < avail)
2376 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2377 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2397 Copy(buf,b->ptr,avail,STDCHAR);
2404 if (b->ptr >= (b->buf + b->bufsiz))
2407 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2413 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2416 if ((code = PerlIO_flush(f)) == 0)
2418 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2419 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2420 code = PerlIO_seek(PerlIONext(f),offset,whence);
2423 b->posn = PerlIO_tell(PerlIONext(f));
2430 PerlIOBuf_tell(PerlIO *f)
2432 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2433 Off_t posn = b->posn;
2435 posn += (b->ptr - b->buf);
2440 PerlIOBuf_close(PerlIO *f)
2443 IV code = PerlIOBase_close(f);
2444 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2445 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2447 PerlMemShared_free(b->buf);
2450 b->ptr = b->end = b->buf;
2451 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2456 PerlIOBuf_setlinebuf(PerlIO *f)
2460 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
2465 PerlIOBuf_get_ptr(PerlIO *f)
2467 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2474 PerlIOBuf_get_cnt(PerlIO *f)
2476 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2479 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2480 return (b->end - b->ptr);
2485 PerlIOBuf_get_base(PerlIO *f)
2487 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2493 b->buf = PerlMemShared_calloc(b->bufsiz,sizeof(STDCHAR));
2496 b->buf = (STDCHAR *)&b->oneword;
2497 b->bufsiz = sizeof(b->oneword);
2506 PerlIOBuf_bufsiz(PerlIO *f)
2508 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2511 return (b->end - b->buf);
2515 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2517 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2521 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2524 assert(PerlIO_get_cnt(f) == cnt);
2525 assert(b->ptr >= b->buf);
2527 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2530 PerlIO_funcs PerlIO_perlio = {
2548 PerlIOBase_clearerr,
2549 PerlIOBuf_setlinebuf,
2554 PerlIOBuf_set_ptrcnt,
2557 /*--------------------------------------------------------------------------------------*/
2558 /* Temp layer to hold unread chars when cannot do it any other way */
2561 PerlIOPending_fill(PerlIO *f)
2563 /* Should never happen */
2569 PerlIOPending_close(PerlIO *f)
2571 /* A tad tricky - flush pops us, then we close new top */
2573 return PerlIO_close(f);
2577 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
2579 /* A tad tricky - flush pops us, then we seek new top */
2581 return PerlIO_seek(f,offset,whence);
2586 PerlIOPending_flush(PerlIO *f)
2588 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2589 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2592 PerlMemShared_free(b->buf);
2600 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2608 PerlIOBuf_set_ptrcnt(f,ptr,cnt);
2613 PerlIOPending_pushed(PerlIO *f,const char *mode,const char *arg,STRLEN len)
2615 IV code = PerlIOBase_pushed(f,mode,arg,len);
2616 PerlIOl *l = PerlIOBase(f);
2617 /* Our PerlIO_fast_gets must match what we are pushed on,
2618 or sv_gets() etc. get muddled when it changes mid-string
2621 l->flags = (l->flags & ~(PERLIO_F_FASTGETS|PERLIO_F_UTF8)) |
2622 (PerlIOBase(PerlIONext(f))->flags & (PERLIO_F_FASTGETS|PERLIO_F_UTF8));
2627 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
2629 SSize_t avail = PerlIO_get_cnt(f);
2634 got = PerlIOBuf_read(f,vbuf,avail);
2635 if (got >= 0 && got < count)
2637 SSize_t more = PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
2638 if (more >= 0 || got == 0)
2645 PerlIO_funcs PerlIO_pending = {
2651 PerlIOPending_pushed,
2658 PerlIOPending_close,
2659 PerlIOPending_flush,
2663 PerlIOBase_clearerr,
2664 PerlIOBuf_setlinebuf,
2669 PerlIOPending_set_ptrcnt,
2674 /*--------------------------------------------------------------------------------------*/
2675 /* crlf - translation
2676 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
2677 to hand back a line at a time and keeping a record of which nl we "lied" about.
2678 On write translate "\n" to CR,LF
2683 PerlIOBuf base; /* PerlIOBuf stuff */
2684 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
2688 PerlIOCrlf_pushed(PerlIO *f, const char *mode,const char *arg,STRLEN len)
2691 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
2692 code = PerlIOBuf_pushed(f,mode,arg,len);
2694 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n",
2695 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
2696 PerlIOBase(f)->flags);
2703 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
2705 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2711 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2712 return PerlIOBuf_unread(f,vbuf,count);
2715 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2716 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2718 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2724 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2726 b->end = b->ptr = b->buf + b->bufsiz;
2727 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2728 b->posn -= b->bufsiz;
2730 while (count > 0 && b->ptr > b->buf)
2735 if (b->ptr - 2 >= b->buf)
2761 PerlIOCrlf_get_cnt(PerlIO *f)
2763 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2766 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2768 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2769 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
2771 STDCHAR *nl = b->ptr;
2773 while (nl < b->end && *nl != 0xd)
2775 if (nl < b->end && *nl == 0xd)
2787 /* Not CR,LF but just CR */
2794 /* Blast - found CR as last char in buffer */
2797 /* They may not care, defer work as long as possible */
2798 return (nl - b->ptr);
2804 b->ptr++; /* say we have read it as far as flush() is concerned */
2805 b->buf++; /* Leave space an front of buffer */
2806 b->bufsiz--; /* Buffer is thus smaller */
2807 code = PerlIO_fill(f); /* Fetch some more */
2808 b->bufsiz++; /* Restore size for next time */
2809 b->buf--; /* Point at space */
2810 b->ptr = nl = b->buf; /* Which is what we hand off */
2811 b->posn--; /* Buffer starts here */
2812 *nl = 0xd; /* Fill in the CR */
2814 goto test; /* fill() call worked */
2815 /* CR at EOF - just fall through */
2820 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
2826 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2828 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2829 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2830 IV flags = PerlIOBase(f)->flags;
2840 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
2847 /* Test code - delete when it works ... */
2854 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
2862 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08"UVxf" nl=%p e=%p for %d",
2863 ptr, chk, flags, c->nl, b->end, cnt);
2870 /* They have taken what we lied about */
2877 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2881 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
2883 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2884 return PerlIOBuf_write(f,vbuf,count);
2887 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2888 const STDCHAR *buf = (const STDCHAR *) vbuf;
2889 const STDCHAR *ebuf = buf+count;
2892 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2896 STDCHAR *eptr = b->buf+b->bufsiz;
2897 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2898 while (buf < ebuf && b->ptr < eptr)
2902 if ((b->ptr + 2) > eptr)
2904 /* Not room for both */
2910 *(b->ptr)++ = 0xd; /* CR */
2911 *(b->ptr)++ = 0xa; /* LF */
2913 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2932 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2934 return (buf - (STDCHAR *) vbuf);
2939 PerlIOCrlf_flush(PerlIO *f)
2941 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2947 return PerlIOBuf_flush(f);
2950 PerlIO_funcs PerlIO_crlf = {
2953 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
2957 PerlIOBase_noop_ok, /* popped */
2958 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
2959 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
2960 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
2968 PerlIOBase_clearerr,
2969 PerlIOBuf_setlinebuf,
2974 PerlIOCrlf_set_ptrcnt,
2978 /*--------------------------------------------------------------------------------------*/
2979 /* mmap as "buffer" layer */
2983 PerlIOBuf base; /* PerlIOBuf stuff */
2984 Mmap_t mptr; /* Mapped address */
2985 Size_t len; /* mapped length */
2986 STDCHAR *bbuf; /* malloced buffer if map fails */
2989 static size_t page_size = 0;
2992 PerlIOMmap_map(PerlIO *f)
2995 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2996 PerlIOBuf *b = &m->base;
2997 IV flags = PerlIOBase(f)->flags;
3001 if (flags & PERLIO_F_CANREAD)
3003 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3004 int fd = PerlIO_fileno(f);
3006 code = fstat(fd,&st);
3007 if (code == 0 && S_ISREG(st.st_mode))
3009 SSize_t len = st.st_size - b->posn;
3014 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
3016 SETERRNO(0,SS$_NORMAL);
3017 # ifdef _SC_PAGESIZE
3018 page_size = sysconf(_SC_PAGESIZE);
3020 page_size = sysconf(_SC_PAGE_SIZE);
3022 if ((long)page_size < 0) {
3027 (void)SvUPGRADE(error, SVt_PV);
3028 msg = SvPVx(error, n_a);
3029 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
3032 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
3036 # ifdef HAS_GETPAGESIZE
3037 page_size = getpagesize();
3039 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
3040 page_size = PAGESIZE; /* compiletime, bad */
3044 if ((IV)page_size <= 0)
3045 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
3049 /* This is a hack - should never happen - open should have set it ! */
3050 b->posn = PerlIO_tell(PerlIONext(f));
3052 posn = (b->posn / page_size) * page_size;
3053 len = st.st_size - posn;
3054 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
3055 if (m->mptr && m->mptr != (Mmap_t) -1)
3057 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
3058 madvise(m->mptr, len, MADV_SEQUENTIAL);
3060 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
3061 madvise(m->mptr, len, MADV_WILLNEED);
3063 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
3064 b->end = ((STDCHAR *)m->mptr) + len;
3065 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
3076 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
3078 b->ptr = b->end = b->ptr;
3087 PerlIOMmap_unmap(PerlIO *f)
3089 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3090 PerlIOBuf *b = &m->base;
3096 code = munmap(m->mptr, m->len);
3100 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
3103 b->ptr = b->end = b->buf;
3104 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
3110 PerlIOMmap_get_base(PerlIO *f)
3112 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3113 PerlIOBuf *b = &m->base;
3114 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3116 /* Already have a readbuffer in progress */
3121 /* We have a write buffer or flushed PerlIOBuf read buffer */
3122 m->bbuf = b->buf; /* save it in case we need it again */
3123 b->buf = NULL; /* Clear to trigger below */
3127 PerlIOMmap_map(f); /* Try and map it */
3130 /* Map did not work - recover PerlIOBuf buffer if we have one */
3134 b->ptr = b->end = b->buf;
3137 return PerlIOBuf_get_base(f);
3141 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
3143 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3144 PerlIOBuf *b = &m->base;
3145 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3147 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
3150 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
3155 /* Loose the unwritable mapped buffer */
3157 /* If flush took the "buffer" see if we have one from before */
3158 if (!b->buf && m->bbuf)
3162 PerlIOBuf_get_base(f);
3166 return PerlIOBuf_unread(f,vbuf,count);
3170 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
3172 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3173 PerlIOBuf *b = &m->base;
3174 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
3176 /* No, or wrong sort of, buffer */
3179 if (PerlIOMmap_unmap(f) != 0)
3182 /* If unmap took the "buffer" see if we have one from before */
3183 if (!b->buf && m->bbuf)
3187 PerlIOBuf_get_base(f);
3191 return PerlIOBuf_write(f,vbuf,count);
3195 PerlIOMmap_flush(PerlIO *f)
3197 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3198 PerlIOBuf *b = &m->base;
3199 IV code = PerlIOBuf_flush(f);
3200 /* Now we are "synced" at PerlIOBuf level */
3205 /* Unmap the buffer */
3206 if (PerlIOMmap_unmap(f) != 0)
3211 /* We seem to have a PerlIOBuf buffer which was not mapped
3212 * remember it in case we need one later
3221 PerlIOMmap_fill(PerlIO *f)
3223 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3224 IV code = PerlIO_flush(f);
3225 if (code == 0 && !b->buf)
3227 code = PerlIOMmap_map(f);
3229 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3231 code = PerlIOBuf_fill(f);
3237 PerlIOMmap_close(PerlIO *f)
3239 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3240 PerlIOBuf *b = &m->base;
3241 IV code = PerlIO_flush(f);
3246 b->ptr = b->end = b->buf;
3248 if (PerlIOBuf_close(f) != 0)
3254 PerlIO_funcs PerlIO_mmap = {
3272 PerlIOBase_clearerr,
3273 PerlIOBuf_setlinebuf,
3274 PerlIOMmap_get_base,
3278 PerlIOBuf_set_ptrcnt,
3281 #endif /* HAS_MMAP */
3289 atexit(&PerlIO_cleanup);
3301 PerlIO_stdstreams();
3305 #undef PerlIO_stdout
3310 PerlIO_stdstreams();
3314 #undef PerlIO_stderr
3319 PerlIO_stdstreams();
3323 /*--------------------------------------------------------------------------------------*/
3325 #undef PerlIO_getname
3327 PerlIO_getname(PerlIO *f, char *buf)
3330 Perl_croak(aTHX_ "Don't know how to get file name");
3335 /*--------------------------------------------------------------------------------------*/
3336 /* Functions which can be called on any kind of PerlIO implemented
3342 PerlIO_getc(PerlIO *f)
3345 SSize_t count = PerlIO_read(f,buf,1);
3348 return (unsigned char) buf[0];
3353 #undef PerlIO_ungetc
3355 PerlIO_ungetc(PerlIO *f, int ch)
3360 if (PerlIO_unread(f,&buf,1) == 1)
3368 PerlIO_putc(PerlIO *f, int ch)
3371 return PerlIO_write(f,&buf,1);
3376 PerlIO_puts(PerlIO *f, const char *s)
3378 STRLEN len = strlen(s);
3379 return PerlIO_write(f,s,len);
3382 #undef PerlIO_rewind
3384 PerlIO_rewind(PerlIO *f)
3386 PerlIO_seek(f,(Off_t)0,SEEK_SET);
3390 #undef PerlIO_vprintf
3392 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3395 SV *sv = newSVpvn("",0);
3401 Perl_va_copy(ap, apc);
3402 sv_vcatpvf(sv, fmt, &apc);
3404 sv_vcatpvf(sv, fmt, &ap);
3407 wrote = PerlIO_write(f,s,len);
3412 #undef PerlIO_printf
3414 PerlIO_printf(PerlIO *f,const char *fmt,...)
3419 result = PerlIO_vprintf(f,fmt,ap);
3424 #undef PerlIO_stdoutf
3426 PerlIO_stdoutf(const char *fmt,...)
3431 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
3436 #undef PerlIO_tmpfile
3438 PerlIO_tmpfile(void)
3440 /* I have no idea how portable mkstemp() is ... */
3441 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
3444 FILE *stdio = PerlSIO_tmpfile();
3447 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"w+",Nullch,0),PerlIOStdio);
3453 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
3454 int fd = mkstemp(SvPVX(sv));
3458 f = PerlIO_fdopen(fd,"w+");
3461 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
3463 PerlLIO_unlink(SvPVX(sv));
3473 #endif /* USE_SFIO */
3474 #endif /* PERLIO_IS_STDIO */
3476 /*======================================================================================*/
3477 /* Now some functions in terms of above which may be needed even if
3478 we are not in true PerlIO mode
3482 #undef PerlIO_setpos
3484 PerlIO_setpos(PerlIO *f, SV *pos)
3490 Off_t *posn = (Off_t *) SvPV(pos,len);
3491 if (f && len == sizeof(Off_t))
3492 return PerlIO_seek(f,*posn,SEEK_SET);
3498 #undef PerlIO_setpos
3500 PerlIO_setpos(PerlIO *f, SV *pos)
3506 Fpos_t *fpos = (Fpos_t *) SvPV(pos,len);
3507 if (f && len == sizeof(Fpos_t))
3509 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3510 return fsetpos64(f, fpos);
3512 return fsetpos(f, fpos);
3522 #undef PerlIO_getpos
3524 PerlIO_getpos(PerlIO *f, SV *pos)
3527 Off_t posn = PerlIO_tell(f);
3528 sv_setpvn(pos,(char *)&posn,sizeof(posn));
3529 return (posn == (Off_t)-1) ? -1 : 0;
3532 #undef PerlIO_getpos
3534 PerlIO_getpos(PerlIO *f, SV *pos)
3539 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3540 code = fgetpos64(f, &fpos);
3542 code = fgetpos(f, &fpos);
3544 sv_setpvn(pos,(char *)&fpos,sizeof(fpos));
3549 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
3552 vprintf(char *pat, char *args)
3554 _doprnt(pat, args, stdout);
3555 return 0; /* wrong, but perl doesn't use the return value */
3559 vfprintf(FILE *fd, char *pat, char *args)
3561 _doprnt(pat, args, fd);
3562 return 0; /* wrong, but perl doesn't use the return value */
3567 #ifndef PerlIO_vsprintf
3569 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
3571 int val = vsprintf(s, fmt, ap);
3574 if (strlen(s) >= (STRLEN)n)
3577 (void)PerlIO_puts(Perl_error_log,
3578 "panic: sprintf overflow - memory corrupted!\n");
3586 #ifndef PerlIO_sprintf
3588 PerlIO_sprintf(char *s, int n, const char *fmt,...)
3593 result = PerlIO_vsprintf(s, n, fmt, ap);