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.
10 /* If we have ActivePerl-like PERL_IMPLICIT_SYS then we need
11 a dTHX to get at the dispatch tables, even when we do not
12 need it for other reasons.
13 Invent a dSYS macro to abstract this out
15 #ifdef PERL_IMPLICIT_SYS
28 #define PERLIO_NOT_STDIO 0
29 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
30 /* #define PerlIO FILE */
33 * This file provides those parts of PerlIO abstraction
34 * which are not #defined in perlio.h.
35 * Which these are depends on various Configure #ifdef's
39 #define PERL_IN_PERLIO_C
42 #undef PerlMemShared_calloc
43 #define PerlMemShared_calloc(x,y) calloc(x,y)
44 #undef PerlMemShared_free
45 #define PerlMemShared_free(x) free(x)
48 perlsio_binmode(FILE *fp, int iotype, int mode)
50 /* This used to be contents of do_binmode in doio.c */
52 # if defined(atarist) || defined(__MINT__)
55 ((FILE*)fp)->_flag |= _IOBIN;
57 ((FILE*)fp)->_flag &= ~ _IOBIN;
63 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
64 # if defined(WIN32) && defined(__BORLANDC__)
65 /* The translation mode of the stream is maintained independent
66 * of the translation mode of the fd in the Borland RTL (heavy
67 * digging through their runtime sources reveal). User has to
68 * set the mode explicitly for the stream (though they don't
69 * document this anywhere). GSAR 97-5-24
75 fp->flags &= ~ _F_BIN;
83 # if defined(USEMYBINMODE)
84 if (my_binmode(fp, iotype, mode) != FALSE)
96 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
98 if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
102 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
108 PerlIO_destruct(pTHX)
113 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
118 return perlsio_binmode(fp,iotype,mode);
122 /* De-mux PerlIO_openn() into fdopen, freopen and fopen type entries */
125 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
129 if (*args == &PL_sv_undef)
130 return PerlIO_tmpfile();
133 char *name = SvPV_nolen(*args);
136 fd = PerlLIO_open3(name,imode,perm);
138 return PerlIO_fdopen(fd,(char *)mode+1);
142 return PerlIO_reopen(name,mode,old);
146 return PerlIO_open(name,mode);
152 return PerlIO_fdopen(fd,(char *)mode);
160 #ifdef PERLIO_IS_STDIO
165 /* Does nothing (yet) except force this file to be included
166 in perl binary. That allows this file to force inclusion
167 of other functions that may be required by loadable
168 extensions e.g. for FileHandle::tmpfile
172 #undef PerlIO_tmpfile
179 #else /* PERLIO_IS_STDIO */
186 /* This section is just to make sure these functions
187 get pulled in from libsfio.a
190 #undef PerlIO_tmpfile
200 /* Force this file to be included in perl binary. Which allows
201 * this file to force inclusion of other functions that may be
202 * required by loadable extensions e.g. for FileHandle::tmpfile
206 * sfio does its own 'autoflush' on stdout in common cases.
207 * Flush results in a lot of lseek()s to regular files and
208 * lot of small writes to pipes.
210 sfset(sfstdout,SF_SHARE,0);
214 PerlIO_importFILE(FILE *stdio, int fl)
216 int fd = fileno(stdio);
217 PerlIO *r = PerlIO_fdopen(fd,"r+");
222 PerlIO_findFILE(PerlIO *pio)
224 int fd = PerlIO_fileno(pio);
225 FILE *f = fdopen(fd,"r+");
227 if (!f && errno == EINVAL)
229 if (!f && errno == EINVAL)
236 /*======================================================================================*/
237 /* Implement all the PerlIO interface ourselves.
242 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
247 #include <sys/mman.h>
252 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
255 PerlIO_debug(const char *fmt,...)
263 char *s = PerlEnv_getenv("PERLIO_DEBUG");
265 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
272 SV *sv = newSVpvn("",0);
275 s = CopFILE(PL_curcop);
278 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
279 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
282 PerlLIO_write(dbg,s,len);
288 /*--------------------------------------------------------------------------------------*/
290 /* Inner level routines */
292 /* Table of pointers to the PerlIO structs (malloc'ed) */
293 PerlIO *_perlio = NULL;
294 #define PERLIO_TABLE_SIZE 64
299 PerlIO_allocate(pTHX)
301 /* Find a free slot in the table, allocating new table as necessary */
308 last = (PerlIO **)(f);
309 for (i=1; i < PERLIO_TABLE_SIZE; i++)
317 f = PerlMemShared_calloc(PERLIO_TABLE_SIZE,sizeof(PerlIO));
327 PerlIO_cleantable(pTHX_ PerlIO **tablep)
329 PerlIO *table = *tablep;
333 PerlIO_cleantable(aTHX_ (PerlIO **) &(table[0]));
334 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
342 PerlMemShared_free(table);
347 PerlIO_list_t *PerlIO_known_layers;
348 PerlIO_list_t *PerlIO_def_layerlist;
351 PerlIO_list_alloc(void)
354 Newz('L',list,1,PerlIO_list_t);
360 PerlIO_list_free(PerlIO_list_t *list)
364 if (--list->refcnt == 0)
370 for (i=0; i < list->cur; i++)
372 if (list->array[i].arg)
373 SvREFCNT_dec(list->array[i].arg);
375 Safefree(list->array);
383 PerlIO_list_push(PerlIO_list_t *list,PerlIO_funcs *funcs,SV *arg)
387 if (list->cur >= list->len)
391 Renew(list->array,list->len,PerlIO_pair_t);
393 New('l',list->array,list->len,PerlIO_pair_t);
395 p = &(list->array[list->cur++]);
397 if ((p->arg = arg)) {
405 PerlIO_cleanup_layers(pTHXo_ void *data)
408 PerlIO_known_layers = Nullhv;
409 PerlIO_def_layerlist = Nullav;
417 PerlIO_cleantable(aTHX_ &_perlio);
421 PerlIO_destruct(pTHX)
423 PerlIO **table = &_perlio;
428 table = (PerlIO **)(f++);
429 for (i=1; i < PERLIO_TABLE_SIZE; i++)
435 if (l->tab->kind & PERLIO_K_DESTRUCT)
437 PerlIO_debug("Destruct popping %s\n",l->tab->name);
452 PerlIO_pop(pTHX_ PerlIO *f)
457 PerlIO_debug("PerlIO_pop f=%p %s\n",f,l->tab->name);
459 (*l->tab->Popped)(f);
461 PerlMemShared_free(l);
465 /*--------------------------------------------------------------------------------------*/
466 /* XS Interface for perl code */
469 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
472 if ((SSize_t) len <= 0)
474 for (i=0; i < PerlIO_known_layers->cur; i++)
476 PerlIO_funcs *f = PerlIO_known_layers->array[i].funcs;
477 if (strEQ(f->name,name))
479 PerlIO_debug("%.*s => %p\n",(int)len,name,f);
483 if (load && PL_subname && PerlIO_def_layerlist && PerlIO_def_layerlist->cur >= 2)
485 SV *pkgsv = newSVpvn("PerlIO",6);
486 SV *layer = newSVpvn(name,len);
488 /* The two SVs are magically freed by load_module */
489 Perl_load_module(aTHX_ 0, pkgsv, Nullsv, layer, Nullsv);
491 return PerlIO_find_layer(aTHX_ name,len,0);
493 PerlIO_debug("Cannot find %.*s\n",(int)len,name);
497 #ifdef USE_ATTRIBUTES_FOR_PERLIO
500 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
504 IO *io = GvIOn((GV *)SvRV(sv));
505 PerlIO *ifp = IoIFP(io);
506 PerlIO *ofp = IoOFP(io);
507 Perl_warn(aTHX_ "set %"SVf" %p %p %p",sv,io,ifp,ofp);
513 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
517 IO *io = GvIOn((GV *)SvRV(sv));
518 PerlIO *ifp = IoIFP(io);
519 PerlIO *ofp = IoOFP(io);
520 Perl_warn(aTHX_ "get %"SVf" %p %p %p",sv,io,ifp,ofp);
526 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
528 Perl_warn(aTHX_ "clear %"SVf,sv);
533 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
535 Perl_warn(aTHX_ "free %"SVf,sv);
539 MGVTBL perlio_vtab = {
547 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
550 SV *sv = SvRV(ST(1));
555 sv_magic(sv, (SV *)av, PERL_MAGIC_ext, NULL, 0);
557 mg = mg_find(sv, PERL_MAGIC_ext);
558 mg->mg_virtual = &perlio_vtab;
560 Perl_warn(aTHX_ "attrib %"SVf,sv);
561 for (i=2; i < items; i++)
564 const char *name = SvPV(ST(i),len);
565 SV *layer = PerlIO_find_layer(aTHX_ name,len,1);
568 av_push(av,SvREFCNT_inc(layer));
580 #endif /* USE_ATTIBUTES_FOR_PERLIO */
583 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
585 HV *stash = gv_stashpv("PerlIO::Layer", TRUE);
586 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
591 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
593 if (!PerlIO_known_layers)
594 PerlIO_known_layers = PerlIO_list_alloc();
595 PerlIO_list_push(PerlIO_known_layers,tab,Nullsv);
596 PerlIO_debug("define %s %p\n",tab->name,tab);
600 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
604 const char *s = names;
607 while (isSPACE(*s) || *s == ':')
613 const char *as = Nullch;
617 /* Message is consistent with how attribute lists are passed.
618 Even though this means "foo : : bar" is seen as an invalid separator
620 char q = ((*s == '\'') ? '"' : '\'');
621 Perl_warn(aTHX_ "perlio: invalid separator character %c%c%c in layer specification list", q, *s, q);
627 } while (isALNUM(*e));
645 /* It's a nul terminated string, not allowed to \ the terminating null.
646 Anything other character is passed over. */
654 Perl_warn(aTHX_ "perlio: argument list not closed for layer \"%.*s\"",(int)(e - s),s);
664 PerlIO_funcs *layer = PerlIO_find_layer(aTHX_ s,llen,1);
667 PerlIO_list_push(av, layer, (as) ? newSVpvn(as,alen) : &PL_sv_undef);
670 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)llen,s);
682 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
684 PerlIO_funcs *tab = &PerlIO_perlio;
685 if (O_BINARY != O_TEXT)
691 if (PerlIO_stdio.Set_ptrcnt)
696 PerlIO_debug("Pushing %s\n",tab->name);
697 PerlIO_list_push(av,PerlIO_find_layer(aTHX_ tab->name,0,0),&PL_sv_undef);
701 PerlIO_arg_fetch(PerlIO_list_t *av,IV n)
703 return av->array[n].arg;
707 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av,IV n,PerlIO_funcs *def)
709 if (n >= 0 && n < av->cur)
711 PerlIO_debug("Layer %ld is %s\n",n,av->array[n].funcs->name);
712 return av->array[n].funcs;
715 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
720 PerlIO_default_layers(pTHX)
722 if (!PerlIO_def_layerlist)
724 const char *s = (PL_tainting) ? Nullch : PerlEnv_getenv("PERLIO");
725 PerlIO_def_layerlist = PerlIO_list_alloc();
727 #ifdef USE_ATTRIBUTES_FOR_PERLIO
728 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
731 PerlIO_define_layer(aTHX_ &PerlIO_raw);
732 PerlIO_define_layer(aTHX_ &PerlIO_unix);
733 PerlIO_define_layer(aTHX_ &PerlIO_perlio);
734 PerlIO_define_layer(aTHX_ &PerlIO_stdio);
735 PerlIO_define_layer(aTHX_ &PerlIO_crlf);
737 PerlIO_define_layer(aTHX_ &PerlIO_mmap);
739 PerlIO_define_layer(aTHX_ &PerlIO_utf8);
740 PerlIO_define_layer(aTHX_ &PerlIO_byte);
741 PerlIO_list_push(PerlIO_def_layerlist,PerlIO_find_layer(aTHX_ PerlIO_unix.name,0,0),&PL_sv_undef);
744 PerlIO_parse_layers(aTHX_ PerlIO_def_layerlist,s);
748 PerlIO_default_buffer(aTHX_ PerlIO_def_layerlist);
751 if (PerlIO_def_layerlist->cur < 2)
753 PerlIO_default_buffer(aTHX_ PerlIO_def_layerlist);
755 return PerlIO_def_layerlist;
760 PerlIO_default_layer(pTHX_ I32 n)
762 PerlIO_list_t *av = PerlIO_default_layers(aTHX);
765 return PerlIO_layer_fetch(aTHX_ av,n, &PerlIO_stdio);
768 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
769 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
772 PerlIO_stdstreams(pTHX)
776 PerlIO_allocate(aTHX);
777 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
778 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
779 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
784 PerlIO_push(pTHX_ PerlIO *f,PerlIO_funcs *tab,const char *mode,SV *arg)
787 l = PerlMemShared_calloc(tab->size,sizeof(char));
790 Zero(l,tab->size,char);
794 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",f,tab->name,
795 (mode) ? mode : "(Null)",arg);
796 if ((*l->tab->Pushed)(f,mode,arg) != 0)
806 PerlIOPop_pushed(PerlIO *f, const char *mode, SV *arg)
820 PerlIORaw_pushed(PerlIO *f, const char *mode, SV *arg)
822 /* Remove the dummy layer */
825 /* Pop back to bottom layer */
829 while (!(PerlIOBase(f)->tab->kind & PERLIO_K_RAW))
837 /* Nothing bellow - push unix on top then remove it */
838 if (PerlIO_push(aTHX_ f,PerlIO_default_btm(),mode,arg))
840 PerlIO_pop(aTHX_ PerlIONext(f));
845 PerlIO_debug(":raw f=%p :%s\n",f,PerlIOBase(f)->tab->name);
852 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode, PerlIO_list_t *layers, IV n)
854 IV max = layers->cur;
858 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers,n,NULL);
861 if (!PerlIO_push(aTHX_ f,tab,mode,PerlIOArg))
873 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
878 PerlIO_list_t *layers = PerlIO_list_alloc();
879 code = PerlIO_parse_layers(aTHX_ layers,names);
882 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0);
884 PerlIO_list_free(layers);
890 /*--------------------------------------------------------------------------------------*/
891 /* Given the abstraction above the public API functions */
894 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
896 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
897 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
898 if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY)))
904 if (PerlIOBase(top)->tab == &PerlIO_crlf)
907 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
910 top = PerlIONext(top);
913 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
918 PerlIO__close(PerlIO *f)
921 return (*PerlIOBase(f)->tab->Close)(f);
924 SETERRNO(EBADF,SS$_IVCHAN);
929 #undef PerlIO_fdupopen
931 PerlIO_fdupopen(pTHX_ PerlIO *f)
936 int fd = PerlLIO_dup(PerlIO_fileno(f));
937 PerlIO *new = PerlIO_fdopen(fd,PerlIO_modestr(f,buf));
940 Off_t posn = PerlIO_tell(f);
941 PerlIO_seek(new,posn,SEEK_SET);
947 SETERRNO(EBADF,SS$_IVCHAN);
954 PerlIO_close(PerlIO *f)
960 code = (*PerlIOBase(f)->tab->Close)(f);
971 PerlIO_fileno(PerlIO *f)
974 return (*PerlIOBase(f)->tab->Fileno)(f);
977 SETERRNO(EBADF,SS$_IVCHAN);
983 PerlIO_context_layers(pTHX_ const char *mode)
985 const char *type = NULL;
986 /* Need to supply default layer info from open.pm */
989 SV *layers = PL_curcop->cop_io;
993 type = SvPV(layers,len);
994 if (type && mode[0] != 'r')
996 /* Skip to write part */
997 const char *s = strchr(type,0);
998 if (s && (s-type) < len)
1008 static PerlIO_funcs *
1009 PerlIO_layer_from_ref(pTHX_ SV *sv)
1011 /* For any scalar type load the handler which is bundled with perl */
1012 if (SvTYPE(sv) < SVt_PVAV)
1013 return PerlIO_find_layer(aTHX_ "Scalar",6, 1);
1015 /* For other types allow if layer is known but don't try and load it */
1019 return PerlIO_find_layer(aTHX_ "Array",5, 0);
1021 return PerlIO_find_layer(aTHX_ "Hash",4, 0);
1023 return PerlIO_find_layer(aTHX_ "Code",4, 0);
1025 return PerlIO_find_layer(aTHX_ "Glob",4, 0);
1031 PerlIO_resolve_layers(pTHX_ const char *layers,const char *mode,int narg, SV **args)
1033 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1036 PerlIO_stdstreams(aTHX);
1040 /* If it is a reference but not an object see if we have a handler for it */
1041 if (SvROK(arg) && !sv_isobject(arg))
1043 PerlIO_funcs *handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1046 def = PerlIO_list_alloc();
1047 PerlIO_list_push(def,handler,&PL_sv_undef);
1050 /* Don't fail if handler cannot be found
1051 * :Via(...) etc. may do something sensible
1052 * else we will just stringfy and open resulting string.
1057 layers = PerlIO_context_layers(aTHX_ mode);
1058 if (layers && *layers)
1064 av = PerlIO_list_alloc();
1065 for (i=0; i < def->cur; i++)
1067 PerlIO_list_push(av,def->array[i].funcs,def->array[i].arg);
1074 PerlIO_parse_layers(aTHX_ av,layers);
1086 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1088 if (!f && narg == 1 && *args == &PL_sv_undef)
1090 if ((f = PerlIO_tmpfile()))
1093 layers = PerlIO_context_layers(aTHX_ mode);
1094 if (layers && *layers)
1095 PerlIO_apply_layers(aTHX_ f,mode,layers);
1100 PerlIO_list_t *layera = NULL;
1102 PerlIO_funcs *tab = NULL;
1105 /* This is "reopen" - it is not tested as perl does not use it yet */
1107 layera = PerlIO_list_alloc();
1110 SV *arg = (l->tab->Getarg) ? (*l->tab->Getarg)(&l) : &PL_sv_undef;
1111 PerlIO_list_push(layera,l->tab,arg);
1112 l = *PerlIONext(&l);
1117 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1119 /* Start at "top" of layer stack */
1123 PerlIO_funcs *t = PerlIO_layer_fetch(aTHX_ layera,n,NULL);
1133 /* Found that layer 'n' can do opens - call it */
1134 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1135 tab->name,layers,mode,fd,imode,perm,f,narg,args);
1136 f = (*tab->Open)(aTHX_ tab, layera, n, mode,fd,imode,perm,f,narg,args);
1139 if (n+1 < layera->cur)
1141 /* More layers above the one that we used to open - apply them now */
1142 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n+1) != 0)
1149 PerlIO_list_free(layera);
1155 #undef PerlIO_fdopen
1157 PerlIO_fdopen(int fd, const char *mode)
1160 return PerlIO_openn(aTHX_ Nullch,mode,fd,0,0,NULL,0,NULL);
1165 PerlIO_open(const char *path, const char *mode)
1168 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
1169 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,NULL,1,&name);
1172 #undef PerlIO_reopen
1174 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
1177 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
1178 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,f,1,&name);
1183 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
1186 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
1189 SETERRNO(EBADF,SS$_IVCHAN);
1194 #undef PerlIO_unread
1196 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
1199 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
1202 SETERRNO(EBADF,SS$_IVCHAN);
1209 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
1212 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
1215 SETERRNO(EBADF,SS$_IVCHAN);
1222 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
1225 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
1228 SETERRNO(EBADF,SS$_IVCHAN);
1235 PerlIO_tell(PerlIO *f)
1238 return (*PerlIOBase(f)->tab->Tell)(f);
1241 SETERRNO(EBADF,SS$_IVCHAN);
1248 PerlIO_flush(PerlIO *f)
1254 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1255 if (tab && tab->Flush)
1257 return (*tab->Flush)(f);
1261 PerlIO_debug("Cannot flush f=%p :%s\n",f,tab->name);
1262 SETERRNO(EBADF,SS$_IVCHAN);
1268 PerlIO_debug("Cannot flush f=%p\n",f);
1269 SETERRNO(EBADF,SS$_IVCHAN);
1275 /* Is it good API design to do flush-all on NULL,
1276 * a potentially errorneous input? Maybe some magical
1277 * value (PerlIO* PERLIO_FLUSH_ALL = (PerlIO*)-1;)?
1278 * Yes, stdio does similar things on fflush(NULL),
1279 * but should we be bound by their design decisions?
1281 PerlIO **table = &_perlio;
1283 while ((f = *table))
1286 table = (PerlIO **)(f++);
1287 for (i=1; i < PERLIO_TABLE_SIZE; i++)
1289 if (*f && PerlIO_flush(f) != 0)
1299 PerlIOBase_flush_linebuf()
1301 PerlIO **table = &_perlio;
1303 while ((f = *table))
1306 table = (PerlIO **)(f++);
1307 for (i=1; i < PERLIO_TABLE_SIZE; i++)
1309 if (*f && (PerlIOBase(f)->flags & (PERLIO_F_LINEBUF|PERLIO_F_CANWRITE))
1310 == (PERLIO_F_LINEBUF|PERLIO_F_CANWRITE))
1319 PerlIO_fill(PerlIO *f)
1322 return (*PerlIOBase(f)->tab->Fill)(f);
1325 SETERRNO(EBADF,SS$_IVCHAN);
1330 #undef PerlIO_isutf8
1332 PerlIO_isutf8(PerlIO *f)
1335 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1338 SETERRNO(EBADF,SS$_IVCHAN);
1345 PerlIO_eof(PerlIO *f)
1348 return (*PerlIOBase(f)->tab->Eof)(f);
1351 SETERRNO(EBADF,SS$_IVCHAN);
1358 PerlIO_error(PerlIO *f)
1361 return (*PerlIOBase(f)->tab->Error)(f);
1364 SETERRNO(EBADF,SS$_IVCHAN);
1369 #undef PerlIO_clearerr
1371 PerlIO_clearerr(PerlIO *f)
1374 (*PerlIOBase(f)->tab->Clearerr)(f);
1376 SETERRNO(EBADF,SS$_IVCHAN);
1379 #undef PerlIO_setlinebuf
1381 PerlIO_setlinebuf(PerlIO *f)
1384 (*PerlIOBase(f)->tab->Setlinebuf)(f);
1386 SETERRNO(EBADF,SS$_IVCHAN);
1389 #undef PerlIO_has_base
1391 PerlIO_has_base(PerlIO *f)
1393 if (f && *f) { return (PerlIOBase(f)->tab->Get_base != NULL); }
1397 #undef PerlIO_fast_gets
1399 PerlIO_fast_gets(PerlIO *f)
1401 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS))
1403 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1404 return (tab->Set_ptrcnt != NULL);
1409 #undef PerlIO_has_cntptr
1411 PerlIO_has_cntptr(PerlIO *f)
1415 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1416 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1421 #undef PerlIO_canset_cnt
1423 PerlIO_canset_cnt(PerlIO *f)
1427 PerlIOl *l = PerlIOBase(f);
1428 return (l->tab->Set_ptrcnt != NULL);
1433 #undef PerlIO_get_base
1435 PerlIO_get_base(PerlIO *f)
1438 return (*PerlIOBase(f)->tab->Get_base)(f);
1442 #undef PerlIO_get_bufsiz
1444 PerlIO_get_bufsiz(PerlIO *f)
1447 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
1451 #undef PerlIO_get_ptr
1453 PerlIO_get_ptr(PerlIO *f)
1455 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1456 if (tab->Get_ptr == NULL)
1458 return (*tab->Get_ptr)(f);
1461 #undef PerlIO_get_cnt
1463 PerlIO_get_cnt(PerlIO *f)
1465 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1466 if (tab->Get_cnt == NULL)
1468 return (*tab->Get_cnt)(f);
1471 #undef PerlIO_set_cnt
1473 PerlIO_set_cnt(PerlIO *f,int cnt)
1475 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
1478 #undef PerlIO_set_ptrcnt
1480 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
1482 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1483 if (tab->Set_ptrcnt == NULL)
1486 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
1488 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
1491 /*--------------------------------------------------------------------------------------*/
1492 /* utf8 and raw dummy layers */
1495 PerlIOUtf8_pushed(PerlIO *f, const char *mode, SV *arg)
1500 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1501 PerlIO_pop(aTHX_ f);
1502 if (tab->kind & PERLIO_K_UTF8)
1503 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1505 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1511 PerlIO_funcs PerlIO_utf8 = {
1514 PERLIO_K_DUMMY|PERLIO_F_UTF8,
1532 NULL, /* get_base */
1533 NULL, /* get_bufsiz */
1536 NULL, /* set_ptrcnt */
1539 PerlIO_funcs PerlIO_byte = {
1560 NULL, /* get_base */
1561 NULL, /* get_bufsiz */
1564 NULL, /* set_ptrcnt */
1568 PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n,const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
1570 PerlIO_funcs *tab = PerlIO_default_btm();
1571 return (*tab->Open)(aTHX_ tab,layers,n-1,mode,fd,imode,perm,old,narg,args);
1574 PerlIO_funcs PerlIO_raw = {
1595 NULL, /* get_base */
1596 NULL, /* get_bufsiz */
1599 NULL, /* set_ptrcnt */
1601 /*--------------------------------------------------------------------------------------*/
1602 /*--------------------------------------------------------------------------------------*/
1603 /* "Methods" of the "base class" */
1606 PerlIOBase_fileno(PerlIO *f)
1608 return PerlIO_fileno(PerlIONext(f));
1612 PerlIO_modestr(PerlIO *f,char *buf)
1615 IV flags = PerlIOBase(f)->flags;
1616 if (flags & PERLIO_F_APPEND)
1619 if (flags & PERLIO_F_CANREAD)
1624 else if (flags & PERLIO_F_CANREAD)
1627 if (flags & PERLIO_F_CANWRITE)
1630 else if (flags & PERLIO_F_CANWRITE)
1633 if (flags & PERLIO_F_CANREAD)
1638 #if O_TEXT != O_BINARY
1639 if (!(flags & PERLIO_F_CRLF))
1647 PerlIOBase_pushed(PerlIO *f, const char *mode, SV *arg)
1649 PerlIOl *l = PerlIOBase(f);
1651 const char *omode = mode;
1654 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1655 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
1656 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1657 if (tab->Set_ptrcnt != NULL)
1658 l->flags |= PERLIO_F_FASTGETS;
1661 if (*mode == '#' || *mode == 'I')
1666 l->flags |= PERLIO_F_CANREAD;
1669 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
1672 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
1675 SETERRNO(EINVAL,LIB$_INVARG);
1683 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
1686 l->flags &= ~PERLIO_F_CRLF;
1689 l->flags |= PERLIO_F_CRLF;
1692 SETERRNO(EINVAL,LIB$_INVARG);
1701 l->flags |= l->next->flags &
1702 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1706 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08"UVxf" (%s)\n",
1707 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
1708 l->flags,PerlIO_modestr(f,temp));
1714 PerlIOBase_popped(PerlIO *f)
1720 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1723 Off_t old = PerlIO_tell(f);
1725 PerlIO_push(aTHX_ f,&PerlIO_pending,"r",Nullsv);
1726 done = PerlIOBuf_unread(f,vbuf,count);
1727 PerlIOSelf(f,PerlIOBuf)->posn = old - done;
1732 PerlIOBase_read(PerlIO *f, void *vbuf, Size_t count)
1734 STDCHAR *buf = (STDCHAR *) vbuf;
1737 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1741 SSize_t avail = PerlIO_get_cnt(f);
1744 take = (count < avail) ? count : avail;
1747 STDCHAR *ptr = PerlIO_get_ptr(f);
1748 Copy(ptr,buf,take,STDCHAR);
1749 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
1753 if (count > 0 && avail <= 0)
1755 if (PerlIO_fill(f) != 0)
1759 return (buf - (STDCHAR *) vbuf);
1765 PerlIOBase_noop_ok(PerlIO *f)
1771 PerlIOBase_noop_fail(PerlIO *f)
1777 PerlIOBase_close(PerlIO *f)
1780 PerlIO *n = PerlIONext(f);
1781 if (PerlIO_flush(f) != 0)
1783 if (n && *n && (*PerlIOBase(n)->tab->Close)(n) != 0)
1785 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1790 PerlIOBase_eof(PerlIO *f)
1794 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1800 PerlIOBase_error(PerlIO *f)
1804 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1810 PerlIOBase_clearerr(PerlIO *f)
1814 PerlIO *n = PerlIONext(f);
1815 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1822 PerlIOBase_setlinebuf(PerlIO *f)
1826 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
1830 /*--------------------------------------------------------------------------------------*/
1831 /* Bottom-most level for UNIX-like case */
1835 struct _PerlIO base; /* The generic part */
1836 int fd; /* UNIX like file descriptor */
1837 int oflags; /* open/fcntl flags */
1841 PerlIOUnix_oflags(const char *mode)
1856 oflags = O_CREAT|O_TRUNC;
1867 oflags = O_CREAT|O_APPEND;
1883 else if (*mode == 't')
1886 oflags &= ~O_BINARY;
1889 /* Always open in binary mode */
1891 if (*mode || oflags == -1)
1893 SETERRNO(EINVAL,LIB$_INVARG);
1900 PerlIOUnix_fileno(PerlIO *f)
1902 return PerlIOSelf(f,PerlIOUnix)->fd;
1906 PerlIOUnix_pushed(PerlIO *f, const char *mode, SV *arg)
1908 IV code = PerlIOBase_pushed(f,mode,arg);
1911 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1912 s->fd = PerlIO_fileno(PerlIONext(f));
1913 s->oflags = PerlIOUnix_oflags(mode);
1915 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1920 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1924 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1925 (*PerlIOBase(f)->tab->Close)(f);
1929 char *path = SvPV_nolen(*args);
1934 imode = PerlIOUnix_oflags(mode);
1939 fd = PerlLIO_open3(path,imode,perm);
1949 f = PerlIO_allocate(aTHX);
1950 s = PerlIOSelf(PerlIO_push(aTHX_ f,self,mode,PerlIOArg),PerlIOUnix);
1953 s = PerlIOSelf(f,PerlIOUnix);
1956 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1963 /* FIXME: pop layers ??? */
1970 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1973 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1974 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1978 SSize_t len = PerlLIO_read(fd,vbuf,count);
1979 if (len >= 0 || errno != EINTR)
1982 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1983 else if (len == 0 && count != 0)
1984 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1992 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1995 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1998 SSize_t len = PerlLIO_write(fd,vbuf,count);
1999 if (len >= 0 || errno != EINTR)
2002 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2010 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
2013 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
2014 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2015 return (new == (Off_t) -1) ? -1 : 0;
2019 PerlIOUnix_tell(PerlIO *f)
2022 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
2026 PerlIOUnix_close(PerlIO *f)
2029 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
2031 while (PerlLIO_close(fd) != 0)
2042 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2047 PerlIO_funcs PerlIO_unix = {
2062 PerlIOBase_noop_ok, /* flush */
2063 PerlIOBase_noop_fail, /* fill */
2066 PerlIOBase_clearerr,
2067 PerlIOBase_setlinebuf,
2068 NULL, /* get_base */
2069 NULL, /* get_bufsiz */
2072 NULL, /* set_ptrcnt */
2075 /*--------------------------------------------------------------------------------------*/
2076 /* stdio as a layer */
2080 struct _PerlIO base;
2081 FILE * stdio; /* The stream */
2085 PerlIOStdio_fileno(PerlIO *f)
2088 return PerlSIO_fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
2092 PerlIOStdio_mode(const char *mode,char *tmode)
2099 if (O_BINARY != O_TEXT)
2107 /* This isn't used yet ... */
2109 PerlIOStdio_pushed(PerlIO *f, const char *mode, SV *arg)
2114 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
2116 FILE *stdio = PerlSIO_fdopen(PerlIO_fileno(PerlIONext(f)),mode = PerlIOStdio_mode(mode,tmode));
2122 return PerlIOBase_pushed(f,mode,arg);
2125 #undef PerlIO_importFILE
2127 PerlIO_importFILE(FILE *stdio, int fl)
2133 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),&PerlIO_stdio,"r+",Nullsv),PerlIOStdio);
2140 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2145 char *path = SvPV_nolen(*args);
2146 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
2147 FILE *stdio = PerlSIO_freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
2157 char *path = SvPV_nolen(*args);
2161 fd = PerlLIO_open3(path,imode,perm);
2165 FILE *stdio = PerlSIO_fopen(path,mode);
2168 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)), self,
2169 (mode = PerlIOStdio_mode(mode,tmode)),PerlIOArg),
2190 stdio = PerlSIO_stdin;
2193 stdio = PerlSIO_stdout;
2196 stdio = PerlSIO_stderr;
2202 stdio = PerlSIO_fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
2206 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),self,mode,PerlIOArg),PerlIOStdio);
2216 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
2219 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
2223 STDCHAR *buf = (STDCHAR *) vbuf;
2224 /* Perl is expecting PerlIO_getc() to fill the buffer
2225 * Linux's stdio does not do that for fread()
2227 int ch = PerlSIO_fgetc(s);
2235 got = PerlSIO_fread(vbuf,1,count,s);
2240 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
2243 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
2244 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
2248 int ch = *buf-- & 0xff;
2249 if (PerlSIO_ungetc(ch,s) != ch)
2258 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
2261 return PerlSIO_fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
2265 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
2268 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2269 return PerlSIO_fseek(stdio,offset,whence);
2273 PerlIOStdio_tell(PerlIO *f)
2276 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2277 return PerlSIO_ftell(stdio);
2281 PerlIOStdio_close(PerlIO *f)
2284 #ifdef SOCKS5_VERSION_NAME
2286 Sock_size_t optlen = sizeof(int);
2288 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2290 #ifdef SOCKS5_VERSION_NAME
2291 (getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (void *)&optval, &optlen) < 0) ?
2292 PerlSIO_fclose(stdio) :
2293 close(PerlIO_fileno(f))
2295 PerlSIO_fclose(stdio)
2302 PerlIOStdio_flush(PerlIO *f)
2305 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2306 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
2308 return PerlSIO_fflush(stdio);
2313 /* FIXME: This discards ungetc() and pre-read stuff which is
2314 not right if this is just a "sync" from a layer above
2315 Suspect right design is to do _this_ but not have layer above
2316 flush this layer read-to-read
2318 /* Not writeable - sync by attempting a seek */
2320 if (PerlSIO_fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
2328 PerlIOStdio_fill(PerlIO *f)
2331 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2333 /* fflush()ing read-only streams can cause trouble on some stdio-s */
2334 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2336 if (PerlSIO_fflush(stdio) != 0)
2339 c = PerlSIO_fgetc(stdio);
2340 if (c == EOF || PerlSIO_ungetc(c,stdio) != c)
2346 PerlIOStdio_eof(PerlIO *f)
2349 return PerlSIO_feof(PerlIOSelf(f,PerlIOStdio)->stdio);
2353 PerlIOStdio_error(PerlIO *f)
2356 return PerlSIO_ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
2360 PerlIOStdio_clearerr(PerlIO *f)
2363 PerlSIO_clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
2367 PerlIOStdio_setlinebuf(PerlIO *f)
2370 #ifdef HAS_SETLINEBUF
2371 PerlSIO_setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
2373 PerlSIO_setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
2379 PerlIOStdio_get_base(PerlIO *f)
2382 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2383 return PerlSIO_get_base(stdio);
2387 PerlIOStdio_get_bufsiz(PerlIO *f)
2390 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2391 return PerlSIO_get_bufsiz(stdio);
2395 #ifdef USE_STDIO_PTR
2397 PerlIOStdio_get_ptr(PerlIO *f)
2400 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2401 return PerlSIO_get_ptr(stdio);
2405 PerlIOStdio_get_cnt(PerlIO *f)
2408 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2409 return PerlSIO_get_cnt(stdio);
2413 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
2415 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2419 #ifdef STDIO_PTR_LVALUE
2420 PerlSIO_set_ptr(stdio,ptr);
2421 #ifdef STDIO_PTR_LVAL_SETS_CNT
2422 if (PerlSIO_get_cnt(stdio) != (cnt))
2425 assert(PerlSIO_get_cnt(stdio) == (cnt));
2428 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
2429 /* Setting ptr _does_ change cnt - we are done */
2432 #else /* STDIO_PTR_LVALUE */
2434 #endif /* STDIO_PTR_LVALUE */
2436 /* Now (or only) set cnt */
2437 #ifdef STDIO_CNT_LVALUE
2438 PerlSIO_set_cnt(stdio,cnt);
2439 #else /* STDIO_CNT_LVALUE */
2440 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
2441 PerlSIO_set_ptr(stdio,PerlSIO_get_ptr(stdio)+(PerlSIO_get_cnt(stdio)-cnt));
2442 #else /* STDIO_PTR_LVAL_SETS_CNT */
2444 #endif /* STDIO_PTR_LVAL_SETS_CNT */
2445 #endif /* STDIO_CNT_LVALUE */
2450 PerlIO_funcs PerlIO_stdio = {
2452 sizeof(PerlIOStdio),
2469 PerlIOStdio_clearerr,
2470 PerlIOStdio_setlinebuf,
2472 PerlIOStdio_get_base,
2473 PerlIOStdio_get_bufsiz,
2478 #ifdef USE_STDIO_PTR
2479 PerlIOStdio_get_ptr,
2480 PerlIOStdio_get_cnt,
2481 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
2482 PerlIOStdio_set_ptrcnt
2483 #else /* STDIO_PTR_LVALUE */
2485 #endif /* STDIO_PTR_LVALUE */
2486 #else /* USE_STDIO_PTR */
2490 #endif /* USE_STDIO_PTR */
2493 #undef PerlIO_exportFILE
2495 PerlIO_exportFILE(PerlIO *f, int fl)
2499 stdio = fdopen(PerlIO_fileno(f),"r+");
2503 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ f,&PerlIO_stdio,"r+",Nullsv),PerlIOStdio);
2509 #undef PerlIO_findFILE
2511 PerlIO_findFILE(PerlIO *f)
2516 if (l->tab == &PerlIO_stdio)
2518 PerlIOStdio *s = PerlIOSelf(&l,PerlIOStdio);
2521 l = *PerlIONext(&l);
2523 return PerlIO_exportFILE(f,0);
2526 #undef PerlIO_releaseFILE
2528 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2532 /*--------------------------------------------------------------------------------------*/
2533 /* perlio buffer layer */
2536 PerlIOBuf_pushed(PerlIO *f, const char *mode, SV *arg)
2539 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2540 int fd = PerlIO_fileno(f);
2542 if (fd >= 0 && PerlLIO_isatty(fd))
2544 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF|PERLIO_F_TTY;
2546 posn = PerlIO_tell(PerlIONext(f));
2547 if (posn != (Off_t) -1)
2551 return PerlIOBase_pushed(f,mode,arg);
2555 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2559 PerlIO *next = PerlIONext(f);
2560 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n-1, PerlIOBase(next)->tab);
2561 next = (*tab->Open)(aTHX_ tab, layers, n-1, mode,fd,imode,perm,next,narg,args);
2562 if (!next || (*PerlIOBase(f)->tab->Pushed)(f,mode,PerlIOArg) != 0)
2569 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n-1, PerlIO_default_btm());
2576 f = (*tab->Open)(aTHX_ tab, layers, n-1, mode,fd,imode,perm,NULL,narg,args);
2579 PerlIO_push(aTHX_ f,self,mode,PerlIOArg);
2580 fd = PerlIO_fileno(f);
2581 #if O_BINARY != O_TEXT
2582 /* do something about failing setmode()? --jhi */
2583 PerlLIO_setmode(fd , O_BINARY);
2585 if (init && fd == 2)
2587 /* Initial stderr is unbuffered */
2588 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2595 /* This "flush" is akin to sfio's sync in that it handles files in either
2599 PerlIOBuf_flush(PerlIO *f)
2601 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2603 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2605 /* write() the buffer */
2606 STDCHAR *buf = b->buf;
2608 PerlIO *n = PerlIONext(f);
2611 SSize_t count = PerlIO_write(n,p,b->ptr - p);
2616 else if (count < 0 || PerlIO_error(n))
2618 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2623 b->posn += (p - buf);
2625 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2627 STDCHAR *buf = PerlIO_get_base(f);
2628 /* Note position change */
2629 b->posn += (b->ptr - buf);
2630 if (b->ptr < b->end)
2632 /* We did not consume all of it */
2633 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
2635 b->posn = PerlIO_tell(PerlIONext(f));
2639 b->ptr = b->end = b->buf;
2640 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2641 /* FIXME: Is this right for read case ? */
2642 if (PerlIO_flush(PerlIONext(f)) != 0)
2648 PerlIOBuf_fill(PerlIO *f)
2650 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2651 PerlIO *n = PerlIONext(f);
2653 /* FIXME: doing the down-stream flush is a bad idea if it causes
2654 pre-read data in stdio buffer to be discarded
2655 but this is too simplistic - as it skips _our_ hosekeeping
2656 and breaks tell tests.
2657 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2661 if (PerlIO_flush(f) != 0)
2663 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
2664 PerlIOBase_flush_linebuf();
2667 PerlIO_get_base(f); /* allocate via vtable */
2669 b->ptr = b->end = b->buf;
2670 if (PerlIO_fast_gets(n))
2672 /* Layer below is also buffered
2673 * We do _NOT_ want to call its ->Read() because that will loop
2674 * till it gets what we asked for which may hang on a pipe etc.
2675 * Instead take anything it has to hand, or ask it to fill _once_.
2677 avail = PerlIO_get_cnt(n);
2680 avail = PerlIO_fill(n);
2682 avail = PerlIO_get_cnt(n);
2685 if (!PerlIO_error(n) && PerlIO_eof(n))
2691 STDCHAR *ptr = PerlIO_get_ptr(n);
2692 SSize_t cnt = avail;
2693 if (avail > b->bufsiz)
2695 Copy(ptr,b->buf,avail,STDCHAR);
2696 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
2701 avail = PerlIO_read(n,b->ptr,b->bufsiz);
2706 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2708 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2711 b->end = b->buf+avail;
2712 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2717 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
2719 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2724 return PerlIOBase_read(f,vbuf,count);
2730 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
2732 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2733 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2736 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2742 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2744 avail = (b->ptr - b->buf);
2749 b->end = b->buf + avail;
2751 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2752 b->posn -= b->bufsiz;
2754 if (avail > (SSize_t) count)
2762 Copy(buf,b->ptr,avail,STDCHAR);
2766 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2773 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2775 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2776 const STDCHAR *buf = (const STDCHAR *) vbuf;
2780 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2784 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2785 if ((SSize_t) count < avail)
2787 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2788 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2808 Copy(buf,b->ptr,avail,STDCHAR);
2815 if (b->ptr >= (b->buf + b->bufsiz))
2818 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2824 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2827 if ((code = PerlIO_flush(f)) == 0)
2829 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2830 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2831 code = PerlIO_seek(PerlIONext(f),offset,whence);
2834 b->posn = PerlIO_tell(PerlIONext(f));
2841 PerlIOBuf_tell(PerlIO *f)
2843 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2844 Off_t posn = b->posn;
2846 posn += (b->ptr - b->buf);
2851 PerlIOBuf_close(PerlIO *f)
2853 IV code = PerlIOBase_close(f);
2854 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2855 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2857 PerlMemShared_free(b->buf);
2860 b->ptr = b->end = b->buf;
2861 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2866 PerlIOBuf_get_ptr(PerlIO *f)
2868 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2875 PerlIOBuf_get_cnt(PerlIO *f)
2877 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2880 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2881 return (b->end - b->ptr);
2886 PerlIOBuf_get_base(PerlIO *f)
2888 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2893 b->buf = PerlMemShared_calloc(b->bufsiz,sizeof(STDCHAR));
2896 b->buf = (STDCHAR *)&b->oneword;
2897 b->bufsiz = sizeof(b->oneword);
2906 PerlIOBuf_bufsiz(PerlIO *f)
2908 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2911 return (b->end - b->buf);
2915 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2917 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2921 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2924 assert(PerlIO_get_cnt(f) == cnt);
2925 assert(b->ptr >= b->buf);
2927 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2930 PerlIO_funcs PerlIO_perlio = {
2949 PerlIOBase_clearerr,
2950 PerlIOBase_setlinebuf,
2955 PerlIOBuf_set_ptrcnt,
2958 /*--------------------------------------------------------------------------------------*/
2959 /* Temp layer to hold unread chars when cannot do it any other way */
2962 PerlIOPending_fill(PerlIO *f)
2964 /* Should never happen */
2970 PerlIOPending_close(PerlIO *f)
2972 /* A tad tricky - flush pops us, then we close new top */
2974 return PerlIO_close(f);
2978 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
2980 /* A tad tricky - flush pops us, then we seek new top */
2982 return PerlIO_seek(f,offset,whence);
2987 PerlIOPending_flush(PerlIO *f)
2990 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2991 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2993 PerlMemShared_free(b->buf);
2996 PerlIO_pop(aTHX_ f);
3001 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
3009 PerlIOBuf_set_ptrcnt(f,ptr,cnt);
3014 PerlIOPending_pushed(PerlIO *f,const char *mode,SV *arg)
3016 IV code = PerlIOBase_pushed(f,mode,arg);
3017 PerlIOl *l = PerlIOBase(f);
3018 /* Our PerlIO_fast_gets must match what we are pushed on,
3019 or sv_gets() etc. get muddled when it changes mid-string
3022 l->flags = (l->flags & ~(PERLIO_F_FASTGETS|PERLIO_F_UTF8)) |
3023 (PerlIOBase(PerlIONext(f))->flags & (PERLIO_F_FASTGETS|PERLIO_F_UTF8));
3028 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
3030 SSize_t avail = PerlIO_get_cnt(f);
3035 got = PerlIOBuf_read(f,vbuf,avail);
3036 if (got >= 0 && got < count)
3038 SSize_t more = PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
3039 if (more >= 0 || got == 0)
3045 PerlIO_funcs PerlIO_pending = {
3049 PerlIOPending_pushed,
3059 PerlIOPending_close,
3060 PerlIOPending_flush,
3064 PerlIOBase_clearerr,
3065 PerlIOBase_setlinebuf,
3070 PerlIOPending_set_ptrcnt,
3075 /*--------------------------------------------------------------------------------------*/
3076 /* crlf - translation
3077 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
3078 to hand back a line at a time and keeping a record of which nl we "lied" about.
3079 On write translate "\n" to CR,LF
3084 PerlIOBuf base; /* PerlIOBuf stuff */
3085 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
3089 PerlIOCrlf_pushed(PerlIO *f, const char *mode,SV *arg)
3092 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
3093 code = PerlIOBuf_pushed(f,mode,arg);
3095 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n",
3096 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
3097 PerlIOBase(f)->flags);
3104 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
3106 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3112 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3113 return PerlIOBuf_unread(f,vbuf,count);
3116 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
3117 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3119 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3125 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3127 b->end = b->ptr = b->buf + b->bufsiz;
3128 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3129 b->posn -= b->bufsiz;
3131 while (count > 0 && b->ptr > b->buf)
3136 if (b->ptr - 2 >= b->buf)
3162 PerlIOCrlf_get_cnt(PerlIO *f)
3164 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3167 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
3169 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3170 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
3172 STDCHAR *nl = b->ptr;
3174 while (nl < b->end && *nl != 0xd)
3176 if (nl < b->end && *nl == 0xd)
3188 /* Not CR,LF but just CR */
3195 /* Blast - found CR as last char in buffer */
3198 /* They may not care, defer work as long as possible */
3199 return (nl - b->ptr);
3204 b->ptr++; /* say we have read it as far as flush() is concerned */
3205 b->buf++; /* Leave space an front of buffer */
3206 b->bufsiz--; /* Buffer is thus smaller */
3207 code = PerlIO_fill(f); /* Fetch some more */
3208 b->bufsiz++; /* Restore size for next time */
3209 b->buf--; /* Point at space */
3210 b->ptr = nl = b->buf; /* Which is what we hand off */
3211 b->posn--; /* Buffer starts here */
3212 *nl = 0xd; /* Fill in the CR */
3214 goto test; /* fill() call worked */
3215 /* CR at EOF - just fall through */
3220 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
3226 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
3228 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3229 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3230 IV flags = PerlIOBase(f)->flags;
3240 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
3247 /* Test code - delete when it works ... */
3254 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
3262 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08"UVxf" nl=%p e=%p for %d",
3263 ptr, chk, flags, c->nl, b->end, cnt);
3270 /* They have taken what we lied about */
3277 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3281 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
3283 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3284 return PerlIOBuf_write(f,vbuf,count);
3287 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3288 const STDCHAR *buf = (const STDCHAR *) vbuf;
3289 const STDCHAR *ebuf = buf+count;
3292 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3296 STDCHAR *eptr = b->buf+b->bufsiz;
3297 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3298 while (buf < ebuf && b->ptr < eptr)
3302 if ((b->ptr + 2) > eptr)
3304 /* Not room for both */
3310 *(b->ptr)++ = 0xd; /* CR */
3311 *(b->ptr)++ = 0xa; /* LF */
3313 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
3332 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
3334 return (buf - (STDCHAR *) vbuf);
3339 PerlIOCrlf_flush(PerlIO *f)
3341 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3347 return PerlIOBuf_flush(f);
3350 PerlIO_funcs PerlIO_crlf = {
3353 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
3355 PerlIOBase_noop_ok, /* popped */
3359 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
3360 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
3361 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
3369 PerlIOBase_clearerr,
3370 PerlIOBase_setlinebuf,
3375 PerlIOCrlf_set_ptrcnt,
3379 /*--------------------------------------------------------------------------------------*/
3380 /* mmap as "buffer" layer */
3384 PerlIOBuf base; /* PerlIOBuf stuff */
3385 Mmap_t mptr; /* Mapped address */
3386 Size_t len; /* mapped length */
3387 STDCHAR *bbuf; /* malloced buffer if map fails */
3390 static size_t page_size = 0;
3393 PerlIOMmap_map(PerlIO *f)
3396 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3397 IV flags = PerlIOBase(f)->flags;
3401 if (flags & PERLIO_F_CANREAD)
3403 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3404 int fd = PerlIO_fileno(f);
3406 code = fstat(fd,&st);
3407 if (code == 0 && S_ISREG(st.st_mode))
3409 SSize_t len = st.st_size - b->posn;
3414 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
3416 SETERRNO(0,SS$_NORMAL);
3417 # ifdef _SC_PAGESIZE
3418 page_size = sysconf(_SC_PAGESIZE);
3420 page_size = sysconf(_SC_PAGE_SIZE);
3422 if ((long)page_size < 0) {
3427 (void)SvUPGRADE(error, SVt_PV);
3428 msg = SvPVx(error, n_a);
3429 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
3432 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
3436 # ifdef HAS_GETPAGESIZE
3437 page_size = getpagesize();
3439 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
3440 page_size = PAGESIZE; /* compiletime, bad */
3444 if ((IV)page_size <= 0)
3445 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
3449 /* This is a hack - should never happen - open should have set it ! */
3450 b->posn = PerlIO_tell(PerlIONext(f));
3452 posn = (b->posn / page_size) * page_size;
3453 len = st.st_size - posn;
3454 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
3455 if (m->mptr && m->mptr != (Mmap_t) -1)
3457 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
3458 madvise(m->mptr, len, MADV_SEQUENTIAL);
3460 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
3461 madvise(m->mptr, len, MADV_WILLNEED);
3463 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
3464 b->end = ((STDCHAR *)m->mptr) + len;
3465 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
3476 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
3478 b->ptr = b->end = b->ptr;
3487 PerlIOMmap_unmap(PerlIO *f)
3489 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3490 PerlIOBuf *b = &m->base;
3496 code = munmap(m->mptr, m->len);
3500 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
3503 b->ptr = b->end = b->buf;
3504 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
3510 PerlIOMmap_get_base(PerlIO *f)
3512 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3513 PerlIOBuf *b = &m->base;
3514 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3516 /* Already have a readbuffer in progress */
3521 /* We have a write buffer or flushed PerlIOBuf read buffer */
3522 m->bbuf = b->buf; /* save it in case we need it again */
3523 b->buf = NULL; /* Clear to trigger below */
3527 PerlIOMmap_map(f); /* Try and map it */
3530 /* Map did not work - recover PerlIOBuf buffer if we have one */
3534 b->ptr = b->end = b->buf;
3537 return PerlIOBuf_get_base(f);
3541 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
3543 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3544 PerlIOBuf *b = &m->base;
3545 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3547 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
3550 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
3555 /* Loose the unwritable mapped buffer */
3557 /* If flush took the "buffer" see if we have one from before */
3558 if (!b->buf && m->bbuf)
3562 PerlIOBuf_get_base(f);
3566 return PerlIOBuf_unread(f,vbuf,count);
3570 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
3572 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3573 PerlIOBuf *b = &m->base;
3574 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
3576 /* No, or wrong sort of, buffer */
3579 if (PerlIOMmap_unmap(f) != 0)
3582 /* If unmap took the "buffer" see if we have one from before */
3583 if (!b->buf && m->bbuf)
3587 PerlIOBuf_get_base(f);
3591 return PerlIOBuf_write(f,vbuf,count);
3595 PerlIOMmap_flush(PerlIO *f)
3597 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3598 PerlIOBuf *b = &m->base;
3599 IV code = PerlIOBuf_flush(f);
3600 /* Now we are "synced" at PerlIOBuf level */
3605 /* Unmap the buffer */
3606 if (PerlIOMmap_unmap(f) != 0)
3611 /* We seem to have a PerlIOBuf buffer which was not mapped
3612 * remember it in case we need one later
3621 PerlIOMmap_fill(PerlIO *f)
3623 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3624 IV code = PerlIO_flush(f);
3625 if (code == 0 && !b->buf)
3627 code = PerlIOMmap_map(f);
3629 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3631 code = PerlIOBuf_fill(f);
3637 PerlIOMmap_close(PerlIO *f)
3639 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3640 PerlIOBuf *b = &m->base;
3641 IV code = PerlIO_flush(f);
3646 b->ptr = b->end = b->buf;
3648 if (PerlIOBuf_close(f) != 0)
3654 PerlIO_funcs PerlIO_mmap = {
3673 PerlIOBase_clearerr,
3674 PerlIOBase_setlinebuf,
3675 PerlIOMmap_get_base,
3679 PerlIOBuf_set_ptrcnt,
3682 #endif /* HAS_MMAP */
3689 call_atexit(PerlIO_cleanup_layers, NULL);
3694 atexit(&PerlIO_cleanup);
3706 PerlIO_stdstreams(aTHX);
3711 #undef PerlIO_stdout
3718 PerlIO_stdstreams(aTHX);
3723 #undef PerlIO_stderr
3730 PerlIO_stdstreams(aTHX);
3735 /*--------------------------------------------------------------------------------------*/
3737 #undef PerlIO_getname
3739 PerlIO_getname(PerlIO *f, char *buf)
3744 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
3745 if (stdio) name = fgetname(stdio, buf);
3747 Perl_croak(aTHX_ "Don't know how to get file name");
3753 /*--------------------------------------------------------------------------------------*/
3754 /* Functions which can be called on any kind of PerlIO implemented
3760 PerlIO_getc(PerlIO *f)
3763 SSize_t count = PerlIO_read(f,buf,1);
3766 return (unsigned char) buf[0];
3771 #undef PerlIO_ungetc
3773 PerlIO_ungetc(PerlIO *f, int ch)
3778 if (PerlIO_unread(f,&buf,1) == 1)
3786 PerlIO_putc(PerlIO *f, int ch)
3789 return PerlIO_write(f,&buf,1);
3794 PerlIO_puts(PerlIO *f, const char *s)
3796 STRLEN len = strlen(s);
3797 return PerlIO_write(f,s,len);
3800 #undef PerlIO_rewind
3802 PerlIO_rewind(PerlIO *f)
3804 PerlIO_seek(f,(Off_t)0,SEEK_SET);
3808 #undef PerlIO_vprintf
3810 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3813 SV *sv = newSVpvn("",0);
3819 Perl_va_copy(ap, apc);
3820 sv_vcatpvf(sv, fmt, &apc);
3822 sv_vcatpvf(sv, fmt, &ap);
3825 wrote = PerlIO_write(f,s,len);
3830 #undef PerlIO_printf
3832 PerlIO_printf(PerlIO *f,const char *fmt,...)
3837 result = PerlIO_vprintf(f,fmt,ap);
3842 #undef PerlIO_stdoutf
3844 PerlIO_stdoutf(const char *fmt,...)
3849 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
3854 #undef PerlIO_tmpfile
3856 PerlIO_tmpfile(void)
3858 /* I have no idea how portable mkstemp() is ... */
3859 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
3862 FILE *stdio = PerlSIO_tmpfile();
3865 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),&PerlIO_stdio,"w+",Nullsv),PerlIOStdio);
3871 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
3872 int fd = mkstemp(SvPVX(sv));
3876 f = PerlIO_fdopen(fd,"w+");
3879 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
3881 PerlLIO_unlink(SvPVX(sv));
3891 #endif /* USE_SFIO */
3892 #endif /* PERLIO_IS_STDIO */
3894 /*======================================================================================*/
3895 /* Now some functions in terms of above which may be needed even if
3896 we are not in true PerlIO mode
3900 #undef PerlIO_setpos
3902 PerlIO_setpos(PerlIO *f, SV *pos)
3908 Off_t *posn = (Off_t *) SvPV(pos,len);
3909 if (f && len == sizeof(Off_t))
3910 return PerlIO_seek(f,*posn,SEEK_SET);
3912 SETERRNO(EINVAL,SS$_IVCHAN);
3916 #undef PerlIO_setpos
3918 PerlIO_setpos(PerlIO *f, SV *pos)
3924 Fpos_t *fpos = (Fpos_t *) SvPV(pos,len);
3925 if (f && len == sizeof(Fpos_t))
3927 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3928 return fsetpos64(f, fpos);
3930 return fsetpos(f, fpos);
3934 SETERRNO(EINVAL,SS$_IVCHAN);
3940 #undef PerlIO_getpos
3942 PerlIO_getpos(PerlIO *f, SV *pos)
3945 Off_t posn = PerlIO_tell(f);
3946 sv_setpvn(pos,(char *)&posn,sizeof(posn));
3947 return (posn == (Off_t)-1) ? -1 : 0;
3950 #undef PerlIO_getpos
3952 PerlIO_getpos(PerlIO *f, SV *pos)
3957 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3958 code = fgetpos64(f, &fpos);
3960 code = fgetpos(f, &fpos);
3962 sv_setpvn(pos,(char *)&fpos,sizeof(fpos));
3967 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
3970 vprintf(char *pat, char *args)
3972 _doprnt(pat, args, stdout);
3973 return 0; /* wrong, but perl doesn't use the return value */
3977 vfprintf(FILE *fd, char *pat, char *args)
3979 _doprnt(pat, args, fd);
3980 return 0; /* wrong, but perl doesn't use the return value */
3985 #ifndef PerlIO_vsprintf
3987 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
3989 int val = vsprintf(s, fmt, ap);
3992 if (strlen(s) >= (STRLEN)n)
3995 (void)PerlIO_puts(Perl_error_log,
3996 "panic: sprintf overflow - memory corrupted!\n");
4004 #ifndef PerlIO_sprintf
4006 PerlIO_sprintf(char *s, int n, const char *fmt,...)
4011 result = PerlIO_vsprintf(s, n, fmt, ap);