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--)
210 PerlIO_cleantable(&_perlio);
214 PerlIO_pop(PerlIO *f)
219 (*l->tab->Popped)(f);
225 /*--------------------------------------------------------------------------------------*/
226 /* XS Interface for perl code */
232 char *s = GvNAME(gv);
233 STRLEN l = GvNAMELEN(gv);
234 PerlIO_debug("%.*s\n",(int) l,s);
238 XS(XS_perlio_unimport)
242 char *s = GvNAME(gv);
243 STRLEN l = GvNAMELEN(gv);
244 PerlIO_debug("%.*s\n",(int) l,s);
249 PerlIO_find_layer(const char *name, STRLEN len)
256 svp = hv_fetch(PerlIO_layer_hv,name,len,0);
257 if (svp && (sv = *svp) && SvROK(sv))
264 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
268 IO *io = GvIOn((GV *)SvRV(sv));
269 PerlIO *ifp = IoIFP(io);
270 PerlIO *ofp = IoOFP(io);
271 AV *av = (AV *) mg->mg_obj;
272 Perl_warn(aTHX_ "set %_ %p %p %p",sv,io,ifp,ofp);
278 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
282 IO *io = GvIOn((GV *)SvRV(sv));
283 PerlIO *ifp = IoIFP(io);
284 PerlIO *ofp = IoOFP(io);
285 AV *av = (AV *) mg->mg_obj;
286 Perl_warn(aTHX_ "get %_ %p %p %p",sv,io,ifp,ofp);
292 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
294 Perl_warn(aTHX_ "clear %_",sv);
299 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
301 Perl_warn(aTHX_ "free %_",sv);
305 MGVTBL perlio_vtab = {
313 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
316 SV *sv = SvRV(ST(1));
321 sv_magic(sv, (SV *)av, '~', NULL, 0);
323 mg = mg_find(sv,'~');
324 mg->mg_virtual = &perlio_vtab;
326 Perl_warn(aTHX_ "attrib %_",sv);
327 for (i=2; i < items; i++)
330 const char *name = SvPV(ST(i),len);
331 SV *layer = PerlIO_find_layer(name,len);
334 av_push(av,SvREFCNT_inc(layer));
347 PerlIO_define_layer(PerlIO_funcs *tab)
350 HV *stash = gv_stashpv("perlio::Layer", TRUE);
351 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))),stash);
352 hv_store(PerlIO_layer_hv,tab->name,strlen(tab->name),sv,0);
356 PerlIO_default_layer(I32 n)
361 PerlIO_funcs *tab = &PerlIO_stdio;
363 if (!PerlIO_layer_hv)
365 const char *s = PerlEnv_getenv("PERLIO");
366 newXS("perlio::import",XS_perlio_import,__FILE__);
367 newXS("perlio::unimport",XS_perlio_unimport,__FILE__);
369 newXS("io::MODIFY_SCALAR_ATTRIBUTES",XS_io_MODIFY_SCALAR_ATTRIBUTES,__FILE__);
371 PerlIO_layer_hv = get_hv("open::layers",GV_ADD|GV_ADDMULTI);
372 PerlIO_layer_av = get_av("open::layers",GV_ADD|GV_ADDMULTI);
373 PerlIO_define_layer(&PerlIO_unix);
374 PerlIO_define_layer(&PerlIO_perlio);
375 PerlIO_define_layer(&PerlIO_stdio);
376 PerlIO_define_layer(&PerlIO_crlf);
378 PerlIO_define_layer(&PerlIO_mmap);
380 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_unix.name,0)));
385 while (*s && isSPACE((unsigned char)*s))
391 while (*e && !isSPACE((unsigned char)*e))
395 layer = PerlIO_find_layer(s,e-s);
398 PerlIO_debug("Pushing %.*s\n",(e-s),s);
399 av_push(PerlIO_layer_av,SvREFCNT_inc(layer));
402 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
408 len = av_len(PerlIO_layer_av);
411 if (PerlIO_stdio.Set_ptrcnt)
413 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_stdio.name,0)));
417 av_push(PerlIO_layer_av,SvREFCNT_inc(PerlIO_find_layer(PerlIO_perlio.name,0)));
419 len = av_len(PerlIO_layer_av);
423 svp = av_fetch(PerlIO_layer_av,n,0);
424 if (svp && (layer = *svp) && SvROK(layer) && SvIOK((layer = SvRV(layer))))
426 tab = INT2PTR(PerlIO_funcs *, SvIV(layer));
428 /* PerlIO_debug("Layer %d is %s\n",n,tab->name); */
433 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
437 const char *s = names;
447 while (*e && *e != ':' && !isSPACE(*e))
451 SV *layer = PerlIO_find_layer(s,e-s);
454 PerlIO_funcs *tab = INT2PTR(PerlIO_funcs *, SvIV(SvRV(layer)));
457 PerlIO *new = PerlIO_push(f,tab,mode);
463 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",(e-s),s);
472 #define PerlIO_default_top() PerlIO_default_layer(-1)
473 #define PerlIO_default_btm() PerlIO_default_layer(0)
481 PerlIO_fdopen(0,"Ir");
482 PerlIO_fdopen(1,"Iw");
483 PerlIO_fdopen(2,"Iw");
488 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
491 Newc('L',l,tab->size,char,PerlIOl);
494 Zero(l,tab->size,char);
498 if ((*l->tab->Pushed)(f,mode) != 0)
507 /*--------------------------------------------------------------------------------------*/
508 /* Given the abstraction above the public API functions */
512 PerlIO_close(PerlIO *f)
514 int code = (*PerlIOBase(f)->tab->Close)(f);
524 PerlIO_fileno(PerlIO *f)
526 return (*PerlIOBase(f)->tab->Fileno)(f);
533 PerlIO_fdopen(int fd, const char *mode)
535 PerlIO_funcs *tab = PerlIO_default_top();
538 return (*tab->Fdopen)(tab,fd,mode);
543 PerlIO_open(const char *path, const char *mode)
545 PerlIO_funcs *tab = PerlIO_default_top();
548 return (*tab->Open)(tab,path,mode);
553 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
558 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
560 if ((*PerlIOBase(f)->tab->Pushed)(f,mode) == 0)
566 return PerlIO_open(path,mode);
571 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
573 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
578 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
580 return (*PerlIOBase(f)->tab->Unread)(f,vbuf,count);
585 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
587 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
592 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
594 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
599 PerlIO_tell(PerlIO *f)
601 return (*PerlIOBase(f)->tab->Tell)(f);
606 PerlIO_flush(PerlIO *f)
610 return (*PerlIOBase(f)->tab->Flush)(f);
614 PerlIO **table = &_perlio;
619 table = (PerlIO **)(f++);
620 for (i=1; i < PERLIO_TABLE_SIZE; i++)
622 if (*f && PerlIO_flush(f) != 0)
633 PerlIO_fill(PerlIO *f)
635 return (*PerlIOBase(f)->tab->Fill)(f);
640 PerlIO_isutf8(PerlIO *f)
642 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
647 PerlIO_eof(PerlIO *f)
649 return (*PerlIOBase(f)->tab->Eof)(f);
654 PerlIO_error(PerlIO *f)
656 return (*PerlIOBase(f)->tab->Error)(f);
659 #undef PerlIO_clearerr
661 PerlIO_clearerr(PerlIO *f)
663 (*PerlIOBase(f)->tab->Clearerr)(f);
666 #undef PerlIO_setlinebuf
668 PerlIO_setlinebuf(PerlIO *f)
670 (*PerlIOBase(f)->tab->Setlinebuf)(f);
673 #undef PerlIO_has_base
675 PerlIO_has_base(PerlIO *f)
679 return (PerlIOBase(f)->tab->Get_base != NULL);
684 #undef PerlIO_fast_gets
686 PerlIO_fast_gets(PerlIO *f)
690 PerlIOl *l = PerlIOBase(f);
691 return (l->tab->Set_ptrcnt != NULL);
696 #undef PerlIO_has_cntptr
698 PerlIO_has_cntptr(PerlIO *f)
702 PerlIO_funcs *tab = PerlIOBase(f)->tab;
703 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
708 #undef PerlIO_canset_cnt
710 PerlIO_canset_cnt(PerlIO *f)
714 PerlIOl *l = PerlIOBase(f);
715 return (l->tab->Set_ptrcnt != NULL);
720 #undef PerlIO_get_base
722 PerlIO_get_base(PerlIO *f)
724 return (*PerlIOBase(f)->tab->Get_base)(f);
727 #undef PerlIO_get_bufsiz
729 PerlIO_get_bufsiz(PerlIO *f)
731 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
734 #undef PerlIO_get_ptr
736 PerlIO_get_ptr(PerlIO *f)
738 return (*PerlIOBase(f)->tab->Get_ptr)(f);
741 #undef PerlIO_get_cnt
743 PerlIO_get_cnt(PerlIO *f)
745 return (*PerlIOBase(f)->tab->Get_cnt)(f);
748 #undef PerlIO_set_cnt
750 PerlIO_set_cnt(PerlIO *f,int cnt)
752 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
755 #undef PerlIO_set_ptrcnt
757 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
759 (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
762 /*--------------------------------------------------------------------------------------*/
763 /* "Methods" of the "base class" */
766 PerlIOBase_fileno(PerlIO *f)
768 return PerlIO_fileno(PerlIONext(f));
772 PerlIOBase_pushed(PerlIO *f, const char *mode)
774 PerlIOl *l = PerlIOBase(f);
775 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
776 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
782 l->flags = PERLIO_F_CANREAD;
785 l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE;
788 l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
799 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
802 l->flags |= PERLIO_F_BINARY;
814 l->flags |= l->next->flags &
815 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
816 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
823 PerlIOBase_popped(PerlIO *f)
829 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
831 Off_t old = PerlIO_tell(f);
832 if (PerlIO_seek(f,-((Off_t)count),SEEK_CUR) == 0)
834 Off_t new = PerlIO_tell(f);
841 PerlIOBase_noop_ok(PerlIO *f)
847 PerlIOBase_noop_fail(PerlIO *f)
853 PerlIOBase_close(PerlIO *f)
856 if (PerlIO_flush(f) != 0)
858 if (PerlIO_close(PerlIONext(f)) != 0)
860 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
865 PerlIOBase_eof(PerlIO *f)
869 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
875 PerlIOBase_error(PerlIO *f)
879 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
885 PerlIOBase_clearerr(PerlIO *f)
889 PerlIOBase(f)->flags &= ~PERLIO_F_ERROR;
894 PerlIOBase_setlinebuf(PerlIO *f)
899 /*--------------------------------------------------------------------------------------*/
900 /* Bottom-most level for UNIX-like case */
904 struct _PerlIO base; /* The generic part */
905 int fd; /* UNIX like file descriptor */
906 int oflags; /* open/fcntl flags */
910 PerlIOUnix_oflags(const char *mode)
925 oflags = O_CREAT|O_TRUNC;
936 oflags = O_CREAT|O_APPEND;
946 if (*mode || oflags == -1)
955 PerlIOUnix_fileno(PerlIO *f)
957 return PerlIOSelf(f,PerlIOUnix)->fd;
961 PerlIOUnix_fdopen(PerlIO_funcs *self, int fd,const char *mode)
968 int oflags = PerlIOUnix_oflags(mode);
971 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
974 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
981 PerlIOUnix_open(PerlIO_funcs *self, const char *path,const char *mode)
984 int oflags = PerlIOUnix_oflags(mode);
987 int fd = PerlLIO_open3(path,oflags,0666);
990 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOUnix);
993 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1000 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
1002 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
1003 int oflags = PerlIOUnix_oflags(mode);
1004 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1005 (*PerlIOBase(f)->tab->Close)(f);
1008 int fd = PerlLIO_open3(path,oflags,0666);
1013 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1021 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
1023 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1024 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1028 SSize_t len = PerlLIO_read(fd,vbuf,count);
1029 if (len >= 0 || errno != EINTR)
1032 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1033 else if (len == 0 && count != 0)
1034 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1041 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
1043 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1046 SSize_t len = PerlLIO_write(fd,vbuf,count);
1047 if (len >= 0 || errno != EINTR)
1050 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1057 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
1059 Off_t new = PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
1060 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1061 return (new == (Off_t) -1) ? -1 : 0;
1065 PerlIOUnix_tell(PerlIO *f)
1067 return PerlLIO_lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
1071 PerlIOUnix_close(PerlIO *f)
1073 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
1075 while (PerlLIO_close(fd) != 0)
1085 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
1090 PerlIO_funcs PerlIO_unix = {
1106 PerlIOBase_noop_ok, /* flush */
1107 PerlIOBase_noop_fail, /* fill */
1110 PerlIOBase_clearerr,
1111 PerlIOBase_setlinebuf,
1112 NULL, /* get_base */
1113 NULL, /* get_bufsiz */
1116 NULL, /* set_ptrcnt */
1119 /*--------------------------------------------------------------------------------------*/
1120 /* stdio as a layer */
1124 struct _PerlIO base;
1125 FILE * stdio; /* The stream */
1129 PerlIOStdio_fileno(PerlIO *f)
1131 return fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
1136 PerlIOStdio_fdopen(PerlIO_funcs *self, int fd,const char *mode)
1164 stdio = fdopen(fd,mode);
1167 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1174 #undef PerlIO_importFILE
1176 PerlIO_importFILE(FILE *stdio, int fl)
1181 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"r+"),PerlIOStdio);
1188 PerlIOStdio_open(PerlIO_funcs *self, const char *path,const char *mode)
1191 FILE *stdio = fopen(path,mode);
1194 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),self,mode),PerlIOStdio);
1201 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
1203 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
1204 FILE *stdio = freopen(path,mode,s->stdio);
1212 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
1214 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1218 STDCHAR *buf = (STDCHAR *) vbuf;
1219 /* Perl is expecting PerlIO_getc() to fill the buffer
1220 * Linux's stdio does not do that for fread()
1230 got = fread(vbuf,1,count,s);
1235 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
1237 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
1238 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
1242 int ch = *buf-- & 0xff;
1243 if (ungetc(ch,s) != ch)
1252 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
1254 return fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
1258 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
1260 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1261 return fseek(stdio,offset,whence);
1265 PerlIOStdio_tell(PerlIO *f)
1267 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1268 return ftell(stdio);
1272 PerlIOStdio_close(PerlIO *f)
1274 return fclose(PerlIOSelf(f,PerlIOStdio)->stdio);
1278 PerlIOStdio_flush(PerlIO *f)
1280 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1281 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
1283 return fflush(stdio);
1288 /* FIXME: This discards ungetc() and pre-read stuff which is
1289 not right if this is just a "sync" from a layer above
1290 Suspect right design is to do _this_ but not have layer above
1291 flush this layer read-to-read
1293 /* Not writeable - sync by attempting a seek */
1295 if (fseek(stdio,(Off_t) 0, SEEK_CUR) != 0)
1303 PerlIOStdio_fill(PerlIO *f)
1305 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1307 if (fflush(stdio) != 0)
1310 if (c == EOF || ungetc(c,stdio) != c)
1316 PerlIOStdio_eof(PerlIO *f)
1318 return feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1322 PerlIOStdio_error(PerlIO *f)
1324 return ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1328 PerlIOStdio_clearerr(PerlIO *f)
1330 clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1334 PerlIOStdio_setlinebuf(PerlIO *f)
1336 #ifdef HAS_SETLINEBUF
1337 setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1339 setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1345 PerlIOStdio_get_base(PerlIO *f)
1347 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1348 return FILE_base(stdio);
1352 PerlIOStdio_get_bufsiz(PerlIO *f)
1354 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1355 return FILE_bufsiz(stdio);
1359 #ifdef USE_STDIO_PTR
1361 PerlIOStdio_get_ptr(PerlIO *f)
1363 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1364 return FILE_ptr(stdio);
1368 PerlIOStdio_get_cnt(PerlIO *f)
1370 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1371 return FILE_cnt(stdio);
1375 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1377 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1380 #ifdef STDIO_PTR_LVALUE
1381 FILE_ptr(stdio) = ptr;
1382 #ifdef STDIO_PTR_LVAL_SETS_CNT
1383 if (FILE_cnt(stdio) != (cnt))
1386 assert(FILE_cnt(stdio) == (cnt));
1389 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1390 /* Setting ptr _does_ change cnt - we are done */
1393 #else /* STDIO_PTR_LVALUE */
1395 #endif /* STDIO_PTR_LVALUE */
1397 /* Now (or only) set cnt */
1398 #ifdef STDIO_CNT_LVALUE
1399 FILE_cnt(stdio) = cnt;
1400 #else /* STDIO_CNT_LVALUE */
1401 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1402 FILE_ptr(stdio) = FILE_ptr(stdio)+(FILE_cnt(stdio)-cnt);
1403 #else /* STDIO_PTR_LVAL_SETS_CNT */
1405 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1406 #endif /* STDIO_CNT_LVALUE */
1411 PerlIO_funcs PerlIO_stdio = {
1413 sizeof(PerlIOStdio),
1431 PerlIOStdio_clearerr,
1432 PerlIOStdio_setlinebuf,
1434 PerlIOStdio_get_base,
1435 PerlIOStdio_get_bufsiz,
1440 #ifdef USE_STDIO_PTR
1441 PerlIOStdio_get_ptr,
1442 PerlIOStdio_get_cnt,
1443 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1444 PerlIOStdio_set_ptrcnt
1445 #else /* STDIO_PTR_LVALUE */
1447 #endif /* STDIO_PTR_LVALUE */
1448 #else /* USE_STDIO_PTR */
1452 #endif /* USE_STDIO_PTR */
1455 #undef PerlIO_exportFILE
1457 PerlIO_exportFILE(PerlIO *f, int fl)
1460 /* Should really push stdio discipline when we have them */
1461 return fdopen(PerlIO_fileno(f),"r+");
1464 #undef PerlIO_findFILE
1466 PerlIO_findFILE(PerlIO *f)
1468 return PerlIO_exportFILE(f,0);
1471 #undef PerlIO_releaseFILE
1473 PerlIO_releaseFILE(PerlIO *p, FILE *f)
1477 /*--------------------------------------------------------------------------------------*/
1478 /* perlio buffer layer */
1481 PerlIOBuf_fdopen(PerlIO_funcs *self, int fd, const char *mode)
1483 PerlIO_funcs *tab = PerlIO_default_btm();
1491 f = (*tab->Fdopen)(tab,fd,mode);
1494 /* Initial stderr is unbuffered */
1495 if (!init || fd != 2)
1497 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
1498 b->posn = PerlIO_tell(PerlIONext(f));
1505 PerlIOBuf_open(PerlIO_funcs *self, const char *path, const char *mode)
1507 PerlIO_funcs *tab = PerlIO_default_btm();
1508 PerlIO *f = (*tab->Open)(tab,path,mode);
1511 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,self,NULL),PerlIOBuf);
1512 b->posn = PerlIO_tell(PerlIONext(f));
1518 PerlIOBuf_reopen(const char *path, const char *mode, PerlIO *f)
1520 PerlIO *next = PerlIONext(f);
1521 int code = (*PerlIOBase(next)->tab->Reopen)(path,mode,next);
1523 code = (*PerlIOBase(f)->tab->Pushed)(f,mode);
1526 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1527 b->posn = PerlIO_tell(PerlIONext(f));
1532 /* This "flush" is akin to sfio's sync in that it handles files in either
1536 PerlIOBuf_flush(PerlIO *f)
1538 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1540 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1542 /* write() the buffer */
1543 STDCHAR *p = b->buf;
1547 count = PerlIO_write(PerlIONext(f),p,b->ptr - p);
1554 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1559 b->posn += (p - b->buf);
1561 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1563 /* Note position change */
1564 b->posn += (b->ptr - b->buf);
1565 if (b->ptr < b->end)
1567 /* We did not consume all of it */
1568 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
1570 b->posn = PerlIO_tell(PerlIONext(f));
1574 b->ptr = b->end = b->buf;
1575 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1576 /* FIXME: Is this right for read case ? */
1577 if (PerlIO_flush(PerlIONext(f)) != 0)
1583 PerlIOBuf_fill(PerlIO *f)
1585 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1586 PerlIO *n = PerlIONext(f);
1588 /* FIXME: doing the down-stream flush is a bad idea if it causes
1589 pre-read data in stdio buffer to be discarded
1590 but this is too simplistic - as it skips _our_ hosekeeping
1591 and breaks tell tests.
1592 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
1596 if (PerlIO_flush(f) != 0)
1599 b->ptr = b->end = b->buf;
1600 if (PerlIO_fast_gets(n))
1602 /* Layer below is also buffered
1603 * We do _NOT_ want to call its ->Read() because that will loop
1604 * till it gets what we asked for which may hang on a pipe etc.
1605 * Instead take anything it has to hand, or ask it to fill _once_.
1607 avail = PerlIO_get_cnt(n);
1610 avail = PerlIO_fill(n);
1612 avail = PerlIO_get_cnt(n);
1615 if (!PerlIO_error(n) && PerlIO_eof(n))
1621 STDCHAR *ptr = PerlIO_get_ptr(n);
1622 SSize_t cnt = avail;
1623 if (avail > b->bufsiz)
1625 Copy(ptr,b->buf,avail,STDCHAR);
1626 PerlIO_set_ptrcnt(n,ptr+avail,cnt-avail);
1631 avail = PerlIO_read(n,b->ptr,b->bufsiz);
1636 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1638 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1641 b->end = b->buf+avail;
1642 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1647 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
1649 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1650 STDCHAR *buf = (STDCHAR *) vbuf;
1656 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1660 SSize_t avail = (b->end - b->ptr);
1661 if ((SSize_t) count < avail)
1665 Copy(b->ptr,buf,avail,STDCHAR);
1671 if (count && (b->ptr >= b->end))
1673 if (PerlIO_fill(f) != 0)
1683 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
1685 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1686 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1689 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1695 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1697 avail = (b->ptr - b->buf);
1698 if (avail > (SSize_t) count)
1705 if (avail > (SSize_t) count)
1707 b->end = b->ptr + avail;
1714 Copy(buf,b->ptr,avail,STDCHAR);
1718 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
1725 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
1727 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1728 const STDCHAR *buf = (const STDCHAR *) vbuf;
1732 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1736 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
1737 if ((SSize_t) count < avail)
1739 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
1740 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
1760 Copy(buf,b->ptr,avail,STDCHAR);
1767 if (b->ptr >= (b->buf + b->bufsiz))
1774 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
1776 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1777 int code = PerlIO_flush(f);
1780 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1781 code = PerlIO_seek(PerlIONext(f),offset,whence);
1784 b->posn = PerlIO_tell(PerlIONext(f));
1791 PerlIOBuf_tell(PerlIO *f)
1793 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1794 Off_t posn = b->posn;
1796 posn += (b->ptr - b->buf);
1801 PerlIOBuf_close(PerlIO *f)
1803 IV code = PerlIOBase_close(f);
1804 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1805 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
1810 b->ptr = b->end = b->buf;
1811 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1816 PerlIOBuf_setlinebuf(PerlIO *f)
1820 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
1825 PerlIOBuf_get_ptr(PerlIO *f)
1827 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1834 PerlIOBuf_get_cnt(PerlIO *f)
1836 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1839 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1840 return (b->end - b->ptr);
1845 PerlIOBuf_get_base(PerlIO *f)
1847 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1852 New('B',b->buf,b->bufsiz,STDCHAR);
1855 b->buf = (STDCHAR *)&b->oneword;
1856 b->bufsiz = sizeof(b->oneword);
1865 PerlIOBuf_bufsiz(PerlIO *f)
1867 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1870 return (b->end - b->buf);
1874 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
1876 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1880 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
1883 assert(PerlIO_get_cnt(f) == cnt);
1884 assert(b->ptr >= b->buf);
1886 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1889 PerlIO_funcs PerlIO_perlio = {
1909 PerlIOBase_clearerr,
1910 PerlIOBuf_setlinebuf,
1915 PerlIOBuf_set_ptrcnt,
1918 /*--------------------------------------------------------------------------------------*/
1919 /* crlf - translation currently just a copy of perlio to prove
1920 that extra buffering which real one will do is not an issue.
1923 PerlIO_funcs PerlIO_crlf = {
1943 PerlIOBase_clearerr,
1944 PerlIOBuf_setlinebuf,
1949 PerlIOBuf_set_ptrcnt,
1953 /*--------------------------------------------------------------------------------------*/
1954 /* mmap as "buffer" layer */
1958 PerlIOBuf base; /* PerlIOBuf stuff */
1959 Mmap_t mptr; /* Mapped address */
1960 Size_t len; /* mapped length */
1961 STDCHAR *bbuf; /* malloced buffer if map fails */
1965 static size_t page_size = 0;
1968 PerlIOMmap_map(PerlIO *f)
1971 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
1972 PerlIOBuf *b = &m->base;
1973 IV flags = PerlIOBase(f)->flags;
1977 if (flags & PERLIO_F_CANREAD)
1979 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1980 int fd = PerlIO_fileno(f);
1982 code = fstat(fd,&st);
1983 if (code == 0 && S_ISREG(st.st_mode))
1985 SSize_t len = st.st_size - b->posn;
1990 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
1992 SETERRNO(0,SS$_NORMAL);
1993 # ifdef _SC_PAGESIZE
1994 page_size = sysconf(_SC_PAGESIZE);
1996 page_size = sysconf(_SC_PAGE_SIZE);
1998 if ((long)page_size < 0) {
2003 (void)SvUPGRADE(error, SVt_PV);
2004 msg = SvPVx(error, n_a);
2005 Perl_croak(aTHX_ "panic: sysconf: %s", msg);
2008 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
2012 # ifdef HAS_GETPAGESIZE
2013 page_size = getpagesize();
2015 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
2016 page_size = PAGESIZE; /* compiletime, bad */
2020 if ((IV)page_size <= 0)
2021 Perl_croak(aTHX_ "panic: bad pagesize %"IVdf, (IV)page_size);
2025 /* This is a hack - should never happen - open should have set it ! */
2026 b->posn = PerlIO_tell(PerlIONext(f));
2028 posn = (b->posn / page_size) * page_size;
2029 len = st.st_size - posn;
2030 m->mptr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, posn);
2031 if (m->mptr && m->mptr != (Mmap_t) -1)
2033 #if defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
2034 madvise(m->mptr, len, MADV_SEQUENTIAL);
2036 PerlIOBase(f)->flags = (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
2037 b->end = ((STDCHAR *)m->mptr) + len;
2038 b->buf = ((STDCHAR *)m->mptr) + (b->posn - posn);
2049 PerlIOBase(f)->flags = flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
2051 b->ptr = b->end = b->ptr;
2060 PerlIOMmap_unmap(PerlIO *f)
2062 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2063 PerlIOBuf *b = &m->base;
2069 code = munmap(m->mptr, m->len);
2073 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) != 0)
2076 b->ptr = b->end = b->buf;
2077 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
2083 PerlIOMmap_get_base(PerlIO *f)
2085 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2086 PerlIOBuf *b = &m->base;
2087 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2089 /* Already have a readbuffer in progress */
2094 /* We have a write buffer or flushed PerlIOBuf read buffer */
2095 m->bbuf = b->buf; /* save it in case we need it again */
2096 b->buf = NULL; /* Clear to trigger below */
2100 PerlIOMmap_map(f); /* Try and map it */
2103 /* Map did not work - recover PerlIOBuf buffer if we have one */
2107 b->ptr = b->end = b->buf;
2110 return PerlIOBuf_get_base(f);
2114 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
2116 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2117 PerlIOBuf *b = &m->base;
2118 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2120 if (b->ptr && (b->ptr - count) >= b->buf && memEQ(b->ptr - count,vbuf,count))
2123 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
2128 /* Loose the unwritable mapped buffer */
2130 /* If flush took the "buffer" see if we have one from before */
2131 if (!b->buf && m->bbuf)
2135 PerlIOBuf_get_base(f);
2139 return PerlIOBuf_unread(f,vbuf,count);
2143 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
2145 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2146 PerlIOBuf *b = &m->base;
2147 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF))
2149 /* No, or wrong sort of, buffer */
2152 if (PerlIOMmap_unmap(f) != 0)
2155 /* If unmap took the "buffer" see if we have one from before */
2156 if (!b->buf && m->bbuf)
2160 PerlIOBuf_get_base(f);
2164 return PerlIOBuf_write(f,vbuf,count);
2168 PerlIOMmap_flush(PerlIO *f)
2170 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2171 PerlIOBuf *b = &m->base;
2172 IV code = PerlIOBuf_flush(f);
2173 /* Now we are "synced" at PerlIOBuf level */
2178 /* Unmap the buffer */
2179 if (PerlIOMmap_unmap(f) != 0)
2184 /* We seem to have a PerlIOBuf buffer which was not mapped
2185 * remember it in case we need one later
2194 PerlIOMmap_fill(PerlIO *f)
2196 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
2197 IV code = PerlIO_flush(f);
2198 if (code == 0 && !b->buf)
2200 code = PerlIOMmap_map(f);
2202 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF))
2204 code = PerlIOBuf_fill(f);
2210 PerlIOMmap_close(PerlIO *f)
2212 PerlIOMmap *m = PerlIOSelf(f,PerlIOMmap);
2213 PerlIOBuf *b = &m->base;
2214 IV code = PerlIO_flush(f);
2219 b->ptr = b->end = b->buf;
2221 if (PerlIOBuf_close(f) != 0)
2227 PerlIO_funcs PerlIO_mmap = {
2247 PerlIOBase_clearerr,
2248 PerlIOBuf_setlinebuf,
2249 PerlIOMmap_get_base,
2253 PerlIOBuf_set_ptrcnt,
2256 #endif /* HAS_MMAP */
2263 atexit(&PerlIO_cleanup);
2272 PerlIO_stdstreams();
2276 #undef PerlIO_stdout
2281 PerlIO_stdstreams();
2285 #undef PerlIO_stderr
2290 PerlIO_stdstreams();
2294 /*--------------------------------------------------------------------------------------*/
2296 #undef PerlIO_getname
2298 PerlIO_getname(PerlIO *f, char *buf)
2301 Perl_croak(aTHX_ "Don't know how to get file name");
2306 /*--------------------------------------------------------------------------------------*/
2307 /* Functions which can be called on any kind of PerlIO implemented
2313 PerlIO_getc(PerlIO *f)
2316 SSize_t count = PerlIO_read(f,buf,1);
2319 return (unsigned char) buf[0];
2324 #undef PerlIO_ungetc
2326 PerlIO_ungetc(PerlIO *f, int ch)
2331 if (PerlIO_unread(f,&buf,1) == 1)
2339 PerlIO_putc(PerlIO *f, int ch)
2342 return PerlIO_write(f,&buf,1);
2347 PerlIO_puts(PerlIO *f, const char *s)
2349 STRLEN len = strlen(s);
2350 return PerlIO_write(f,s,len);
2353 #undef PerlIO_rewind
2355 PerlIO_rewind(PerlIO *f)
2357 PerlIO_seek(f,(Off_t)0,SEEK_SET);
2361 #undef PerlIO_vprintf
2363 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
2366 SV *sv = newSVpvn("",0);
2369 sv_vcatpvf(sv, fmt, &ap);
2371 return PerlIO_write(f,s,len);
2374 #undef PerlIO_printf
2376 PerlIO_printf(PerlIO *f,const char *fmt,...)
2381 result = PerlIO_vprintf(f,fmt,ap);
2386 #undef PerlIO_stdoutf
2388 PerlIO_stdoutf(const char *fmt,...)
2393 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
2398 #undef PerlIO_tmpfile
2400 PerlIO_tmpfile(void)
2403 /* I have no idea how portable mkstemp() is ... */
2404 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
2405 int fd = mkstemp(SvPVX(sv));
2409 f = PerlIO_fdopen(fd,"w+");
2412 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
2414 PerlLIO_unlink(SvPVX(sv));
2423 #endif /* USE_SFIO */
2424 #endif /* PERLIO_IS_STDIO */
2426 /*======================================================================================*/
2427 /* Now some functions in terms of above which may be needed even if
2428 we are not in true PerlIO mode
2432 #undef PerlIO_setpos
2434 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2436 return PerlIO_seek(f,*pos,0);
2439 #ifndef PERLIO_IS_STDIO
2440 #undef PerlIO_setpos
2442 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
2444 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2445 return fsetpos64(f, pos);
2447 return fsetpos(f, pos);
2454 #undef PerlIO_getpos
2456 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2458 *pos = PerlIO_tell(f);
2459 return *pos == -1 ? -1 : 0;
2462 #ifndef PERLIO_IS_STDIO
2463 #undef PerlIO_getpos
2465 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
2467 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
2468 return fgetpos64(f, pos);
2470 return fgetpos(f, pos);
2476 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
2479 vprintf(char *pat, char *args)
2481 _doprnt(pat, args, stdout);
2482 return 0; /* wrong, but perl doesn't use the return value */
2486 vfprintf(FILE *fd, char *pat, char *args)
2488 _doprnt(pat, args, fd);
2489 return 0; /* wrong, but perl doesn't use the return value */
2494 #ifndef PerlIO_vsprintf
2496 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
2498 int val = vsprintf(s, fmt, ap);
2501 if (strlen(s) >= (STRLEN)n)
2504 (void)PerlIO_puts(Perl_error_log,
2505 "panic: sprintf overflow - memory corrupted!\n");
2513 #ifndef PerlIO_sprintf
2515 PerlIO_sprintf(char *s, int n, const char *fmt,...)
2520 result = PerlIO_vsprintf(s, n, fmt, ap);
2526 #endif /* !PERL_IMPLICIT_SYS */