3 * Copyright (c) 1996-2000, 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)
39 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
41 if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
45 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
51 perlsio_binmode(FILE *fp, int iotype, int mode)
53 /* This used to be contents of do_binmode in doio.c */
55 # if defined(atarist) || defined(__MINT__)
58 ((FILE*)fp)->_flag |= _IOBIN;
60 ((FILE*)fp)->_flag &= ~ _IOBIN;
65 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
66 # if defined(WIN32) && defined(__BORLANDC__)
67 /* The translation mode of the stream is maintained independent
68 * of the translation mode of the fd in the Borland RTL (heavy
69 * digging through their runtime sources reveal). User has to
70 * set the mode explicitly for the stream (though they don't
71 * document this anywhere). GSAR 97-5-24
77 fp->flags &= ~ _F_BIN;
85 # if defined(USEMYBINMODE)
86 if (my_binmode(fp, iotype, mode) != FALSE)
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);
286 (*l->tab->Popped)(f);
288 PerlMemShared_free(l);
292 /*--------------------------------------------------------------------------------------*/
293 /* XS Interface for perl code */
299 char *s = GvNAME(gv);
300 STRLEN l = GvNAMELEN(gv);
301 PerlIO_debug("%.*s\n",(int) l,s);
305 XS(XS_perlio_unimport)
309 char *s = GvNAME(gv);
310 STRLEN l = GvNAMELEN(gv);
311 PerlIO_debug("%.*s\n",(int) l,s);
316 PerlIO_find_layer(const char *name, STRLEN len)
323 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
324 if (svp && (sv = *svp) && SvROK(sv))
331 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
335 IO *io = GvIOn((GV *)SvRV(sv));
336 PerlIO *ifp = IoIFP(io);
337 PerlIO *ofp = IoOFP(io);
338 AV *av = (AV *) mg->mg_obj;
339 Perl_warn(aTHX_ "set %"SVf" %p %p %p",sv,io,ifp,ofp);
345 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
349 IO *io = GvIOn((GV *)SvRV(sv));
350 PerlIO *ifp = IoIFP(io);
351 PerlIO *ofp = IoOFP(io);
352 AV *av = (AV *) mg->mg_obj;
353 Perl_warn(aTHX_ "get %"SVf" %p %p %p",sv,io,ifp,ofp);
359 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
361 Perl_warn(aTHX_ "clear %"SVf,sv);
366 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
368 Perl_warn(aTHX_ "free %"SVf,sv);
372 MGVTBL perlio_vtab = {
380 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
383 SV *sv = SvRV(ST(1));
388 sv_magic(sv, (SV *)av, '~', NULL, 0);
390 mg = mg_find(sv,'~');
391 mg->mg_virtual = &perlio_vtab;
393 Perl_warn(aTHX_ "attrib %"SVf,sv);
394 for (i=2; i < items; i++)
397 const char *name = SvPV(ST(i),len);
398 SV *layer = PerlIO_find_layer(name,len);
401 av_push(av,SvREFCNT_inc(layer));
414 PerlIO_define_layer(PerlIO_funcs *tab)
417 HV *stash = gv_stashpv("perlio::Layer", TRUE);
418 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
419 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
423 PerlIO_default_layer(I32 n)
428 PerlIO_funcs *tab = &PerlIO_stdio;
430 if (!PerlIO_layer_hv)
432 const char *s = PerlEnv_getenv("PERLIO");
433 newXS("perlio::import",XS_perlio_import,__FILE__);
434 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
436 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
438 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
439 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
440 PerlIO_define_layer(&PerlIO_unix);
441 PerlIO_define_layer(&PerlIO_perlio);
442 PerlIO_define_layer(&PerlIO_stdio);
443 PerlIO_define_layer(&PerlIO_crlf);
445 PerlIO_define_layer(&PerlIO_mmap);
447 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
452 while (*s && isSPACE((unsigned char)*s))
458 while (*e && !isSPACE((unsigned char)*e))
462 layer = PerlIO_find_layer(s,e-s);
465 PerlIO_debug("Pushing %.*s\n",(e-s),s);
466 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
469 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
475 len = av_len(PerlIO_layer_av);
478 if (O_BINARY != O_TEXT)
480 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_crlf.name,0)));
484 if (PerlIO_stdio.Set_ptrcnt)
486 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0)));
490 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0)));
493 len = av_len(PerlIO_layer_av);
497 svp = av_fetch(PerlIO_layer_av,n,0);
498 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
500 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
502 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
506 #define PerlIO_default_top() PerlIO_default_layer(-1)
507 #define PerlIO_default_btm() PerlIO_default_layer(0)
515 PerlIO_allocate(aTHX);
516 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
517 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
518 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
523 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
527 l = PerlMemShared_calloc(tab->size,sizeof(char));
530 Zero(l,tab->size,char);
534 PerlIO_debug("PerlIO_push f=%p %s %s\n",f,tab->name,(mode) ? mode : "(Null)");
535 if ((*l->tab->Pushed)(f,mode) != 0)
545 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
549 const char *s = names;
559 while (*e && *e != ':' && !isSPACE(*e))
563 if ((e - s) == 3 && strncmp(s,"raw",3) == 0)
565 /* Pop back to bottom layer */
569 while (PerlIONext(f))
577 SV *layer = PerlIO_find_layer(s,e-s);
580 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
583 PerlIO *new = PerlIO_push(f,tab,mode);
589 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)(e-s),s);
601 /*--------------------------------------------------------------------------------------*/
602 /* Given the abstraction above the public API functions */
605 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
607 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
608 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
609 if (!names || (O_TEXT != O_BINARY && mode & O_BINARY))
615 if (PerlIOBase(top)->tab == &PerlIO_crlf)
618 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
621 top = PerlIONext(top);
624 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
629 PerlIO__close(PerlIO *f)
631 return (*PerlIOBase(f)->tab->Close)(f);
634 #undef PerlIO_fdupopen
636 PerlIO_fdupopen(pTHX_ PerlIO *f)
639 int fd = PerlLIO_dup(PerlIO_fileno(f));
640 PerlIO *new = PerlIO_fdopen(fd,PerlIO_modestr(f,buf));
643 Off_t posn = PerlIO_tell(f);
644 PerlIO_seek(new,posn,SEEK_SET);
651 PerlIO_close(PerlIO *f)
653 int code = (*PerlIOBase(f)->tab->Close)(f);
663 PerlIO_fileno(PerlIO *f)
665 return (*PerlIOBase(f)->tab->Fileno)(f);
672 PerlIO_fdopen(int fd, const char *mode)
674 PerlIO_funcs *tab = PerlIO_default_top();
677 return (*tab->Fdopen)(tab,fd,mode);
682 PerlIO_open(const char *path, const char *mode)
684 PerlIO_funcs *tab = PerlIO_default_top();
687 return (*tab->Open)(tab,path,mode);
692 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
697 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
699 if ((*PerlIOBase(f)->tab->Pushed)(f,mode) == 0)
705 return PerlIO_open(path,mode);
710 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
712 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
717 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
719 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
724 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
726 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
731 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
733 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
738 PerlIO_tell(PerlIO *f)
740 return (*PerlIOBase(f)->tab->Tell)(f);
745 PerlIO_flush(PerlIO *f)
749 return (*PerlIOBase(f)->tab->Flush)(f);
753 PerlIO **table = &_perlio;
758 table = (PerlIO **)(f++);
759 for (i=1; i < PERLIO_TABLE_SIZE; i++)
761 if (*f && PerlIO_flush(f) != 0)
772 PerlIO_fill(PerlIO *f)
774 return (*PerlIOBase(f)->tab->Fill)(f);
779 PerlIO_isutf8(PerlIO *f)
781 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
786 PerlIO_eof(PerlIO *f)
788 return (*PerlIOBase(f)->tab->Eof)(f);
793 PerlIO_error(PerlIO *f)
795 return (*PerlIOBase(f)->tab->Error)(f);
798 #undef PerlIO_clearerr
800 PerlIO_clearerr(PerlIO *f)
803 (*PerlIOBase(f)->tab->Clearerr)(f);
806 #undef PerlIO_setlinebuf
808 PerlIO_setlinebuf(PerlIO *f)
810 (*PerlIOBase(f)->tab->Setlinebuf)(f);
813 #undef PerlIO_has_base
815 PerlIO_has_base(PerlIO *f)
819 return (PerlIOBase(f)->tab->Get_base != NULL);
824 #undef PerlIO_fast_gets
826 PerlIO_fast_gets(PerlIO *f)
828 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS))
830 PerlIO_funcs *tab = PerlIOBase(f)->tab;
831 return (tab->Set_ptrcnt != NULL);
836 #undef PerlIO_has_cntptr
838 PerlIO_has_cntptr(PerlIO *f)
842 PerlIO_funcs *tab = PerlIOBase(f)->tab;
843 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
848 #undef PerlIO_canset_cnt
850 PerlIO_canset_cnt(PerlIO *f)
854 PerlIOl *l = PerlIOBase(f);
855 return (l->tab->Set_ptrcnt != NULL);
860 #undef PerlIO_get_base
862 PerlIO_get_base(PerlIO *f)
864 return (*PerlIOBase(f)->tab->Get_base)(f);
867 #undef PerlIO_get_bufsiz
869 PerlIO_get_bufsiz(PerlIO *f)
871 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
874 #undef PerlIO_get_ptr
876 PerlIO_get_ptr(PerlIO *f)
878 PerlIO_funcs *tab = PerlIOBase(f)->tab;
879 if (tab->Get_ptr == NULL)
881 return (*tab->Get_ptr)(f);
884 #undef PerlIO_get_cnt
886 PerlIO_get_cnt(PerlIO *f)
888 PerlIO_funcs *tab = PerlIOBase(f)->tab;
889 if (tab->Get_cnt == NULL)
891 return (*tab->Get_cnt)(f);
894 #undef PerlIO_set_cnt
896 PerlIO_set_cnt(PerlIO *f,int cnt)
898 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
901 #undef PerlIO_set_ptrcnt
903 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
905 PerlIO_funcs *tab = PerlIOBase(f)->tab;
906 if (tab->Set_ptrcnt == NULL)
909 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
911 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
914 /*--------------------------------------------------------------------------------------*/
915 /* "Methods" of the "base class" */
918 PerlIOBase_fileno(PerlIO *f)
920 return PerlIO_fileno(PerlIONext(f));
924 PerlIO_modestr(PerlIO *f,char *buf)
927 IV flags = PerlIOBase(f)->flags;
928 if (flags & PERLIO_F_APPEND)
931 if (flags & PERLIO_F_CANREAD)
936 else if (flags & PERLIO_F_CANREAD)
939 if (flags & PERLIO_F_CANWRITE)
942 else if (flags & PERLIO_F_CANWRITE)
945 if (flags & PERLIO_F_CANREAD)
950 #if O_TEXT != O_BINARY
951 if (!(flags & PERLIO_F_CRLF))
959 PerlIOBase_pushed(PerlIO *f, const char *mode)
961 PerlIOl *l = PerlIOBase(f);
962 const char *omode = mode;
964 PerlIO_funcs *tab = PerlIOBase(f)->tab;
965 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
966 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
967 if (tab->Set_ptrcnt != NULL)
968 l->flags |= PERLIO_F_FASTGETS;
974 l->flags |= PERLIO_F_CANREAD;
977 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
980 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
991 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
994 l->flags &= ~PERLIO_F_CRLF;
997 l->flags |= PERLIO_F_CRLF;
1009 l->flags |= l->next->flags &
1010 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
1014 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08"UVxf" (%s)\n",
1015 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
1016 l->flags,PerlIO_modestr(f,temp));
1022 PerlIOBase_popped(PerlIO *f)
1027 extern PerlIO_funcs PerlIO_pending;
1030 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1033 Off_t old = PerlIO_tell(f);
1034 if (0 && PerlIO_seek(f,-((Off_t)count),SEEK_CUR) == 0)
1036 Off_t new = PerlIO_tell(f);
1044 PerlIO_push(f,&PerlIO_pending,"r");
1045 return PerlIOBuf_unread(f,vbuf,count);
1050 PerlIOBase_noop_ok(PerlIO *f)
1056 PerlIOBase_noop_fail(PerlIO *f)
1062 PerlIOBase_close(PerlIO *f)
1065 PerlIO *n = PerlIONext(f);
1066 if (PerlIO_flush(f) != 0)
1068 if (n && (*PerlIOBase(n)->tab->Close)(n) != 0)
1070 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1075 PerlIOBase_eof(PerlIO *f)
1079 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1085 PerlIOBase_error(PerlIO *f)
1089 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1095 PerlIOBase_clearerr(PerlIO *f)
1099 PerlIO *n = PerlIONext(f);
1100 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1107 PerlIOBase_setlinebuf(PerlIO *f)
1112 /*--------------------------------------------------------------------------------------*/
1113 /* Bottom-most level for UNIX-like case */
1117 struct _PerlIO base; /* The generic part */
1118 int fd; /* UNIX like file descriptor */
1119 int oflags; /* open/fcntl flags */
1123 PerlIOUnix_oflags(const char *mode)
1138 oflags = O_CREAT|O_TRUNC;
1149 oflags = O_CREAT|O_APPEND;
1165 else if (*mode == 't')
1168 oflags &= ~O_BINARY;
1171 /* Always open in binary mode */
1173 if (*mode || oflags == -1)
1182 PerlIOUnix_fileno(PerlIO *f)
1184 return PerlIOSelf(f,PerlIOUnix)->fd;
1188 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1196 int oflags = PerlIOUnix_oflags(mode);
1199 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode),PerlIOUnix);
1202 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1209 PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
1213 int oflags = PerlIOUnix_oflags(mode);
1216 int fd = PerlLIO_open3(path,oflags,0666);
1219 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode),PerlIOUnix);
1222 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1229 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
1231 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1232 int oflags = PerlIOUnix_oflags(mode);
1233 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1234 (*PerlIOBase(f)->tab->Close)(f);
1238 int fd = PerlLIO_open3(path,oflags,0666);
1243 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1251 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1254 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1255 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1259 SSize_t len = PerlLIO_read(fd,vbuf,count);
1260 if (len >= 0 || errno != EINTR)
1263 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1264 else if (len == 0 && count != 0)
1265 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1272 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1275 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1278 SSize_t len = PerlLIO_write(fd,vbuf,count);
1279 if (len >= 0 || errno != EINTR)
1282 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1289 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1292 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1293 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1294 return (new == (Off_t) -1) ? -1 : 0;
1298 PerlIOUnix_tell(PerlIO *f)
1301 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1305 PerlIOUnix_close(PerlIO *f)
1308 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1310 while (PerlLIO_close(fd) != 0)
1320 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1325 PerlIO_funcs PerlIO_unix = {
1341 PerlIOBase_noop_ok, /* flush */
1342 PerlIOBase_noop_fail, /* fill */
1345 PerlIOBase_clearerr,
1346 PerlIOBase_setlinebuf,
1347 NULL, /* get_base */
1348 NULL, /* get_bufsiz */
1351 NULL, /* set_ptrcnt */
1354 /*--------------------------------------------------------------------------------------*/
1355 /* stdio as a layer */
1359 struct _PerlIO base;
1360 FILE * stdio; /* The stream */
1364 PerlIOStdio_fileno(PerlIO *f)
1367 return PerlSIO_fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1371 PerlIOStdio_mode(const char *mode,char *tmode)
1373 const char *ret = mode;
1374 if (O_BINARY != O_TEXT)
1376 ret = (const char *) tmode;
1388 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1407 stdio = PerlSIO_stdin;
1410 stdio = PerlSIO_stdout;
1413 stdio = PerlSIO_stderr;
1419 stdio = PerlSIO_fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
1423 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),self,mode),PerlIOStdio);
1430 #undef PerlIO_importFILE
1432 PerlIO_importFILE(FILE *stdio, int fl)
1438 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"r+"),PerlIOStdio);
1445 PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode)
1449 FILE *stdio = PerlSIO_fopen(path,mode);
1453 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX), self,
1454 (mode = PerlIOStdio_mode(mode,tmode))),
1462 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
1465 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1467 FILE *stdio = PerlSIO_freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
1475 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1478 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1482 STDCHAR *buf = (STDCHAR *) vbuf;
1483 /* Perl is expecting PerlIO_getc() to fill the buffer
1484 * Linux's stdio does not do that for fread()
1486 int ch = PerlSIO_fgetc(s);
1494 got = PerlSIO_fread(vbuf,1,count,s);
1499 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1502 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1503 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1507 int ch = *buf-- & 0xff;
1508 if (PerlSIO_ungetc(ch,s) != ch)
1517 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1520 return PerlSIO_fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1524 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1527 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1528 return PerlSIO_fseek(stdio,offset,whence);
1532 PerlIOStdio_tell(PerlIO *f)
1535 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1536 return PerlSIO_ftell(stdio);
1540 PerlIOStdio_close(PerlIO *f)
1543 int optval, optlen = sizeof(int);
1544 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1546 (getsockopt(PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (char *)&optval, &optlen) < 0) ?
1547 PerlSIO_fclose(stdio) :
1548 close(PerlIO_fileno(f)));
1552 PerlIOStdio_flush(PerlIO *f)
1555 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1556 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
1558 return PerlSIO_fflush(stdio);
1563 /* FIXME: This discards ungetc() and pre-read stuff which is
1564 not right if this is just a "sync" from a layer above
1565 Suspect right design is to do _this_ but not have layer above
1566 flush this layer read-to-read
1568 /* Not writeable - sync by attempting a seek */
1570 if (PerlSIO_fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
1578 PerlIOStdio_fill(PerlIO *f)
1581 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1583 /* fflush()ing read-only streams can cause trouble on some stdio-s */
1584 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1586 if (PerlSIO_fflush(stdio) != 0)
1589 c = PerlSIO_fgetc(stdio);
1590 if (c == EOF || PerlSIO_ungetc(c,stdio) != c)
1596 PerlIOStdio_eof(PerlIO *f)
1599 return PerlSIO_feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1603 PerlIOStdio_error(PerlIO *f)
1606 return PerlSIO_ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1610 PerlIOStdio_clearerr(PerlIO *f)
1613 PerlSIO_clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1617 PerlIOStdio_setlinebuf(PerlIO *f)
1620 #ifdef HAS_SETLINEBUF
1621 PerlSIO_setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1623 PerlSIO_setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1629 PerlIOStdio_get_base(PerlIO *f)
1632 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1633 return PerlSIO_get_base(stdio);
1637 PerlIOStdio_get_bufsiz(PerlIO *f)
1640 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1641 return PerlSIO_get_bufsiz(stdio);
1645 #ifdef USE_STDIO_PTR
1647 PerlIOStdio_get_ptr(PerlIO *f)
1650 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1651 return PerlSIO_get_ptr(stdio);
1655 PerlIOStdio_get_cnt(PerlIO *f)
1658 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1659 return PerlSIO_get_cnt(stdio);
1663 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1666 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1669 #ifdef STDIO_PTR_LVALUE
1670 PerlSIO_set_ptr(stdio,ptr);
1671 #ifdef STDIO_PTR_LVAL_SETS_CNT
1672 if (PerlSIO_get_cnt(stdio) != (cnt))
1675 assert(PerlSIO_get_cnt(stdio) == (cnt));
1678 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1679 /* Setting ptr _does_ change cnt - we are done */
1682 #else /* STDIO_PTR_LVALUE */
1684 #endif /* STDIO_PTR_LVALUE */
1686 /* Now (or only) set cnt */
1687 #ifdef STDIO_CNT_LVALUE
1688 PerlSIO_set_cnt(stdio,cnt);
1689 #else /* STDIO_CNT_LVALUE */
1690 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1691 PerlSIO_set_ptr(stdio,PerlSIO_get_ptr(stdio)+(PerlSIO_get_cnt(stdio)-cnt));
1692 #else /* STDIO_PTR_LVAL_SETS_CNT */
1694 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1695 #endif /* STDIO_CNT_LVALUE */
1700 PerlIO_funcs PerlIO_stdio = {
1702 sizeof(PerlIOStdio),
1720 PerlIOStdio_clearerr,
1721 PerlIOStdio_setlinebuf,
1723 PerlIOStdio_get_base,
1724 PerlIOStdio_get_bufsiz,
1729 #ifdef USE_STDIO_PTR
1730 PerlIOStdio_get_ptr,
1731 PerlIOStdio_get_cnt,
1732 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1733 PerlIOStdio_set_ptrcnt
1734 #else /* STDIO_PTR_LVALUE */
1736 #endif /* STDIO_PTR_LVALUE */
1737 #else /* USE_STDIO_PTR */
1741 #endif /* USE_STDIO_PTR */
1744 #undef PerlIO_exportFILE
1746 PerlIO_exportFILE(PerlIO *f, int fl)
1749 /* Should really push stdio discipline when we have them */
1750 return fdopen(PerlIO_fileno(f),"r+");
1753 #undef PerlIO_findFILE
1755 PerlIO_findFILE(PerlIO *f)
1757 return PerlIO_exportFILE(f,0);
1760 #undef PerlIO_releaseFILE
1762 PerlIO_releaseFILE(PerlIO *p, FILE *f)
1766 /*--------------------------------------------------------------------------------------*/
1767 /* perlio buffer layer */
1770 PerlIOBuf_pushed(PerlIO *f, const char *mode)
1772 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1773 b->posn = PerlIO_tell(PerlIONext(f));
1774 return PerlIOBase_pushed(f,mode);
1778 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
1781 PerlIO_funcs *tab = PerlIO_default_btm();
1789 #if O_BINARY != O_TEXT
1790 /* do something about failing setmode()? --jhi */
1791 PerlLIO_setmode(fd, O_BINARY);
1793 f = (*tab->Fdopen)(tab,fd,mode);
1796 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode),PerlIOBuf);
1797 if (init && fd == 2)
1799 /* Initial stderr is unbuffered */
1800 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
1803 PerlIO_debug("PerlIOBuf_fdopen %s f=%p fd=%d m=%s fl=%08"UVxf"\n",
1804 self->name,f,fd,mode,PerlIOBase(f)->flags);
1811 PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
1813 PerlIO_funcs *tab = PerlIO_default_btm();
1814 PerlIO *f = (*tab->Open)(tab,path,mode);
1817 PerlIO_push(f,self,mode);
1823 PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
1825 PerlIO *next = PerlIONext(f);
1826 int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
1828 code = (*PerlIOBase(f)->tab->Pushed)(f,mode);
1832 /* This "flush" is akin to sfio's sync in that it handles files in either
1836 PerlIOBuf_flush(PerlIO *f)
1838 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1840 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1842 /* write() the buffer */
1843 STDCHAR *p = b->buf;
1845 PerlIO *n = PerlIONext(f);
1848 count = PerlIO_write(n,p,b->ptr - p);
1853 else if (count < 0 || PerlIO_error(n))
1855 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1860 b->posn += (p - b->buf);
1862 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1864 /* Note position change */
1865 b->posn += (b->ptr - b->buf);
1866 if (b->ptr < b->end)
1868 /* We did not consume all of it */
1869 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
1871 b->posn = PerlIO_tell(PerlIONext(f));
1875 b->ptr = b->end = b->buf;
1876 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1877 /* FIXME: Is this right for read case ? */
1878 if (PerlIO_flush(PerlIONext(f)) != 0)
1884 PerlIOBuf_fill(PerlIO *f)
1886 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1887 PerlIO *n = PerlIONext(f);
1889 /* FIXME: doing the down-stream flush is a bad idea if it causes
1890 pre-read data in stdio buffer to be discarded
1891 but this is too simplistic - as it skips _our_ hosekeeping
1892 and breaks tell tests.
1893 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
1897 if (PerlIO_flush(f) != 0)
1900 b->ptr = b->end = b->buf;
1901 if (PerlIO_fast_gets(n))
1903 /* Layer below is also buffered
1904 * We do _NOT_ want to call its ->Read() because that will loop
1905 * till it gets what we asked for which may hang on a pipe etc.
1906 * Instead take anything it has to hand, or ask it to fill _once_.
1908 avail = PerlIO_get_cnt(n);
1911 avail = PerlIO_fill(n);
1913 avail = PerlIO_get_cnt(n);
1916 if (!PerlIO_error(n) && PerlIO_eof(n))
1922 STDCHAR *ptr = PerlIO_get_ptr(n);
1923 SSize_t cnt = avail;
1924 if (avail > b->bufsiz)
1926 Copy(ptr,b->buf,avail,STDCHAR);
1927 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
1932 avail = PerlIO_read(n,b->ptr,b->bufsiz);
1937 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1939 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1942 b->end = b->buf+avail;
1943 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1948 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
1950 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1951 STDCHAR *buf = (STDCHAR *) vbuf;
1956 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1960 SSize_t avail = PerlIO_get_cnt(f);
1961 SSize_t take = (count < avail) ? count : avail;
1964 STDCHAR *ptr = PerlIO_get_ptr(f);
1965 Copy(ptr,buf,take,STDCHAR);
1966 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
1970 if (count > 0 && avail <= 0)
1972 if (PerlIO_fill(f) != 0)
1976 return (buf - (STDCHAR *) vbuf);
1982 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
1984 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1985 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1988 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1994 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1996 avail = (b->ptr - b->buf);
2001 b->end = b->buf + avail;
2003 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2004 b->posn -= b->bufsiz;
2006 if (avail > (SSize_t) count)
2014 Copy(buf,b->ptr,avail,STDCHAR);
2018 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2025 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2027 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2028 const STDCHAR *buf = (const STDCHAR *) vbuf;
2032 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2036 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2037 if ((SSize_t) count < avail)
2039 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2040 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2060 Copy(buf,b->ptr,avail,STDCHAR);
2067 if (b->ptr >= (b->buf + b->bufsiz))
2070 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2076 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2079 if ((code = PerlIO_flush(f)) == 0)
2081 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2082 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2083 code = PerlIO_seek(PerlIONext(f),offset,whence);
2086 b->posn = PerlIO_tell(PerlIONext(f));
2093 PerlIOBuf_tell(PerlIO *f)
2095 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2096 Off_t posn = b->posn;
2098 posn += (b->ptr - b->buf);
2103 PerlIOBuf_close(PerlIO *f)
2106 IV code = PerlIOBase_close(f);
2107 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2108 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2110 PerlMemShared_free(b->buf);
2113 b->ptr = b->end = b->buf;
2114 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2119 PerlIOBuf_setlinebuf(PerlIO *f)
2123 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
2128 PerlIOBuf_get_ptr(PerlIO *f)
2130 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2137 PerlIOBuf_get_cnt(PerlIO *f)
2139 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2142 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2143 return (b->end - b->ptr);
2148 PerlIOBuf_get_base(PerlIO *f)
2150 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2156 b->buf = PerlMemShared_calloc(b->bufsiz,sizeof(STDCHAR));
2159 b->buf = (STDCHAR *)&b->oneword;
2160 b->bufsiz = sizeof(b->oneword);
2169 PerlIOBuf_bufsiz(PerlIO *f)
2171 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2174 return (b->end - b->buf);
2178 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2180 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2184 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2187 assert(PerlIO_get_cnt(f) == cnt);
2188 assert(b->ptr >= b->buf);
2190 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2193 PerlIO_funcs PerlIO_perlio = {
2213 PerlIOBase_clearerr,
2214 PerlIOBuf_setlinebuf,
2219 PerlIOBuf_set_ptrcnt,
2222 /*--------------------------------------------------------------------------------------*/
2223 /* Temp layer to hold unread chars when cannot do it any other way */
2226 PerlIOPending_fill(PerlIO *f)
2228 /* Should never happen */
2234 PerlIOPending_close(PerlIO *f)
2236 /* A tad tricky - flush pops us, then we close new top */
2238 return PerlIO_close(f);
2242 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
2244 /* A tad tricky - flush pops us, then we seek new top */
2246 return PerlIO_seek(f,offset,whence);
2251 PerlIOPending_flush(PerlIO *f)
2253 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2254 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2257 PerlMemShared_free(b->buf);
2265 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2273 PerlIOBuf_set_ptrcnt(f,ptr,cnt);
2278 PerlIOPending_pushed(PerlIO *f,const char *mode)
2280 IV code = PerlIOBuf_pushed(f,mode);
2281 PerlIOl *l = PerlIOBase(f);
2282 /* Our PerlIO_fast_gets must match what we are pushed on,
2283 or sv_gets() etc. get muddled when it changes mid-string
2286 l->flags = (l->flags & ~PERLIO_F_FASTGETS) |
2287 (PerlIOBase(PerlIONext(f))->flags & PERLIO_F_FASTGETS);
2292 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
2294 SSize_t avail = PerlIO_get_cnt(f);
2299 got = PerlIOBuf_read(f,vbuf,avail);
2301 got += PerlIO_read(f,((STDCHAR *) vbuf)+got,count-got);
2306 PerlIO_funcs PerlIO_pending = {
2314 PerlIOPending_pushed,
2321 PerlIOPending_close,
2322 PerlIOPending_flush,
2326 PerlIOBase_clearerr,
2327 PerlIOBuf_setlinebuf,
2332 PerlIOPending_set_ptrcnt,
2337 /*--------------------------------------------------------------------------------------*/
2338 /* crlf - translation
2339 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
2340 to hand back a line at a time and keeping a record of which nl we "lied" about.
2341 On write translate "\n" to CR,LF
2346 PerlIOBuf base; /* PerlIOBuf stuff */
2347 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
2351 PerlIOCrlf_pushed(PerlIO *f, const char *mode)
2354 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
2355 code = PerlIOBuf_pushed(f,mode);
2357 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08"UVxf"\n",
2358 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
2359 PerlIOBase(f)->flags);
2366 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
2368 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2374 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2375 return PerlIOBuf_unread(f,vbuf,count);
2378 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2379 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2381 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2387 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2389 b->end = b->ptr = b->buf + b->bufsiz;
2390 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2391 b->posn -= b->bufsiz;
2393 while (count > 0 && b->ptr > b->buf)
2398 if (b->ptr - 2 >= b->buf)
2424 PerlIOCrlf_get_cnt(PerlIO *f)
2426 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2429 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2431 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2432 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
2434 STDCHAR *nl = b->ptr;
2436 while (nl < b->end && *nl != 0xd)
2438 if (nl < b->end && *nl == 0xd)
2450 /* Not CR,LF but just CR */
2457 /* Blast - found CR as last char in buffer */
2460 /* They may not care, defer work as long as possible */
2461 return (nl - b->ptr);
2467 b->ptr++; /* say we have read it as far as flush() is concerned */
2468 b->buf++; /* Leave space an front of buffer */
2469 b->bufsiz--; /* Buffer is thus smaller */
2470 code = PerlIO_fill(f); /* Fetch some more */
2471 b->bufsiz++; /* Restore size for next time */
2472 b->buf--; /* Point at space */
2473 b->ptr = nl = b->buf; /* Which is what we hand off */
2474 b->posn--; /* Buffer starts here */
2475 *nl = 0xd; /* Fill in the CR */
2477 goto test; /* fill() call worked */
2478 /* CR at EOF - just fall through */
2483 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
2489 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2491 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2492 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2493 IV flags = PerlIOBase(f)->flags;
2503 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
2510 /* Test code - delete when it works ... */
2517 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
2525 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08"UVxf" nl=%p e=%p for %d",
2526 ptr, chk, flags, c->nl, b->end, cnt);
2533 /* They have taken what we lied about */
2540 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2544 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
2546 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2547 return PerlIOBuf_write(f,vbuf,count);
2550 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2551 const STDCHAR *buf = (const STDCHAR *) vbuf;
2552 const STDCHAR *ebuf = buf+count;
2555 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2559 STDCHAR *eptr = b->buf+b->bufsiz;
2560 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2561 while (buf < ebuf && b->ptr < eptr)
2565 if ((b->ptr + 2) > eptr)
2567 /* Not room for both */
2573 *(b->ptr)++ = 0xd; /* CR */
2574 *(b->ptr)++ = 0xa; /* LF */
2576 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2595 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2597 return (buf - (STDCHAR *) vbuf);
2602 PerlIOCrlf_flush(PerlIO *f)
2604 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2610 return PerlIOBuf_flush(f);
2613 PerlIO_funcs PerlIO_crlf = {
2616 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
2622 PerlIOBase_noop_ok, /* popped */
2623 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
2624 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
2625 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
2633 PerlIOBase_clearerr,
2634 PerlIOBuf_setlinebuf,
2639 PerlIOCrlf_set_ptrcnt,
2643 /*--------------------------------------------------------------------------------------*/
2644 /* mmap as "buffer" layer */
2648 PerlIOBuf base; /* PerlIOBuf stuff */
2649 Mmap_t mptr; /* Mapped address */
2650 Size_t len; /* mapped length */
2651 STDCHAR *bbuf; /* malloced buffer if map fails */
2654 static size_t page_size = 0;
2657 PerlIOMmap_map(PerlIO *f)
2660 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2661 PerlIOBuf *b = &m->base;
2662 IV flags = PerlIOBase(f)->flags;
2666 if (flags & PERLIO_F_CANREAD)
2668 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2669 int fd = PerlIO_fileno(f);
2671 code = fstat(fd,&st);
2672 if (code == 0 && S_ISREG(st.st_mode))
2674 SSize_t len = st.st_size - b->posn;
2679 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
2681 SETERRNO(0,SS$_NORMAL);
2682 # ifdef _SC_PAGESIZE
2683 page_size = sysconf(_SC_PAGESIZE);
2685 page_size = sysconf(_SC_PAGE_SIZE);
2687 if ((long)page_size < 0) {
2692 (void)SvUPGRADE(error, SVt_PV);
2693 msg = SvPVx(error, n_a);
2694 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
2697 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
2701 # ifdef HAS_GETPAGESIZE
2702 page_size = getpagesize();
2704 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
2705 page_size = PAGESIZE; /* compiletime, bad */
2709 if ((IV)page_size <= 0)
2710 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
2714 /* This is a hack - should never happen - open should have set it ! */
2715 b->posn = PerlIO_tell(PerlIONext(f));
2717 posn = (b->posn / page_size) * page_size;
2718 len = st.st_size - posn;
2719 m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn);
2720 if (m->mptr && m->mptr != (Mmap_t) -1)
2722 #if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
2723 madvise(m->mptr, len, MADV_SEQUENTIAL);
2725 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
2726 b->end = ((STDCHAR *)m->mptr) + len;
2727 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
2738 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
2740 b->ptr = b->end = b->ptr;
2749 PerlIOMmap_unmap(PerlIO *f)
2751 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2752 PerlIOBuf *b = &m->base;
2758 code = munmap(m->mptr, m->len);
2762 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
2765 b->ptr = b->end = b->buf;
2766 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2772 PerlIOMmap_get_base(PerlIO *f)
2774 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2775 PerlIOBuf *b = &m->base;
2776 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2778 /* Already have a readbuffer in progress */
2783 /* We have a write buffer or flushed PerlIOBuf read buffer */
2784 m->bbuf = b->buf; /* save it in case we need it again */
2785 b->buf = NULL; /* Clear to trigger below */
2789 PerlIOMmap_map(f); /* Try and map it */
2792 /* Map did not work - recover PerlIOBuf buffer if we have one */
2796 b->ptr = b->end = b->buf;
2799 return PerlIOBuf_get_base(f);
2803 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
2805 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2806 PerlIOBuf *b = &m->base;
2807 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2809 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
2812 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2817 /* Loose the unwritable mapped buffer */
2819 /* If flush took the "buffer" see if we have one from before */
2820 if (!b->buf && m->bbuf)
2824 PerlIOBuf_get_base(f);
2828 return PerlIOBuf_unread(f,vbuf,count);
2832 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
2834 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2835 PerlIOBuf *b = &m->base;
2836 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
2838 /* No, or wrong sort of, buffer */
2841 if (PerlIOMmap_unmap(f) != 0)
2844 /* If unmap took the "buffer" see if we have one from before */
2845 if (!b->buf && m->bbuf)
2849 PerlIOBuf_get_base(f);
2853 return PerlIOBuf_write(f,vbuf,count);
2857 PerlIOMmap_flush(PerlIO *f)
2859 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2860 PerlIOBuf *b = &m->base;
2861 IV code = PerlIOBuf_flush(f);
2862 /* Now we are "synced" at PerlIOBuf level */
2867 /* Unmap the buffer */
2868 if (PerlIOMmap_unmap(f) != 0)
2873 /* We seem to have a PerlIOBuf buffer which was not mapped
2874 * remember it in case we need one later
2883 PerlIOMmap_fill(PerlIO *f)
2885 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2886 IV code = PerlIO_flush(f);
2887 if (code == 0 && !b->buf)
2889 code = PerlIOMmap_map(f);
2891 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2893 code = PerlIOBuf_fill(f);
2899 PerlIOMmap_close(PerlIO *f)
2901 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2902 PerlIOBuf *b = &m->base;
2903 IV code = PerlIO_flush(f);
2908 b->ptr = b->end = b->buf;
2910 if (PerlIOBuf_close(f) != 0)
2916 PerlIO_funcs PerlIO_mmap = {
2936 PerlIOBase_clearerr,
2937 PerlIOBuf_setlinebuf,
2938 PerlIOMmap_get_base,
2942 PerlIOBuf_set_ptrcnt,
2945 #endif /* HAS_MMAP */
2952 atexit(&PerlIO_cleanup);
2961 PerlIO_stdstreams();
2965 #undef PerlIO_stdout
2970 PerlIO_stdstreams();
2974 #undef PerlIO_stderr
2979 PerlIO_stdstreams();
2983 /*--------------------------------------------------------------------------------------*/
2985 #undef PerlIO_getname
2987 PerlIO_getname(PerlIO *f, char *buf)
2990 Perl_croak(aTHX_ "Don't know how to get file name");
2995 /*--------------------------------------------------------------------------------------*/
2996 /* Functions which can be called on any kind of PerlIO implemented
3002 PerlIO_getc(PerlIO *f)
3005 SSize_t count = PerlIO_read(f,buf,1);
3008 return (unsigned char) buf[0];
3013 #undef PerlIO_ungetc
3015 PerlIO_ungetc(PerlIO *f, int ch)
3020 if (PerlIO_unread(f,&buf,1) == 1)
3028 PerlIO_putc(PerlIO *f, int ch)
3031 return PerlIO_write(f,&buf,1);
3036 PerlIO_puts(PerlIO *f, const char *s)
3038 STRLEN len = strlen(s);
3039 return PerlIO_write(f,s,len);
3042 #undef PerlIO_rewind
3044 PerlIO_rewind(PerlIO *f)
3046 PerlIO_seek(f,(Off_t)0,SEEK_SET);
3050 #undef PerlIO_vprintf
3052 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3055 SV *sv = newSVpvn("",0);
3060 Perl_va_copy(ap, apc);
3061 sv_vcatpvf(sv, fmt, &apc);
3063 sv_vcatpvf(sv, fmt, &ap);
3066 return PerlIO_write(f,s,len);
3069 #undef PerlIO_printf
3071 PerlIO_printf(PerlIO *f,const char *fmt,...)
3076 result = PerlIO_vprintf(f,fmt,ap);
3081 #undef PerlIO_stdoutf
3083 PerlIO_stdoutf(const char *fmt,...)
3088 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
3093 #undef PerlIO_tmpfile
3095 PerlIO_tmpfile(void)
3097 /* I have no idea how portable mkstemp() is ... */
3098 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
3101 FILE *stdio = PerlSIO_tmpfile();
3104 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(aTHX),&PerlIO_stdio,"w+"),PerlIOStdio);
3110 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
3111 int fd = mkstemp(SvPVX(sv));
3115 f = PerlIO_fdopen(fd,"w+");
3118 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
3120 PerlLIO_unlink(SvPVX(sv));
3130 #endif /* USE_SFIO */
3131 #endif /* PERLIO_IS_STDIO */
3133 /*======================================================================================*/
3134 /* Now some functions in terms of above which may be needed even if
3135 we are not in true PerlIO mode
3139 #undef PerlIO_setpos
3141 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
3143 return PerlIO_seek(f,*pos,0);
3146 #ifndef PERLIO_IS_STDIO
3147 #undef PerlIO_setpos
3149 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
3151 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3152 return fsetpos64(f, pos);
3154 return fsetpos(f, pos);
3161 #undef PerlIO_getpos
3163 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
3165 *pos = PerlIO_tell(f);
3166 return *pos == -1 ? -1 : 0;
3169 #ifndef PERLIO_IS_STDIO
3170 #undef PerlIO_getpos
3172 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
3174 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
3175 return fgetpos64(f, pos);
3177 return fgetpos(f, pos);
3183 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
3186 vprintf(char *pat, char *args)
3188 _doprnt(pat, args, stdout);
3189 return 0; /* wrong, but perl doesn't use the return value */
3193 vfprintf(FILE *fd, char *pat, char *args)
3195 _doprnt(pat, args, fd);
3196 return 0; /* wrong, but perl doesn't use the return value */
3201 #ifndef PerlIO_vsprintf
3203 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
3205 int val = vsprintf(s, fmt, ap);
3208 if (strlen(s) >= (STRLEN)n)
3211 (void)PerlIO_puts(Perl_error_log,
3212 "panic: sprintf overflow - memory corrupted!\n");
3220 #ifndef PerlIO_sprintf
3222 PerlIO_sprintf(char *s, int n, const char *fmt,...)
3227 result = PerlIO_vsprintf(s, n, fmt, ap);