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
33 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
35 if (!names || !*names || strEQ(names,":crlf") || strEQ(names,":raw"))
39 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl",names);
45 #if !defined(PERL_IMPLICIT_SYS)
47 #ifdef PERLIO_IS_STDIO
52 /* Does nothing (yet) except force this file to be included
53 in perl binary. That allows this file to force inclusion
54 of other functions that may be required by loadable
55 extensions e.g. for FileHandle::tmpfile
66 #else /* PERLIO_IS_STDIO */
73 /* This section is just to make sure these functions
74 get pulled in from libsfio.a
87 /* Force this file to be included in perl binary. Which allows
88 * this file to force inclusion of other functions that may be
89 * required by loadable extensions e.g. for FileHandle::tmpfile
93 * sfio does its own 'autoflush' on stdout in common cases.
94 * Flush results in a lot of lseek()s to regular files and
95 * lot of small writes to pipes.
97 sfset(sfstdout,SF_SHARE,0);
101 /*======================================================================================*/
102 /* Implement all the PerlIO interface ourselves.
107 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
112 #include <sys/mman.h>
117 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
120 PerlIO_debug(const char *fmt,...)
127 char *s = PerlEnv_getenv("PERLIO_DEBUG");
129 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
136 SV *sv = newSVpvn("",0);
139 s = CopFILE(PL_curcop);
142 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
143 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
146 PerlLIO_write(dbg,s,len);
152 /*--------------------------------------------------------------------------------------*/
154 /* Inner level routines */
156 /* Table of pointers to the PerlIO structs (malloc'ed) */
157 PerlIO *_perlio = NULL;
158 #define PERLIO_TABLE_SIZE 64
161 PerlIO_allocate(void)
163 /* Find a free slot in the table, allocating new table as necessary */
164 PerlIO **last = &_perlio;
169 last = (PerlIO **)(f);
170 for (i=1; i < PERLIO_TABLE_SIZE; i++)
178 Newz('I',f,PERLIO_TABLE_SIZE,PerlIO);
186 PerlIO_cleantable(PerlIO **tablep)
188 PerlIO *table = *tablep;
192 PerlIO_cleantable((PerlIO **) &(table[0]));
193 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
212 PerlIO_cleantable(&_perlio);
216 PerlIO_pop(PerlIO *f)
221 (*l->tab->Popped)(f);
227 /*--------------------------------------------------------------------------------------*/
228 /* XS Interface for perl code */
234 char *s = GvNAME(gv);
235 STRLEN l = GvNAMELEN(gv);
236 PerlIO_debug("%.*s\n",(int) l,s);
240 XS(XS_perlio_unimport)
244 char *s = GvNAME(gv);
245 STRLEN l = GvNAMELEN(gv);
246 PerlIO_debug("%.*s\n",(int) l,s);
251 PerlIO_find_layer(const char *name, STRLEN len)
258 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
259 if (svp && (sv = *svp) && SvROK(sv))
266 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
270 IO *io = GvIOn((GV *)SvRV(sv));
271 PerlIO *ifp = IoIFP(io);
272 PerlIO *ofp = IoOFP(io);
273 AV *av = (AV *) mg->mg_obj;
274 Perl_warn(aTHX_ "set %_ %p %p %p",sv,io,ifp,ofp);
280 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
284 IO *io = GvIOn((GV *)SvRV(sv));
285 PerlIO *ifp = IoIFP(io);
286 PerlIO *ofp = IoOFP(io);
287 AV *av = (AV *) mg->mg_obj;
288 Perl_warn(aTHX_ "get %_ %p %p %p",sv,io,ifp,ofp);
294 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
296 Perl_warn(aTHX_ "clear %_",sv);
301 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
303 Perl_warn(aTHX_ "free %_",sv);
307 MGVTBL perlio_vtab = {
315 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
318 SV *sv = SvRV(ST(1));
323 sv_magic(sv, (SV *)av, '~', NULL, 0);
325 mg = mg_find(sv,'~');
326 mg->mg_virtual = &perlio_vtab;
328 Perl_warn(aTHX_ "attrib %_",sv);
329 for (i=2; i < items; i++)
332 const char *name = SvPV(ST(i),len);
333 SV *layer = PerlIO_find_layer(name,len);
336 av_push(av,SvREFCNT_inc(layer));
349 PerlIO_define_layer(PerlIO_funcs *tab)
352 HV *stash = gv_stashpv("perlio::Layer", TRUE);
353 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
354 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
358 PerlIO_default_layer(I32 n)
363 PerlIO_funcs *tab = &PerlIO_stdio;
365 if (!PerlIO_layer_hv)
367 const char *s = PerlEnv_getenv("PERLIO");
368 newXS("perlio::import",XS_perlio_import,__FILE__);
369 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
371 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
373 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
374 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
375 PerlIO_define_layer(&PerlIO_unix);
376 PerlIO_define_layer(&PerlIO_perlio);
377 PerlIO_define_layer(&PerlIO_stdio);
378 PerlIO_define_layer(&PerlIO_crlf);
380 PerlIO_define_layer(&PerlIO_mmap);
382 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
387 while (*s && isSPACE((unsigned char)*s))
393 while (*e && !isSPACE((unsigned char)*e))
397 layer = PerlIO_find_layer(s,e-s);
400 PerlIO_debug("Pushing %.*s\n",(e-s),s);
401 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
404 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
410 len = av_len(PerlIO_layer_av);
413 if (PerlIO_stdio.Set_ptrcnt)
415 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0)));
419 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0)));
421 len = av_len(PerlIO_layer_av);
425 svp = av_fetch(PerlIO_layer_av,n,0);
426 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
428 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
430 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
435 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
439 const char *s = names;
449 while (*e && *e != ':' && !isSPACE(*e))
453 SV *layer = PerlIO_find_layer(s,e-s);
456 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
459 PerlIO *new = PerlIO_push(f,tab,mode);
465 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
474 #define PerlIO_default_top() PerlIO_default_layer(-1)
475 #define PerlIO_default_btm() PerlIO_default_layer(0)
483 PerlIO_fdopen(0,"Ir");
484 PerlIO_fdopen(1,"Iw");
485 PerlIO_fdopen(2,"Iw");
490 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
493 Newc('L',l,tab->size,char,PerlIOl);
496 Zero(l,tab->size,char);
500 if ((*l->tab->Pushed)(f,mode) != 0)
509 /*--------------------------------------------------------------------------------------*/
510 /* Given the abstraction above the public API functions */
514 PerlIO_close(PerlIO *f)
516 int code = (*PerlIOBase(f)->tab->Close)(f);
526 PerlIO_fileno(PerlIO *f)
528 return (*PerlIOBase(f)->tab->Fileno)(f);
535 PerlIO_fdopen(int fd, const char *mode)
537 PerlIO_funcs *tab = PerlIO_default_top();
540 return (*tab->Fdopen)(tab,fd,mode);
545 PerlIO_open(const char *path, const char *mode)
547 PerlIO_funcs *tab = PerlIO_default_top();
550 return (*tab->Open)(tab,path,mode);
555 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
560 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
562 if ((*PerlIOBase(f)->tab->Pushed)(f,mode) == 0)
568 return PerlIO_open(path,mode);
573 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
575 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
580 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
582 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
587 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
589 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
594 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
596 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
601 PerlIO_tell(PerlIO *f)
603 return (*PerlIOBase(f)->tab->Tell)(f);
608 PerlIO_flush(PerlIO *f)
612 return (*PerlIOBase(f)->tab->Flush)(f);
616 PerlIO **table = &_perlio;
621 table = (PerlIO **)(f++);
622 for (i=1; i < PERLIO_TABLE_SIZE; i++)
624 if (*f && PerlIO_flush(f) != 0)
635 PerlIO_fill(PerlIO *f)
637 return (*PerlIOBase(f)->tab->Fill)(f);
642 PerlIO_isutf8(PerlIO *f)
644 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
649 PerlIO_eof(PerlIO *f)
651 return (*PerlIOBase(f)->tab->Eof)(f);
656 PerlIO_error(PerlIO *f)
658 return (*PerlIOBase(f)->tab->Error)(f);
661 #undef PerlIO_clearerr
663 PerlIO_clearerr(PerlIO *f)
665 (*PerlIOBase(f)->tab->Clearerr)(f);
668 #undef PerlIO_setlinebuf
670 PerlIO_setlinebuf(PerlIO *f)
672 (*PerlIOBase(f)->tab->Setlinebuf)(f);
675 #undef PerlIO_has_base
677 PerlIO_has_base(PerlIO *f)
681 return (PerlIOBase(f)->tab->Get_base != NULL);
686 #undef PerlIO_fast_gets
688 PerlIO_fast_gets(PerlIO *f)
692 PerlIOl *l = PerlIOBase(f);
693 return (l->tab->Set_ptrcnt != NULL);
698 #undef PerlIO_has_cntptr
700 PerlIO_has_cntptr(PerlIO *f)
704 PerlIO_funcs *tab = PerlIOBase(f)->tab;
705 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
710 #undef PerlIO_canset_cnt
712 PerlIO_canset_cnt(PerlIO *f)
716 PerlIOl *l = PerlIOBase(f);
717 return (l->tab->Set_ptrcnt != NULL);
722 #undef PerlIO_get_base
724 PerlIO_get_base(PerlIO *f)
726 return (*PerlIOBase(f)->tab->Get_base)(f);
729 #undef PerlIO_get_bufsiz
731 PerlIO_get_bufsiz(PerlIO *f)
733 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
736 #undef PerlIO_get_ptr
738 PerlIO_get_ptr(PerlIO *f)
740 return (*PerlIOBase(f)->tab->Get_ptr)(f);
743 #undef PerlIO_get_cnt
745 PerlIO_get_cnt(PerlIO *f)
747 return (*PerlIOBase(f)->tab->Get_cnt)(f);
750 #undef PerlIO_set_cnt
752 PerlIO_set_cnt(PerlIO *f,int cnt)
754 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
757 #undef PerlIO_set_ptrcnt
759 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
761 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
764 /*--------------------------------------------------------------------------------------*/
765 /* "Methods" of the "base class" */
768 PerlIOBase_fileno(PerlIO *f)
770 return PerlIO_fileno(PerlIONext(f));
774 PerlIOBase_pushed(PerlIO *f, const char *mode)
776 PerlIOl *l = PerlIOBase(f);
777 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
778 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
784 l->flags = PERLIO_F_CANREAD;
787 l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE;
790 l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
801 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
804 l->flags |= PERLIO_F_BINARY;
816 l->flags |= l->next->flags &
817 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
818 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
825 PerlIOBase_popped(PerlIO *f)
831 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
833 Off_t old = PerlIO_tell(f);
834 if (PerlIO_seek(f,-((Off_t)count),SEEK_CUR) == 0)
836 Off_t new = PerlIO_tell(f);
843 PerlIOBase_noop_ok(PerlIO *f)
849 PerlIOBase_noop_fail(PerlIO *f)
855 PerlIOBase_close(PerlIO *f)
858 if (PerlIO_flush(f) != 0)
860 if (PerlIO_close(PerlIONext(f)) != 0)
862 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
867 PerlIOBase_eof(PerlIO *f)
871 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
877 PerlIOBase_error(PerlIO *f)
881 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
887 PerlIOBase_clearerr(PerlIO *f)
891 PerlIOBase(f)->flags &= ~PERLIO_F_ERROR;
896 PerlIOBase_setlinebuf(PerlIO *f)
901 /*--------------------------------------------------------------------------------------*/
902 /* Bottom-most level for UNIX-like case */
906 struct _PerlIO base; /* The generic part */
907 int fd; /* UNIX like file descriptor */
908 int oflags; /* open/fcntl flags */
912 PerlIOUnix_oflags(const char *mode)
927 oflags = O_CREAT|O_TRUNC;
938 oflags = O_CREAT|O_APPEND;
953 /* Always open in binary mode */
955 if (*mode || oflags == -1)
964 PerlIOUnix_fileno(PerlIO *f)
966 return PerlIOSelf(f,PerlIOUnix)->fd;
970 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
977 int oflags = PerlIOUnix_oflags(mode);
980 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
983 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
990 PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
993 int oflags = PerlIOUnix_oflags(mode);
996 int fd = PerlLIO_open3(path,oflags,0666);
999 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
1002 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1009 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
1011 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1012 int oflags = PerlIOUnix_oflags(mode);
1013 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1014 (*PerlIOBase(f)->tab->Close)(f);
1017 int fd = PerlLIO_open3(path,oflags,0666);
1022 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1030 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1032 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1033 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1037 SSize_t len = PerlLIO_read(fd,vbuf,count);
1038 if (len >= 0 || errno != EINTR)
1041 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1042 else if (len == 0 && count != 0)
1043 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1050 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1052 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1055 SSize_t len = PerlLIO_write(fd,vbuf,count);
1056 if (len >= 0 || errno != EINTR)
1059 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1066 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1068 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1069 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1070 return (new == (Off_t) -1) ? -1 : 0;
1074 PerlIOUnix_tell(PerlIO *f)
1076 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1080 PerlIOUnix_close(PerlIO *f)
1082 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1084 while (PerlLIO_close(fd) != 0)
1094 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1099 PerlIO_funcs PerlIO_unix = {
1115 PerlIOBase_noop_ok, /* flush */
1116 PerlIOBase_noop_fail, /* fill */
1119 PerlIOBase_clearerr,
1120 PerlIOBase_setlinebuf,
1121 NULL, /* get_base */
1122 NULL, /* get_bufsiz */
1125 NULL, /* set_ptrcnt */
1128 /*--------------------------------------------------------------------------------------*/
1129 /* stdio as a layer */
1133 struct _PerlIO base;
1134 FILE * stdio; /* The stream */
1138 PerlIOStdio_fileno(PerlIO *f)
1140 return fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1145 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1173 stdio = fdopen(fd,mode);
1176 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1183 #undef PerlIO_importFILE
1185 PerlIO_importFILE(FILE *stdio, int fl)
1190 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"r+"),PerlIOStdio);
1197 PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode)
1200 FILE *stdio = fopen(path,mode);
1203 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1210 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
1212 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1213 FILE *stdio = freopen(path,mode,s->stdio);
1221 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1223 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1227 STDCHAR *buf = (STDCHAR *) vbuf;
1228 /* Perl is expecting PerlIO_getc() to fill the buffer
1229 * Linux's stdio does not do that for fread()
1239 got = fread(vbuf,1,count,s);
1244 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1246 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1247 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1251 int ch = *buf-- & 0xff;
1252 if (ungetc(ch,s) != ch)
1261 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1263 return fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1267 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1269 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1270 return fseek(stdio,offset,whence);
1274 PerlIOStdio_tell(PerlIO *f)
1276 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1277 return ftell(stdio);
1281 PerlIOStdio_close(PerlIO *f)
1283 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1284 return fclose(stdio);
1288 PerlIOStdio_flush(PerlIO *f)
1290 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1291 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
1293 return fflush(stdio);
1298 /* FIXME: This discards ungetc() and pre-read stuff which is
1299 not right if this is just a "sync" from a layer above
1300 Suspect right design is to do _this_ but not have layer above
1301 flush this layer read-to-read
1303 /* Not writeable - sync by attempting a seek */
1305 if (fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
1313 PerlIOStdio_fill(PerlIO *f)
1315 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1317 /* fflush()ing read-only streams can cause trouble on some stdio-s */
1318 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1320 if (fflush(stdio) != 0)
1324 if (c == EOF || ungetc(c,stdio) != c)
1330 PerlIOStdio_eof(PerlIO *f)
1332 return feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1336 PerlIOStdio_error(PerlIO *f)
1338 return ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1342 PerlIOStdio_clearerr(PerlIO *f)
1344 clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1348 PerlIOStdio_setlinebuf(PerlIO *f)
1350 #ifdef HAS_SETLINEBUF
1351 setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1353 setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1359 PerlIOStdio_get_base(PerlIO *f)
1361 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1362 return FILE_base(stdio);
1366 PerlIOStdio_get_bufsiz(PerlIO *f)
1368 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1369 return FILE_bufsiz(stdio);
1373 #ifdef USE_STDIO_PTR
1375 PerlIOStdio_get_ptr(PerlIO *f)
1377 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1378 return FILE_ptr(stdio);
1382 PerlIOStdio_get_cnt(PerlIO *f)
1384 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1385 return FILE_cnt(stdio);
1389 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1391 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1394 #ifdef STDIO_PTR_LVALUE
1395 FILE_ptr(stdio) = ptr;
1396 #ifdef STDIO_PTR_LVAL_SETS_CNT
1397 if (FILE_cnt(stdio) != (cnt))
1400 assert(FILE_cnt(stdio) == (cnt));
1403 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1404 /* Setting ptr _does_ change cnt - we are done */
1407 #else /* STDIO_PTR_LVALUE */
1409 #endif /* STDIO_PTR_LVALUE */
1411 /* Now (or only) set cnt */
1412 #ifdef STDIO_CNT_LVALUE
1413 FILE_cnt(stdio) = cnt;
1414 #else /* STDIO_CNT_LVALUE */
1415 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1416 FILE_ptr(stdio) = FILE_ptr(stdio)+(FILE_cnt(stdio)-cnt);
1417 #else /* STDIO_PTR_LVAL_SETS_CNT */
1419 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1420 #endif /* STDIO_CNT_LVALUE */
1425 PerlIO_funcs PerlIO_stdio = {
1427 sizeof(PerlIOStdio),
1445 PerlIOStdio_clearerr,
1446 PerlIOStdio_setlinebuf,
1448 PerlIOStdio_get_base,
1449 PerlIOStdio_get_bufsiz,
1454 #ifdef USE_STDIO_PTR
1455 PerlIOStdio_get_ptr,
1456 PerlIOStdio_get_cnt,
1457 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1458 PerlIOStdio_set_ptrcnt
1459 #else /* STDIO_PTR_LVALUE */
1461 #endif /* STDIO_PTR_LVALUE */
1462 #else /* USE_STDIO_PTR */
1466 #endif /* USE_STDIO_PTR */
1469 #undef PerlIO_exportFILE
1471 PerlIO_exportFILE(PerlIO *f, int fl)
1474 /* Should really push stdio discipline when we have them */
1475 return fdopen(PerlIO_fileno(f),"r+");
1478 #undef PerlIO_findFILE
1480 PerlIO_findFILE(PerlIO *f)
1482 return PerlIO_exportFILE(f,0);
1485 #undef PerlIO_releaseFILE
1487 PerlIO_releaseFILE(PerlIO *p, FILE *f)
1491 /*--------------------------------------------------------------------------------------*/
1492 /* perlio buffer layer */
1495 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
1497 PerlIO_funcs *tab = PerlIO_default_btm();
1505 f = (*tab->Fdopen)(tab,fd,mode);
1508 /* Initial stderr is unbuffered */
1509 if (!init || fd != 2)
1511 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
1512 b->posn = PerlIO_tell(PerlIONext(f));
1519 PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
1521 PerlIO_funcs *tab = PerlIO_default_btm();
1522 PerlIO *f = (*tab->Open)(tab,path,mode);
1525 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
1526 b->posn = PerlIO_tell(PerlIONext(f));
1532 PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
1534 PerlIO *next = PerlIONext(f);
1535 int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
1537 code = (*PerlIOBase(f)->tab->Pushed)(f,mode);
1540 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1541 b->posn = PerlIO_tell(PerlIONext(f));
1546 /* This "flush" is akin to sfio's sync in that it handles files in either
1550 PerlIOBuf_flush(PerlIO *f)
1552 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1554 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1556 /* write() the buffer */
1557 STDCHAR *p = b->buf;
1559 PerlIO *n = PerlIONext(f);
1562 count = PerlIO_write(n,p,b->ptr - p);
1567 else if (count < 0 || PerlIO_error(n))
1569 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1574 b->posn += (p - b->buf);
1576 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1578 /* Note position change */
1579 b->posn += (b->ptr - b->buf);
1580 if (b->ptr < b->end)
1582 /* We did not consume all of it */
1583 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
1585 b->posn = PerlIO_tell(PerlIONext(f));
1589 b->ptr = b->end = b->buf;
1590 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1591 /* FIXME: Is this right for read case ? */
1592 if (PerlIO_flush(PerlIONext(f)) != 0)
1598 PerlIOBuf_fill(PerlIO *f)
1600 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1601 PerlIO *n = PerlIONext(f);
1603 /* FIXME: doing the down-stream flush is a bad idea if it causes
1604 pre-read data in stdio buffer to be discarded
1605 but this is too simplistic - as it skips _our_ hosekeeping
1606 and breaks tell tests.
1607 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
1611 if (PerlIO_flush(f) != 0)
1614 b->ptr = b->end = b->buf;
1615 if (PerlIO_fast_gets(n))
1617 /* Layer below is also buffered
1618 * We do _NOT_ want to call its ->Read() because that will loop
1619 * till it gets what we asked for which may hang on a pipe etc.
1620 * Instead take anything it has to hand, or ask it to fill _once_.
1622 avail = PerlIO_get_cnt(n);
1625 avail = PerlIO_fill(n);
1627 avail = PerlIO_get_cnt(n);
1630 if (!PerlIO_error(n) && PerlIO_eof(n))
1636 STDCHAR *ptr = PerlIO_get_ptr(n);
1637 SSize_t cnt = avail;
1638 if (avail > b->bufsiz)
1640 Copy(ptr,b->buf,avail,STDCHAR);
1641 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
1646 avail = PerlIO_read(n,b->ptr,b->bufsiz);
1651 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1653 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1656 b->end = b->buf+avail;
1657 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1662 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
1664 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1665 STDCHAR *buf = (STDCHAR *) vbuf;
1670 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1674 SSize_t avail = PerlIO_get_cnt(f);
1675 SSize_t take = (count < avail) ? count : avail;
1678 STDCHAR *ptr = PerlIO_get_ptr(f);
1679 Copy(ptr,buf,take,STDCHAR);
1680 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
1684 if (count > 0 && avail <= 0)
1686 if (PerlIO_fill(f) != 0)
1690 return (buf - (STDCHAR *) vbuf);
1696 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
1698 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1699 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1702 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1708 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1710 avail = (b->ptr - b->buf);
1711 if (avail > (SSize_t) count)
1718 if (avail > (SSize_t) count)
1720 b->end = b->ptr + avail;
1727 Copy(buf,b->ptr,avail,STDCHAR);
1731 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
1738 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
1740 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1741 const STDCHAR *buf = (const STDCHAR *) vbuf;
1745 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1749 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
1750 if ((SSize_t) count < avail)
1752 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
1753 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
1773 Copy(buf,b->ptr,avail,STDCHAR);
1780 if (b->ptr >= (b->buf + b->bufsiz))
1787 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
1789 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1790 int code = PerlIO_flush(f);
1793 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1794 code = PerlIO_seek(PerlIONext(f),offset,whence);
1797 b->posn = PerlIO_tell(PerlIONext(f));
1804 PerlIOBuf_tell(PerlIO *f)
1806 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1807 Off_t posn = b->posn;
1809 posn += (b->ptr - b->buf);
1814 PerlIOBuf_close(PerlIO *f)
1816 IV code = PerlIOBase_close(f);
1817 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1818 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
1823 b->ptr = b->end = b->buf;
1824 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1829 PerlIOBuf_setlinebuf(PerlIO *f)
1833 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
1838 PerlIOBuf_get_ptr(PerlIO *f)
1840 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1847 PerlIOBuf_get_cnt(PerlIO *f)
1849 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1852 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1853 return (b->end - b->ptr);
1858 PerlIOBuf_get_base(PerlIO *f)
1860 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1865 New('B',b->buf,b->bufsiz,STDCHAR);
1868 b->buf = (STDCHAR *)&b->oneword;
1869 b->bufsiz = sizeof(b->oneword);
1878 PerlIOBuf_bufsiz(PerlIO *f)
1880 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1883 return (b->end - b->buf);
1887 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
1889 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1893 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
1896 assert(PerlIO_get_cnt(f) == cnt);
1897 assert(b->ptr >= b->buf);
1899 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1902 PerlIO_funcs PerlIO_perlio = {
1922 PerlIOBase_clearerr,
1923 PerlIOBuf_setlinebuf,
1928 PerlIOBuf_set_ptrcnt,
1931 /*--------------------------------------------------------------------------------------*/
1932 /* crlf - translation
1933 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
1934 to hand back a line at a time and keeping a record of which nl we "lied" about.
1935 On write translate "\n" to CR,LF
1940 PerlIOBuf base; /* PerlIOBuf stuff */
1941 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
1945 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
1947 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1948 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1950 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1956 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
1958 b->end = b->ptr = b->buf + b->bufsiz;
1959 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1961 while (count > 0 && b->ptr > b->buf)
1966 if (b->ptr - 2 >= b->buf)
1991 PerlIOCrlf_get_cnt(PerlIO *f)
1993 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1996 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1998 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2001 STDCHAR *nl = b->ptr;
2003 while (nl < b->end && *nl != 0xd)
2005 if (nl < b->end && *nl == 0xd)
2017 /* Not CR,LF but just CR */
2024 /* Blast - found CR as last char in buffer */
2027 /* They may not care, defer work as long as possible */
2028 return (nl - b->ptr);
2034 Perl_warn(aTHX_ __FUNCTION__ " f=%p CR @ end of buffer",f);
2035 b->ptr++; /* say we have read it as far as flush() is concerned */
2036 b->buf++; /* Leave space an front of buffer */
2037 b->bufsiz--; /* Buffer is thus smaller */
2038 code = PerlIO_fill(f); /* Fetch some more */
2039 b->bufsiz++; /* Restore size for next time */
2040 b->buf--; /* Point at space */
2041 b->ptr = nl = b->buf; /* Which is what we hand off */
2042 b->posn--; /* Buffer starts here */
2043 *nl = 0xd; /* Fill in the CR */
2045 goto test; /* fill() call worked */
2046 /* CR at EOF - just fall through */
2051 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
2057 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2059 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2060 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2064 ptr = ((c->nl) ? (c->nl+1) : b->end) - cnt;
2069 /* They have taken what we lied about */
2076 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2080 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
2082 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2083 const STDCHAR *buf = (const STDCHAR *) vbuf;
2084 const STDCHAR *ebuf = buf+count;
2087 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2091 STDCHAR *eptr = b->buf+b->bufsiz;
2092 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2093 while (buf < ebuf && b->ptr < eptr)
2097 if (b->ptr + 2 >= eptr)
2099 /* Not room for both */
2103 *(b->ptr)++ = 0xd; /* CR */
2104 *(b->ptr)++ = 0xa; /* LF */
2106 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2124 return (buf - (STDCHAR *) vbuf);
2128 PerlIOCrlf_flush(PerlIO *f)
2130 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2134 Perl_warn(aTHX_ __FUNCTION__ " f=%p flush with nl@%p",f,c->nl);
2138 return PerlIOBuf_flush(f);
2141 PerlIO_funcs PerlIO_crlf = {
2150 PerlIOBase_noop_ok, /* popped */
2151 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
2152 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
2153 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
2161 PerlIOBase_clearerr,
2162 PerlIOBuf_setlinebuf,
2167 PerlIOCrlf_set_ptrcnt,
2171 /*--------------------------------------------------------------------------------------*/
2172 /* mmap as "buffer" layer */
2176 PerlIOBuf base; /* PerlIOBuf stuff */
2177 Mmap_t mptr; /* Mapped address */
2178 Size_t len; /* mapped length */
2179 STDCHAR *bbuf; /* malloced buffer if map fails */
2182 static size_t page_size = 0;
2185 PerlIOMmap_map(PerlIO *f)
2188 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2189 PerlIOBuf *b = &m->base;
2190 IV flags = PerlIOBase(f)->flags;
2194 if (flags & PERLIO_F_CANREAD)
2196 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2197 int fd = PerlIO_fileno(f);
2199 code = fstat(fd,&st);
2200 if (code == 0 && S_ISREG(st.st_mode))
2202 SSize_t len = st.st_size - b->posn;
2207 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
2209 SETERRNO(0,SS$_NORMAL);
2210 # ifdef _SC_PAGESIZE
2211 page_size = sysconf(_SC_PAGESIZE);
2213 page_size = sysconf(_SC_PAGE_SIZE);
2215 if ((long)page_size < 0) {
2220 (void)SvUPGRADE(error, SVt_PV);
2221 msg = SvPVx(error, n_a);
2222 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
2225 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
2229 # ifdef HAS_GETPAGESIZE
2230 page_size = getpagesize();
2232 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
2233 page_size = PAGESIZE; /* compiletime, bad */
2237 if ((IV)page_size <= 0)
2238 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
2242 /* This is a hack - should never happen - open should have set it ! */
2243 b->posn = PerlIO_tell(PerlIONext(f));
2245 posn = (b->posn / page_size) * page_size;
2246 len = st.st_size - posn;
2247 m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn);
2248 if (m->mptr && m->mptr != (Mmap_t) -1)
2250 #if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
2251 madvise(m->mptr, len, MADV_SEQUENTIAL);
2253 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
2254 b->end = ((STDCHAR *)m->mptr) + len;
2255 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
2266 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
2268 b->ptr = b->end = b->ptr;
2277 PerlIOMmap_unmap(PerlIO *f)
2279 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2280 PerlIOBuf *b = &m->base;
2286 code = munmap(m->mptr, m->len);
2290 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
2293 b->ptr = b->end = b->buf;
2294 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2300 PerlIOMmap_get_base(PerlIO *f)
2302 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2303 PerlIOBuf *b = &m->base;
2304 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2306 /* Already have a readbuffer in progress */
2311 /* We have a write buffer or flushed PerlIOBuf read buffer */
2312 m->bbuf = b->buf; /* save it in case we need it again */
2313 b->buf = NULL; /* Clear to trigger below */
2317 PerlIOMmap_map(f); /* Try and map it */
2320 /* Map did not work - recover PerlIOBuf buffer if we have one */
2324 b->ptr = b->end = b->buf;
2327 return PerlIOBuf_get_base(f);
2331 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
2333 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2334 PerlIOBuf *b = &m->base;
2335 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2337 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
2340 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2345 /* Loose the unwritable mapped buffer */
2347 /* If flush took the "buffer" see if we have one from before */
2348 if (!b->buf && m->bbuf)
2352 PerlIOBuf_get_base(f);
2356 return PerlIOBuf_unread(f,vbuf,count);
2360 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
2362 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2363 PerlIOBuf *b = &m->base;
2364 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
2366 /* No, or wrong sort of, buffer */
2369 if (PerlIOMmap_unmap(f) != 0)
2372 /* If unmap took the "buffer" see if we have one from before */
2373 if (!b->buf && m->bbuf)
2377 PerlIOBuf_get_base(f);
2381 return PerlIOBuf_write(f,vbuf,count);
2385 PerlIOMmap_flush(PerlIO *f)
2387 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2388 PerlIOBuf *b = &m->base;
2389 IV code = PerlIOBuf_flush(f);
2390 /* Now we are "synced" at PerlIOBuf level */
2395 /* Unmap the buffer */
2396 if (PerlIOMmap_unmap(f) != 0)
2401 /* We seem to have a PerlIOBuf buffer which was not mapped
2402 * remember it in case we need one later
2411 PerlIOMmap_fill(PerlIO *f)
2413 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2414 IV code = PerlIO_flush(f);
2415 if (code == 0 && !b->buf)
2417 code = PerlIOMmap_map(f);
2419 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2421 code = PerlIOBuf_fill(f);
2427 PerlIOMmap_close(PerlIO *f)
2429 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2430 PerlIOBuf *b = &m->base;
2431 IV code = PerlIO_flush(f);
2436 b->ptr = b->end = b->buf;
2438 if (PerlIOBuf_close(f) != 0)
2444 PerlIO_funcs PerlIO_mmap = {
2464 PerlIOBase_clearerr,
2465 PerlIOBuf_setlinebuf,
2466 PerlIOMmap_get_base,
2470 PerlIOBuf_set_ptrcnt,
2473 #endif /* HAS_MMAP */
2480 atexit(&PerlIO_cleanup);
2489 PerlIO_stdstreams();
2493 #undef PerlIO_stdout
2498 PerlIO_stdstreams();
2502 #undef PerlIO_stderr
2507 PerlIO_stdstreams();
2511 /*--------------------------------------------------------------------------------------*/
2513 #undef PerlIO_getname
2515 PerlIO_getname(PerlIO *f, char *buf)
2518 Perl_croak(aTHX_ "Don't know how to get file name");
2523 /*--------------------------------------------------------------------------------------*/
2524 /* Functions which can be called on any kind of PerlIO implemented
2530 PerlIO_getc(PerlIO *f)
2533 SSize_t count = PerlIO_read(f,buf,1);
2536 return (unsigned char) buf[0];
2541 #undef PerlIO_ungetc
2543 PerlIO_ungetc(PerlIO *f, int ch)
2548 if (PerlIO_unread(f,&buf,1) == 1)
2556 PerlIO_putc(PerlIO *f, int ch)
2559 return PerlIO_write(f,&buf,1);
2564 PerlIO_puts(PerlIO *f, const char *s)
2566 STRLEN len = strlen(s);
2567 return PerlIO_write(f,s,len);
2570 #undef PerlIO_rewind
2572 PerlIO_rewind(PerlIO *f)
2574 PerlIO_seek(f,(Off_t)0,SEEK_SET);
2578 #undef PerlIO_vprintf
2580 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
2583 SV *sv = newSVpvn("",0);
2588 Perl_va_copy(ap, apc);
2589 sv_vcatpvf(sv, fmt, &apc);
2591 sv_vcatpvf(sv, fmt, &ap);
2594 return PerlIO_write(f,s,len);
2597 #undef PerlIO_printf
2599 PerlIO_printf(PerlIO *f,const char *fmt,...)
2604 result = PerlIO_vprintf(f,fmt,ap);
2609 #undef PerlIO_stdoutf
2611 PerlIO_stdoutf(const char *fmt,...)
2616 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
2621 #undef PerlIO_tmpfile
2623 PerlIO_tmpfile(void)
2625 /* I have no idea how portable mkstemp() is ... */
2626 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
2628 FILE *stdio = tmpfile();
2631 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"w+"),PerlIOStdio);
2637 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
2638 int fd = mkstemp(SvPVX(sv));
2642 f = PerlIO_fdopen(fd,"w+");
2645 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
2647 PerlLIO_unlink(SvPVX(sv));
2657 #endif /* USE_SFIO */
2658 #endif /* PERLIO_IS_STDIO */
2660 /*======================================================================================*/
2661 /* Now some functions in terms of above which may be needed even if
2662 we are not in true PerlIO mode
2666 #undef PerlIO_setpos
2668 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2670 return PerlIO_seek(f,*pos,0);
2673 #ifndef PERLIO_IS_STDIO
2674 #undef PerlIO_setpos
2676 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2678 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2679 return fsetpos64(f, pos);
2681 return fsetpos(f, pos);
2688 #undef PerlIO_getpos
2690 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2692 *pos = PerlIO_tell(f);
2693 return *pos == -1 ? -1 : 0;
2696 #ifndef PERLIO_IS_STDIO
2697 #undef PerlIO_getpos
2699 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2701 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2702 return fgetpos64(f, pos);
2704 return fgetpos(f, pos);
2710 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
2713 vprintf(char *pat, char *args)
2715 _doprnt(pat, args, stdout);
2716 return 0; /* wrong, but perl doesn't use the return value */
2720 vfprintf(FILE *fd, char *pat, char *args)
2722 _doprnt(pat, args, fd);
2723 return 0; /* wrong, but perl doesn't use the return value */
2728 #ifndef PerlIO_vsprintf
2730 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
2732 int val = vsprintf(s, fmt, ap);
2735 if (strlen(s) >= (STRLEN)n)
2738 (void)PerlIO_puts(Perl_error_log,
2739 "panic: sprintf overflow - memory corrupted!\n");
2747 #ifndef PerlIO_sprintf
2749 PerlIO_sprintf(char *s, int n, const char *fmt,...)
2754 result = PerlIO_vsprintf(s, n, fmt, ap);
2760 #endif /* !PERL_IMPLICIT_SYS */