3 * Copyright (c) 1996-2001, Nick Ing-Simmons
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
17 #define PERLIO_NOT_STDIO 0
18 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
19 /* #define PerlIO FILE */
22 * This file provides those parts of PerlIO abstraction
23 * which are not #defined in perlio.h.
24 * Which these are depends on various Configure #ifdef's
28 #define PERL_IN_PERLIO_C
31 #undef PerlMemShared_calloc
32 #define PerlMemShared_calloc(x,y) calloc(x,y)
33 #undef PerlMemShared_free
34 #define PerlMemShared_free(x) free(x)
37 perlsio_binmode(FILE *fp, int iotype, int mode)
39 /* This used to be contents of do_binmode in doio.c */
41 # if defined(atarist) || defined(__MINT__)
44 ((FILE*)fp)->_flag |= _IOBIN;
46 ((FILE*)fp)->_flag &= ~ _IOBIN;
52 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
53 # if defined(WIN32) && defined(__BORLANDC__)
54 /* The translation mode of the stream is maintained independent
55 * of the translation mode of the fd in the Borland RTL (heavy
56 * digging through their runtime sources reveal). User has to
57 * set the mode explicitly for the stream (though they don't
58 * document this anywhere). GSAR 97-5-24
64 fp->flags &= ~ _F_BIN;
72 # if defined(USEMYBINMODE)
73 if (my_binmode(fp, iotype, mode) != FALSE)
85 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
87 if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
91 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
97 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
99 return perlsio_binmode(fp,iotype,mode);
105 #ifdef PERLIO_IS_STDIO
110 /* Does nothing (yet) except force this file to be included
111 in perl binary. That allows this file to force inclusion
112 of other functions that may be required by loadable
113 extensions e.g. for FileHandle::tmpfile
117 #undef PerlIO_tmpfile
124 #else /* PERLIO_IS_STDIO */
131 /* This section is just to make sure these functions
132 get pulled in from libsfio.a
135 #undef PerlIO_tmpfile
145 /* Force this file to be included in perl binary. Which allows
146 * this file to force inclusion of other functions that may be
147 * required by loadable extensions e.g. for FileHandle::tmpfile
151 * sfio does its own 'autoflush' on stdout in common cases.
152 * Flush results in a lot of lseek()s to regular files and
153 * lot of small writes to pipes.
155 sfset(sfstdout,SF_SHARE,0);
159 /*======================================================================================*/
160 /* Implement all the PerlIO interface ourselves.
165 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
170 #include <sys/mman.h>
175 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
178 PerlIO_debug(const char *fmt,...)
186 char *s = PerlEnv_getenv("PERLIO_DEBUG");
188 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
195 SV *sv = newSVpvn("",0);
198 s = CopFILE(PL_curcop);
201 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
202 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
205 PerlLIO_write(dbg,s,len);
211 /*--------------------------------------------------------------------------------------*/
213 /* Inner level routines */
215 /* Table of pointers to the PerlIO structs (malloc'ed) */
216 PerlIO *_perlio = NULL;
217 #define PERLIO_TABLE_SIZE 64
220 PerlIO_allocate(pTHX)
222 /* Find a free slot in the table, allocating new table as necessary */
229 last = (PerlIO **)(f);
230 for (i=1; i < PERLIO_TABLE_SIZE; i++)
238 f = PerlMemShared_calloc(PERLIO_TABLE_SIZE,sizeof(PerlIO));
248 PerlIO_cleantable(pTHX_ PerlIO **tablep)
250 PerlIO *table = *tablep;
254 PerlIO_cleantable(aTHX_ (PerlIO **) &(table[0]));
255 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
263 PerlMemShared_free(table);
275 PerlIO_cleantable(aTHX_ &_perlio);
279 PerlIO_pop(PerlIO *f)
285 PerlIO_debug("PerlIO_pop f=%p %s\n",f,l->tab->name);
287 (*l->tab->Popped)(f);
289 PerlMemShared_free(l);
293 /*--------------------------------------------------------------------------------------*/
294 /* XS Interface for perl code */
300 char *s = GvNAME(gv);
301 STRLEN l = GvNAMELEN(gv);
302 PerlIO_debug("%.*s\n",(int) l,s);
306 XS(XS_perlio_unimport)
310 char *s = GvNAME(gv);
311 STRLEN l = GvNAMELEN(gv);
312 PerlIO_debug("%.*s\n",(int) l,s);
317 PerlIO_find_layer(const char *name, STRLEN len)
322 if ((SSize_t) len <= 0)
324 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
325 if (svp && (sv = *svp) && SvROK(sv))
332 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
336 IO *io = GvIOn((GV *)SvRV(sv));
337 PerlIO *ifp = IoIFP(io);
338 PerlIO *ofp = IoOFP(io);
339 AV *av = (AV *) mg->mg_obj;
340 Perl_warn(aTHX_ "set %"SVf" %p %p %p",sv,io,ifp,ofp);
346 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
350 IO *io = GvIOn((GV *)SvRV(sv));
351 PerlIO *ifp = IoIFP(io);
352 PerlIO *ofp = IoOFP(io);
353 AV *av = (AV *) mg->mg_obj;
354 Perl_warn(aTHX_ "get %"SVf" %p %p %p",sv,io,ifp,ofp);
360 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
362 Perl_warn(aTHX_ "clear %"SVf,sv);
367 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
369 Perl_warn(aTHX_ "free %"SVf,sv);
373 MGVTBL perlio_vtab = {
381 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
384 SV *sv = SvRV(ST(1));
389 sv_magic(sv, (SV *)av, '~', NULL, 0);
391 mg = mg_find(sv,'~');
392 mg->mg_virtual = &perlio_vtab;
394 Perl_warn(aTHX_ "attrib %"SVf,sv);
395 for (i=2; i < items; i++)
398 const char *name = SvPV(ST(i),len);
399 SV *layer = PerlIO_find_layer(name,len);
402 av_push(av,SvREFCNT_inc(layer));
415 PerlIO_define_layer(PerlIO_funcs *tab)
418 HV *stash = gv_stashpv("perlio::Layer", TRUE);
419 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
420 if (!PerlIO_layer_hv)
422 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
424 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
425 PerlIO_debug("define %s %p\n",tab->name,tab);
429 PerlIO_default_buffer(pTHX)
431 PerlIO_funcs *tab = &PerlIO_perlio;
432 if (O_BINARY != O_TEXT)
438 if (PerlIO_stdio.Set_ptrcnt)
443 PerlIO_debug("Pushing %s\n",tab->name);
444 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(tab->name,0)));
449 PerlIO_default_layer(I32 n)
454 PerlIO_funcs *tab = &PerlIO_stdio;
456 if (!PerlIO_layer_av)
458 const char *s = PerlEnv_getenv("PERLIO");
459 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
460 newXS("perlio::import",XS_perlio_import,__FILE__);
461 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
463 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
465 PerlIO_define_layer(&PerlIO_raw);
466 PerlIO_define_layer(&PerlIO_unix);
467 PerlIO_define_layer(&PerlIO_perlio);
468 PerlIO_define_layer(&PerlIO_stdio);
469 PerlIO_define_layer(&PerlIO_crlf);
471 PerlIO_define_layer(&PerlIO_mmap);
473 PerlIO_define_layer(&PerlIO_utf8);
474 PerlIO_define_layer(&PerlIO_byte);
475 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
481 while (*s && isSPACE((unsigned char)*s))
487 while (*e && !isSPACE((unsigned char)*e))
491 layer = PerlIO_find_layer(s,e-s);
494 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
495 if ((tab->kind & PERLIO_K_DUMMY) && (tab->kind & PERLIO_K_BUFFERED))
498 PerlIO_default_buffer(aTHX);
500 PerlIO_debug("Pushing %.*s\n",(e-s),s);
501 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
502 buffered |= (tab->kind & PERLIO_K_BUFFERED);
505 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
511 len = av_len(PerlIO_layer_av);
514 PerlIO_default_buffer(aTHX);
515 len = av_len(PerlIO_layer_av);
519 svp = av_fetch(PerlIO_layer_av,n,0);
520 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
522 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
524 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
528 #define PerlIO_default_top() PerlIO_default_layer(-1)
529 #define PerlIO_default_btm() PerlIO_default_layer(0)
537 PerlIO_allocate(aTHX);
538 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
539 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
540 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
545 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode,const char *arg,STRLEN len)
549 l = PerlMemShared_calloc(tab->size,sizeof(char));
552 Zero(l,tab->size,char);
556 PerlIO_debug("PerlIO_push f=%p %s %s\n",f,tab->name,(mode) ? mode : "(Null)");
557 if ((*l->tab->Pushed)(f,mode,arg,len) != 0)
567 PerlIORaw_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
569 /* Pop back to bottom layer */
570 if (f && *f && *PerlIONext(f))
572 PerlIO_flush(PerlIONext(f));
573 while (*PerlIONext(f))
577 PerlIO_debug(":raw f=%p :%s\n",f,PerlIOBase(f)->tab->name);
584 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
588 const char *s = names;
591 while (isSPACE(*s) || *s == ':')
596 const char *as = Nullch;
597 const char *ae = Nullch;
599 while (*e && *e != ':' && !isSPACE(*e))
609 if (as && --count == 0)
616 if ((e - s) == 3 && strncmp(s,"raw",3) == 0)
618 /* Pop back to bottom layer */
622 while (*PerlIONext(f))
627 PerlIO_debug(":raw f=%p => :%s\n",f,PerlIOBase(f)->tab->name);
629 else if ((e - s) == 4 && strncmp(s,"utf8",4) == 0)
631 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
633 else if ((e - s) == 5 && strncmp(s,"bytes",5) == 0)
635 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
639 STRLEN len = ((as) ? as : e)-s;
640 SV *layer = PerlIO_find_layer(s,len);
643 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
646 if (as && (ae == Nullch)) {
648 Perl_warn(aTHX_ "perlio: argument list not closed for layer \"%.*s\"",(int)(e - s),s);
650 len = (as) ? (ae-(as++)-1) : 0;
651 if (!PerlIO_push(f,tab,mode,as,len))
656 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)len,s);
668 /*--------------------------------------------------------------------------------------*/
669 /* Given the abstraction above the public API functions */
672 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
674 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
675 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
676 if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY)))
682 if (PerlIOBase(top)->tab == &PerlIO_crlf)
685 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
688 top = PerlIONext(top);
691 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
696 PerlIO__close(PerlIO *f)
698 return (*PerlIOBase(f)->tab->Close)(f);
701 #undef PerlIO_fdupopen
703 PerlIO_fdupopen(pTHX_ PerlIO *f)
706 int fd = PerlLIO_dup(PerlIO_fileno(f));
707 PerlIO *new = PerlIO_fdopen(fd,PerlIO_modestr(f,buf));
710 Off_t posn = PerlIO_tell(f);
711 PerlIO_seek(new,posn,SEEK_SET);
718 PerlIO_close(PerlIO *f)
720 int code = (*PerlIOBase(f)->tab->Close)(f);
730 PerlIO_fileno(PerlIO *f)
732 return (*PerlIOBase(f)->tab->Fileno)(f);
739 PerlIO_fdopen(int fd, const char *mode)
741 PerlIO_funcs *tab = PerlIO_default_top();
744 return (*tab->Fdopen)(tab,fd,mode);
749 PerlIO_open(const char *path, const char *mode)
751 PerlIO_funcs *tab = PerlIO_default_top();
754 return (*tab->Open)(tab,path,mode);
759 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
764 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
766 if ((*PerlIOBase(f)->tab->Pushed)(f,mode,Nullch,0) == 0)
772 return PerlIO_open(path,mode);
777 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
779 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
784 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
786 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
791 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
793 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
798 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
800 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
805 PerlIO_tell(PerlIO *f)
807 return (*PerlIOBase(f)->tab->Tell)(f);
812 PerlIO_flush(PerlIO *f)
816 PerlIO_funcs *tab = PerlIOBase(f)->tab;
817 if (tab && tab->Flush)
819 return (*tab->Flush)(f);
823 PerlIO_debug("Cannot flush f=%p :%s\n",f,tab->name);
830 PerlIO **table = &_perlio;
835 table = (PerlIO **)(f++);
836 for (i=1; i < PERLIO_TABLE_SIZE; i++)
838 if (*f && PerlIO_flush(f) != 0)
849 PerlIO_fill(PerlIO *f)
851 return (*PerlIOBase(f)->tab->Fill)(f);
856 PerlIO_isutf8(PerlIO *f)
858 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
863 PerlIO_eof(PerlIO *f)
865 return (*PerlIOBase(f)->tab->Eof)(f);
870 PerlIO_error(PerlIO *f)
872 return (*PerlIOBase(f)->tab->Error)(f);
875 #undef PerlIO_clearerr
877 PerlIO_clearerr(PerlIO *f)
880 (*PerlIOBase(f)->tab->Clearerr)(f);
883 #undef PerlIO_setlinebuf
885 PerlIO_setlinebuf(PerlIO *f)
887 (*PerlIOBase(f)->tab->Setlinebuf)(f);
890 #undef PerlIO_has_base
892 PerlIO_has_base(PerlIO *f)
896 return (PerlIOBase(f)->tab->Get_base != NULL);
901 #undef PerlIO_fast_gets
903 PerlIO_fast_gets(PerlIO *f)
905 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS))
907 PerlIO_funcs *tab = PerlIOBase(f)->tab;
908 return (tab->Set_ptrcnt != NULL);
913 #undef PerlIO_has_cntptr
915 PerlIO_has_cntptr(PerlIO *f)
919 PerlIO_funcs *tab = PerlIOBase(f)->tab;
920 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
925 #undef PerlIO_canset_cnt
927 PerlIO_canset_cnt(PerlIO *f)
931 PerlIOl *l = PerlIOBase(f);
932 return (l->tab->Set_ptrcnt != NULL);
937 #undef PerlIO_get_base
939 PerlIO_get_base(PerlIO *f)
941 return (*PerlIOBase(f)->tab->Get_base)(f);
944 #undef PerlIO_get_bufsiz
946 PerlIO_get_bufsiz(PerlIO *f)
948 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
951 #undef PerlIO_get_ptr
953 PerlIO_get_ptr(PerlIO *f)
955 PerlIO_funcs *tab = PerlIOBase(f)->tab;
956 if (tab->Get_ptr == NULL)
958 return (*tab->Get_ptr)(f);
961 #undef PerlIO_get_cnt
963 PerlIO_get_cnt(PerlIO *f)
965 PerlIO_funcs *tab = PerlIOBase(f)->tab;
966 if (tab->Get_cnt == NULL)
968 return (*tab->Get_cnt)(f);
971 #undef PerlIO_set_cnt
973 PerlIO_set_cnt(PerlIO *f,int cnt)
975 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
978 #undef PerlIO_set_ptrcnt
980 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
982 PerlIO_funcs *tab = PerlIOBase(f)->tab;
983 if (tab->Set_ptrcnt == NULL)
986 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
988 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
991 /*--------------------------------------------------------------------------------------*/
992 /* utf8 and raw dummy layers */
995 PerlIOUtf8_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
999 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1001 if (tab->kind & PERLIO_K_UTF8)
1002 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1004 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1011 PerlIOUtf8_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1013 PerlIO_funcs *tab = PerlIO_default_layer(-2);
1014 PerlIO *f = (*tab->Fdopen)(tab,fd,mode);
1017 PerlIOl *l = PerlIOBase(f);
1018 if (tab->kind & PERLIO_K_UTF8)
1019 l->flags |= PERLIO_F_UTF8;
1021 l->flags &= ~PERLIO_F_UTF8;
1027 PerlIOUtf8_open(PerlIO_funcs *self, const char *path,const char *mode)
1029 PerlIO_funcs *tab = PerlIO_default_layer(-2);
1030 PerlIO *f = (*tab->Open)(tab,path,mode);
1033 PerlIOl *l = PerlIOBase(f);
1034 if (tab->kind & PERLIO_K_UTF8)
1035 l->flags |= PERLIO_F_UTF8;
1037 l->flags &= ~PERLIO_F_UTF8;
1042 PerlIO_funcs PerlIO_utf8 = {
1045 PERLIO_K_DUMMY|PERLIO_F_UTF8,
1064 NULL, /* get_base */
1065 NULL, /* get_bufsiz */
1068 NULL, /* set_ptrcnt */
1071 PerlIO_funcs PerlIO_byte = {
1093 NULL, /* get_base */
1094 NULL, /* get_bufsiz */
1097 NULL, /* set_ptrcnt */
1101 PerlIORaw_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1103 PerlIO_funcs *tab = PerlIO_default_layer(0);
1104 return (*tab->Fdopen)(tab,fd,mode);
1108 PerlIORaw_open(PerlIO_funcs *self, const char *path,const char *mode)
1110 PerlIO_funcs *tab = PerlIO_default_layer(0);
1111 return (*tab->Open)(tab,path,mode);
1114 PerlIO_funcs PerlIO_raw = {
1117 PERLIO_K_DUMMY|PERLIO_K_RAW,
1136 NULL, /* get_base */
1137 NULL, /* get_bufsiz */
1140 NULL, /* set_ptrcnt */
1142 /*--------------------------------------------------------------------------------------*/
1143 /*--------------------------------------------------------------------------------------*/
1144 /* "Methods" of the "base class" */
1147 PerlIOBase_fileno(PerlIO *f)
1149 return PerlIO_fileno(PerlIONext(f));
1153 PerlIO_modestr(PerlIO *f,char *buf)
1156 IV flags = PerlIOBase(f)->flags;
1157 if (flags & PERLIO_F_APPEND)
1160 if (flags & PERLIO_F_CANREAD)
1165 else if (flags & PERLIO_F_CANREAD)
1168 if (flags & PERLIO_F_CANWRITE)
1171 else if (flags & PERLIO_F_CANWRITE)
1174 if (flags & PERLIO_F_CANREAD)
1179 #if O_TEXT != O_BINARY
1180 if (!(flags & PERLIO_F_CRLF))
1188 PerlIOBase_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
1190 PerlIOl *l = PerlIOBase(f);
1191 const char *omode = mode;
1193 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1194 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
1195 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1196 if (tab->Set_ptrcnt != NULL)
1197 l->flags |= PERLIO_F_FASTGETS;
1203 l->flags |= PERLIO_F_CANREAD;
1206 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
1209 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
1220 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
1223 l->flags &= ~PERLIO_F_CRLF;
1226 l->flags |= PERLIO_F_CRLF;
1238 l->flags |= l->next->flags &
1239 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1243 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08"UVxf" (%s)\n",
1244 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
1245 l->flags,PerlIO_modestr(f,temp));
1251 PerlIOBase_popped(PerlIO *f)
1257 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1259 Off_t old = PerlIO_tell(f);
1261 PerlIO_push(f,&PerlIO_pending,"r",Nullch,0);
1262 done = PerlIOBuf_unread(f,vbuf,count);
1263 PerlIOSelf(f,PerlIOBuf)->posn = old - done;
1268 PerlIOBase_noop_ok(PerlIO *f)
1274 PerlIOBase_noop_fail(PerlIO *f)
1280 PerlIOBase_close(PerlIO *f)
1283 PerlIO *n = PerlIONext(f);
1284 if (PerlIO_flush(f) != 0)
1286 if (n && (*PerlIOBase(n)->tab->Close)(n) != 0)
1288 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1293 PerlIOBase_eof(PerlIO *f)
1297 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1303 PerlIOBase_error(PerlIO *f)
1307 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1313 PerlIOBase_clearerr(PerlIO *f)
1317 PerlIO *n = PerlIONext(f);
1318 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1325 PerlIOBase_setlinebuf(PerlIO *f)
1330 /*--------------------------------------------------------------------------------------*/
1331 /* Bottom-most level for UNIX-like case */
1335 struct _PerlIO base; /* The generic part */
1336 int fd; /* UNIX like file descriptor */
1337 int oflags; /* open/fcntl flags */
1341 PerlIOUnix_oflags(const char *mode)
1356 oflags = O_CREAT|O_TRUNC;
1367 oflags = O_CREAT|O_APPEND;
1383 else if (*mode == 't')
1386 oflags &= ~O_BINARY;
1389 /* Always open in binary mode */
1391 if (*mode || oflags == -1)
1400 PerlIOUnix_fileno(PerlIO *f)
1402 return PerlIOSelf(f,PerlIOUnix)->fd;
1406 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1414 int oflags = PerlIOUnix_oflags(mode);
1417 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOUnix);
1420 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1427 PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
1431 int oflags = PerlIOUnix_oflags(mode);
1434 int fd = PerlLIO_open3(path,oflags,0666);
1437 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOUnix);
1440 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1447 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
1449 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1450 int oflags = PerlIOUnix_oflags(mode);
1451 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1452 (*PerlIOBase(f)->tab->Close)(f);
1456 int fd = PerlLIO_open3(path,oflags,0666);
1461 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1469 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1472 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1473 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1477 SSize_t len = PerlLIO_read(fd,vbuf,count);
1478 if (len >= 0 || errno != EINTR)
1481 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1482 else if (len == 0 && count != 0)
1483 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1491 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1494 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1497 SSize_t len = PerlLIO_write(fd,vbuf,count);
1498 if (len >= 0 || errno != EINTR)
1501 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1509 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1512 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1513 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1514 return (new == (Off_t) -1) ? -1 : 0;
1518 PerlIOUnix_tell(PerlIO *f)
1521 Off_t posn = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1522 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1526 PerlIOUnix_close(PerlIO *f)
1529 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1531 while (PerlLIO_close(fd) != 0)
1542 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1547 PerlIO_funcs PerlIO_unix = {
1563 PerlIOBase_noop_ok, /* flush */
1564 PerlIOBase_noop_fail, /* fill */
1567 PerlIOBase_clearerr,
1568 PerlIOBase_setlinebuf,
1569 NULL, /* get_base */
1570 NULL, /* get_bufsiz */
1573 NULL, /* set_ptrcnt */
1576 /*--------------------------------------------------------------------------------------*/
1577 /* stdio as a layer */
1581 struct _PerlIO base;
1582 FILE * stdio; /* The stream */
1586 PerlIOStdio_fileno(PerlIO *f)
1589 return PerlSIO_fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1593 PerlIOStdio_mode(const char *mode,char *tmode)
1600 if (O_BINARY != O_TEXT)
1609 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1628 stdio = PerlSIO_stdin;
1631 stdio = PerlSIO_stdout;
1634 stdio = PerlSIO_stderr;
1640 stdio = PerlSIO_fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
1644 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode,Nullch,0),PerlIOStdio);
1651 #undef PerlIO_importFILE
1653 PerlIO_importFILE(FILE *stdio, int fl)
1659 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"r+",Nullch,0),PerlIOStdio);
1666 PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode)
1670 FILE *stdio = PerlSIO_fopen(path,mode);
1674 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX), self,
1675 (mode = PerlIOStdio_mode(mode,tmode)),Nullch,0),
1683 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
1686 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1688 FILE *stdio = PerlSIO_freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
1696 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1699 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1703 STDCHAR *buf = (STDCHAR *) vbuf;
1704 /* Perl is expecting PerlIO_getc() to fill the buffer
1705 * Linux's stdio does not do that for fread()
1707 int ch = PerlSIO_fgetc(s);
1715 got = PerlSIO_fread(vbuf,1,count,s);
1720 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1723 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1724 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1728 int ch = *buf-- & 0xff;
1729 if (PerlSIO_ungetc(ch,s) != ch)
1738 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1741 return PerlSIO_fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1745 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1748 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1749 return PerlSIO_fseek(stdio,offset,whence);
1753 PerlIOStdio_tell(PerlIO *f)
1756 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1757 return PerlSIO_ftell(stdio);
1761 PerlIOStdio_close(PerlIO *f)
1765 int optval, optlen = sizeof(int);
1767 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1770 (getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (char *)&optval, &optlen) < 0) ?
1771 PerlSIO_fclose(stdio) :
1772 close(PerlIO_fileno(f))
1774 PerlSIO_fclose(stdio)
1781 PerlIOStdio_flush(PerlIO *f)
1784 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1785 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
1787 return PerlSIO_fflush(stdio);
1792 /* FIXME: This discards ungetc() and pre-read stuff which is
1793 not right if this is just a "sync" from a layer above
1794 Suspect right design is to do _this_ but not have layer above
1795 flush this layer read-to-read
1797 /* Not writeable - sync by attempting a seek */
1799 if (PerlSIO_fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
1807 PerlIOStdio_fill(PerlIO *f)
1810 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1812 /* fflush()ing read-only streams can cause trouble on some stdio-s */
1813 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1815 if (PerlSIO_fflush(stdio) != 0)
1818 c = PerlSIO_fgetc(stdio);
1819 if (c == EOF || PerlSIO_ungetc(c,stdio) != c)
1825 PerlIOStdio_eof(PerlIO *f)
1828 return PerlSIO_feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1832 PerlIOStdio_error(PerlIO *f)
1835 return PerlSIO_ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1839 PerlIOStdio_clearerr(PerlIO *f)
1842 PerlSIO_clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1846 PerlIOStdio_setlinebuf(PerlIO *f)
1849 #ifdef HAS_SETLINEBUF
1850 PerlSIO_setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1852 PerlSIO_setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1858 PerlIOStdio_get_base(PerlIO *f)
1861 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1862 return PerlSIO_get_base(stdio);
1866 PerlIOStdio_get_bufsiz(PerlIO *f)
1869 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1870 return PerlSIO_get_bufsiz(stdio);
1874 #ifdef USE_STDIO_PTR
1876 PerlIOStdio_get_ptr(PerlIO *f)
1879 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1880 return PerlSIO_get_ptr(stdio);
1884 PerlIOStdio_get_cnt(PerlIO *f)
1887 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1888 return PerlSIO_get_cnt(stdio);
1892 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1895 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1898 #ifdef STDIO_PTR_LVALUE
1899 PerlSIO_set_ptr(stdio,ptr);
1900 #ifdef STDIO_PTR_LVAL_SETS_CNT
1901 if (PerlSIO_get_cnt(stdio) != (cnt))
1904 assert(PerlSIO_get_cnt(stdio) == (cnt));
1907 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1908 /* Setting ptr _does_ change cnt - we are done */
1911 #else /* STDIO_PTR_LVALUE */
1913 #endif /* STDIO_PTR_LVALUE */
1915 /* Now (or only) set cnt */
1916 #ifdef STDIO_CNT_LVALUE
1917 PerlSIO_set_cnt(stdio,cnt);
1918 #else /* STDIO_CNT_LVALUE */
1919 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1920 PerlSIO_set_ptr(stdio,PerlSIO_get_ptr(stdio)+(PerlSIO_get_cnt(stdio)-cnt));
1921 #else /* STDIO_PTR_LVAL_SETS_CNT */
1923 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1924 #endif /* STDIO_CNT_LVALUE */
1929 PerlIO_funcs PerlIO_stdio = {
1931 sizeof(PerlIOStdio),
1949 PerlIOStdio_clearerr,
1950 PerlIOStdio_setlinebuf,
1952 PerlIOStdio_get_base,
1953 PerlIOStdio_get_bufsiz,
1958 #ifdef USE_STDIO_PTR
1959 PerlIOStdio_get_ptr,
1960 PerlIOStdio_get_cnt,
1961 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1962 PerlIOStdio_set_ptrcnt
1963 #else /* STDIO_PTR_LVALUE */
1965 #endif /* STDIO_PTR_LVALUE */
1966 #else /* USE_STDIO_PTR */
1970 #endif /* USE_STDIO_PTR */
1973 #undef PerlIO_exportFILE
1975 PerlIO_exportFILE(PerlIO *f, int fl)
1979 stdio = fdopen(PerlIO_fileno(f),"r+");
1982 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f,&PerlIO_stdio,"r+",Nullch,0),PerlIOStdio);
1988 #undef PerlIO_findFILE
1990 PerlIO_findFILE(PerlIO *f)
1995 if (l->tab == &PerlIO_stdio)
1997 PerlIOStdio *s = PerlIOSelf(&l,PerlIOStdio);
2000 l = *PerlIONext(&l);
2002 return PerlIO_exportFILE(f,0);
2005 #undef PerlIO_releaseFILE
2007 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2011 /*--------------------------------------------------------------------------------------*/
2012 /* perlio buffer layer */
2015 PerlIOBuf_pushed(PerlIO *f, const char *mode, const char *arg, STRLEN len)
2017 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2018 b->posn = PerlIO_tell(PerlIONext(f));
2019 return PerlIOBase_pushed(f,mode,arg,len);
2023 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
2026 PerlIO_funcs *tab = PerlIO_default_btm();
2034 #if O_BINARY != O_TEXT
2035 /* do something about failing setmode()? --jhi */
2036 PerlLIO_setmode(fd, O_BINARY);
2038 f = (*tab->Fdopen)(tab,fd,mode);
2041 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode,Nullch,0),PerlIOBuf);
2042 if (init && fd == 2)
2044 /* Initial stderr is unbuffered */
2045 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2048 PerlIO_debug("PerlIOBuf_fdopen %s f=%p fd=%d m=%s fl=%08"UVxf"\n",
2049 self->name,f,fd,mode,PerlIOBase(f)->flags);
2056 PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
2058 PerlIO_funcs *tab = PerlIO_default_btm();
2059 PerlIO *f = (*tab->Open)(tab,path,mode);
2062 PerlIO_push(f,self,mode,Nullch,0);
2068 PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
2070 PerlIO *next = PerlIONext(f);
2071 int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
2073 code = (*PerlIOBase(f)->tab->Pushed)(f,mode,Nullch,0);
2077 /* This "flush" is akin to sfio's sync in that it handles files in either
2081 PerlIOBuf_flush(PerlIO *f)
2083 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2085 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2087 /* write() the buffer */
2088 STDCHAR *buf = b->buf;
2091 PerlIO *n = PerlIONext(f);
2094 count = PerlIO_write(n,p,b->ptr - p);
2099 else if (count < 0 || PerlIO_error(n))
2101 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2106 b->posn += (p - buf);
2108 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2110 STDCHAR *buf = PerlIO_get_base(f);
2111 /* Note position change */
2112 b->posn += (b->ptr - buf);
2113 if (b->ptr < b->end)
2115 /* We did not consume all of it */
2116 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
2118 b->posn = PerlIO_tell(PerlIONext(f));
2122 b->ptr = b->end = b->buf;
2123 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2124 /* FIXME: Is this right for read case ? */
2125 if (PerlIO_flush(PerlIONext(f)) != 0)
2131 PerlIOBuf_fill(PerlIO *f)
2133 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2134 PerlIO *n = PerlIONext(f);
2136 /* FIXME: doing the down-stream flush is a bad idea if it causes
2137 pre-read data in stdio buffer to be discarded
2138 but this is too simplistic - as it skips _our_ hosekeeping
2139 and breaks tell tests.
2140 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2144 if (PerlIO_flush(f) != 0)
2148 PerlIO_get_base(f); /* allocate via vtable */
2150 b->ptr = b->end = b->buf;
2151 if (PerlIO_fast_gets(n))
2153 /* Layer below is also buffered
2154 * We do _NOT_ want to call its ->Read() because that will loop
2155 * till it gets what we asked for which may hang on a pipe etc.
2156 * Instead take anything it has to hand, or ask it to fill _once_.
2158 avail = PerlIO_get_cnt(n);
2161 avail = PerlIO_fill(n);
2163 avail = PerlIO_get_cnt(n);
2166 if (!PerlIO_error(n) && PerlIO_eof(n))
2172 STDCHAR *ptr = PerlIO_get_ptr(n);
2173 SSize_t cnt = avail;
2174 if (avail > b->bufsiz)
2176 Copy(ptr,b->buf,avail,STDCHAR);
2177 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
2182 avail = PerlIO_read(n,b->ptr,b->bufsiz);
2187 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2189 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2192 b->end = b->buf+avail;
2193 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2198 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
2200 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2201 STDCHAR *buf = (STDCHAR *) vbuf;
2206 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
2210 SSize_t avail = PerlIO_get_cnt(f);
2211 SSize_t take = (count < avail) ? count : avail;
2214 STDCHAR *ptr = PerlIO_get_ptr(f);
2215 Copy(ptr,buf,take,STDCHAR);
2216 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
2220 if (count > 0 && avail <= 0)
2222 if (PerlIO_fill(f) != 0)
2226 return (buf - (STDCHAR *) vbuf);
2232 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
2234 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2235 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2238 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2244 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2246 avail = (b->ptr - b->buf);
2251 b->end = b->buf + avail;
2253 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2254 b->posn -= b->bufsiz;
2256 if (avail > (SSize_t) count)
2264 Copy(buf,b->ptr,avail,STDCHAR);
2268 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2275 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2277 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2278 const STDCHAR *buf = (const STDCHAR *) vbuf;
2282 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2286 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2287 if ((SSize_t) count < avail)
2289 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2290 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2310 Copy(buf,b->ptr,avail,STDCHAR);
2317 if (b->ptr >= (b->buf + b->bufsiz))
2320 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2326 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2329 if ((code = PerlIO_flush(f)) == 0)
2331 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2332 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2333 code = PerlIO_seek(PerlIONext(f),offset,whence);
2336 b->posn = PerlIO_tell(PerlIONext(f));
2343 PerlIOBuf_tell(PerlIO *f)
2345 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2346 Off_t posn = b->posn;
2348 posn += (b->ptr - b->buf);
2353 PerlIOBuf_close(PerlIO *f)
2356 IV code = PerlIOBase_close(f);
2357 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2358 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2360 PerlMemShared_free(b->buf);
2363 b->ptr = b->end = b->buf;
2364 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2369 PerlIOBuf_setlinebuf(PerlIO *f)
2373 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
2378 PerlIOBuf_get_ptr(PerlIO *f)
2380 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2387 PerlIOBuf_get_cnt(PerlIO *f)
2389 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2392 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2393 return (b->end - b->ptr);
2398 PerlIOBuf_get_base(PerlIO *f)
2400 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2406 b->buf = PerlMemShared_calloc(b->bufsiz,sizeof(STDCHAR));
2409 b->buf = (STDCHAR *)&b->oneword;
2410 b->bufsiz = sizeof(b->oneword);
2419 PerlIOBuf_bufsiz(PerlIO *f)
2421 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2424 return (b->end - b->buf);
2428 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2430 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2434 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2437 assert(PerlIO_get_cnt(f) == cnt);
2438 assert(b->ptr >= b->buf);
2440 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2443 PerlIO_funcs PerlIO_perlio = {
2463 PerlIOBase_clearerr,
2464 PerlIOBuf_setlinebuf,
2469 PerlIOBuf_set_ptrcnt,
2472 /*--------------------------------------------------------------------------------------*/
2473 /* Temp layer to hold unread chars when cannot do it any other way */
2476 PerlIOPending_fill(PerlIO *f)
2478 /* Should never happen */
2484 PerlIOPending_close(PerlIO *f)
2486 /* A tad tricky - flush pops us, then we close new top */
2488 return PerlIO_close(f);
2492 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
2494 /* A tad tricky - flush pops us, then we seek new top */
2496 return PerlIO_seek(f,offset,whence);
2501 PerlIOPending_flush(PerlIO *f)
2503 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2504 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2507 PerlMemShared_free(b->buf);
2515 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2523 PerlIOBuf_set_ptrcnt(f,ptr,cnt);
2528 PerlIOPending_pushed(PerlIO *f,const char *mode,const char *arg,STRLEN len)
2530 IV code = PerlIOBase_pushed(f,mode,arg,len);
2531 PerlIOl *l = PerlIOBase(f);
2532 /* Our PerlIO_fast_gets must match what we are pushed on,
2533 or sv_gets() etc. get muddled when it changes mid-string
2536 l->flags = (l->flags & ~(PERLIO_F_FASTGETS|PERLIO_F_UTF8)) |
2537 (PerlIOBase(PerlIONext(f))->flags & (PERLIO_F_FASTGETS|PERLIO_F_UTF8));
2542 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
2544 SSize_t avail = PerlIO_get_cnt(f);
2549 got = PerlIOBuf_read(f,vbuf,avail);
2551 got += PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
2556 PerlIO_funcs PerlIO_pending = {
2564 PerlIOPending_pushed,
2571 PerlIOPending_close,
2572 PerlIOPending_flush,
2576 PerlIOBase_clearerr,
2577 PerlIOBuf_setlinebuf,
2582 PerlIOPending_set_ptrcnt,
2587 /*--------------------------------------------------------------------------------------*/
2588 /* crlf - translation
2589 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
2590 to hand back a line at a time and keeping a record of which nl we "lied" about.
2591 On write translate "\n" to CR,LF
2596 PerlIOBuf base; /* PerlIOBuf stuff */
2597 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
2601 PerlIOCrlf_pushed(PerlIO *f, const char *mode,const char *arg,STRLEN len)
2604 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
2605 code = PerlIOBuf_pushed(f,mode,arg,len);
2607 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n",
2608 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
2609 PerlIOBase(f)->flags);
2616 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
2618 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2624 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2625 return PerlIOBuf_unread(f,vbuf,count);
2628 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2629 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2631 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2637 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2639 b->end = b->ptr = b->buf + b->bufsiz;
2640 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2641 b->posn -= b->bufsiz;
2643 while (count > 0 && b->ptr > b->buf)
2648 if (b->ptr - 2 >= b->buf)
2674 PerlIOCrlf_get_cnt(PerlIO *f)
2676 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2679 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2681 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2682 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
2684 STDCHAR *nl = b->ptr;
2686 while (nl < b->end && *nl != 0xd)
2688 if (nl < b->end && *nl == 0xd)
2700 /* Not CR,LF but just CR */
2707 /* Blast - found CR as last char in buffer */
2710 /* They may not care, defer work as long as possible */
2711 return (nl - b->ptr);
2717 b->ptr++; /* say we have read it as far as flush() is concerned */
2718 b->buf++; /* Leave space an front of buffer */
2719 b->bufsiz--; /* Buffer is thus smaller */
2720 code = PerlIO_fill(f); /* Fetch some more */
2721 b->bufsiz++; /* Restore size for next time */
2722 b->buf--; /* Point at space */
2723 b->ptr = nl = b->buf; /* Which is what we hand off */
2724 b->posn--; /* Buffer starts here */
2725 *nl = 0xd; /* Fill in the CR */
2727 goto test; /* fill() call worked */
2728 /* CR at EOF - just fall through */
2733 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
2739 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2741 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2742 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2743 IV flags = PerlIOBase(f)->flags;
2753 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
2760 /* Test code - delete when it works ... */
2767 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
2775 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08"UVxf" nl=%p e=%p for %d",
2776 ptr, chk, flags, c->nl, b->end, cnt);
2783 /* They have taken what we lied about */
2790 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2794 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
2796 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2797 return PerlIOBuf_write(f,vbuf,count);
2800 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2801 const STDCHAR *buf = (const STDCHAR *) vbuf;
2802 const STDCHAR *ebuf = buf+count;
2805 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2809 STDCHAR *eptr = b->buf+b->bufsiz;
2810 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2811 while (buf < ebuf && b->ptr < eptr)
2815 if ((b->ptr + 2) > eptr)
2817 /* Not room for both */
2823 *(b->ptr)++ = 0xd; /* CR */
2824 *(b->ptr)++ = 0xa; /* LF */
2826 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2845 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2847 return (buf - (STDCHAR *) vbuf);
2852 PerlIOCrlf_flush(PerlIO *f)
2854 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2860 return PerlIOBuf_flush(f);
2863 PerlIO_funcs PerlIO_crlf = {
2866 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
2872 PerlIOBase_noop_ok, /* popped */
2873 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
2874 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
2875 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
2883 PerlIOBase_clearerr,
2884 PerlIOBuf_setlinebuf,
2889 PerlIOCrlf_set_ptrcnt,
2893 /*--------------------------------------------------------------------------------------*/
2894 /* mmap as "buffer" layer */
2898 PerlIOBuf base; /* PerlIOBuf stuff */
2899 Mmap_t mptr; /* Mapped address */
2900 Size_t len; /* mapped length */
2901 STDCHAR *bbuf; /* malloced buffer if map fails */
2904 static size_t page_size = 0;
2907 PerlIOMmap_map(PerlIO *f)
2910 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2911 PerlIOBuf *b = &m->base;
2912 IV flags = PerlIOBase(f)->flags;
2916 if (flags & PERLIO_F_CANREAD)
2918 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2919 int fd = PerlIO_fileno(f);
2921 code = fstat(fd,&st);
2922 if (code == 0 && S_ISREG(st.st_mode))
2924 SSize_t len = st.st_size - b->posn;
2929 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
2931 SETERRNO(0,SS$_NORMAL);
2932 # ifdef _SC_PAGESIZE
2933 page_size = sysconf(_SC_PAGESIZE);
2935 page_size = sysconf(_SC_PAGE_SIZE);
2937 if ((long)page_size < 0) {
2942 (void)SvUPGRADE(error, SVt_PV);
2943 msg = SvPVx(error, n_a);
2944 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
2947 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
2951 # ifdef HAS_GETPAGESIZE
2952 page_size = getpagesize();
2954 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
2955 page_size = PAGESIZE; /* compiletime, bad */
2959 if ((IV)page_size <= 0)
2960 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
2964 /* This is a hack - should never happen - open should have set it ! */
2965 b->posn = PerlIO_tell(PerlIONext(f));
2967 posn = (b->posn / page_size) * page_size;
2968 len = st.st_size - posn;
2969 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
2970 if (m->mptr && m->mptr != (Mmap_t) -1)
2972 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
2973 madvise(m->mptr, len, MADV_SEQUENTIAL);
2975 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
2976 madvise(m->mptr, len, MADV_WILLNEED);
2978 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
2979 b->end = ((STDCHAR *)m->mptr) + len;
2980 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
2991 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
2993 b->ptr = b->end = b->ptr;
3002 PerlIOMmap_unmap(PerlIO *f)
3004 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3005 PerlIOBuf *b = &m->base;
3011 code = munmap(m->mptr, m->len);
3015 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
3018 b->ptr = b->end = b->buf;
3019 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
3025 PerlIOMmap_get_base(PerlIO *f)
3027 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3028 PerlIOBuf *b = &m->base;
3029 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3031 /* Already have a readbuffer in progress */
3036 /* We have a write buffer or flushed PerlIOBuf read buffer */
3037 m->bbuf = b->buf; /* save it in case we need it again */
3038 b->buf = NULL; /* Clear to trigger below */
3042 PerlIOMmap_map(f); /* Try and map it */
3045 /* Map did not work - recover PerlIOBuf buffer if we have one */
3049 b->ptr = b->end = b->buf;
3052 return PerlIOBuf_get_base(f);
3056 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
3058 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3059 PerlIOBuf *b = &m->base;
3060 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3062 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
3065 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
3070 /* Loose the unwritable mapped buffer */
3072 /* If flush took the "buffer" see if we have one from before */
3073 if (!b->buf && m->bbuf)
3077 PerlIOBuf_get_base(f);
3081 return PerlIOBuf_unread(f,vbuf,count);
3085 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
3087 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3088 PerlIOBuf *b = &m->base;
3089 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
3091 /* No, or wrong sort of, buffer */
3094 if (PerlIOMmap_unmap(f) != 0)
3097 /* If unmap took the "buffer" see if we have one from before */
3098 if (!b->buf && m->bbuf)
3102 PerlIOBuf_get_base(f);
3106 return PerlIOBuf_write(f,vbuf,count);
3110 PerlIOMmap_flush(PerlIO *f)
3112 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3113 PerlIOBuf *b = &m->base;
3114 IV code = PerlIOBuf_flush(f);
3115 /* Now we are "synced" at PerlIOBuf level */
3120 /* Unmap the buffer */
3121 if (PerlIOMmap_unmap(f) != 0)
3126 /* We seem to have a PerlIOBuf buffer which was not mapped
3127 * remember it in case we need one later
3136 PerlIOMmap_fill(PerlIO *f)
3138 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
3139 IV code = PerlIO_flush(f);
3140 if (code == 0 && !b->buf)
3142 code = PerlIOMmap_map(f);
3144 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
3146 code = PerlIOBuf_fill(f);
3152 PerlIOMmap_close(PerlIO *f)
3154 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
3155 PerlIOBuf *b = &m->base;
3156 IV code = PerlIO_flush(f);
3161 b->ptr = b->end = b->buf;
3163 if (PerlIOBuf_close(f) != 0)
3169 PerlIO_funcs PerlIO_mmap = {
3189 PerlIOBase_clearerr,
3190 PerlIOBuf_setlinebuf,
3191 PerlIOMmap_get_base,
3195 PerlIOBuf_set_ptrcnt,
3198 #endif /* HAS_MMAP */
3206 atexit(&PerlIO_cleanup);
3218 PerlIO_stdstreams();
3222 #undef PerlIO_stdout
3227 PerlIO_stdstreams();
3231 #undef PerlIO_stderr
3236 PerlIO_stdstreams();
3240 /*--------------------------------------------------------------------------------------*/
3242 #undef PerlIO_getname
3244 PerlIO_getname(PerlIO *f, char *buf)
3247 Perl_croak(aTHX_ "Don't know how to get file name");
3252 /*--------------------------------------------------------------------------------------*/
3253 /* Functions which can be called on any kind of PerlIO implemented
3259 PerlIO_getc(PerlIO *f)
3262 SSize_t count = PerlIO_read(f,buf,1);
3265 return (unsigned char) buf[0];
3270 #undef PerlIO_ungetc
3272 PerlIO_ungetc(PerlIO *f, int ch)
3277 if (PerlIO_unread(f,&buf,1) == 1)
3285 PerlIO_putc(PerlIO *f, int ch)
3288 return PerlIO_write(f,&buf,1);
3293 PerlIO_puts(PerlIO *f, const char *s)
3295 STRLEN len = strlen(s);
3296 return PerlIO_write(f,s,len);
3299 #undef PerlIO_rewind
3301 PerlIO_rewind(PerlIO *f)
3303 PerlIO_seek(f,(Off_t)0,SEEK_SET);
3307 #undef PerlIO_vprintf
3309 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3312 SV *sv = newSVpvn("",0);
3317 Perl_va_copy(ap, apc);
3318 sv_vcatpvf(sv, fmt, &apc);
3320 sv_vcatpvf(sv, fmt, &ap);
3323 return PerlIO_write(f,s,len);
3326 #undef PerlIO_printf
3328 PerlIO_printf(PerlIO *f,const char *fmt,...)
3333 result = PerlIO_vprintf(f,fmt,ap);
3338 #undef PerlIO_stdoutf
3340 PerlIO_stdoutf(const char *fmt,...)
3345 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
3350 #undef PerlIO_tmpfile
3352 PerlIO_tmpfile(void)
3354 /* I have no idea how portable mkstemp() is ... */
3355 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
3358 FILE *stdio = PerlSIO_tmpfile();
3361 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"w+",Nullch,0),PerlIOStdio);
3367 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
3368 int fd = mkstemp(SvPVX(sv));
3372 f = PerlIO_fdopen(fd,"w+");
3375 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
3377 PerlLIO_unlink(SvPVX(sv));
3387 #endif /* USE_SFIO */
3388 #endif /* PERLIO_IS_STDIO */
3390 /*======================================================================================*/
3391 /* Now some functions in terms of above which may be needed even if
3392 we are not in true PerlIO mode
3396 #undef PerlIO_setpos
3398 PerlIO_setpos(PerlIO *f, SV *pos)
3404 Off_t *posn = (Off_t *) SvPV(pos,len);
3405 if (f && len == sizeof(Off_t))
3406 return PerlIO_seek(f,*posn,SEEK_SET);
3412 #undef PerlIO_setpos
3414 PerlIO_setpos(PerlIO *f, SV *pos)
3420 Fpos_t *fpos = (Fpos_t *) SvPV(pos,len);
3421 if (f && len == sizeof(Fpos_t))
3423 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3424 return fsetpos64(f, fpos);
3426 return fsetpos(f, fpos);
3436 #undef PerlIO_getpos
3438 PerlIO_getpos(PerlIO *f, SV *pos)
3441 Off_t posn = PerlIO_tell(f);
3442 sv_setpvn(pos,(char *)&posn,sizeof(posn));
3443 return (posn == (Off_t)-1) ? -1 : 0;
3446 #undef PerlIO_getpos
3448 PerlIO_getpos(PerlIO *f, SV *pos)
3453 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3454 code = fgetpos64(f, &fpos);
3456 code = fgetpos(f, &fpos);
3458 sv_setpvn(pos,(char *)&fpos,sizeof(fpos));
3463 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
3466 vprintf(char *pat, char *args)
3468 _doprnt(pat, args, stdout);
3469 return 0; /* wrong, but perl doesn't use the return value */
3473 vfprintf(FILE *fd, char *pat, char *args)
3475 _doprnt(pat, args, fd);
3476 return 0; /* wrong, but perl doesn't use the return value */
3481 #ifndef PerlIO_vsprintf
3483 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
3485 int val = vsprintf(s, fmt, ap);
3488 if (strlen(s) >= (STRLEN)n)
3491 (void)PerlIO_puts(Perl_error_log,
3492 "panic: sprintf overflow - memory corrupted!\n");
3500 #ifndef PerlIO_sprintf
3502 PerlIO_sprintf(char *s, int n, const char *fmt,...)
3507 result = PerlIO_vsprintf(s, n, fmt, ap);