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 perlsio_binmode(FILE *fp, int iotype, int mode)
47 /* This used to be contents of do_binmode in doio.c */
49 # if defined(atarist) || defined(__MINT__)
52 ((FILE*)fp)->_flag |= _IOBIN;
54 ((FILE*)fp)->_flag &= ~ _IOBIN;
59 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
60 # if defined(WIN32) && defined(__BORLANDC__)
61 /* The translation mode of the stream is maintained independent
62 * of the translation mode of the fd in the Borland RTL (heavy
63 * digging through their runtime sources reveal). User has to
64 * set the mode explicitly for the stream (though they don't
65 * document this anywhere). GSAR 97-5-24
71 fp->flags &= ~ _F_BIN;
79 # if defined(USEMYBINMODE)
80 if (my_binmode(fp, iotype, mode) != FALSE)
91 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
93 return perlsio_binmode(fp,iotype,mode);
98 #if !defined(PERL_IMPLICIT_SYS)
100 #ifdef PERLIO_IS_STDIO
105 /* Does nothing (yet) except force this file to be included
106 in perl binary. That allows this file to force inclusion
107 of other functions that may be required by loadable
108 extensions e.g. for FileHandle::tmpfile
112 #undef PerlIO_tmpfile
119 #else /* PERLIO_IS_STDIO */
126 /* This section is just to make sure these functions
127 get pulled in from libsfio.a
130 #undef PerlIO_tmpfile
140 /* Force this file to be included in perl binary. Which allows
141 * this file to force inclusion of other functions that may be
142 * required by loadable extensions e.g. for FileHandle::tmpfile
146 * sfio does its own 'autoflush' on stdout in common cases.
147 * Flush results in a lot of lseek()s to regular files and
148 * lot of small writes to pipes.
150 sfset(sfstdout,SF_SHARE,0);
154 /*======================================================================================*/
155 /* Implement all the PerlIO interface ourselves.
160 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
165 #include <sys/mman.h>
170 void PerlIO_debug(const char *fmt,...) __attribute__((format(__printf__,1,2)));
173 PerlIO_debug(const char *fmt,...)
180 char *s = PerlEnv_getenv("PERLIO_DEBUG");
182 dbg = PerlLIO_open3(s,O_WRONLY|O_CREAT|O_APPEND,0666);
189 SV *sv = newSVpvn("",0);
192 s = CopFILE(PL_curcop);
195 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ", s, (IV)CopLINE(PL_curcop));
196 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
199 PerlLIO_write(dbg,s,len);
205 /*--------------------------------------------------------------------------------------*/
207 /* Inner level routines */
209 /* Table of pointers to the PerlIO structs (malloc'ed) */
210 PerlIO *_perlio = NULL;
211 #define PERLIO_TABLE_SIZE 64
214 PerlIO_allocate(void)
216 /* Find a free slot in the table, allocating new table as necessary */
217 PerlIO **last = &_perlio;
222 last = (PerlIO **)(f);
223 for (i=1; i < PERLIO_TABLE_SIZE; i++)
231 Newz('I',f,PERLIO_TABLE_SIZE,PerlIO);
239 PerlIO_cleantable(PerlIO **tablep)
241 PerlIO *table = *tablep;
245 PerlIO_cleantable((PerlIO **) &(table[0]));
246 for (i=PERLIO_TABLE_SIZE-1; i > 0; i--)
265 PerlIO_cleantable(&_perlio);
269 PerlIO_pop(PerlIO *f)
274 PerlIO_debug(__FUNCTION__ " f=%p %s\n",f,l->tab->name);
275 (*l->tab->Popped)(f);
281 /*--------------------------------------------------------------------------------------*/
282 /* XS Interface for perl code */
288 char *s = GvNAME(gv);
289 STRLEN l = GvNAMELEN(gv);
290 PerlIO_debug("%.*s\n",(int) l,s);
294 XS(XS_perlio_unimport)
298 char *s = GvNAME(gv);
299 STRLEN l = GvNAMELEN(gv);
300 PerlIO_debug("%.*s\n",(int) l,s);
305 PerlIO_find_layer(const char *name, STRLEN len)
312 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
313 if (svp && (sv = *svp) && SvROK(sv))
320 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
324 IO *io = GvIOn((GV *)SvRV(sv));
325 PerlIO *ifp = IoIFP(io);
326 PerlIO *ofp = IoOFP(io);
327 AV *av = (AV *) mg->mg_obj;
328 Perl_warn(aTHX_ "set %_ %p %p %p",sv,io,ifp,ofp);
334 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
338 IO *io = GvIOn((GV *)SvRV(sv));
339 PerlIO *ifp = IoIFP(io);
340 PerlIO *ofp = IoOFP(io);
341 AV *av = (AV *) mg->mg_obj;
342 Perl_warn(aTHX_ "get %_ %p %p %p",sv,io,ifp,ofp);
348 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
350 Perl_warn(aTHX_ "clear %_",sv);
355 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
357 Perl_warn(aTHX_ "free %_",sv);
361 MGVTBL perlio_vtab = {
369 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
372 SV *sv = SvRV(ST(1));
377 sv_magic(sv, (SV *)av, '~', NULL, 0);
379 mg = mg_find(sv,'~');
380 mg->mg_virtual = &perlio_vtab;
382 Perl_warn(aTHX_ "attrib %_",sv);
383 for (i=2; i < items; i++)
386 const char *name = SvPV(ST(i),len);
387 SV *layer = PerlIO_find_layer(name,len);
390 av_push(av,SvREFCNT_inc(layer));
403 PerlIO_define_layer(PerlIO_funcs *tab)
406 HV *stash = gv_stashpv("perlio::Layer", TRUE);
407 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
408 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
412 PerlIO_default_layer(I32 n)
417 PerlIO_funcs *tab = &PerlIO_stdio;
419 if (!PerlIO_layer_hv)
421 const char *s = PerlEnv_getenv("PERLIO");
422 newXS("perlio::import",XS_perlio_import,__FILE__);
423 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
425 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
427 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
428 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
429 PerlIO_define_layer(&PerlIO_unix);
430 PerlIO_define_layer(&PerlIO_perlio);
431 PerlIO_define_layer(&PerlIO_stdio);
432 PerlIO_define_layer(&PerlIO_crlf);
434 PerlIO_define_layer(&PerlIO_mmap);
436 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
441 while (*s && isSPACE((unsigned char)*s))
447 while (*e && !isSPACE((unsigned char)*e))
451 layer = PerlIO_find_layer(s,e-s);
454 PerlIO_debug("Pushing %.*s\n",(e-s),s);
455 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
458 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
464 len = av_len(PerlIO_layer_av);
467 if (O_BINARY != O_TEXT)
469 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_crlf.name,0)));
473 if (PerlIO_stdio.Set_ptrcnt)
475 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0)));
479 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0)));
482 len = av_len(PerlIO_layer_av);
486 svp = av_fetch(PerlIO_layer_av,n,0);
487 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
489 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
491 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
495 #define PerlIO_default_top() PerlIO_default_layer(-1)
496 #define PerlIO_default_btm() PerlIO_default_layer(0)
504 PerlIO_fdopen(0,"Ir" PERLIO_STDTEXT);
505 PerlIO_fdopen(1,"Iw" PERLIO_STDTEXT);
506 PerlIO_fdopen(2,"Iw" PERLIO_STDTEXT);
511 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
514 Newc('L',l,tab->size,char,PerlIOl);
517 Zero(l,tab->size,char);
521 PerlIO_debug(__FUNCTION__ " f=%p %s %s\n",f,tab->name,(mode) ? mode : "(Null)");
522 if ((*l->tab->Pushed)(f,mode) != 0)
532 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
536 const char *s = names;
546 while (*e && *e != ':' && !isSPACE(*e))
550 if ((e - s) == 3 && strncmp(s,"raw",3) == 0)
552 /* Pop back to bottom layer */
556 while (PerlIONext(f))
564 SV *layer = PerlIO_find_layer(s,e-s);
567 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
570 PerlIO *new = PerlIO_push(f,tab,mode);
576 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(int)(e-s),s);
588 /*--------------------------------------------------------------------------------------*/
589 /* Given the abstraction above the public API functions */
592 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
594 PerlIO_debug(__FUNCTION__ " f=%p %s %c %x %s\n",
595 f,PerlIOBase(f)->tab->name,iotype,mode, (names) ? names : "(Null)");
596 if (!names || (O_TEXT != O_BINARY && mode & O_BINARY))
602 if (PerlIOBase(top)->tab == &PerlIO_crlf)
605 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
608 top = PerlIONext(top);
611 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
616 PerlIO__close(PerlIO *f)
618 return (*PerlIOBase(f)->tab->Close)(f);
624 PerlIO_close(PerlIO *f)
626 int code = (*PerlIOBase(f)->tab->Close)(f);
636 PerlIO_fileno(PerlIO *f)
638 return (*PerlIOBase(f)->tab->Fileno)(f);
645 PerlIO_fdopen(int fd, const char *mode)
647 PerlIO_funcs *tab = PerlIO_default_top();
650 return (*tab->Fdopen)(tab,fd,mode);
655 PerlIO_open(const char *path, const char *mode)
657 PerlIO_funcs *tab = PerlIO_default_top();
660 return (*tab->Open)(tab,path,mode);
665 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
670 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
672 if ((*PerlIOBase(f)->tab->Pushed)(f,mode) == 0)
678 return PerlIO_open(path,mode);
683 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
685 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
690 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
692 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
697 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
699 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
704 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
706 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
711 PerlIO_tell(PerlIO *f)
713 return (*PerlIOBase(f)->tab->Tell)(f);
718 PerlIO_flush(PerlIO *f)
722 return (*PerlIOBase(f)->tab->Flush)(f);
726 PerlIO **table = &_perlio;
731 table = (PerlIO **)(f++);
732 for (i=1; i < PERLIO_TABLE_SIZE; i++)
734 if (*f && PerlIO_flush(f) != 0)
745 PerlIO_fill(PerlIO *f)
747 return (*PerlIOBase(f)->tab->Fill)(f);
752 PerlIO_isutf8(PerlIO *f)
754 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
759 PerlIO_eof(PerlIO *f)
761 return (*PerlIOBase(f)->tab->Eof)(f);
766 PerlIO_error(PerlIO *f)
768 return (*PerlIOBase(f)->tab->Error)(f);
771 #undef PerlIO_clearerr
773 PerlIO_clearerr(PerlIO *f)
776 (*PerlIOBase(f)->tab->Clearerr)(f);
779 #undef PerlIO_setlinebuf
781 PerlIO_setlinebuf(PerlIO *f)
783 (*PerlIOBase(f)->tab->Setlinebuf)(f);
786 #undef PerlIO_has_base
788 PerlIO_has_base(PerlIO *f)
792 return (PerlIOBase(f)->tab->Get_base != NULL);
797 #undef PerlIO_fast_gets
799 PerlIO_fast_gets(PerlIO *f)
803 PerlIOl *l = PerlIOBase(f);
804 return (l->tab->Set_ptrcnt != NULL);
809 #undef PerlIO_has_cntptr
811 PerlIO_has_cntptr(PerlIO *f)
815 PerlIO_funcs *tab = PerlIOBase(f)->tab;
816 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
821 #undef PerlIO_canset_cnt
823 PerlIO_canset_cnt(PerlIO *f)
827 PerlIOl *l = PerlIOBase(f);
828 return (l->tab->Set_ptrcnt != NULL);
833 #undef PerlIO_get_base
835 PerlIO_get_base(PerlIO *f)
837 return (*PerlIOBase(f)->tab->Get_base)(f);
840 #undef PerlIO_get_bufsiz
842 PerlIO_get_bufsiz(PerlIO *f)
844 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
847 #undef PerlIO_get_ptr
849 PerlIO_get_ptr(PerlIO *f)
851 return (*PerlIOBase(f)->tab->Get_ptr)(f);
854 #undef PerlIO_get_cnt
856 PerlIO_get_cnt(PerlIO *f)
858 return (*PerlIOBase(f)->tab->Get_cnt)(f);
861 #undef PerlIO_set_cnt
863 PerlIO_set_cnt(PerlIO *f,int cnt)
865 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
868 #undef PerlIO_set_ptrcnt
870 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
872 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
875 /*--------------------------------------------------------------------------------------*/
876 /* "Methods" of the "base class" */
879 PerlIOBase_fileno(PerlIO *f)
881 return PerlIO_fileno(PerlIONext(f));
885 PerlIO_modestr(PerlIO *f,char *buf)
888 IV flags = PerlIOBase(f)->flags;
889 if (flags & PERLIO_F_CANREAD)
891 if (flags & PERLIO_F_CANWRITE)
893 if (flags & PERLIO_F_CRLF)
902 PerlIOBase_pushed(PerlIO *f, const char *mode)
904 PerlIOl *l = PerlIOBase(f);
905 const char *omode = mode;
907 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
908 PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
914 l->flags |= PERLIO_F_CANREAD;
917 l->flags |= PERLIO_F_APPEND|PERLIO_F_CANWRITE;
920 l->flags |= PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
931 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
934 l->flags &= ~PERLIO_F_CRLF;
937 l->flags |= PERLIO_F_CRLF;
949 l->flags |= l->next->flags &
950 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_TRUNCATE|PERLIO_F_APPEND);
953 PerlIO_debug(__FUNCTION__ " f=%p %s %s fl=%08x (%s)\n",
954 f,PerlIOBase(f)->tab->name,(omode) ? omode : "(Null)",
955 l->flags,PerlIO_modestr(f,temp));
960 PerlIOBase_popped(PerlIO *f)
966 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
968 Off_t old = PerlIO_tell(f);
969 if (PerlIO_seek(f,-((Off_t)count),SEEK_CUR) == 0)
971 Off_t new = PerlIO_tell(f);
978 PerlIOBase_noop_ok(PerlIO *f)
984 PerlIOBase_noop_fail(PerlIO *f)
990 PerlIOBase_close(PerlIO *f)
993 PerlIO *n = PerlIONext(f);
994 if (PerlIO_flush(f) != 0)
996 if (n && (*PerlIOBase(n)->tab->Close)(n) != 0)
998 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
1003 PerlIOBase_eof(PerlIO *f)
1007 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1013 PerlIOBase_error(PerlIO *f)
1017 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1023 PerlIOBase_clearerr(PerlIO *f)
1027 PerlIO *n = PerlIONext(f);
1028 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR|PERLIO_F_EOF);
1035 PerlIOBase_setlinebuf(PerlIO *f)
1040 /*--------------------------------------------------------------------------------------*/
1041 /* Bottom-most level for UNIX-like case */
1045 struct _PerlIO base; /* The generic part */
1046 int fd; /* UNIX like file descriptor */
1047 int oflags; /* open/fcntl flags */
1051 PerlIOUnix_oflags(const char *mode)
1066 oflags = O_CREAT|O_TRUNC;
1077 oflags = O_CREAT|O_APPEND;
1093 else if (*mode == 't')
1096 oflags &= ~O_BINARY;
1099 /* Always open in binary mode */
1101 if (*mode || oflags == -1)
1110 PerlIOUnix_fileno(PerlIO *f)
1112 return PerlIOSelf(f,PerlIOUnix)->fd;
1116 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1123 int oflags = PerlIOUnix_oflags(mode);
1126 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
1129 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1136 PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
1139 int oflags = PerlIOUnix_oflags(mode);
1142 int fd = PerlLIO_open3(path,oflags,0666);
1145 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
1148 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1155 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
1157 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1158 int oflags = PerlIOUnix_oflags(mode);
1159 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1160 (*PerlIOBase(f)->tab->Close)(f);
1163 int fd = PerlLIO_open3(path,oflags,0666);
1168 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1176 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1178 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1179 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1183 SSize_t len = PerlLIO_read(fd,vbuf,count);
1184 if (len >= 0 || errno != EINTR)
1187 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1188 else if (len == 0 && count != 0)
1189 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1196 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1198 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1201 SSize_t len = PerlLIO_write(fd,vbuf,count);
1202 if (len >= 0 || errno != EINTR)
1205 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1212 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1214 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1215 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1216 return (new == (Off_t) -1) ? -1 : 0;
1220 PerlIOUnix_tell(PerlIO *f)
1222 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1226 PerlIOUnix_close(PerlIO *f)
1228 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1230 while (PerlLIO_close(fd) != 0)
1240 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1245 PerlIO_funcs PerlIO_unix = {
1261 PerlIOBase_noop_ok, /* flush */
1262 PerlIOBase_noop_fail, /* fill */
1265 PerlIOBase_clearerr,
1266 PerlIOBase_setlinebuf,
1267 NULL, /* get_base */
1268 NULL, /* get_bufsiz */
1271 NULL, /* set_ptrcnt */
1274 /*--------------------------------------------------------------------------------------*/
1275 /* stdio as a layer */
1279 struct _PerlIO base;
1280 FILE * stdio; /* The stream */
1284 PerlIOStdio_fileno(PerlIO *f)
1286 return fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1290 PerlIOStdio_mode(const char *mode,char *tmode)
1292 const char *ret = mode;
1293 if (O_BINARY != O_TEXT)
1295 ret = (const char *) tmode;
1307 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1337 stdio = fdopen(fd,mode = PerlIOStdio_mode(mode,tmode));
1341 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1348 #undef PerlIO_importFILE
1350 PerlIO_importFILE(FILE *stdio, int fl)
1355 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"r+"),PerlIOStdio);
1362 PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode)
1365 FILE *stdio = fopen(path,mode);
1369 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(), self,
1370 (mode = PerlIOStdio_mode(mode,tmode))),
1378 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
1380 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1382 FILE *stdio = freopen(path,(mode = PerlIOStdio_mode(mode,tmode)),s->stdio);
1390 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1392 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1396 STDCHAR *buf = (STDCHAR *) vbuf;
1397 /* Perl is expecting PerlIO_getc() to fill the buffer
1398 * Linux's stdio does not do that for fread()
1408 got = fread(vbuf,1,count,s);
1413 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1415 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1416 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1420 int ch = *buf-- & 0xff;
1421 if (ungetc(ch,s) != ch)
1430 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1432 return fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1436 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1438 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1439 return fseek(stdio,offset,whence);
1443 PerlIOStdio_tell(PerlIO *f)
1445 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1446 return ftell(stdio);
1450 PerlIOStdio_close(PerlIO *f)
1452 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1453 return fclose(stdio);
1457 PerlIOStdio_flush(PerlIO *f)
1459 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1460 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
1462 return fflush(stdio);
1467 /* FIXME: This discards ungetc() and pre-read stuff which is
1468 not right if this is just a "sync" from a layer above
1469 Suspect right design is to do _this_ but not have layer above
1470 flush this layer read-to-read
1472 /* Not writeable - sync by attempting a seek */
1474 if (fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
1482 PerlIOStdio_fill(PerlIO *f)
1484 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1486 /* fflush()ing read-only streams can cause trouble on some stdio-s */
1487 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1489 if (fflush(stdio) != 0)
1493 if (c == EOF || ungetc(c,stdio) != c)
1499 PerlIOStdio_eof(PerlIO *f)
1501 return feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1505 PerlIOStdio_error(PerlIO *f)
1507 return ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1511 PerlIOStdio_clearerr(PerlIO *f)
1513 clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1517 PerlIOStdio_setlinebuf(PerlIO *f)
1519 #ifdef HAS_SETLINEBUF
1520 setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1522 setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1528 PerlIOStdio_get_base(PerlIO *f)
1530 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1531 return FILE_base(stdio);
1535 PerlIOStdio_get_bufsiz(PerlIO *f)
1537 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1538 return FILE_bufsiz(stdio);
1542 #ifdef USE_STDIO_PTR
1544 PerlIOStdio_get_ptr(PerlIO *f)
1546 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1547 return FILE_ptr(stdio);
1551 PerlIOStdio_get_cnt(PerlIO *f)
1553 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1554 return FILE_cnt(stdio);
1558 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1560 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1563 #ifdef STDIO_PTR_LVALUE
1564 FILE_ptr(stdio) = ptr;
1565 #ifdef STDIO_PTR_LVAL_SETS_CNT
1566 if (FILE_cnt(stdio) != (cnt))
1569 assert(FILE_cnt(stdio) == (cnt));
1572 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1573 /* Setting ptr _does_ change cnt - we are done */
1576 #else /* STDIO_PTR_LVALUE */
1578 #endif /* STDIO_PTR_LVALUE */
1580 /* Now (or only) set cnt */
1581 #ifdef STDIO_CNT_LVALUE
1582 FILE_cnt(stdio) = cnt;
1583 #else /* STDIO_CNT_LVALUE */
1584 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1585 FILE_ptr(stdio) = FILE_ptr(stdio)+(FILE_cnt(stdio)-cnt);
1586 #else /* STDIO_PTR_LVAL_SETS_CNT */
1588 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1589 #endif /* STDIO_CNT_LVALUE */
1594 PerlIO_funcs PerlIO_stdio = {
1596 sizeof(PerlIOStdio),
1614 PerlIOStdio_clearerr,
1615 PerlIOStdio_setlinebuf,
1617 PerlIOStdio_get_base,
1618 PerlIOStdio_get_bufsiz,
1623 #ifdef USE_STDIO_PTR
1624 PerlIOStdio_get_ptr,
1625 PerlIOStdio_get_cnt,
1626 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1627 PerlIOStdio_set_ptrcnt
1628 #else /* STDIO_PTR_LVALUE */
1630 #endif /* STDIO_PTR_LVALUE */
1631 #else /* USE_STDIO_PTR */
1635 #endif /* USE_STDIO_PTR */
1638 #undef PerlIO_exportFILE
1640 PerlIO_exportFILE(PerlIO *f, int fl)
1643 /* Should really push stdio discipline when we have them */
1644 return fdopen(PerlIO_fileno(f),"r+");
1647 #undef PerlIO_findFILE
1649 PerlIO_findFILE(PerlIO *f)
1651 return PerlIO_exportFILE(f,0);
1654 #undef PerlIO_releaseFILE
1656 PerlIO_releaseFILE(PerlIO *p, FILE *f)
1660 /*--------------------------------------------------------------------------------------*/
1661 /* perlio buffer layer */
1664 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
1666 PerlIO_funcs *tab = PerlIO_default_btm();
1673 if (O_BINARY != O_TEXT)
1675 int code = PerlLIO_setmode(fd, O_BINARY);
1676 PerlIO_debug(__FUNCTION__ " %s fd=%d m=%s c=%d\n",tab->name,fd,mode,code);
1679 f = (*tab->Fdopen)(tab,fd,mode);
1682 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode),PerlIOBuf);
1683 b->posn = PerlIO_tell(PerlIONext(f));
1684 if (init && fd == 2)
1686 /* Initial stderr is unbuffered */
1687 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
1689 PerlIO_debug(__FUNCTION__ " %s f=%p fd=%d m=%s fl=%08x\n",
1690 self->name,f,fd,mode,PerlIOBase(f)->flags);
1696 PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
1698 PerlIO_funcs *tab = PerlIO_default_btm();
1699 PerlIO *f = (*tab->Open)(tab,path,mode);
1702 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,mode),PerlIOBuf);
1703 b->posn = PerlIO_tell(PerlIONext(f));
1709 PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
1711 PerlIO *next = PerlIONext(f);
1712 int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
1714 code = (*PerlIOBase(f)->tab->Pushed)(f,mode);
1717 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1718 b->posn = PerlIO_tell(PerlIONext(f));
1723 /* This "flush" is akin to sfio's sync in that it handles files in either
1727 PerlIOBuf_flush(PerlIO *f)
1729 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1731 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1733 /* write() the buffer */
1734 STDCHAR *p = b->buf;
1736 PerlIO *n = PerlIONext(f);
1739 count = PerlIO_write(n,p,b->ptr - p);
1744 else if (count < 0 || PerlIO_error(n))
1746 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1751 b->posn += (p - b->buf);
1753 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1755 /* Note position change */
1756 b->posn += (b->ptr - b->buf);
1757 if (b->ptr < b->end)
1759 /* We did not consume all of it */
1760 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
1762 b->posn = PerlIO_tell(PerlIONext(f));
1766 b->ptr = b->end = b->buf;
1767 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1768 /* FIXME: Is this right for read case ? */
1769 if (PerlIO_flush(PerlIONext(f)) != 0)
1775 PerlIOBuf_fill(PerlIO *f)
1777 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1778 PerlIO *n = PerlIONext(f);
1780 /* FIXME: doing the down-stream flush is a bad idea if it causes
1781 pre-read data in stdio buffer to be discarded
1782 but this is too simplistic - as it skips _our_ hosekeeping
1783 and breaks tell tests.
1784 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
1788 if (PerlIO_flush(f) != 0)
1791 b->ptr = b->end = b->buf;
1792 if (PerlIO_fast_gets(n))
1794 /* Layer below is also buffered
1795 * We do _NOT_ want to call its ->Read() because that will loop
1796 * till it gets what we asked for which may hang on a pipe etc.
1797 * Instead take anything it has to hand, or ask it to fill _once_.
1799 avail = PerlIO_get_cnt(n);
1802 avail = PerlIO_fill(n);
1804 avail = PerlIO_get_cnt(n);
1807 if (!PerlIO_error(n) && PerlIO_eof(n))
1813 STDCHAR *ptr = PerlIO_get_ptr(n);
1814 SSize_t cnt = avail;
1815 if (avail > b->bufsiz)
1817 Copy(ptr,b->buf,avail,STDCHAR);
1818 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
1823 avail = PerlIO_read(n,b->ptr,b->bufsiz);
1828 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1830 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1833 b->end = b->buf+avail;
1834 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1839 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
1841 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1842 STDCHAR *buf = (STDCHAR *) vbuf;
1847 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1851 SSize_t avail = PerlIO_get_cnt(f);
1852 SSize_t take = (count < avail) ? count : avail;
1855 STDCHAR *ptr = PerlIO_get_ptr(f);
1856 Copy(ptr,buf,take,STDCHAR);
1857 PerlIO_set_ptrcnt(f,ptr+take,(avail -= take));
1861 if (count > 0 && avail <= 0)
1863 if (PerlIO_fill(f) != 0)
1867 return (buf - (STDCHAR *) vbuf);
1873 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
1875 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1876 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1879 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1885 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1887 avail = (b->ptr - b->buf);
1888 if (avail > (SSize_t) count)
1895 if (avail > (SSize_t) count)
1897 b->end = b->ptr + avail;
1904 Copy(buf,b->ptr,avail,STDCHAR);
1908 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
1915 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
1917 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1918 const STDCHAR *buf = (const STDCHAR *) vbuf;
1922 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1926 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
1927 if ((SSize_t) count < avail)
1929 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
1930 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
1950 Copy(buf,b->ptr,avail,STDCHAR);
1957 if (b->ptr >= (b->buf + b->bufsiz))
1960 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
1966 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
1968 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1969 int code = PerlIO_flush(f);
1972 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1973 code = PerlIO_seek(PerlIONext(f),offset,whence);
1976 b->posn = PerlIO_tell(PerlIONext(f));
1983 PerlIOBuf_tell(PerlIO *f)
1985 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1986 Off_t posn = b->posn;
1988 posn += (b->ptr - b->buf);
1993 PerlIOBuf_close(PerlIO *f)
1995 IV code = PerlIOBase_close(f);
1996 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1997 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
2002 b->ptr = b->end = b->buf;
2003 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2008 PerlIOBuf_setlinebuf(PerlIO *f)
2012 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
2017 PerlIOBuf_get_ptr(PerlIO *f)
2019 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2026 PerlIOBuf_get_cnt(PerlIO *f)
2028 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2031 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2032 return (b->end - b->ptr);
2037 PerlIOBuf_get_base(PerlIO *f)
2039 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2044 New('B',b->buf,b->bufsiz,STDCHAR);
2047 b->buf = (STDCHAR *)&b->oneword;
2048 b->bufsiz = sizeof(b->oneword);
2057 PerlIOBuf_bufsiz(PerlIO *f)
2059 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2062 return (b->end - b->buf);
2066 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2068 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2072 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
2075 assert(PerlIO_get_cnt(f) == cnt);
2076 assert(b->ptr >= b->buf);
2078 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2081 PerlIO_funcs PerlIO_perlio = {
2101 PerlIOBase_clearerr,
2102 PerlIOBuf_setlinebuf,
2107 PerlIOBuf_set_ptrcnt,
2110 /*--------------------------------------------------------------------------------------*/
2111 /* crlf - translation
2112 On read translate CR,LF to "\n" we do this by overriding ptr/cnt entries
2113 to hand back a line at a time and keeping a record of which nl we "lied" about.
2114 On write translate "\n" to CR,LF
2119 PerlIOBuf base; /* PerlIOBuf stuff */
2120 STDCHAR *nl; /* Position of crlf we "lied" about in the buffer */
2124 PerlIOCrlf_pushed(PerlIO *f, const char *mode)
2127 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
2128 code = PerlIOBase_pushed(f,mode);
2129 PerlIO_debug(__FUNCTION__ " f=%p %s %s fl=%08x\n",
2130 f,PerlIOBase(f)->tab->name,(mode) ? mode : "(Null)",
2131 PerlIOBase(f)->flags);
2137 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
2139 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2145 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2146 return PerlIOBuf_unread(f,vbuf,count);
2149 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
2150 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2152 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2158 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2160 b->end = b->ptr = b->buf + b->bufsiz;
2161 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2163 while (count > 0 && b->ptr > b->buf)
2168 if (b->ptr - 2 >= b->buf)
2194 PerlIOCrlf_get_cnt(PerlIO *f)
2196 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2199 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
2201 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2202 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl)
2204 STDCHAR *nl = b->ptr;
2206 while (nl < b->end && *nl != 0xd)
2208 if (nl < b->end && *nl == 0xd)
2220 /* Not CR,LF but just CR */
2227 /* Blast - found CR as last char in buffer */
2230 /* They may not care, defer work as long as possible */
2231 return (nl - b->ptr);
2237 b->ptr++; /* say we have read it as far as flush() is concerned */
2238 b->buf++; /* Leave space an front of buffer */
2239 b->bufsiz--; /* Buffer is thus smaller */
2240 code = PerlIO_fill(f); /* Fetch some more */
2241 b->bufsiz++; /* Restore size for next time */
2242 b->buf--; /* Point at space */
2243 b->ptr = nl = b->buf; /* Which is what we hand off */
2244 b->posn--; /* Buffer starts here */
2245 *nl = 0xd; /* Fill in the CR */
2247 goto test; /* fill() call worked */
2248 /* CR at EOF - just fall through */
2253 return (((c->nl) ? (c->nl+1) : b->end) - b->ptr);
2259 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
2261 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2262 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2263 IV flags = PerlIOBase(f)->flags;
2273 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
2280 /* Test code - delete when it works ... */
2287 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
2295 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08x nl=%p e=%p for %d",
2296 ptr, chk, flags, c->nl, b->end, cnt);
2303 /* They have taken what we lied about */
2310 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2314 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
2316 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
2317 return PerlIOBuf_write(f,vbuf,count);
2320 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2321 const STDCHAR *buf = (const STDCHAR *) vbuf;
2322 const STDCHAR *ebuf = buf+count;
2325 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2329 STDCHAR *eptr = b->buf+b->bufsiz;
2330 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2331 while (buf < ebuf && b->ptr < eptr)
2335 if ((b->ptr + 2) > eptr)
2337 /* Not room for both */
2343 *(b->ptr)++ = 0xd; /* CR */
2344 *(b->ptr)++ = 0xa; /* LF */
2346 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
2365 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2367 return (buf - (STDCHAR *) vbuf);
2372 PerlIOCrlf_flush(PerlIO *f)
2374 PerlIOCrlf *c = PerlIOSelf(f,PerlIOCrlf);
2380 return PerlIOBuf_flush(f);
2383 PerlIO_funcs PerlIO_crlf = {
2386 PERLIO_K_BUFFERED|PERLIO_K_CANCRLF,
2392 PerlIOBase_noop_ok, /* popped */
2393 PerlIOBuf_read, /* generic read works with ptr/cnt lies ... */
2394 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
2395 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
2403 PerlIOBase_clearerr,
2404 PerlIOBuf_setlinebuf,
2409 PerlIOCrlf_set_ptrcnt,
2413 /*--------------------------------------------------------------------------------------*/
2414 /* mmap as "buffer" layer */
2418 PerlIOBuf base; /* PerlIOBuf stuff */
2419 Mmap_t mptr; /* Mapped address */
2420 Size_t len; /* mapped length */
2421 STDCHAR *bbuf; /* malloced buffer if map fails */
2424 static size_t page_size = 0;
2427 PerlIOMmap_map(PerlIO *f)
2430 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2431 PerlIOBuf *b = &m->base;
2432 IV flags = PerlIOBase(f)->flags;
2436 if (flags & PERLIO_F_CANREAD)
2438 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2439 int fd = PerlIO_fileno(f);
2441 code = fstat(fd,&st);
2442 if (code == 0 && S_ISREG(st.st_mode))
2444 SSize_t len = st.st_size - b->posn;
2449 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
2451 SETERRNO(0,SS$_NORMAL);
2452 # ifdef _SC_PAGESIZE
2453 page_size = sysconf(_SC_PAGESIZE);
2455 page_size = sysconf(_SC_PAGE_SIZE);
2457 if ((long)page_size < 0) {
2462 (void)SvUPGRADE(error, SVt_PV);
2463 msg = SvPVx(error, n_a);
2464 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
2467 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
2471 # ifdef HAS_GETPAGESIZE
2472 page_size = getpagesize();
2474 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
2475 page_size = PAGESIZE; /* compiletime, bad */
2479 if ((IV)page_size <= 0)
2480 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
2484 /* This is a hack - should never happen - open should have set it ! */
2485 b->posn = PerlIO_tell(PerlIONext(f));
2487 posn = (b->posn / page_size) * page_size;
2488 len = st.st_size - posn;
2489 m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn);
2490 if (m->mptr && m->mptr != (Mmap_t) -1)
2492 #if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
2493 madvise(m->mptr, len, MADV_SEQUENTIAL);
2495 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
2496 b->end = ((STDCHAR *)m->mptr) + len;
2497 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
2508 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
2510 b->ptr = b->end = b->ptr;
2519 PerlIOMmap_unmap(PerlIO *f)
2521 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2522 PerlIOBuf *b = &m->base;
2528 code = munmap(m->mptr, m->len);
2532 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
2535 b->ptr = b->end = b->buf;
2536 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2542 PerlIOMmap_get_base(PerlIO *f)
2544 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2545 PerlIOBuf *b = &m->base;
2546 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2548 /* Already have a readbuffer in progress */
2553 /* We have a write buffer or flushed PerlIOBuf read buffer */
2554 m->bbuf = b->buf; /* save it in case we need it again */
2555 b->buf = NULL; /* Clear to trigger below */
2559 PerlIOMmap_map(f); /* Try and map it */
2562 /* Map did not work - recover PerlIOBuf buffer if we have one */
2566 b->ptr = b->end = b->buf;
2569 return PerlIOBuf_get_base(f);
2573 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
2575 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2576 PerlIOBuf *b = &m->base;
2577 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2579 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
2582 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2587 /* Loose the unwritable mapped buffer */
2589 /* If flush took the "buffer" see if we have one from before */
2590 if (!b->buf && m->bbuf)
2594 PerlIOBuf_get_base(f);
2598 return PerlIOBuf_unread(f,vbuf,count);
2602 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
2604 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2605 PerlIOBuf *b = &m->base;
2606 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
2608 /* No, or wrong sort of, buffer */
2611 if (PerlIOMmap_unmap(f) != 0)
2614 /* If unmap took the "buffer" see if we have one from before */
2615 if (!b->buf && m->bbuf)
2619 PerlIOBuf_get_base(f);
2623 return PerlIOBuf_write(f,vbuf,count);
2627 PerlIOMmap_flush(PerlIO *f)
2629 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2630 PerlIOBuf *b = &m->base;
2631 IV code = PerlIOBuf_flush(f);
2632 /* Now we are "synced" at PerlIOBuf level */
2637 /* Unmap the buffer */
2638 if (PerlIOMmap_unmap(f) != 0)
2643 /* We seem to have a PerlIOBuf buffer which was not mapped
2644 * remember it in case we need one later
2653 PerlIOMmap_fill(PerlIO *f)
2655 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2656 IV code = PerlIO_flush(f);
2657 if (code == 0 && !b->buf)
2659 code = PerlIOMmap_map(f);
2661 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2663 code = PerlIOBuf_fill(f);
2669 PerlIOMmap_close(PerlIO *f)
2671 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2672 PerlIOBuf *b = &m->base;
2673 IV code = PerlIO_flush(f);
2678 b->ptr = b->end = b->buf;
2680 if (PerlIOBuf_close(f) != 0)
2686 PerlIO_funcs PerlIO_mmap = {
2706 PerlIOBase_clearerr,
2707 PerlIOBuf_setlinebuf,
2708 PerlIOMmap_get_base,
2712 PerlIOBuf_set_ptrcnt,
2715 #endif /* HAS_MMAP */
2722 atexit(&PerlIO_cleanup);
2731 PerlIO_stdstreams();
2735 #undef PerlIO_stdout
2740 PerlIO_stdstreams();
2744 #undef PerlIO_stderr
2749 PerlIO_stdstreams();
2753 /*--------------------------------------------------------------------------------------*/
2755 #undef PerlIO_getname
2757 PerlIO_getname(PerlIO *f, char *buf)
2760 Perl_croak(aTHX_ "Don't know how to get file name");
2765 /*--------------------------------------------------------------------------------------*/
2766 /* Functions which can be called on any kind of PerlIO implemented
2772 PerlIO_getc(PerlIO *f)
2775 SSize_t count = PerlIO_read(f,buf,1);
2778 return (unsigned char) buf[0];
2783 #undef PerlIO_ungetc
2785 PerlIO_ungetc(PerlIO *f, int ch)
2790 if (PerlIO_unread(f,&buf,1) == 1)
2798 PerlIO_putc(PerlIO *f, int ch)
2801 return PerlIO_write(f,&buf,1);
2806 PerlIO_puts(PerlIO *f, const char *s)
2808 STRLEN len = strlen(s);
2809 return PerlIO_write(f,s,len);
2812 #undef PerlIO_rewind
2814 PerlIO_rewind(PerlIO *f)
2816 PerlIO_seek(f,(Off_t)0,SEEK_SET);
2820 #undef PerlIO_vprintf
2822 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
2825 SV *sv = newSVpvn("",0);
2830 Perl_va_copy(ap, apc);
2831 sv_vcatpvf(sv, fmt, &apc);
2833 sv_vcatpvf(sv, fmt, &ap);
2836 return PerlIO_write(f,s,len);
2839 #undef PerlIO_printf
2841 PerlIO_printf(PerlIO *f,const char *fmt,...)
2846 result = PerlIO_vprintf(f,fmt,ap);
2851 #undef PerlIO_stdoutf
2853 PerlIO_stdoutf(const char *fmt,...)
2858 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
2863 #undef PerlIO_tmpfile
2865 PerlIO_tmpfile(void)
2867 /* I have no idea how portable mkstemp() is ... */
2868 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
2870 FILE *stdio = tmpfile();
2873 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"w+"),PerlIOStdio);
2879 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
2880 int fd = mkstemp(SvPVX(sv));
2884 f = PerlIO_fdopen(fd,"w+");
2887 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
2889 PerlLIO_unlink(SvPVX(sv));
2899 #endif /* USE_SFIO */
2900 #endif /* PERLIO_IS_STDIO */
2902 /*======================================================================================*/
2903 /* Now some functions in terms of above which may be needed even if
2904 we are not in true PerlIO mode
2908 #undef PerlIO_setpos
2910 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2912 return PerlIO_seek(f,*pos,0);
2915 #ifndef PERLIO_IS_STDIO
2916 #undef PerlIO_setpos
2918 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2920 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2921 return fsetpos64(f, pos);
2923 return fsetpos(f, pos);
2930 #undef PerlIO_getpos
2932 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2934 *pos = PerlIO_tell(f);
2935 return *pos == -1 ? -1 : 0;
2938 #ifndef PERLIO_IS_STDIO
2939 #undef PerlIO_getpos
2941 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2943 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2944 return fgetpos64(f, pos);
2946 return fgetpos(f, pos);
2952 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
2955 vprintf(char *pat, char *args)
2957 _doprnt(pat, args, stdout);
2958 return 0; /* wrong, but perl doesn't use the return value */
2962 vfprintf(FILE *fd, char *pat, char *args)
2964 _doprnt(pat, args, fd);
2965 return 0; /* wrong, but perl doesn't use the return value */
2970 #ifndef PerlIO_vsprintf
2972 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
2974 int val = vsprintf(s, fmt, ap);
2977 if (strlen(s) >= (STRLEN)n)
2980 (void)PerlIO_puts(Perl_error_log,
2981 "panic: sprintf overflow - memory corrupted!\n");
2989 #ifndef PerlIO_sprintf
2991 PerlIO_sprintf(char *s, int n, const char *fmt,...)
2996 result = PerlIO_vsprintf(s, n, fmt, ap);
3002 #endif /* !PERL_IMPLICIT_SYS */