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 iperlsys.h.
24 * Which these are depends on various Configure #ifdef's
28 #define PERL_IN_PERLIO_C
33 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
35 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
41 #if !defined(PERL_IMPLICIT_SYS)
43 #ifdef PERLIO_IS_STDIO
48 /* Does nothing (yet) except force this file to be included
49 in perl binary. That allows this file to force inclusion
50 of other functions that may be required by loadable
51 extensions e.g. for FileHandle::tmpfile
62 #else /* PERLIO_IS_STDIO */
69 /* This section is just to make sure these functions
70 get pulled in from libsfio.a
83 /* Force this file to be included in perl binary. Which allows
84 * this file to force inclusion of other functions that may be
85 * required by loadable extensions e.g. for FileHandle::tmpfile
89 * sfio does its own 'autoflush' on stdout in common cases.
90 * Flush results in a lot of lseek()s to regular files and
91 * lot of small writes to pipes.
93 sfset(sfstdout,SF_SHARE,0);
97 /*======================================================================================*/
98 /* Implement all the PerlIO interface ourselves.
103 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
108 #include <sys/mman.h>
113 void PerlIO_debug(char *fmt,...) __attribute__((format(__printf__,1,2)));
116 PerlIO_debug(char *fmt,...)
121 char *s = PerlEnv_getenv("PERLIO_DEBUG");
123 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
131 SV *sv = newSVpvn("",0);
135 s = CopFILE(PL_curcop);
138 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
139 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
142 PerlLIO_write(dbg,s,len);
148 /*--------------------------------------------------------------------------------------*/
150 /* Inner level routines */
152 /* Table of pointers to the PerlIO structs (malloc'ed) */
153 PerlIO *_perlio = NULL;
154 #define PERLIO_TABLE_SIZE 64
157 PerlIO_allocate(void)
159 /* Find a free slot in the table, allocating new table as necessary */
160 PerlIO **last = &_perlio;
165 last = (PerlIO **)(f);
166 for (i=1; i < PERLIO_TABLE_SIZE; i++)
174 Newz('I',f,PERLIO_TABLE_SIZE,PerlIO);
182 PerlIO_cleantable(PerlIO **tablep)
184 PerlIO *table = *tablep;
188 PerlIO_cleantable((PerlIO **) &(table[0]));
189 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
206 PerlIO_cleantable(&_perlio);
210 PerlIO_pop(PerlIO *f)
215 (*l->tab->Popped)(f);
221 /*--------------------------------------------------------------------------------------*/
222 /* XS Interface for perl code */
228 char *s = GvNAME(gv);
229 STRLEN l = GvNAMELEN(gv);
230 PerlIO_debug("%.*s\n",(int) l,s);
234 XS(XS_perlio_unimport)
238 char *s = GvNAME(gv);
239 STRLEN l = GvNAMELEN(gv);
240 PerlIO_debug("%.*s\n",(int) l,s);
245 PerlIO_find_layer(const char *name, STRLEN len)
252 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
253 if (svp && (sv = *svp) && SvROK(sv))
260 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
264 IO *io = GvIOn((GV *)SvRV(sv));
265 PerlIO *ifp = IoIFP(io);
266 PerlIO *ofp = IoOFP(io);
267 AV *av = (AV *) mg->mg_obj;
268 Perl_warn(aTHX_ "set %_ %p %p %p",sv,io,ifp,ofp);
274 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
278 IO *io = GvIOn((GV *)SvRV(sv));
279 PerlIO *ifp = IoIFP(io);
280 PerlIO *ofp = IoOFP(io);
281 AV *av = (AV *) mg->mg_obj;
282 Perl_warn(aTHX_ "get %_ %p %p %p",sv,io,ifp,ofp);
288 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
290 Perl_warn(aTHX_ "clear %_",sv);
295 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
297 Perl_warn(aTHX_ "free %_",sv);
301 MGVTBL perlio_vtab = {
309 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
312 SV *sv = SvRV(ST(1));
317 sv_magic(sv, (SV *)av, '~', NULL, 0);
319 mg = mg_find(sv,'~');
320 mg->mg_virtual = &perlio_vtab;
322 Perl_warn(aTHX_ "attrib %_",sv);
323 for (i=2; i < items; i++)
326 const char *name = SvPV(ST(i),len);
327 SV *layer = PerlIO_find_layer(name,len);
330 av_push(av,SvREFCNT_inc(layer));
343 PerlIO_define_layer(PerlIO_funcs *tab)
346 HV *stash = gv_stashpv("perlio::Layer", TRUE);
347 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
348 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
352 PerlIO_default_layer(I32 n)
357 PerlIO_funcs *tab = &PerlIO_stdio;
359 if (!PerlIO_layer_hv)
361 const char *s = PerlEnv_getenv("PERLIO");
362 newXS("perlio::import",XS_perlio_import,__FILE__);
363 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
365 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
367 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
368 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
369 PerlIO_define_layer(&PerlIO_unix);
370 PerlIO_define_layer(&PerlIO_perlio);
371 PerlIO_define_layer(&PerlIO_stdio);
373 PerlIO_define_layer(&PerlIO_mmap);
375 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
380 while (*s && isSPACE((unsigned char)*s))
386 while (*e && !isSPACE((unsigned char)*e))
390 layer = PerlIO_find_layer(s,e-s);
393 PerlIO_debug("Pushing %.*s\n",(e-s),s);
394 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
397 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
403 len = av_len(PerlIO_layer_av);
406 if (PerlIO_stdio.Set_ptrcnt)
408 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0)));
412 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0)));
414 len = av_len(PerlIO_layer_av);
418 svp = av_fetch(PerlIO_layer_av,n,0);
419 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
421 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
423 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
428 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
432 const char *s = names;
442 while (*e && *e != ':' && !isSPACE(*e))
446 SV *layer = PerlIO_find_layer(s,e-s);
449 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
452 PerlIO *new = PerlIO_push(f,tab,mode);
458 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
467 #define PerlIO_default_top() PerlIO_default_layer(-1)
468 #define PerlIO_default_btm() PerlIO_default_layer(0)
476 PerlIO_fdopen(0,"Ir");
477 PerlIO_fdopen(1,"Iw");
478 PerlIO_fdopen(2,"Iw");
483 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
486 Newc('L',l,tab->size,char,PerlIOl);
489 Zero(l,tab->size,char);
493 if ((*l->tab->Pushed)(f,mode) != 0)
502 /*--------------------------------------------------------------------------------------*/
503 /* Given the abstraction above the public API functions */
507 PerlIO_close(PerlIO *f)
509 int code = (*PerlIOBase(f)->tab->Close)(f);
519 PerlIO_fileno(PerlIO *f)
521 return (*PerlIOBase(f)->tab->Fileno)(f);
528 PerlIO_fdopen(int fd, const char *mode)
530 PerlIO_funcs *tab = PerlIO_default_top();
533 return (*tab->Fdopen)(tab,fd,mode);
538 PerlIO_open(const char *path, const char *mode)
540 PerlIO_funcs *tab = PerlIO_default_top();
543 return (*tab->Open)(tab,path,mode);
548 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
553 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
555 if ((*PerlIOBase(f)->tab->Pushed)(f,mode) == 0)
561 return PerlIO_open(path,mode);
566 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
568 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
573 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
575 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
580 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
582 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
587 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
589 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
594 PerlIO_tell(PerlIO *f)
596 return (*PerlIOBase(f)->tab->Tell)(f);
601 PerlIO_flush(PerlIO *f)
605 return (*PerlIOBase(f)->tab->Flush)(f);
609 PerlIO **table = &_perlio;
614 table = (PerlIO **)(f++);
615 for (i=1; i < PERLIO_TABLE_SIZE; i++)
617 if (*f && PerlIO_flush(f) != 0)
628 PerlIO_fill(PerlIO *f)
630 return (*PerlIOBase(f)->tab->Fill)(f);
635 PerlIO_isutf8(PerlIO *f)
637 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
642 PerlIO_eof(PerlIO *f)
644 return (*PerlIOBase(f)->tab->Eof)(f);
649 PerlIO_error(PerlIO *f)
651 return (*PerlIOBase(f)->tab->Error)(f);
654 #undef PerlIO_clearerr
656 PerlIO_clearerr(PerlIO *f)
658 (*PerlIOBase(f)->tab->Clearerr)(f);
661 #undef PerlIO_setlinebuf
663 PerlIO_setlinebuf(PerlIO *f)
665 (*PerlIOBase(f)->tab->Setlinebuf)(f);
668 #undef PerlIO_has_base
670 PerlIO_has_base(PerlIO *f)
674 return (PerlIOBase(f)->tab->Get_base != NULL);
679 #undef PerlIO_fast_gets
681 PerlIO_fast_gets(PerlIO *f)
685 PerlIOl *l = PerlIOBase(f);
686 return (l->tab->Set_ptrcnt != NULL);
691 #undef PerlIO_has_cntptr
693 PerlIO_has_cntptr(PerlIO *f)
697 PerlIO_funcs *tab = PerlIOBase(f)->tab;
698 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
703 #undef PerlIO_canset_cnt
705 PerlIO_canset_cnt(PerlIO *f)
709 PerlIOl *l = PerlIOBase(f);
710 return (l->tab->Set_ptrcnt != NULL);
715 #undef PerlIO_get_base
717 PerlIO_get_base(PerlIO *f)
719 return (*PerlIOBase(f)->tab->Get_base)(f);
722 #undef PerlIO_get_bufsiz
724 PerlIO_get_bufsiz(PerlIO *f)
726 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
729 #undef PerlIO_get_ptr
731 PerlIO_get_ptr(PerlIO *f)
733 return (*PerlIOBase(f)->tab->Get_ptr)(f);
736 #undef PerlIO_get_cnt
738 PerlIO_get_cnt(PerlIO *f)
740 return (*PerlIOBase(f)->tab->Get_cnt)(f);
743 #undef PerlIO_set_cnt
745 PerlIO_set_cnt(PerlIO *f,int cnt)
747 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
750 #undef PerlIO_set_ptrcnt
752 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
754 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
757 /*--------------------------------------------------------------------------------------*/
758 /* "Methods" of the "base class" */
761 PerlIOBase_fileno(PerlIO *f)
763 return PerlIO_fileno(PerlIONext(f));
767 PerlIOBase_pushed(PerlIO *f, const char *mode)
769 PerlIOl *l = PerlIOBase(f);
770 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
771 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
777 l->flags = PERLIO_F_CANREAD;
780 l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE;
783 l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
794 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
797 l->flags |= PERLIO_F_BINARY;
809 l->flags |= l->next->flags &
810 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
811 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
818 PerlIOBase_popped(PerlIO *f)
824 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
826 Off_t old = PerlIO_tell(f);
827 if (PerlIO_seek(f,-((Off_t)count),SEEK_CUR) == 0)
829 Off_t new = PerlIO_tell(f);
836 PerlIOBase_noop_ok(PerlIO *f)
842 PerlIOBase_noop_fail(PerlIO *f)
848 PerlIOBase_close(PerlIO *f)
851 if (PerlIO_flush(f) != 0)
853 if (PerlIO_close(PerlIONext(f)) != 0)
855 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
860 PerlIOBase_eof(PerlIO *f)
864 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
870 PerlIOBase_error(PerlIO *f)
874 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
880 PerlIOBase_clearerr(PerlIO *f)
884 PerlIOBase(f)->flags &= ~PERLIO_F_ERROR;
889 PerlIOBase_setlinebuf(PerlIO *f)
894 /*--------------------------------------------------------------------------------------*/
895 /* Bottom-most level for UNIX-like case */
899 struct _PerlIO base; /* The generic part */
900 int fd; /* UNIX like file descriptor */
901 int oflags; /* open/fcntl flags */
905 PerlIOUnix_oflags(const char *mode)
920 oflags = O_CREAT|O_TRUNC;
931 oflags = O_CREAT|O_APPEND;
941 if (*mode || oflags == -1)
950 PerlIOUnix_fileno(PerlIO *f)
952 return PerlIOSelf(f,PerlIOUnix)->fd;
956 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
963 int oflags = PerlIOUnix_oflags(mode);
966 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
969 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
976 PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
979 int oflags = PerlIOUnix_oflags(mode);
982 int fd = PerlLIO_open3(path,oflags,0666);
985 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
988 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
995 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
997 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
998 int oflags = PerlIOUnix_oflags(mode);
999 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1000 (*PerlIOBase(f)->tab->Close)(f);
1003 int fd = PerlLIO_open3(path,oflags,0666);
1008 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1016 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1018 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1019 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1023 SSize_t len = PerlLIO_read(fd,vbuf,count);
1024 if (len >= 0 || errno != EINTR)
1027 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1028 else if (len == 0 && count != 0)
1029 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1036 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1038 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1041 SSize_t len = PerlLIO_write(fd,vbuf,count);
1042 if (len >= 0 || errno != EINTR)
1045 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1052 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1054 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1055 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1056 return (new == (Off_t) -1) ? -1 : 0;
1060 PerlIOUnix_tell(PerlIO *f)
1062 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1066 PerlIOUnix_close(PerlIO *f)
1068 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1070 while (PerlLIO_close(fd) != 0)
1080 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1085 PerlIO_funcs PerlIO_unix = {
1101 PerlIOBase_noop_ok, /* flush */
1102 PerlIOBase_noop_fail, /* fill */
1105 PerlIOBase_clearerr,
1106 PerlIOBase_setlinebuf,
1107 NULL, /* get_base */
1108 NULL, /* get_bufsiz */
1111 NULL, /* set_ptrcnt */
1114 /*--------------------------------------------------------------------------------------*/
1115 /* stdio as a layer */
1119 struct _PerlIO base;
1120 FILE * stdio; /* The stream */
1124 PerlIOStdio_fileno(PerlIO *f)
1126 return fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1131 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1159 stdio = fdopen(fd,mode);
1162 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1169 #undef PerlIO_importFILE
1171 PerlIO_importFILE(FILE *stdio, int fl)
1176 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"r+"),PerlIOStdio);
1183 PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode)
1186 FILE *stdio = fopen(path,mode);
1189 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1196 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
1198 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1199 FILE *stdio = freopen(path,mode,s->stdio);
1207 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1209 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1213 STDCHAR *buf = (STDCHAR *) vbuf;
1214 /* Perl is expecting PerlIO_getc() to fill the buffer
1215 * Linux's stdio does not do that for fread()
1225 got = fread(vbuf,1,count,s);
1230 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1232 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1233 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1237 int ch = *buf-- & 0xff;
1238 if (ungetc(ch,s) != ch)
1247 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1249 return fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1253 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1255 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1256 return fseek(stdio,offset,whence);
1260 PerlIOStdio_tell(PerlIO *f)
1262 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1263 return ftell(stdio);
1267 PerlIOStdio_close(PerlIO *f)
1269 return fclose(PerlIOSelf(f,PerlIOStdio)->stdio);
1273 PerlIOStdio_flush(PerlIO *f)
1275 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1276 return fflush(stdio);
1280 PerlIOStdio_fill(PerlIO *f)
1282 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1284 if (fflush(stdio) != 0)
1287 if (c == EOF || ungetc(c,stdio) != c)
1293 PerlIOStdio_eof(PerlIO *f)
1295 return feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1299 PerlIOStdio_error(PerlIO *f)
1301 return ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1305 PerlIOStdio_clearerr(PerlIO *f)
1307 clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1311 PerlIOStdio_setlinebuf(PerlIO *f)
1313 #ifdef HAS_SETLINEBUF
1314 setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1316 setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1322 PerlIOStdio_get_base(PerlIO *f)
1324 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1325 return FILE_base(stdio);
1329 PerlIOStdio_get_bufsiz(PerlIO *f)
1331 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1332 return FILE_bufsiz(stdio);
1336 #ifdef USE_STDIO_PTR
1338 PerlIOStdio_get_ptr(PerlIO *f)
1340 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1341 return FILE_ptr(stdio);
1345 PerlIOStdio_get_cnt(PerlIO *f)
1347 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1348 return FILE_cnt(stdio);
1352 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1354 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1357 #ifdef STDIO_PTR_LVALUE
1358 FILE_ptr(stdio) = ptr;
1359 #ifdef STDIO_PTR_LVAL_SETS_CNT
1360 if (FILE_cnt(stdio) != (cnt))
1363 assert(FILE_cnt(stdio) == (cnt));
1366 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1367 /* Setting ptr _does_ change cnt - we are done */
1370 #else /* STDIO_PTR_LVALUE */
1372 #endif /* STDIO_PTR_LVALUE */
1374 /* Now (or only) set cnt */
1375 #ifdef STDIO_CNT_LVALUE
1376 FILE_cnt(stdio) = cnt;
1377 #else /* STDIO_CNT_LVALUE */
1378 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1379 FILE_ptr(stdio) = FILE_ptr(stdio)+(FILE_cnt(stdio)-cnt);
1380 #else /* STDIO_PTR_LVAL_SETS_CNT */
1382 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1383 #endif /* STDIO_CNT_LVALUE */
1388 PerlIO_funcs PerlIO_stdio = {
1390 sizeof(PerlIOStdio),
1408 PerlIOStdio_clearerr,
1409 PerlIOStdio_setlinebuf,
1411 PerlIOStdio_get_base,
1412 PerlIOStdio_get_bufsiz,
1417 #ifdef USE_STDIO_PTR
1418 PerlIOStdio_get_ptr,
1419 PerlIOStdio_get_cnt,
1420 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1421 PerlIOStdio_set_ptrcnt
1422 #else /* STDIO_PTR_LVALUE */
1424 #endif /* STDIO_PTR_LVALUE */
1425 #else /* USE_STDIO_PTR */
1429 #endif /* USE_STDIO_PTR */
1432 #undef PerlIO_exportFILE
1434 PerlIO_exportFILE(PerlIO *f, int fl)
1437 /* Should really push stdio discipline when we have them */
1438 return fdopen(PerlIO_fileno(f),"r+");
1441 #undef PerlIO_findFILE
1443 PerlIO_findFILE(PerlIO *f)
1445 return PerlIO_exportFILE(f,0);
1448 #undef PerlIO_releaseFILE
1450 PerlIO_releaseFILE(PerlIO *p, FILE *f)
1454 /*--------------------------------------------------------------------------------------*/
1455 /* perlio buffer layer */
1458 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
1460 PerlIO_funcs *tab = PerlIO_default_btm();
1468 f = (*tab->Fdopen)(tab,fd,mode);
1471 /* Initial stderr is unbuffered */
1472 if (!init || fd != 2)
1474 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
1475 b->posn = PerlIO_tell(PerlIONext(f));
1482 PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
1484 PerlIO_funcs *tab = PerlIO_default_btm();
1485 PerlIO *f = (*tab->Open)(tab,path,mode);
1488 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
1489 b->posn = PerlIO_tell(PerlIONext(f));
1495 PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
1497 PerlIO *next = PerlIONext(f);
1498 int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
1500 code = (*PerlIOBase(f)->tab->Pushed)(f,mode);
1503 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1504 b->posn = PerlIO_tell(PerlIONext(f));
1509 /* This "flush" is akin to sfio's sync in that it handles files in either
1513 PerlIOBuf_flush(PerlIO *f)
1515 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1517 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1519 /* write() the buffer */
1520 STDCHAR *p = b->buf;
1524 count = PerlIO_write(PerlIONext(f),p,b->ptr - p);
1531 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1536 b->posn += (p - b->buf);
1538 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1540 /* Note position change */
1541 b->posn += (b->ptr - b->buf);
1542 if (b->ptr < b->end)
1544 /* We did not consume all of it */
1545 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
1547 b->posn = PerlIO_tell(PerlIONext(f));
1551 b->ptr = b->end = b->buf;
1552 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1553 if (PerlIO_flush(PerlIONext(f)) != 0)
1559 PerlIOBuf_fill(PerlIO *f)
1561 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1563 if (PerlIO_flush(f) != 0)
1565 b->ptr = b->end = b->buf;
1566 avail = PerlIO_read(PerlIONext(f),b->ptr,b->bufsiz);
1570 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1572 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1575 b->end = b->buf+avail;
1576 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1581 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
1583 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1584 STDCHAR *buf = (STDCHAR *) vbuf;
1590 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1594 SSize_t avail = (b->end - b->ptr);
1595 if ((SSize_t) count < avail)
1599 Copy(b->ptr,buf,avail,char);
1605 if (count && (b->ptr >= b->end))
1607 if (PerlIO_fill(f) != 0)
1617 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
1619 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1620 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1623 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1629 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1631 avail = (b->ptr - b->buf);
1632 if (avail > (SSize_t) count)
1639 if (avail > (SSize_t) count)
1641 b->end = b->ptr + avail;
1648 Copy(buf,b->ptr,avail,char);
1652 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
1659 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
1661 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1662 const STDCHAR *buf = (const STDCHAR *) vbuf;
1666 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1670 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
1671 if ((SSize_t) count < avail)
1673 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
1674 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
1694 Copy(buf,b->ptr,avail,char);
1701 if (b->ptr >= (b->buf + b->bufsiz))
1708 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
1710 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1711 int code = PerlIO_flush(f);
1714 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1715 code = PerlIO_seek(PerlIONext(f),offset,whence);
1718 b->posn = PerlIO_tell(PerlIONext(f));
1725 PerlIOBuf_tell(PerlIO *f)
1727 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1728 Off_t posn = b->posn;
1730 posn += (b->ptr - b->buf);
1735 PerlIOBuf_close(PerlIO *f)
1737 IV code = PerlIOBase_close(f);
1738 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1739 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
1744 b->ptr = b->end = b->buf;
1745 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1750 PerlIOBuf_setlinebuf(PerlIO *f)
1754 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
1759 PerlIOBuf_get_ptr(PerlIO *f)
1761 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1768 PerlIOBuf_get_cnt(PerlIO *f)
1770 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1773 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1774 return (b->end - b->ptr);
1779 PerlIOBuf_get_base(PerlIO *f)
1781 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1786 New('B',b->buf,b->bufsiz,STDCHAR);
1789 b->buf = (STDCHAR *)&b->oneword;
1790 b->bufsiz = sizeof(b->oneword);
1799 PerlIOBuf_bufsiz(PerlIO *f)
1801 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1804 return (b->end - b->buf);
1808 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
1810 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1814 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
1817 assert(PerlIO_get_cnt(f) == cnt);
1818 assert(b->ptr >= b->buf);
1820 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1823 PerlIO_funcs PerlIO_perlio = {
1843 PerlIOBase_clearerr,
1844 PerlIOBuf_setlinebuf,
1849 PerlIOBuf_set_ptrcnt,
1853 /*--------------------------------------------------------------------------------------*/
1854 /* mmap as "buffer" layer */
1858 PerlIOBuf base; /* PerlIOBuf stuff */
1859 Mmap_t mptr; /* Mapped address */
1860 Size_t len; /* mapped length */
1861 STDCHAR *bbuf; /* malloced buffer if map fails */
1865 static size_t page_size = 0;
1868 PerlIOMmap_map(PerlIO *f)
1871 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
1872 PerlIOBuf *b = &m->base;
1873 IV flags = PerlIOBase(f)->flags;
1877 if (flags & PERLIO_F_CANREAD)
1879 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1880 int fd = PerlIO_fileno(f);
1882 code = fstat(fd,&st);
1883 if (code == 0 && S_ISREG(st.st_mode))
1885 SSize_t len = st.st_size - b->posn;
1890 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
1892 SETERRNO(0,SS$_NORMAL);
1893 # ifdef _SC_PAGESIZE
1894 page_size = sysconf(_SC_PAGESIZE);
1896 page_size = sysconf(_SC_PAGE_SIZE);
1898 if ((long)page_size < 0) {
1903 (void)SvUPGRADE(error, SVt_PV);
1904 msg = SvPVx(error, n_a);
1905 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
1908 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
1912 # ifdef HAS_GETPAGESIZE
1913 page_size = getpagesize();
1915 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
1916 page_size = PAGESIZE; /* compiletime, bad */
1920 if ((IV)page_size <= 0)
1921 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
1925 /* This is a hack - should never happen - open should have set it ! */
1926 b->posn = PerlIO_tell(PerlIONext(f));
1928 posn = (b->posn / page_size) * page_size;
1929 len = st.st_size - posn;
1930 m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn);
1931 if (m->mptr && m->mptr != (Mmap_t) -1)
1933 #if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
1934 madvise(m->mptr, len, MADV_SEQUENTIAL);
1936 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
1937 b->end = ((STDCHAR *)m->mptr) + len;
1938 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
1949 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
1951 b->ptr = b->end = b->ptr;
1960 PerlIOMmap_unmap(PerlIO *f)
1962 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
1963 PerlIOBuf *b = &m->base;
1969 code = munmap(m->mptr, m->len);
1973 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
1976 b->ptr = b->end = b->buf;
1977 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1983 PerlIOMmap_get_base(PerlIO *f)
1985 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
1986 PerlIOBuf *b = &m->base;
1987 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
1989 /* Already have a readbuffer in progress */
1994 /* We have a write buffer or flushed PerlIOBuf read buffer */
1995 m->bbuf = b->buf; /* save it in case we need it again */
1996 b->buf = NULL; /* Clear to trigger below */
2000 PerlIOMmap_map(f); /* Try and map it */
2003 /* Map did not work - recover PerlIOBuf buffer if we have one */
2007 b->ptr = b->end = b->buf;
2010 return PerlIOBuf_get_base(f);
2014 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
2016 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2017 PerlIOBuf *b = &m->base;
2018 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2020 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
2023 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2028 /* Loose the unwritable mapped buffer */
2030 /* If flush took the "buffer" see if we have one from before */
2031 if (!b->buf && m->bbuf)
2035 PerlIOBuf_get_base(f);
2039 return PerlIOBuf_unread(f,vbuf,count);
2043 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
2045 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2046 PerlIOBuf *b = &m->base;
2047 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
2049 /* No, or wrong sort of, buffer */
2052 if (PerlIOMmap_unmap(f) != 0)
2055 /* If unmap took the "buffer" see if we have one from before */
2056 if (!b->buf && m->bbuf)
2060 PerlIOBuf_get_base(f);
2064 return PerlIOBuf_write(f,vbuf,count);
2068 PerlIOMmap_flush(PerlIO *f)
2070 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2071 PerlIOBuf *b = &m->base;
2072 IV code = PerlIOBuf_flush(f);
2073 /* Now we are "synced" at PerlIOBuf level */
2078 /* Unmap the buffer */
2079 if (PerlIOMmap_unmap(f) != 0)
2084 /* We seem to have a PerlIOBuf buffer which was not mapped
2085 * remember it in case we need one later
2094 PerlIOMmap_fill(PerlIO *f)
2096 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2097 IV code = PerlIO_flush(f);
2098 if (code == 0 && !b->buf)
2100 code = PerlIOMmap_map(f);
2102 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2104 code = PerlIOBuf_fill(f);
2110 PerlIOMmap_close(PerlIO *f)
2112 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2113 PerlIOBuf *b = &m->base;
2114 IV code = PerlIO_flush(f);
2119 b->ptr = b->end = b->buf;
2121 if (PerlIOBuf_close(f) != 0)
2127 PerlIO_funcs PerlIO_mmap = {
2147 PerlIOBase_clearerr,
2148 PerlIOBuf_setlinebuf,
2149 PerlIOMmap_get_base,
2153 PerlIOBuf_set_ptrcnt,
2156 #endif /* HAS_MMAP */
2163 atexit(&PerlIO_cleanup);
2172 PerlIO_stdstreams();
2176 #undef PerlIO_stdout
2181 PerlIO_stdstreams();
2185 #undef PerlIO_stderr
2190 PerlIO_stdstreams();
2194 /*--------------------------------------------------------------------------------------*/
2196 #undef PerlIO_getname
2198 PerlIO_getname(PerlIO *f, char *buf)
2201 Perl_croak(aTHX_ "Don't know how to get file name");
2206 /*--------------------------------------------------------------------------------------*/
2207 /* Functions which can be called on any kind of PerlIO implemented
2213 PerlIO_getc(PerlIO *f)
2216 SSize_t count = PerlIO_read(f,buf,1);
2219 return (unsigned char) buf[0];
2224 #undef PerlIO_ungetc
2226 PerlIO_ungetc(PerlIO *f, int ch)
2231 if (PerlIO_unread(f,&buf,1) == 1)
2239 PerlIO_putc(PerlIO *f, int ch)
2242 return PerlIO_write(f,&buf,1);
2247 PerlIO_puts(PerlIO *f, const char *s)
2249 STRLEN len = strlen(s);
2250 return PerlIO_write(f,s,len);
2253 #undef PerlIO_rewind
2255 PerlIO_rewind(PerlIO *f)
2257 PerlIO_seek(f,(Off_t)0,SEEK_SET);
2261 #undef PerlIO_vprintf
2263 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
2266 SV *sv = newSVpvn("",0);
2269 sv_vcatpvf(sv, fmt, &ap);
2271 return PerlIO_write(f,s,len);
2274 #undef PerlIO_printf
2276 PerlIO_printf(PerlIO *f,const char *fmt,...)
2281 result = PerlIO_vprintf(f,fmt,ap);
2286 #undef PerlIO_stdoutf
2288 PerlIO_stdoutf(const char *fmt,...)
2293 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
2298 #undef PerlIO_tmpfile
2300 PerlIO_tmpfile(void)
2303 /* I have no idea how portable mkstemp() is ... */
2304 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
2305 int fd = mkstemp(SvPVX(sv));
2309 f = PerlIO_fdopen(fd,"w+");
2312 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
2314 PerlLIO_unlink(SvPVX(sv));
2323 #endif /* USE_SFIO */
2324 #endif /* PERLIO_IS_STDIO */
2326 /*======================================================================================*/
2327 /* Now some functions in terms of above which may be needed even if
2328 we are not in true PerlIO mode
2332 #undef PerlIO_setpos
2334 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2336 return PerlIO_seek(f,*pos,0);
2339 #ifndef PERLIO_IS_STDIO
2340 #undef PerlIO_setpos
2342 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2344 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2345 return fsetpos64(f, pos);
2347 return fsetpos(f, pos);
2354 #undef PerlIO_getpos
2356 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2358 *pos = PerlIO_tell(f);
2359 return *pos == -1 ? -1 : 0;
2362 #ifndef PERLIO_IS_STDIO
2363 #undef PerlIO_getpos
2365 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2367 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2368 return fgetpos64(f, pos);
2370 return fgetpos(f, pos);
2376 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
2379 vprintf(char *pat, char *args)
2381 _doprnt(pat, args, stdout);
2382 return 0; /* wrong, but perl doesn't use the return value */
2386 vfprintf(FILE *fd, char *pat, char *args)
2388 _doprnt(pat, args, fd);
2389 return 0; /* wrong, but perl doesn't use the return value */
2394 #ifndef PerlIO_vsprintf
2396 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
2398 int val = vsprintf(s, fmt, ap);
2401 if (strlen(s) >= (STRLEN)n)
2404 (void)PerlIO_puts(Perl_error_log,
2405 "panic: sprintf overflow - memory corrupted!\n");
2413 #ifndef PerlIO_sprintf
2415 PerlIO_sprintf(char *s, int n, const char *fmt,...)
2420 result = PerlIO_vsprintf(s, n, fmt, ap);
2426 #endif /* !PERL_IMPLICIT_SYS */