3 * Copyright (c) 1996-2001, Nick Ing-Simmons
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
17 #define PERLIO_NOT_STDIO 0
18 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
19 /* #define PerlIO FILE */
22 * This file provides those parts of PerlIO abstraction
23 * which are not #defined in perlio.h.
24 * Which these are depends on various Configure #ifdef's
28 #define PERL_IN_PERLIO_C
31 #undef PerlMemShared_calloc
32 #define PerlMemShared_calloc(x,y) calloc(x,y)
33 #undef PerlMemShared_free
34 #define PerlMemShared_free(x) free(x)
37 perlsio_binmode(FILE *fp, int iotype, int mode)
39 /* This used to be contents of do_binmode in doio.c */
41 # if defined(atarist) || defined(__MINT__)
44 ((FILE*)fp)->_flag |= _IOBIN;
46 ((FILE*)fp)->_flag &= ~ _IOBIN;
52 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
53 # if defined(WIN32) && defined(__BORLANDC__)
54 /* The translation mode of the stream is maintained independent
55 * of the translation mode of the fd in the Borland RTL (heavy
56 * digging through their runtime sources reveal). User has to
57 * set the mode explicitly for the stream (though they don't
58 * document this anywhere). GSAR 97-5-24
64 fp->flags &= ~ _F_BIN;
72 # if defined(USEMYBINMODE)
73 if (my_binmode(fp, iotype, mode) != FALSE)
85 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
87 if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
91 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
102 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
104 return perlsio_binmode(fp,iotype,mode);
107 /* De-mux PerlIO_openn() into fdopen, freopen and fopen type entries */
110 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
114 if (*args == &PL_sv_undef)
115 return PerlIO_tmpfile();
118 char *name = SvPV_nolen(*args);
121 fd = PerlLIO_open3(name,imode,perm);
123 return PerlIO_fdopen(fd,mode+1);
127 return PerlIO_reopen(name,mode,old);
131 return PerlIO_open(name,mode);
137 return PerlIO_fdopen(fd,mode);
145 #ifdef PERLIO_IS_STDIO
150 /* Does nothing (yet) except force this file to be included
151 in perl binary. That allows this file to force inclusion
152 of other functions that may be required by loadable
153 extensions e.g. for FileHandle::tmpfile
157 #undef PerlIO_tmpfile
164 #else /* PERLIO_IS_STDIO */
171 /* This section is just to make sure these functions
172 get pulled in from libsfio.a
175 #undef PerlIO_tmpfile
185 /* Force this file to be included in perl binary. Which allows
186 * this file to force inclusion of other functions that may be
187 * required by loadable extensions e.g. for FileHandle::tmpfile
191 * sfio does its own 'autoflush' on stdout in common cases.
192 * Flush results in a lot of lseek()s to regular files and
193 * lot of small writes to pipes.
195 sfset(sfstdout,SF_SHARE,0);
199 /*======================================================================================*/
200 /* Implement all the PerlIO interface ourselves.
205 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
210 #include <sys/mman.h>
215 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
218 PerlIO_debug(const char *fmt,...)
226 char *s = PerlEnv_getenv("PERLIO_DEBUG");
228 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
235 SV *sv = newSVpvn("",0);
238 s = CopFILE(PL_curcop);
241 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
242 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
245 PerlLIO_write(dbg,s,len);
251 /*--------------------------------------------------------------------------------------*/
253 /* Inner level routines */
255 /* Table of pointers to the PerlIO structs (malloc'ed) */
256 PerlIO *_perlio = NULL;
257 #define PERLIO_TABLE_SIZE 64
262 PerlIO_allocate(pTHX)
264 /* Find a free slot in the table, allocating new table as necessary */
271 last = (PerlIO **)(f);
272 for (i=1; i < PERLIO_TABLE_SIZE; i++)
280 f = PerlMemShared_calloc(PERLIO_TABLE_SIZE,sizeof(PerlIO));
290 PerlIO_cleantable(pTHX_ PerlIO **tablep)
292 PerlIO *table = *tablep;
296 PerlIO_cleantable(aTHX_ (PerlIO **) &(table[0]));
297 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
305 PerlMemShared_free(table);
317 PerlIO_cleantable(aTHX_ &_perlio);
321 PerlIO_destruct(pTHX)
323 PerlIO **table = &_perlio;
328 table = (PerlIO **)(f++);
329 for (i=1; i < PERLIO_TABLE_SIZE; i++)
335 if (l->tab->kind & PERLIO_K_DESTRUCT)
337 PerlIO_debug("Destruct popping %s\n",l->tab->name);
352 PerlIO_pop(pTHX_ PerlIO *f)
357 PerlIO_debug("PerlIO_pop f=%p %s\n",f,l->tab->name);
359 (*l->tab->Popped)(f);
361 PerlMemShared_free(l);
365 /*--------------------------------------------------------------------------------------*/
366 /* XS Interface for perl code */
369 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
373 if ((SSize_t) len <= 0)
375 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
376 if (!svp && load && PL_subname && PerlIO_layer_av && av_len(PerlIO_layer_av)+1 >= 2)
378 SV *pkgsv = newSVpvn("PerlIO",6);
379 SV *layer = newSVpvn(name,len);
381 /* The two SVs are magically freed by load_module */
382 Perl_load_module(aTHX_ 0, pkgsv, Nullsv, layer, Nullsv);
384 /* Say this is lvalue so we get an 'undef' if still not there */
385 svp = hv_fetch(PerlIO_layer_hv,name,len,1);
387 if (svp && (sv = *svp))
397 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
401 IO *io = GvIOn((GV *)SvRV(sv));
402 PerlIO *ifp = IoIFP(io);
403 PerlIO *ofp = IoOFP(io);
404 AV *av = (AV *) mg->mg_obj;
405 Perl_warn(aTHX_ "set %"SVf" %p %p %p",sv,io,ifp,ofp);
411 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
415 IO *io = GvIOn((GV *)SvRV(sv));
416 PerlIO *ifp = IoIFP(io);
417 PerlIO *ofp = IoOFP(io);
418 AV *av = (AV *) mg->mg_obj;
419 Perl_warn(aTHX_ "get %"SVf" %p %p %p",sv,io,ifp,ofp);
425 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
427 Perl_warn(aTHX_ "clear %"SVf,sv);
432 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
434 Perl_warn(aTHX_ "free %"SVf,sv);
438 MGVTBL perlio_vtab = {
446 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
449 SV *sv = SvRV(ST(1));
454 sv_magic(sv, (SV *)av, '~', NULL, 0);
456 mg = mg_find(sv,'~');
457 mg->mg_virtual = &perlio_vtab;
459 Perl_warn(aTHX_ "attrib %"SVf,sv);
460 for (i=2; i < items; i++)
463 const char *name = SvPV(ST(i),len);
464 SV *layer = PerlIO_find_layer(aTHX_ name,len,1);
467 av_push(av,SvREFCNT_inc(layer));
480 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
482 HV *stash = gv_stashpv("PerlIO::Layer", TRUE);
483 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
488 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
490 if (!PerlIO_layer_hv)
492 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
494 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),PerlIO_tab_sv(aTHX_ tab),0);
495 PerlIO_debug("define %s %p\n",tab->name,tab);
499 PerlIO_parse_layers(pTHX_ AV *av, const char *names)
503 const char *s = names;
506 while (isSPACE(*s) || *s == ':')
512 const char *as = Nullch;
516 /* Message is consistent with how attribute lists are passed.
517 Even though this means "foo : : bar" is seen as an invalid separator
519 char q = ((*s == '\'') ? '"' : '\'');
520 Perl_warn(aTHX_ "perlio: invalid separator character %c%c%c in layer specification list", q, *s, q);
526 } while (isALNUM(*e));
544 /* It's a nul terminated string, not allowed to \ the terminating null.
545 Anything other character is passed over. */
553 Perl_warn(aTHX_ "perlio: argument list not closed for layer \"%.*s\"",(int)(e - s),s);
563 SV *layer = PerlIO_find_layer(aTHX_ s,llen,1);
566 av_push(av,SvREFCNT_inc(layer));
567 av_push(av,(as) ? newSVpvn(as,alen) : &PL_sv_undef);
570 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)llen,s);
582 PerlIO_default_buffer(pTHX_ AV *av)
584 PerlIO_funcs *tab = &PerlIO_perlio;
585 if (O_BINARY != O_TEXT)
591 if (PerlIO_stdio.Set_ptrcnt)
596 PerlIO_debug("Pushing %s\n",tab->name);
597 av_push(av,SvREFCNT_inc(PerlIO_find_layer(aTHX_ tab->name,0,0)));
598 av_push(av,&PL_sv_undef);
602 PerlIO_arg_fetch(pTHX_ AV *av,IV n)
604 SV **svp = av_fetch(av,n,FALSE);
605 return (svp) ? *svp : Nullsv;
609 PerlIO_layer_fetch(pTHX_ AV *av,IV n,PerlIO_funcs *def)
611 SV **svp = av_fetch(av,n,FALSE);
613 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
615 /* PerlIO_debug("Layer %d is %s\n",n/2,tab->name); */
616 return INT2PTR(PerlIO_funcs *, SvIV(layer));
619 Perl_croak(aTHX_ "panic:PerlIO layer array corrupt");
624 PerlIO_default_layers(pTHX)
627 if (!PerlIO_layer_av)
629 const char *s = (PL_tainting) ? Nullch : PerlEnv_getenv("PERLIO");
630 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
632 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
634 PerlIO_define_layer(aTHX_ &PerlIO_raw);
635 PerlIO_define_layer(aTHX_ &PerlIO_unix);
636 PerlIO_define_layer(aTHX_ &PerlIO_perlio);
637 PerlIO_define_layer(aTHX_ &PerlIO_stdio);
638 PerlIO_define_layer(aTHX_ &PerlIO_crlf);
640 PerlIO_define_layer(aTHX_ &PerlIO_mmap);
642 PerlIO_define_layer(aTHX_ &PerlIO_utf8);
643 PerlIO_define_layer(aTHX_ &PerlIO_byte);
644 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(aTHX_ PerlIO_unix.name,0,0)));
645 av_push(PerlIO_layer_av,&PL_sv_undef);
648 PerlIO_parse_layers(aTHX_ PerlIO_layer_av,s);
652 PerlIO_default_buffer(aTHX_ PerlIO_layer_av);
655 len = av_len(PerlIO_layer_av)+1;
658 PerlIO_default_buffer(aTHX_ PerlIO_layer_av);
659 len = av_len(PerlIO_layer_av);
661 return PerlIO_layer_av;
666 PerlIO_default_layer(pTHX_ I32 n)
668 AV *av = PerlIO_default_layers(aTHX);
671 n += av_len(PerlIO_layer_av)+1;
672 return PerlIO_layer_fetch(aTHX_ av,n, &PerlIO_stdio);
675 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
676 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
679 PerlIO_stdstreams(pTHX)
683 PerlIO_allocate(aTHX);
684 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
685 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
686 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
691 PerlIO_push(pTHX_ PerlIO *f,PerlIO_funcs *tab,const char *mode,SV *arg)
694 l = PerlMemShared_calloc(tab->size,sizeof(char));
697 Zero(l,tab->size,char);
701 PerlIO_debug("PerlIO_push f=%p %s %s %p\n",f,tab->name,
702 (mode) ? mode : "(Null)",arg);
703 if ((*l->tab->Pushed)(f,mode,arg) != 0)
713 PerlIOPop_pushed(PerlIO *f, const char *mode, SV *arg)
727 PerlIORaw_pushed(PerlIO *f, const char *mode, SV *arg)
729 /* Remove the dummy layer */
732 /* Pop back to bottom layer */
737 while (!(PerlIOBase(f)->tab->kind & PERLIO_K_RAW))
745 /* Nothing bellow - push unix on top then remove it */
746 if (PerlIO_push(aTHX_ f,PerlIO_default_btm(),mode,arg))
748 PerlIO_pop(aTHX_ PerlIONext(f));
753 PerlIO_debug(":raw f=%p :%s\n",f,PerlIOBase(f)->tab->name);
760 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode, AV *layers, IV n)
762 IV max = av_len(layers)+1;
766 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers,n,NULL);
769 if (!PerlIO_push(aTHX_ f,tab,mode,PerlIOArg))
781 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
786 AV *layers = newAV();
787 code = PerlIO_parse_layers(aTHX_ layers,names);
790 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0);
792 SvREFCNT_dec((SV *) layers);
798 /*--------------------------------------------------------------------------------------*/
799 /* Given the abstraction above the public API functions */
802 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
804 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
805 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
806 if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY)))
812 if (PerlIOBase(top)->tab == &PerlIO_crlf)
815 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
818 top = PerlIONext(top);
821 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
826 PerlIO__close(PerlIO *f)
828 return (*PerlIOBase(f)->tab->Close)(f);
831 #undef PerlIO_fdupopen
833 PerlIO_fdupopen(pTHX_ PerlIO *f)
836 int fd = PerlLIO_dup(PerlIO_fileno(f));
837 PerlIO *new = PerlIO_fdopen(fd,PerlIO_modestr(f,buf));
840 Off_t posn = PerlIO_tell(f);
841 PerlIO_seek(new,posn,SEEK_SET);
848 PerlIO_close(PerlIO *f)
854 code = (*PerlIOBase(f)->tab->Close)(f);
865 PerlIO_fileno(PerlIO *f)
867 return (*PerlIOBase(f)->tab->Fileno)(f);
871 PerlIO_context_layers(pTHX_ const char *mode)
873 const char *type = NULL;
874 /* Need to supply default layer info from open.pm */
877 SV *layers = PL_curcop->cop_io;
881 type = SvPV(layers,len);
882 if (type && mode[0] != 'r')
884 /* Skip to write part */
885 const char *s = strchr(type,0);
886 if (s && (s-type) < len)
897 PerlIO_layer_from_ref(pTHX_ SV *sv)
899 /* For any scalar type load the handler which is bundled with perl */
900 if (SvTYPE(sv) < SVt_PVAV)
901 return PerlIO_find_layer(aTHX_ "Scalar",6, 1);
903 /* For other types allow if layer is known but don't try and load it */
907 return PerlIO_find_layer(aTHX_ "Array",5, 0);
909 return PerlIO_find_layer(aTHX_ "Hash",4, 0);
911 return PerlIO_find_layer(aTHX_ "Code",4, 0);
913 return PerlIO_find_layer(aTHX_ "Glob",4, 0);
919 PerlIO_resolve_layers(pTHX_ const char *layers,const char *mode,int narg, SV **args)
921 AV *def = PerlIO_default_layers(aTHX);
924 PerlIO_stdstreams(aTHX);
928 /* If it is a reference but not an object see if we have a handler for it */
929 if (SvROK(arg) && !sv_isobject(arg))
931 SV *handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
935 av_push(def,SvREFCNT_inc(handler));
936 av_push(def,&PL_sv_undef);
939 /* Don't fail if handler cannot be found
940 * :Via(...) etc. may do something sensible
941 * else we will just stringfy and open resulting string.
946 layers = PerlIO_context_layers(aTHX_ mode);
947 if (layers && *layers)
952 IV n = av_len(def)+1;
956 SV **svp = av_fetch(def,n,0);
957 av_store(av,n,(svp) ? SvREFCNT_inc(*svp) : &PL_sv_undef);
964 PerlIO_parse_layers(aTHX_ av,layers);
976 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
978 if (!f && narg == 1 && *args == &PL_sv_undef)
980 if ((f = PerlIO_tmpfile()))
983 layers = PerlIO_context_layers(aTHX_ mode);
984 if (layers && *layers)
985 PerlIO_apply_layers(aTHX_ f,mode,layers);
995 /* This is "reopen" - it is not tested as perl does not use it yet */
1000 SV *arg = (l->tab->Getarg) ? (*l->tab->Getarg)(&l) : &PL_sv_undef;
1001 av_unshift(layera,2);
1002 av_store(layera,0,PerlIO_tab_sv(aTHX_ l->tab));
1003 av_store(layera,1,arg);
1004 l = *PerlIONext(&l);
1009 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1011 n = av_len(layera)-1;
1014 PerlIO_funcs *t = PerlIO_layer_fetch(aTHX_ layera,n,NULL);
1024 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1025 tab->name,layers,mode,fd,imode,perm,f,narg,args);
1026 f = (*tab->Open)(aTHX_ tab, layera, n, mode,fd,imode,perm,f,narg,args);
1029 if (n+2 < av_len(layera)+1)
1031 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n+2) != 0)
1038 SvREFCNT_dec(layera);
1044 #undef PerlIO_fdopen
1046 PerlIO_fdopen(int fd, const char *mode)
1049 return PerlIO_openn(aTHX_ Nullch,mode,fd,0,0,NULL,0,NULL);
1054 PerlIO_open(const char *path, const char *mode)
1057 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
1058 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,NULL,1,&name);
1061 #undef PerlIO_reopen
1063 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
1066 SV *name = sv_2mortal(newSVpvn(path,strlen(path)));
1067 return PerlIO_openn(aTHX_ Nullch,mode,-1,0,0,f,1,&name);
1072 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
1075 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
1078 SETERRNO(EBADF,SS$_IVCHAN);
1083 #undef PerlIO_unread
1085 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
1088 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
1091 SETERRNO(EBADF,SS$_IVCHAN);
1098 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
1101 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
1104 SETERRNO(EBADF,SS$_IVCHAN);
1111 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
1114 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
1117 SETERRNO(EBADF,SS$_IVCHAN);
1124 PerlIO_tell(PerlIO *f)
1127 return (*PerlIOBase(f)->tab->Tell)(f);
1130 SETERRNO(EBADF,SS$_IVCHAN);
1137 PerlIO_flush(PerlIO *f)
1143 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1144 if (tab && tab->Flush)
1146 return (*tab->Flush)(f);
1150 PerlIO_debug("Cannot flush f=%p :%s\n",f,tab->name);
1151 SETERRNO(EBADF,SS$_IVCHAN);
1157 PerlIO_debug("Cannot flush f=%p\n",f);
1158 SETERRNO(EBADF,SS$_IVCHAN);
1164 /* Is it good API design to do flush-all on NULL,
1165 * a potentially errorneous input? Maybe some magical
1166 * value (PerlIO* PERLIO_FLUSH_ALL = (PerlIO*)-1;)?
1167 * Yes, stdio does similar things on fflush(NULL),
1168 * but should we be bound by their design decisions?
1170 PerlIO **table = &_perlio;
1172 while ((f = *table))
1175 table = (PerlIO **)(f++);
1176 for (i=1; i < PERLIO_TABLE_SIZE; i++)
1178 if (*f && PerlIO_flush(f) != 0)
1188 PerlIOBase_flush_linebuf()
1190 PerlIO **table = &_perlio;
1192 while ((f = *table))
1195 table = (PerlIO **)(f++);
1196 for (i=1; i < PERLIO_TABLE_SIZE; i++)
1198 if (*f && (PerlIOBase(f)->flags & (PERLIO_F_LINEBUF|PERLIO_F_CANWRITE))
1199 == (PERLIO_F_LINEBUF|PERLIO_F_CANWRITE))
1208 PerlIO_fill(PerlIO *f)
1211 return (*PerlIOBase(f)->tab->Fill)(f);
1214 SETERRNO(EBADF,SS$_IVCHAN);
1219 #undef PerlIO_isutf8
1221 PerlIO_isutf8(PerlIO *f)
1224 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1227 SETERRNO(EBADF,SS$_IVCHAN);
1234 PerlIO_eof(PerlIO *f)
1237 return (*PerlIOBase(f)->tab->Eof)(f);
1240 SETERRNO(EBADF,SS$_IVCHAN);
1247 PerlIO_error(PerlIO *f)
1250 return (*PerlIOBase(f)->tab->Error)(f);
1253 SETERRNO(EBADF,SS$_IVCHAN);
1258 #undef PerlIO_clearerr
1260 PerlIO_clearerr(PerlIO *f)
1263 (*PerlIOBase(f)->tab->Clearerr)(f);
1265 SETERRNO(EBADF,SS$_IVCHAN);
1268 #undef PerlIO_setlinebuf
1270 PerlIO_setlinebuf(PerlIO *f)
1273 (*PerlIOBase(f)->tab->Setlinebuf)(f);
1275 SETERRNO(EBADF,SS$_IVCHAN);
1278 #undef PerlIO_has_base
1280 PerlIO_has_base(PerlIO *f)
1282 if (f && *f) { return (PerlIOBase(f)->tab->Get_base != NULL); }
1286 #undef PerlIO_fast_gets
1288 PerlIO_fast_gets(PerlIO *f)
1290 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS))
1292 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1293 return (tab->Set_ptrcnt != NULL);
1298 #undef PerlIO_has_cntptr
1300 PerlIO_has_cntptr(PerlIO *f)
1304 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1305 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1310 #undef PerlIO_canset_cnt
1312 PerlIO_canset_cnt(PerlIO *f)
1316 PerlIOl *l = PerlIOBase(f);
1317 return (l->tab->Set_ptrcnt != NULL);
1322 #undef PerlIO_get_base
1324 PerlIO_get_base(PerlIO *f)
1327 return (*PerlIOBase(f)->tab->Get_base)(f);
1331 #undef PerlIO_get_bufsiz
1333 PerlIO_get_bufsiz(PerlIO *f)
1336 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
1340 #undef PerlIO_get_ptr
1342 PerlIO_get_ptr(PerlIO *f)
1344 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1345 if (tab->Get_ptr == NULL)
1347 return (*tab->Get_ptr)(f);
1350 #undef PerlIO_get_cnt
1352 PerlIO_get_cnt(PerlIO *f)
1354 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1355 if (tab->Get_cnt == NULL)
1357 return (*tab->Get_cnt)(f);
1360 #undef PerlIO_set_cnt
1362 PerlIO_set_cnt(PerlIO *f,int cnt)
1364 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
1367 #undef PerlIO_set_ptrcnt
1369 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
1371 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1372 if (tab->Set_ptrcnt == NULL)
1375 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
1377 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
1380 /*--------------------------------------------------------------------------------------*/
1381 /* utf8 and raw dummy layers */
1384 PerlIOUtf8_pushed(PerlIO *f, const char *mode, SV *arg)
1389 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1390 PerlIO_pop(aTHX_ f);
1391 if (tab->kind & PERLIO_K_UTF8)
1392 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1394 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1400 PerlIO_funcs PerlIO_utf8 = {
1403 PERLIO_K_DUMMY|PERLIO_F_UTF8,
1421 NULL, /* get_base */
1422 NULL, /* get_bufsiz */
1425 NULL, /* set_ptrcnt */
1428 PerlIO_funcs PerlIO_byte = {
1449 NULL, /* get_base */
1450 NULL, /* get_bufsiz */
1453 NULL, /* set_ptrcnt */
1457 PerlIORaw_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n,const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args)
1459 PerlIO_funcs *tab = PerlIO_default_btm();
1460 return (*tab->Open)(aTHX_ tab,layers,n-2,mode,fd,imode,perm,old,narg,args);
1463 PerlIO_funcs PerlIO_raw = {
1484 NULL, /* get_base */
1485 NULL, /* get_bufsiz */
1488 NULL, /* set_ptrcnt */
1490 /*--------------------------------------------------------------------------------------*/
1491 /*--------------------------------------------------------------------------------------*/
1492 /* "Methods" of the "base class" */
1495 PerlIOBase_fileno(PerlIO *f)
1497 return PerlIO_fileno(PerlIONext(f));
1501 PerlIO_modestr(PerlIO *f,char *buf)
1504 IV flags = PerlIOBase(f)->flags;
1505 if (flags & PERLIO_F_APPEND)
1508 if (flags & PERLIO_F_CANREAD)
1513 else if (flags & PERLIO_F_CANREAD)
1516 if (flags & PERLIO_F_CANWRITE)
1519 else if (flags & PERLIO_F_CANWRITE)
1522 if (flags & PERLIO_F_CANREAD)
1527 #if O_TEXT != O_BINARY
1528 if (!(flags & PERLIO_F_CRLF))
1536 PerlIOBase_pushed(PerlIO *f, const char *mode, SV *arg)
1538 PerlIOl *l = PerlIOBase(f);
1539 const char *omode = mode;
1541 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1542 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
1543 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1544 if (tab->Set_ptrcnt != NULL)
1545 l->flags |= PERLIO_F_FASTGETS;
1548 if (*mode == '#' || *mode == 'I')
1553 l->flags |= PERLIO_F_CANREAD;
1556 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
1559 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
1562 SETERRNO(EINVAL,LIB$_INVARG);
1570 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
1573 l->flags &= ~PERLIO_F_CRLF;
1576 l->flags |= PERLIO_F_CRLF;
1579 SETERRNO(EINVAL,LIB$_INVARG);
1588 l->flags |= l->next->flags &
1589 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1593 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08"UVxf" (%s)\n",
1594 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
1595 l->flags,PerlIO_modestr(f,temp));
1601 PerlIOBase_popped(PerlIO *f)
1607 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1610 Off_t old = PerlIO_tell(f);
1612 PerlIO_push(aTHX_ f,&PerlIO_pending,"r",Nullsv);
1613 done = PerlIOBuf_unread(f,vbuf,count);
1614 PerlIOSelf(f,PerlIOBuf)->posn = old - done;
1619 PerlIOBase_read(PerlIO *f, void *vbuf, Size_t count)
1621 STDCHAR *buf = (STDCHAR *) vbuf;
1624 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1628 SSize_t avail = PerlIO_get_cnt(f);
1629 SSize_t take = (count < avail) ? count : avail;
1632 STDCHAR *ptr = PerlIO_get_ptr(f);
1633 Copy(ptr,buf,take,STDCHAR);
1634 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
1638 if (count > 0 && avail <= 0)
1640 if (PerlIO_fill(f) != 0)
1644 return (buf - (STDCHAR *) vbuf);
1650 PerlIOBase_noop_ok(PerlIO *f)
1656 PerlIOBase_noop_fail(PerlIO *f)
1662 PerlIOBase_close(PerlIO *f)
1665 PerlIO *n = PerlIONext(f);
1666 if (PerlIO_flush(f) != 0)
1668 if (n && *n && (*PerlIOBase(n)->tab->Close)(n) != 0)
1670 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1675 PerlIOBase_eof(PerlIO *f)
1679 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1685 PerlIOBase_error(PerlIO *f)
1689 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1695 PerlIOBase_clearerr(PerlIO *f)
1699 PerlIO *n = PerlIONext(f);
1700 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1707 PerlIOBase_setlinebuf(PerlIO *f)
1711 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
1715 /*--------------------------------------------------------------------------------------*/
1716 /* Bottom-most level for UNIX-like case */
1720 struct _PerlIO base; /* The generic part */
1721 int fd; /* UNIX like file descriptor */
1722 int oflags; /* open/fcntl flags */
1726 PerlIOUnix_oflags(const char *mode)
1741 oflags = O_CREAT|O_TRUNC;
1752 oflags = O_CREAT|O_APPEND;
1768 else if (*mode == 't')
1771 oflags &= ~O_BINARY;
1774 /* Always open in binary mode */
1776 if (*mode || oflags == -1)
1778 SETERRNO(EINVAL,LIB$_INVARG);
1785 PerlIOUnix_fileno(PerlIO *f)
1787 return PerlIOSelf(f,PerlIOUnix)->fd;
1791 PerlIOUnix_pushed(PerlIO *f, const char *mode, SV *arg)
1793 IV code = PerlIOBase_pushed(f,mode,arg);
1796 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1797 s->fd = PerlIO_fileno(PerlIONext(f));
1798 s->oflags = PerlIOUnix_oflags(mode);
1800 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1805 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
1809 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1810 (*PerlIOBase(f)->tab->Close)(f);
1814 char *path = SvPV_nolen(*args);
1819 imode = PerlIOUnix_oflags(mode);
1824 fd = PerlLIO_open3(path,imode,perm);
1834 f = PerlIO_allocate(aTHX);
1835 s = PerlIOSelf(PerlIO_push(aTHX_ f,self,mode,PerlIOArg),PerlIOUnix);
1838 s = PerlIOSelf(f,PerlIOUnix);
1841 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1848 /* FIXME: pop layers ??? */
1855 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1858 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1859 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1863 SSize_t len = PerlLIO_read(fd,vbuf,count);
1864 if (len >= 0 || errno != EINTR)
1867 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1868 else if (len == 0 && count != 0)
1869 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1877 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1880 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1883 SSize_t len = PerlLIO_write(fd,vbuf,count);
1884 if (len >= 0 || errno != EINTR)
1887 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1895 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1898 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1899 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1900 return (new == (Off_t) -1) ? -1 : 0;
1904 PerlIOUnix_tell(PerlIO *f)
1907 Off_t posn = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1908 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1912 PerlIOUnix_close(PerlIO *f)
1915 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1917 while (PerlLIO_close(fd) != 0)
1928 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1933 PerlIO_funcs PerlIO_unix = {
1948 PerlIOBase_noop_ok, /* flush */
1949 PerlIOBase_noop_fail, /* fill */
1952 PerlIOBase_clearerr,
1953 PerlIOBase_setlinebuf,
1954 NULL, /* get_base */
1955 NULL, /* get_bufsiz */
1958 NULL, /* set_ptrcnt */
1961 /*--------------------------------------------------------------------------------------*/
1962 /* stdio as a layer */
1966 struct _PerlIO base;
1967 FILE * stdio; /* The stream */
1971 PerlIOStdio_fileno(PerlIO *f)
1974 return PerlSIO_fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1978 PerlIOStdio_mode(const char *mode,char *tmode)
1985 if (O_BINARY != O_TEXT)
1993 /* This isn't used yet ... */
1995 PerlIOStdio_pushed(PerlIO *f, const char *mode, SV *arg)
2000 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
2002 FILE *stdio = PerlSIO_fdopen(PerlIO_fileno(PerlIONext(f)),mode = PerlIOStdio_mode(mode,tmode));
2008 return PerlIOBase_pushed(f,mode,arg);
2011 #undef PerlIO_importFILE
2013 PerlIO_importFILE(FILE *stdio, int fl)
2019 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),&PerlIO_stdio,"r+",Nullsv),PerlIOStdio);
2026 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2031 char *path = SvPV_nolen(*args);
2032 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
2033 FILE *stdio = PerlSIO_freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
2043 char *path = SvPV_nolen(*args);
2047 fd = PerlLIO_open3(path,imode,perm);
2051 FILE *stdio = PerlSIO_fopen(path,mode);
2054 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)), self,
2055 (mode = PerlIOStdio_mode(mode,tmode)),PerlIOArg),
2076 stdio = PerlSIO_stdin;
2079 stdio = PerlSIO_stdout;
2082 stdio = PerlSIO_stderr;
2088 stdio = PerlSIO_fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
2092 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),self,mode,PerlIOArg),PerlIOStdio);
2102 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
2105 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
2109 STDCHAR *buf = (STDCHAR *) vbuf;
2110 /* Perl is expecting PerlIO_getc() to fill the buffer
2111 * Linux's stdio does not do that for fread()
2113 int ch = PerlSIO_fgetc(s);
2121 got = PerlSIO_fread(vbuf,1,count,s);
2126 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
2129 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
2130 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
2134 int ch = *buf-- & 0xff;
2135 if (PerlSIO_ungetc(ch,s) != ch)
2144 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
2147 return PerlSIO_fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
2151 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
2154 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2155 return PerlSIO_fseek(stdio,offset,whence);
2159 PerlIOStdio_tell(PerlIO *f)
2162 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2163 return PerlSIO_ftell(stdio);
2167 PerlIOStdio_close(PerlIO *f)
2170 #ifdef HAS_SOCKS5_INIT
2172 Sock_size_t optlen = sizeof(int);
2174 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2176 #ifdef HAS_SOCKS5_INIT
2177 (getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (void *)&optval, &optlen) < 0) ?
2178 PerlSIO_fclose(stdio) :
2179 close(PerlIO_fileno(f))
2181 PerlSIO_fclose(stdio)
2188 PerlIOStdio_flush(PerlIO *f)
2191 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2192 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
2194 return PerlSIO_fflush(stdio);
2199 /* FIXME: This discards ungetc() and pre-read stuff which is
2200 not right if this is just a "sync" from a layer above
2201 Suspect right design is to do _this_ but not have layer above
2202 flush this layer read-to-read
2204 /* Not writeable - sync by attempting a seek */
2206 if (PerlSIO_fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
2214 PerlIOStdio_fill(PerlIO *f)
2217 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2219 /* fflush()ing read-only streams can cause trouble on some stdio-s */
2220 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2222 if (PerlSIO_fflush(stdio) != 0)
2225 c = PerlSIO_fgetc(stdio);
2226 if (c == EOF || PerlSIO_ungetc(c,stdio) != c)
2232 PerlIOStdio_eof(PerlIO *f)
2235 return PerlSIO_feof(PerlIOSelf(f,PerlIOStdio)->stdio);
2239 PerlIOStdio_error(PerlIO *f)
2242 return PerlSIO_ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
2246 PerlIOStdio_clearerr(PerlIO *f)
2249 PerlSIO_clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
2253 PerlIOStdio_setlinebuf(PerlIO *f)
2256 #ifdef HAS_SETLINEBUF
2257 PerlSIO_setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
2259 PerlSIO_setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
2265 PerlIOStdio_get_base(PerlIO *f)
2268 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2269 return PerlSIO_get_base(stdio);
2273 PerlIOStdio_get_bufsiz(PerlIO *f)
2276 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2277 return PerlSIO_get_bufsiz(stdio);
2281 #ifdef USE_STDIO_PTR
2283 PerlIOStdio_get_ptr(PerlIO *f)
2286 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2287 return PerlSIO_get_ptr(stdio);
2291 PerlIOStdio_get_cnt(PerlIO *f)
2294 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2295 return PerlSIO_get_cnt(stdio);
2299 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
2302 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
2305 #ifdef STDIO_PTR_LVALUE
2306 PerlSIO_set_ptr(stdio,ptr);
2307 #ifdef STDIO_PTR_LVAL_SETS_CNT
2308 if (PerlSIO_get_cnt(stdio) != (cnt))
2311 assert(PerlSIO_get_cnt(stdio) == (cnt));
2314 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
2315 /* Setting ptr _does_ change cnt - we are done */
2318 #else /* STDIO_PTR_LVALUE */
2320 #endif /* STDIO_PTR_LVALUE */
2322 /* Now (or only) set cnt */
2323 #ifdef STDIO_CNT_LVALUE
2324 PerlSIO_set_cnt(stdio,cnt);
2325 #else /* STDIO_CNT_LVALUE */
2326 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
2327 PerlSIO_set_ptr(stdio,PerlSIO_get_ptr(stdio)+(PerlSIO_get_cnt(stdio)-cnt));
2328 #else /* STDIO_PTR_LVAL_SETS_CNT */
2330 #endif /* STDIO_PTR_LVAL_SETS_CNT */
2331 #endif /* STDIO_CNT_LVALUE */
2336 PerlIO_funcs PerlIO_stdio = {
2338 sizeof(PerlIOStdio),
2355 PerlIOStdio_clearerr,
2356 PerlIOStdio_setlinebuf,
2358 PerlIOStdio_get_base,
2359 PerlIOStdio_get_bufsiz,
2364 #ifdef USE_STDIO_PTR
2365 PerlIOStdio_get_ptr,
2366 PerlIOStdio_get_cnt,
2367 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
2368 PerlIOStdio_set_ptrcnt
2369 #else /* STDIO_PTR_LVALUE */
2371 #endif /* STDIO_PTR_LVALUE */
2372 #else /* USE_STDIO_PTR */
2376 #endif /* USE_STDIO_PTR */
2379 #undef PerlIO_exportFILE
2381 PerlIO_exportFILE(PerlIO *f, int fl)
2385 stdio = fdopen(PerlIO_fileno(f),"r+");
2389 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ f,&PerlIO_stdio,"r+",Nullsv),PerlIOStdio);
2395 #undef PerlIO_findFILE
2397 PerlIO_findFILE(PerlIO *f)
2402 if (l->tab == &PerlIO_stdio)
2404 PerlIOStdio *s = PerlIOSelf(&l,PerlIOStdio);
2407 l = *PerlIONext(&l);
2409 return PerlIO_exportFILE(f,0);
2412 #undef PerlIO_releaseFILE
2414 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2418 /*--------------------------------------------------------------------------------------*/
2419 /* perlio buffer layer */
2422 PerlIOBuf_pushed(PerlIO *f, const char *mode, SV *arg)
2424 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2425 int fd = PerlIO_fileno(f);
2428 if (fd >= 0 && PerlLIO_isatty(fd))
2430 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF|PERLIO_F_TTY;
2432 posn = PerlIO_tell(PerlIONext(f));
2433 if (posn != (Off_t) -1)
2437 return PerlIOBase_pushed(f,mode,arg);
2441 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
2445 PerlIO *next = PerlIONext(f);
2446 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n-2, PerlIOBase(next)->tab);
2447 next = (*tab->Open)(aTHX_ tab, layers, n-2, mode,fd,imode,perm,next,narg,args);
2448 if (!next || (*PerlIOBase(f)->tab->Pushed)(f,mode,PerlIOArg) != 0)
2455 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n-2, PerlIO_default_btm());
2462 f = (*tab->Open)(aTHX_ tab, layers, n-2, mode,fd,imode,perm,NULL,narg,args);
2465 PerlIOBuf *b = PerlIOSelf(PerlIO_push(aTHX_ f,self,mode,PerlIOArg),PerlIOBuf);
2466 fd = PerlIO_fileno(f);
2467 #if O_BINARY != O_TEXT
2468 /* do something about failing setmode()? --jhi */
2469 PerlLIO_setmode(fd , O_BINARY);
2471 if (init && fd == 2)
2473 /* Initial stderr is unbuffered */
2474 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2481 /* This "flush" is akin to sfio's sync in that it handles files in either
2485 PerlIOBuf_flush(PerlIO *f)
2487 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2489 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2491 /* write() the buffer */
2492 STDCHAR *buf = b->buf;
2494 PerlIO *n = PerlIONext(f);
2497 SSize_t count = PerlIO_write(n,p,b->ptr - p);
2502 else if (count < 0 || PerlIO_error(n))
2504 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2509 b->posn += (p - buf);
2511 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2513 STDCHAR *buf = PerlIO_get_base(f);
2514 /* Note position change */
2515 b->posn += (b->ptr - buf);
2516 if (b->ptr < b->end)
2518 /* We did not consume all of it */
2519 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
2521 b->posn = PerlIO_tell(PerlIONext(f));
2525 b->ptr = b->end = b->buf;
2526 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2527 /* FIXME: Is this right for read case ? */
2528 if (PerlIO_flush(PerlIONext(f)) != 0)
2534 PerlIOBuf_fill(PerlIO *f)
2536 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2537 PerlIO *n = PerlIONext(f);
2539 /* FIXME: doing the down-stream flush is a bad idea if it causes
2540 pre-read data in stdio buffer to be discarded
2541 but this is too simplistic - as it skips _our_ hosekeeping
2542 and breaks tell tests.
2543 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2547 if (PerlIO_flush(f) != 0)
2549 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
2550 PerlIOBase_flush_linebuf();
2553 PerlIO_get_base(f); /* allocate via vtable */
2555 b->ptr = b->end = b->buf;
2556 if (PerlIO_fast_gets(n))
2558 /* Layer below is also buffered
2559 * We do _NOT_ want to call its ->Read() because that will loop
2560 * till it gets what we asked for which may hang on a pipe etc.
2561 * Instead take anything it has to hand, or ask it to fill _once_.
2563 avail = PerlIO_get_cnt(n);
2566 avail = PerlIO_fill(n);
2568 avail = PerlIO_get_cnt(n);
2571 if (!PerlIO_error(n) && PerlIO_eof(n))
2577 STDCHAR *ptr = PerlIO_get_ptr(n);
2578 SSize_t cnt = avail;
2579 if (avail > b->bufsiz)
2581 Copy(ptr,b->buf,avail,STDCHAR);
2582 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
2587 avail = PerlIO_read(n,b->ptr,b->bufsiz);
2592 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2594 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2597 b->end = b->buf+avail;
2598 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2603 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
2605 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2610 return PerlIOBase_read(f,vbuf,count);
2616 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
2618 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2619 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2622 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2628 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2630 avail = (b->ptr - b->buf);
2635 b->end = b->buf + avail;
2637 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2638 b->posn -= b->bufsiz;
2640 if (avail > (SSize_t) count)
2648 Copy(buf,b->ptr,avail,STDCHAR);
2652 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2659 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2661 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2662 const STDCHAR *buf = (const STDCHAR *) vbuf;
2666 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2670 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2671 if ((SSize_t) count < avail)
2673 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2674 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2694 Copy(buf,b->ptr,avail,STDCHAR);
2701 if (b->ptr >= (b->buf + b->bufsiz))
2704 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2710 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2713 if ((code = PerlIO_flush(f)) == 0)
2715 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2716 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2717 code = PerlIO_seek(PerlIONext(f),offset,whence);
2720 b->posn = PerlIO_tell(PerlIONext(f));
2727 PerlIOBuf_tell(PerlIO *f)
2729 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2730 Off_t posn = b->posn;
2732 posn += (b->ptr - b->buf);
2737 PerlIOBuf_close(PerlIO *f)
2740 IV code = PerlIOBase_close(f);
2741 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2742 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2744 PerlMemShared_free(b->buf);
2747 b->ptr = b->end = b->buf;
2748 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2753 PerlIOBuf_get_ptr(PerlIO *f)
2755 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2762 PerlIOBuf_get_cnt(PerlIO *f)
2764 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2767 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2768 return (b->end - b->ptr);
2773 PerlIOBuf_get_base(PerlIO *f)
2775 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2781 b->buf = PerlMemShared_calloc(b->bufsiz,sizeof(STDCHAR));
2784 b->buf = (STDCHAR *)&b->oneword;
2785 b->bufsiz = sizeof(b->oneword);
2794 PerlIOBuf_bufsiz(PerlIO *f)
2796 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2799 return (b->end - b->buf);
2803 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2805 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2809 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2812 assert(PerlIO_get_cnt(f) == cnt);
2813 assert(b->ptr >= b->buf);
2815 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2818 PerlIO_funcs PerlIO_perlio = {
2837 PerlIOBase_clearerr,
2838 PerlIOBase_setlinebuf,
2843 PerlIOBuf_set_ptrcnt,
2846 /*--------------------------------------------------------------------------------------*/
2847 /* Temp layer to hold unread chars when cannot do it any other way */
2850 PerlIOPending_fill(PerlIO *f)
2852 /* Should never happen */
2858 PerlIOPending_close(PerlIO *f)
2860 /* A tad tricky - flush pops us, then we close new top */
2862 return PerlIO_close(f);
2866 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
2868 /* A tad tricky - flush pops us, then we seek new top */
2870 return PerlIO_seek(f,offset,whence);
2875 PerlIOPending_flush(PerlIO *f)
2878 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2879 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2881 PerlMemShared_free(b->buf);
2884 PerlIO_pop(aTHX_ f);
2889 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2897 PerlIOBuf_set_ptrcnt(f,ptr,cnt);
2902 PerlIOPending_pushed(PerlIO *f,const char *mode,SV *arg)
2904 IV code = PerlIOBase_pushed(f,mode,arg);
2905 PerlIOl *l = PerlIOBase(f);
2906 /* Our PerlIO_fast_gets must match what we are pushed on,
2907 or sv_gets() etc. get muddled when it changes mid-string
2910 l->flags = (l->flags & ~(PERLIO_F_FASTGETS|PERLIO_F_UTF8)) |
2911 (PerlIOBase(PerlIONext(f))->flags & (PERLIO_F_FASTGETS|PERLIO_F_UTF8));
2916 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
2918 SSize_t avail = PerlIO_get_cnt(f);
2923 got = PerlIOBuf_read(f,vbuf,avail);
2924 if (got >= 0 && got < count)
2926 SSize_t more = PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
2927 if (more >= 0 || got == 0)
2933 PerlIO_funcs PerlIO_pending = {
2937 PerlIOPending_pushed,
2947 PerlIOPending_close,
2948 PerlIOPending_flush,
2952 PerlIOBase_clearerr,
2953 PerlIOBase_setlinebuf,
2958 PerlIOPending_set_ptrcnt,
2963 /*--------------------------------------------------------------------------------------*/
2964 /* crlf - translation
2965 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
2966 to hand back a line at a time and keeping a record of which nl we "lied" about.
2967 On write translate "\n" to CR,LF
2972 PerlIOBuf base; /* PerlIOBuf stuff */
2973 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
2977 PerlIOCrlf_pushed(PerlIO *f, const char *mode,SV *arg)
2980 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
2981 code = PerlIOBuf_pushed(f,mode,arg);
2983 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n",
2984 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
2985 PerlIOBase(f)->flags);
2992 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
2994 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3000 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3001 return PerlIOBuf_unread(f,vbuf,count);
3004 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
3005 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3007 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3013 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3015 b->end = b->ptr = b->buf + b->bufsiz;
3016 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3017 b->posn -= b->bufsiz;
3019 while (count > 0 && b->ptr > b->buf)
3024 if (b->ptr - 2 >= b->buf)
3050 PerlIOCrlf_get_cnt(PerlIO *f)
3052 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3055 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
3057 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3058 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
3060 STDCHAR *nl = b->ptr;
3062 while (nl < b->end && *nl != 0xd)
3064 if (nl < b->end && *nl == 0xd)
3076 /* Not CR,LF but just CR */
3083 /* Blast - found CR as last char in buffer */
3086 /* They may not care, defer work as long as possible */
3087 return (nl - b->ptr);
3093 b->ptr++; /* say we have read it as far as flush() is concerned */
3094 b->buf++; /* Leave space an front of buffer */
3095 b->bufsiz--; /* Buffer is thus smaller */
3096 code = PerlIO_fill(f); /* Fetch some more */
3097 b->bufsiz++; /* Restore size for next time */
3098 b->buf--; /* Point at space */
3099 b->ptr = nl = b->buf; /* Which is what we hand off */
3100 b->posn--; /* Buffer starts here */
3101 *nl = 0xd; /* Fill in the CR */
3103 goto test; /* fill() call worked */
3104 /* CR at EOF - just fall through */
3109 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
3115 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
3117 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3118 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3119 IV flags = PerlIOBase(f)->flags;
3129 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
3136 /* Test code - delete when it works ... */
3143 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
3151 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08"UVxf" nl=%p e=%p for %d",
3152 ptr, chk, flags, c->nl, b->end, cnt);
3159 /* They have taken what we lied about */
3166 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3170 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
3172 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3173 return PerlIOBuf_write(f,vbuf,count);
3176 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3177 const STDCHAR *buf = (const STDCHAR *) vbuf;
3178 const STDCHAR *ebuf = buf+count;
3181 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3185 STDCHAR *eptr = b->buf+b->bufsiz;
3186 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3187 while (buf < ebuf && b->ptr < eptr)
3191 if ((b->ptr + 2) > eptr)
3193 /* Not room for both */
3199 *(b->ptr)++ = 0xd; /* CR */
3200 *(b->ptr)++ = 0xa; /* LF */
3202 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
3221 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
3223 return (buf - (STDCHAR *) vbuf);
3228 PerlIOCrlf_flush(PerlIO *f)
3230 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
3236 return PerlIOBuf_flush(f);
3239 PerlIO_funcs PerlIO_crlf = {
3242 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
3244 PerlIOBase_noop_ok, /* popped */
3248 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
3249 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
3250 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
3258 PerlIOBase_clearerr,
3259 PerlIOBase_setlinebuf,
3264 PerlIOCrlf_set_ptrcnt,
3268 /*--------------------------------------------------------------------------------------*/
3269 /* mmap as "buffer" layer */
3273 PerlIOBuf base; /* PerlIOBuf stuff */
3274 Mmap_t mptr; /* Mapped address */
3275 Size_t len; /* mapped length */
3276 STDCHAR *bbuf; /* malloced buffer if map fails */
3279 static size_t page_size = 0;
3282 PerlIOMmap_map(PerlIO *f)
3285 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3286 PerlIOBuf *b = &m->base;
3287 IV flags = PerlIOBase(f)->flags;
3291 if (flags & PERLIO_F_CANREAD)
3293 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3294 int fd = PerlIO_fileno(f);
3296 code = fstat(fd,&st);
3297 if (code == 0 && S_ISREG(st.st_mode))
3299 SSize_t len = st.st_size - b->posn;
3304 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
3306 SETERRNO(0,SS$_NORMAL);
3307 # ifdef _SC_PAGESIZE
3308 page_size = sysconf(_SC_PAGESIZE);
3310 page_size = sysconf(_SC_PAGE_SIZE);
3312 if ((long)page_size < 0) {
3317 (void)SvUPGRADE(error, SVt_PV);
3318 msg = SvPVx(error, n_a);
3319 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
3322 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
3326 # ifdef HAS_GETPAGESIZE
3327 page_size = getpagesize();
3329 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
3330 page_size = PAGESIZE; /* compiletime, bad */
3334 if ((IV)page_size <= 0)
3335 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
3339 /* This is a hack - should never happen - open should have set it ! */
3340 b->posn = PerlIO_tell(PerlIONext(f));
3342 posn = (b->posn / page_size) * page_size;
3343 len = st.st_size - posn;
3344 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
3345 if (m->mptr && m->mptr != (Mmap_t) -1)
3347 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
3348 madvise(m->mptr, len, MADV_SEQUENTIAL);
3350 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
3351 madvise(m->mptr, len, MADV_WILLNEED);
3353 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
3354 b->end = ((STDCHAR *)m->mptr) + len;
3355 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
3366 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
3368 b->ptr = b->end = b->ptr;
3377 PerlIOMmap_unmap(PerlIO *f)
3379 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3380 PerlIOBuf *b = &m->base;
3386 code = munmap(m->mptr, m->len);
3390 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
3393 b->ptr = b->end = b->buf;
3394 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
3400 PerlIOMmap_get_base(PerlIO *f)
3402 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3403 PerlIOBuf *b = &m->base;
3404 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3406 /* Already have a readbuffer in progress */
3411 /* We have a write buffer or flushed PerlIOBuf read buffer */
3412 m->bbuf = b->buf; /* save it in case we need it again */
3413 b->buf = NULL; /* Clear to trigger below */
3417 PerlIOMmap_map(f); /* Try and map it */
3420 /* Map did not work - recover PerlIOBuf buffer if we have one */
3424 b->ptr = b->end = b->buf;
3427 return PerlIOBuf_get_base(f);
3431 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
3433 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3434 PerlIOBuf *b = &m->base;
3435 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3437 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
3440 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
3445 /* Loose the unwritable mapped buffer */
3447 /* If flush took the "buffer" see if we have one from before */
3448 if (!b->buf && m->bbuf)
3452 PerlIOBuf_get_base(f);
3456 return PerlIOBuf_unread(f,vbuf,count);
3460 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
3462 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3463 PerlIOBuf *b = &m->base;
3464 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
3466 /* No, or wrong sort of, buffer */
3469 if (PerlIOMmap_unmap(f) != 0)
3472 /* If unmap took the "buffer" see if we have one from before */
3473 if (!b->buf && m->bbuf)
3477 PerlIOBuf_get_base(f);
3481 return PerlIOBuf_write(f,vbuf,count);
3485 PerlIOMmap_flush(PerlIO *f)
3487 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3488 PerlIOBuf *b = &m->base;
3489 IV code = PerlIOBuf_flush(f);
3490 /* Now we are "synced" at PerlIOBuf level */
3495 /* Unmap the buffer */
3496 if (PerlIOMmap_unmap(f) != 0)
3501 /* We seem to have a PerlIOBuf buffer which was not mapped
3502 * remember it in case we need one later
3511 PerlIOMmap_fill(PerlIO *f)
3513 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3514 IV code = PerlIO_flush(f);
3515 if (code == 0 && !b->buf)
3517 code = PerlIOMmap_map(f);
3519 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3521 code = PerlIOBuf_fill(f);
3527 PerlIOMmap_close(PerlIO *f)
3529 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3530 PerlIOBuf *b = &m->base;
3531 IV code = PerlIO_flush(f);
3536 b->ptr = b->end = b->buf;
3538 if (PerlIOBuf_close(f) != 0)
3544 PerlIO_funcs PerlIO_mmap = {
3563 PerlIOBase_clearerr,
3564 PerlIOBase_setlinebuf,
3565 PerlIOMmap_get_base,
3569 PerlIOBuf_set_ptrcnt,
3572 #endif /* HAS_MMAP */
3580 atexit(&PerlIO_cleanup);
3592 PerlIO_stdstreams(aTHX);
3597 #undef PerlIO_stdout
3604 PerlIO_stdstreams(aTHX);
3609 #undef PerlIO_stderr
3616 PerlIO_stdstreams(aTHX);
3621 /*--------------------------------------------------------------------------------------*/
3623 #undef PerlIO_getname
3625 PerlIO_getname(PerlIO *f, char *buf)
3628 Perl_croak(aTHX_ "Don't know how to get file name");
3633 /*--------------------------------------------------------------------------------------*/
3634 /* Functions which can be called on any kind of PerlIO implemented
3640 PerlIO_getc(PerlIO *f)
3643 SSize_t count = PerlIO_read(f,buf,1);
3646 return (unsigned char) buf[0];
3651 #undef PerlIO_ungetc
3653 PerlIO_ungetc(PerlIO *f, int ch)
3658 if (PerlIO_unread(f,&buf,1) == 1)
3666 PerlIO_putc(PerlIO *f, int ch)
3669 return PerlIO_write(f,&buf,1);
3674 PerlIO_puts(PerlIO *f, const char *s)
3676 STRLEN len = strlen(s);
3677 return PerlIO_write(f,s,len);
3680 #undef PerlIO_rewind
3682 PerlIO_rewind(PerlIO *f)
3684 PerlIO_seek(f,(Off_t)0,SEEK_SET);
3688 #undef PerlIO_vprintf
3690 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3693 SV *sv = newSVpvn("",0);
3699 Perl_va_copy(ap, apc);
3700 sv_vcatpvf(sv, fmt, &apc);
3702 sv_vcatpvf(sv, fmt, &ap);
3705 wrote = PerlIO_write(f,s,len);
3710 #undef PerlIO_printf
3712 PerlIO_printf(PerlIO *f,const char *fmt,...)
3717 result = PerlIO_vprintf(f,fmt,ap);
3722 #undef PerlIO_stdoutf
3724 PerlIO_stdoutf(const char *fmt,...)
3729 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
3734 #undef PerlIO_tmpfile
3736 PerlIO_tmpfile(void)
3738 /* I have no idea how portable mkstemp() is ... */
3739 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
3742 FILE *stdio = PerlSIO_tmpfile();
3745 PerlIOStdio *s = PerlIOSelf(PerlIO_push(aTHX_ (f = PerlIO_allocate(aTHX)),&PerlIO_stdio,"w+",Nullsv),PerlIOStdio);
3751 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
3752 int fd = mkstemp(SvPVX(sv));
3756 f = PerlIO_fdopen(fd,"w+");
3759 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
3761 PerlLIO_unlink(SvPVX(sv));
3771 #endif /* USE_SFIO */
3772 #endif /* PERLIO_IS_STDIO */
3774 /*======================================================================================*/
3775 /* Now some functions in terms of above which may be needed even if
3776 we are not in true PerlIO mode
3780 #undef PerlIO_setpos
3782 PerlIO_setpos(PerlIO *f, SV *pos)
3788 Off_t *posn = (Off_t *) SvPV(pos,len);
3789 if (f && len == sizeof(Off_t))
3790 return PerlIO_seek(f,*posn,SEEK_SET);
3792 SETERRNO(EINVAL,SS$_IVCHAN);
3796 #undef PerlIO_setpos
3798 PerlIO_setpos(PerlIO *f, SV *pos)
3804 Fpos_t *fpos = (Fpos_t *) SvPV(pos,len);
3805 if (f && len == sizeof(Fpos_t))
3807 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3808 return fsetpos64(f, fpos);
3810 return fsetpos(f, fpos);
3814 SETERRNO(EINVAL,SS$_IVCHAN);
3820 #undef PerlIO_getpos
3822 PerlIO_getpos(PerlIO *f, SV *pos)
3825 Off_t posn = PerlIO_tell(f);
3826 sv_setpvn(pos,(char *)&posn,sizeof(posn));
3827 return (posn == (Off_t)-1) ? -1 : 0;
3830 #undef PerlIO_getpos
3832 PerlIO_getpos(PerlIO *f, SV *pos)
3837 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3838 code = fgetpos64(f, &fpos);
3840 code = fgetpos(f, &fpos);
3842 sv_setpvn(pos,(char *)&fpos,sizeof(fpos));
3847 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
3850 vprintf(char *pat, char *args)
3852 _doprnt(pat, args, stdout);
3853 return 0; /* wrong, but perl doesn't use the return value */
3857 vfprintf(FILE *fd, char *pat, char *args)
3859 _doprnt(pat, args, fd);
3860 return 0; /* wrong, but perl doesn't use the return value */
3865 #ifndef PerlIO_vsprintf
3867 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
3869 int val = vsprintf(s, fmt, ap);
3872 if (strlen(s) >= (STRLEN)n)
3875 (void)PerlIO_puts(Perl_error_log,
3876 "panic: sprintf overflow - memory corrupted!\n");
3884 #ifndef PerlIO_sprintf
3886 PerlIO_sprintf(char *s, int n, const char *fmt,...)
3891 result = PerlIO_vsprintf(s, n, fmt, ap);