2 * perlio.c Copyright (c) 1996-2002, Nick Ing-Simmons You may distribute
3 * under the terms of either the GNU General Public License or the
4 * Artistic License, as specified in the README file.
8 * Hour after hour for nearly three weary days he had jogged up and down,
9 * over passes, and through long dales, and across many streams.
13 * If we have ActivePerl-like PERL_IMPLICIT_SYS then we need a dTHX to get
14 * at the dispatch tables, even when we do not need it for other reasons.
15 * Invent a dSYS macro to abstract this out
17 #ifdef PERL_IMPLICIT_SYS
30 #define PERLIO_NOT_STDIO 0
31 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
37 * This file provides those parts of PerlIO abstraction
38 * which are not #defined in perlio.h.
39 * Which these are depends on various Configure #ifdef's
43 #define PERL_IN_PERLIO_C
46 #ifdef PERL_IMPLICIT_CONTEXT
54 perlsio_binmode(FILE *fp, int iotype, int mode)
57 * This used to be contents of do_binmode in doio.c
60 # if defined(atarist) || defined(__MINT__)
63 ((FILE *) fp)->_flag |= _IOBIN;
65 ((FILE *) fp)->_flag &= ~_IOBIN;
72 if (PerlLIO_setmode(fp, mode) != -1) {
74 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
76 # if defined(WIN32) && defined(__BORLANDC__)
78 * The translation mode of the stream is maintained independent of
79 * the translation mode of the fd in the Borland RTL (heavy
80 * digging through their runtime sources reveal). User has to set
81 * the mode explicitly for the stream (though they don't document
82 * this anywhere). GSAR 97-5-24
96 # if defined(USEMYBINMODE)
98 if (my_binmode(fp, iotype, mode) != FALSE)
109 #define O_ACCMODE 3 /* Assume traditional implementation */
113 PerlIO_intmode2str(int rawmode, char *mode, int *writing)
115 int result = rawmode & O_ACCMODE;
120 ptype = IoTYPE_RDONLY;
123 ptype = IoTYPE_WRONLY;
131 *writing = (result != O_RDONLY);
133 if (result == O_RDONLY) {
137 else if (rawmode & O_APPEND) {
139 if (result != O_WRONLY)
144 if (result == O_WRONLY)
151 if (rawmode & O_BINARY)
157 #ifndef PERLIO_LAYERS
159 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
161 if (!names || !*names || strEQ(names, ":crlf") || strEQ(names, ":raw")) {
164 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
172 PerlIO_destruct(pTHX)
177 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
182 return perlsio_binmode(fp, iotype, mode);
187 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
191 int fd = PerlLIO_dup(PerlIO_fileno(f));
194 int omode = fcntl(fd, F_GETFL);
196 omode = djgpp_get_stream_mode(f);
198 PerlIO_intmode2str(omode,mode,NULL);
199 /* the r+ is a hack */
200 return PerlIO_fdopen(fd, mode);
205 SETERRNO(EBADF, SS$_IVCHAN);
213 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
217 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
218 int imode, int perm, PerlIO *old, int narg, SV **args)
222 Perl_croak(aTHX_ "More than one argument to open");
224 if (*args == &PL_sv_undef)
225 return PerlIO_tmpfile();
227 char *name = SvPV_nolen(*args);
229 fd = PerlLIO_open3(name, imode, perm);
231 return PerlIO_fdopen(fd, (char *) mode + 1);
234 return PerlIO_reopen(name, mode, old);
237 return PerlIO_open(name, mode);
242 return PerlIO_fdopen(fd, (char *) mode);
247 XS(XS_PerlIO__Layer__find)
251 Perl_croak(aTHX_ "Usage class->find(name[,load])");
253 char *name = SvPV_nolen(ST(1));
254 ST(0) = (strEQ(name, "crlf")
255 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
262 Perl_boot_core_PerlIO(pTHX)
264 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
270 #ifdef PERLIO_IS_STDIO
276 * Does nothing (yet) except force this file to be included in perl
277 * binary. That allows this file to force inclusion of other functions
278 * that may be required by loadable extensions e.g. for
279 * FileHandle::tmpfile
283 #undef PerlIO_tmpfile
290 #else /* PERLIO_IS_STDIO */
298 * This section is just to make sure these functions get pulled in from
302 #undef PerlIO_tmpfile
313 * Force this file to be included in perl binary. Which allows this
314 * file to force inclusion of other functions that may be required by
315 * loadable extensions e.g. for FileHandle::tmpfile
319 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
320 * results in a lot of lseek()s to regular files and lot of small
323 sfset(sfstdout, SF_SHARE, 0);
327 PerlIO_importFILE(FILE *stdio, int fl)
329 int fd = fileno(stdio);
330 PerlIO *r = PerlIO_fdopen(fd, "r+");
335 PerlIO_findFILE(PerlIO *pio)
337 int fd = PerlIO_fileno(pio);
338 FILE *f = fdopen(fd, "r+");
340 if (!f && errno == EINVAL)
342 if (!f && errno == EINVAL)
349 /*======================================================================================*/
351 * Implement all the PerlIO interface ourselves.
357 * We _MUST_ have <unistd.h> if we are using lseek() and may have large
364 #include <sys/mman.h>
368 void PerlIO_debug(const char *fmt, ...)
369 __attribute__ ((format(__printf__, 1, 2)));
372 PerlIO_debug(const char *fmt, ...)
379 char *s = PerlEnv_getenv("PERLIO_DEBUG");
381 dbg = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
388 /* Use fixed buffer as sv_catpvf etc. needs SVs */
392 s = CopFILE(PL_curcop);
395 sprintf(buffer, "%s:%" IVdf " ", s, (IV) CopLINE(PL_curcop));
396 len = strlen(buffer);
397 vsprintf(buffer+len, fmt, ap);
398 PerlLIO_write(dbg, buffer, strlen(buffer));
400 SV *sv = newSVpvn("", 0);
403 s = CopFILE(PL_curcop);
406 Perl_sv_catpvf(aTHX_ sv, "%s:%" IVdf " ", s,
407 (IV) CopLINE(PL_curcop));
408 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
411 PerlLIO_write(dbg, s, len);
418 /*--------------------------------------------------------------------------------------*/
421 * Inner level routines
425 * Table of pointers to the PerlIO structs (malloc'ed)
427 #define PERLIO_TABLE_SIZE 64
430 PerlIO_allocate(pTHX)
433 * Find a free slot in the table, allocating new table as necessary
438 while ((f = *last)) {
440 last = (PerlIO **) (f);
441 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
447 Newz('I',f,PERLIO_TABLE_SIZE,PerlIO);
455 #undef PerlIO_fdupopen
457 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
459 if (PerlIOValid(f)) {
460 PerlIO_funcs *tab = PerlIOBase(f)->tab;
462 PerlIO_debug("fdupopen f=%p param=%p\n",(void*)f,(void*)param);
463 new = (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX),f,param, flags);
467 SETERRNO(EBADF, SS$_IVCHAN);
473 PerlIO_cleantable(pTHX_ PerlIO **tablep)
475 PerlIO *table = *tablep;
478 PerlIO_cleantable(aTHX_(PerlIO **) & (table[0]));
479 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
480 PerlIO *f = table + i;
492 PerlIO_list_alloc(pTHX)
495 Newz('L', list, 1, PerlIO_list_t);
501 PerlIO_list_free(pTHX_ PerlIO_list_t *list)
504 if (--list->refcnt == 0) {
507 for (i = 0; i < list->cur; i++) {
508 if (list->array[i].arg)
509 SvREFCNT_dec(list->array[i].arg);
511 Safefree(list->array);
519 PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
522 if (list->cur >= list->len) {
525 Renew(list->array, list->len, PerlIO_pair_t);
527 New('l', list->array, list->len, PerlIO_pair_t);
529 p = &(list->array[list->cur++]);
531 if ((p->arg = arg)) {
537 PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param)
539 PerlIO_list_t *list = (PerlIO_list_t *) NULL;
542 list = PerlIO_list_alloc(aTHX);
543 for (i=0; i < proto->cur; i++) {
545 if (proto->array[i].arg)
546 arg = PerlIO_sv_dup(aTHX_ proto->array[i].arg,param);
547 PerlIO_list_push(aTHX_ list, proto->array[i].funcs, arg);
554 PerlIO_clone(pTHX_ PerlInterpreter *proto, CLONE_PARAMS *param)
557 PerlIO **table = &proto->Iperlio;
560 PL_known_layers = PerlIO_clone_list(aTHX_ proto->Iknown_layers, param);
561 PL_def_layerlist = PerlIO_clone_list(aTHX_ proto->Idef_layerlist, param);
562 PerlIO_allocate(aTHX); /* root slot is never used */
563 PerlIO_debug("Clone %p from %p\n",aTHX,proto);
564 while ((f = *table)) {
566 table = (PerlIO **) (f++);
567 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
569 (void) fp_dup(f, 0, param);
578 PerlIO_destruct(pTHX)
580 PerlIO **table = &PL_perlio;
583 PerlIO_debug("Destruct %p\n",aTHX);
585 while ((f = *table)) {
587 table = (PerlIO **) (f++);
588 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
592 if (l->tab->kind & PERLIO_K_DESTRUCT) {
593 PerlIO_debug("Destruct popping %s\n", l->tab->name);
604 PerlIO_list_free(aTHX_ PL_known_layers);
605 PL_known_layers = NULL;
606 PerlIO_list_free(aTHX_ PL_def_layerlist);
607 PL_def_layerlist = NULL;
611 PerlIO_pop(pTHX_ PerlIO *f)
615 PerlIO_debug("PerlIO_pop f=%p %s\n", (void*)f, l->tab->name);
616 if (l->tab->Popped) {
618 * If popped returns non-zero do not free its layer structure
619 * it has either done so itself, or it is shared and still in
622 if ((*l->tab->Popped) (aTHX_ f) != 0)
630 /*--------------------------------------------------------------------------------------*/
632 * XS Interface for perl code
636 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
639 if ((SSize_t) len <= 0)
641 for (i = 0; i < PL_known_layers->cur; i++) {
642 PerlIO_funcs *f = PL_known_layers->array[i].funcs;
643 if (memEQ(f->name, name, len)) {
644 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
648 if (load && PL_subname && PL_def_layerlist
649 && PL_def_layerlist->cur >= 2) {
650 SV *pkgsv = newSVpvn("PerlIO", 6);
651 SV *layer = newSVpvn(name, len);
654 * The two SVs are magically freed by load_module
656 Perl_load_module(aTHX_ 0, pkgsv, Nullsv, layer, Nullsv);
658 return PerlIO_find_layer(aTHX_ name, len, 0);
660 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
664 #ifdef USE_ATTRIBUTES_FOR_PERLIO
667 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
670 IO *io = GvIOn((GV *) SvRV(sv));
671 PerlIO *ifp = IoIFP(io);
672 PerlIO *ofp = IoOFP(io);
673 Perl_warn(aTHX_ "set %" SVf " %p %p %p", sv, io, ifp, ofp);
679 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
682 IO *io = GvIOn((GV *) SvRV(sv));
683 PerlIO *ifp = IoIFP(io);
684 PerlIO *ofp = IoOFP(io);
685 Perl_warn(aTHX_ "get %" SVf " %p %p %p", sv, io, ifp, ofp);
691 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
693 Perl_warn(aTHX_ "clear %" SVf, sv);
698 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
700 Perl_warn(aTHX_ "free %" SVf, sv);
704 MGVTBL perlio_vtab = {
712 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
715 SV *sv = SvRV(ST(1));
720 sv_magic(sv, (SV *) av, PERL_MAGIC_ext, NULL, 0);
722 mg = mg_find(sv, PERL_MAGIC_ext);
723 mg->mg_virtual = &perlio_vtab;
725 Perl_warn(aTHX_ "attrib %" SVf, sv);
726 for (i = 2; i < items; i++) {
728 const char *name = SvPV(ST(i), len);
729 SV *layer = PerlIO_find_layer(aTHX_ name, len, 1);
731 av_push(av, SvREFCNT_inc(layer));
742 #endif /* USE_ATTIBUTES_FOR_PERLIO */
745 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
747 HV *stash = gv_stashpv("PerlIO::Layer", TRUE);
748 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
752 XS(XS_PerlIO__Layer__find)
756 Perl_croak(aTHX_ "Usage class->find(name[,load])");
759 char *name = SvPV(ST(1), len);
760 bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
761 PerlIO_funcs *layer = PerlIO_find_layer(aTHX_ name, len, load);
763 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
770 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
772 if (!PL_known_layers)
773 PL_known_layers = PerlIO_list_alloc(aTHX);
774 PerlIO_list_push(aTHX_ PL_known_layers, tab, Nullsv);
775 PerlIO_debug("define %s %p\n", tab->name, (void*)tab);
779 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
782 const char *s = names;
784 while (isSPACE(*s) || *s == ':')
789 const char *as = Nullch;
791 if (!isIDFIRST(*s)) {
793 * Message is consistent with how attribute lists are
794 * passed. Even though this means "foo : : bar" is
795 * seen as an invalid separator character.
797 char q = ((*s == '\'') ? '"' : '\'');
798 if (ckWARN(WARN_LAYER))
799 Perl_warner(aTHX_ packWARN(WARN_LAYER),
800 "perlio: invalid separator character %c%c%c in layer specification list %s",
806 } while (isALNUM(*e));
822 * It's a nul terminated string, not allowed
823 * to \ the terminating null. Anything other
824 * character is passed over.
834 if (ckWARN(WARN_LAYER))
835 Perl_warner(aTHX_ packWARN(WARN_LAYER),
836 "perlio: argument list not closed for layer \"%.*s\"",
848 bool warn_layer = ckWARN(WARN_LAYER);
849 PerlIO_funcs *layer =
850 PerlIO_find_layer(aTHX_ s, llen, 1);
852 PerlIO_list_push(aTHX_ av, layer,
859 Perl_warner(aTHX_ packWARN(WARN_LAYER), "perlio: unknown layer \"%.*s\"",
872 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
874 PerlIO_funcs *tab = &PerlIO_perlio;
875 #ifdef PERLIO_USING_CRLF
878 if (PerlIO_stdio.Set_ptrcnt)
881 PerlIO_debug("Pushing %s\n", tab->name);
882 PerlIO_list_push(aTHX_ av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
887 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
889 return av->array[n].arg;
893 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
895 if (n >= 0 && n < av->cur) {
896 PerlIO_debug("Layer %" IVdf " is %s\n", n,
897 av->array[n].funcs->name);
898 return av->array[n].funcs;
901 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
906 PerlIO_default_layers(pTHX)
908 if (!PL_def_layerlist) {
909 const char *s = (PL_tainting) ? Nullch : PerlEnv_getenv("PERLIO");
910 PerlIO_funcs *osLayer = &PerlIO_unix;
911 PL_def_layerlist = PerlIO_list_alloc(aTHX);
912 PerlIO_define_layer(aTHX_ & PerlIO_unix);
913 #if defined(WIN32) && !defined(UNDER_CE)
914 PerlIO_define_layer(aTHX_ & PerlIO_win32);
916 osLayer = &PerlIO_win32;
919 PerlIO_define_layer(aTHX_ & PerlIO_raw);
920 PerlIO_define_layer(aTHX_ & PerlIO_perlio);
921 PerlIO_define_layer(aTHX_ & PerlIO_stdio);
922 PerlIO_define_layer(aTHX_ & PerlIO_crlf);
924 PerlIO_define_layer(aTHX_ & PerlIO_mmap);
926 PerlIO_define_layer(aTHX_ & PerlIO_utf8);
927 PerlIO_define_layer(aTHX_ & PerlIO_byte);
928 PerlIO_list_push(aTHX_ PL_def_layerlist,
929 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
932 PerlIO_parse_layers(aTHX_ PL_def_layerlist, s);
935 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
938 if (PL_def_layerlist->cur < 2) {
939 PerlIO_default_buffer(aTHX_ PL_def_layerlist);
941 return PL_def_layerlist;
945 Perl_boot_core_PerlIO(pTHX)
947 #ifdef USE_ATTRIBUTES_FOR_PERLIO
948 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
951 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
955 PerlIO_default_layer(pTHX_ I32 n)
957 PerlIO_list_t *av = PerlIO_default_layers(aTHX);
960 return PerlIO_layer_fetch(aTHX_ av, n, &PerlIO_stdio);
963 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
964 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
967 PerlIO_stdstreams(pTHX)
970 PerlIO_allocate(aTHX);
971 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
972 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
973 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
978 PerlIO_push(pTHX_ PerlIO *f, PerlIO_funcs *tab, const char *mode, SV *arg)
981 Newc('L',l,tab->size,char,PerlIOl);
983 Zero(l, tab->size, char);
987 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", (void*)f, tab->name,
988 (mode) ? mode : "(Null)", (void*)arg);
989 if ((*l->tab->Pushed) (aTHX_ f, mode, arg) != 0) {
998 PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
1000 PerlIO_pop(aTHX_ f);
1003 PerlIO_pop(aTHX_ f);
1010 PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
1013 * Remove the dummy layer
1015 PerlIO_pop(aTHX_ f);
1017 * Pop back to bottom layer
1019 if (PerlIOValid(f)) {
1021 while (!(PerlIOBase(f)->tab->kind & PERLIO_K_RAW)) {
1022 if (*PerlIONext(f)) {
1023 PerlIO_pop(aTHX_ f);
1027 * Nothing bellow - push unix on top then remove it
1029 if (PerlIO_push(aTHX_ f, PerlIO_default_btm(), mode, arg)) {
1030 PerlIO_pop(aTHX_ PerlIONext(f));
1035 PerlIO_debug(":raw f=%p :%s\n", (void*)f, PerlIOBase(f)->tab->name);
1042 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
1043 PerlIO_list_t *layers, IV n, IV max)
1047 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
1049 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
1060 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
1064 PerlIO_list_t *layers = PerlIO_list_alloc(aTHX);
1065 code = PerlIO_parse_layers(aTHX_ layers, names);
1067 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0, layers->cur);
1069 PerlIO_list_free(aTHX_ layers);
1075 /*--------------------------------------------------------------------------------------*/
1077 * Given the abstraction above the public API functions
1081 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
1083 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
1084 (void*)f, PerlIOBase(f)->tab->name, iotype, mode,
1085 (names) ? names : "(Null)");
1087 /* Do not flush etc. if (e.g.) switching encodings.
1088 if a pushed layer knows it needs to flush lower layers
1089 (for example :unix which is never going to call them)
1090 it can do the flush when it is pushed.
1092 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
1095 /* FIXME?: Looking down the layer stack seems wrong,
1096 but is a way of reaching past (say) an encoding layer
1097 to flip CRLF-ness of the layer(s) below
1099 #ifdef PERLIO_USING_CRLF
1100 /* Legacy binmode only has meaning if O_TEXT has a value distinct from
1101 O_BINARY so we can look for it in mode.
1103 if (!(mode & O_BINARY)) {
1106 /* Perhaps we should turn on bottom-most aware layer
1107 e.g. Ilya's idea that UNIX TTY could serve
1109 if (PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF) {
1110 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1111 /* Not in text mode - flush any pending stuff and flip it */
1113 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
1115 /* Only need to turn it on in one layer so we are done */
1120 /* Not finding a CRLF aware layer presumably means we are binary
1121 which is not what was requested - so we failed
1122 We _could_ push :crlf layer but so could caller
1127 /* Either asked for BINMODE or that is normal on this platform
1128 see if any CRLF aware layers are present and turn off the flag
1129 and possibly remove layer.
1132 if (PerlIOBase(f)->tab->kind & PERLIO_K_CANCRLF) {
1133 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF)) {
1134 /* In text mode - flush any pending stuff and flip it */
1136 PerlIOBase(f)->flags &= ~PERLIO_F_CRLF;
1137 #ifndef PERLIO_USING_CRLF
1138 /* CRLF is unusual case - if this is just the :crlf layer pop it */
1139 if (PerlIOBase(f)->tab == &PerlIO_crlf) {
1140 PerlIO_pop(aTHX_ f);
1143 /* Normal case is only one layer doing this, so exit on first
1144 abnormal case can always do multiple binmode calls
1156 PerlIO__close(pTHX_ PerlIO *f)
1159 return (*PerlIOBase(f)->tab->Close) (aTHX_ f);
1161 SETERRNO(EBADF, SS$_IVCHAN);
1167 Perl_PerlIO_close(pTHX_ PerlIO *f)
1170 if (PerlIOValid(f)) {
1171 code = (*PerlIOBase(f)->tab->Close) (aTHX_ f);
1173 PerlIO_pop(aTHX_ f);
1180 Perl_PerlIO_fileno(pTHX_ PerlIO *f)
1183 return (*PerlIOBase(f)->tab->Fileno) (aTHX_ f);
1185 SETERRNO(EBADF, SS$_IVCHAN);
1191 PerlIO_context_layers(pTHX_ const char *mode)
1193 const char *type = NULL;
1195 * Need to supply default layer info from open.pm
1198 SV *layers = PL_curcop->cop_io;
1201 type = SvPV(layers, len);
1202 if (type && mode[0] != 'r') {
1204 * Skip to write part
1206 const char *s = strchr(type, 0);
1207 if (s && (STRLEN)(s - type) < len) {
1216 static PerlIO_funcs *
1217 PerlIO_layer_from_ref(pTHX_ SV *sv)
1220 * For any scalar type load the handler which is bundled with perl
1222 if (SvTYPE(sv) < SVt_PVAV)
1223 return PerlIO_find_layer(aTHX_ "Scalar", 6, 1);
1226 * For other types allow if layer is known but don't try and load it
1228 switch (SvTYPE(sv)) {
1230 return PerlIO_find_layer(aTHX_ "Array", 5, 0);
1232 return PerlIO_find_layer(aTHX_ "Hash", 4, 0);
1234 return PerlIO_find_layer(aTHX_ "Code", 4, 0);
1236 return PerlIO_find_layer(aTHX_ "Glob", 4, 0);
1242 PerlIO_resolve_layers(pTHX_ const char *layers,
1243 const char *mode, int narg, SV **args)
1245 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1248 PerlIO_stdstreams(aTHX);
1252 * If it is a reference but not an object see if we have a handler
1255 if (SvROK(arg) && !sv_isobject(arg)) {
1256 PerlIO_funcs *handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1258 def = PerlIO_list_alloc(aTHX);
1259 PerlIO_list_push(aTHX_ def, handler, &PL_sv_undef);
1263 * Don't fail if handler cannot be found :Via(...) etc. may do
1264 * something sensible else we will just stringfy and open
1270 layers = PerlIO_context_layers(aTHX_ mode);
1271 if (layers && *layers) {
1275 av = PerlIO_list_alloc(aTHX);
1276 for (i = 0; i < def->cur; i++) {
1277 PerlIO_list_push(aTHX_ av, def->array[i].funcs,
1284 PerlIO_parse_layers(aTHX_ av, layers);
1295 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1296 int imode, int perm, PerlIO *f, int narg, SV **args)
1298 if (!f && narg == 1 && *args == &PL_sv_undef) {
1299 if ((f = PerlIO_tmpfile())) {
1301 layers = PerlIO_context_layers(aTHX_ mode);
1302 if (layers && *layers)
1303 PerlIO_apply_layers(aTHX_ f, mode, layers);
1307 PerlIO_list_t *layera = NULL;
1309 PerlIO_funcs *tab = NULL;
1310 if (PerlIOValid(f)) {
1312 * This is "reopen" - it is not tested as perl does not use it
1316 layera = PerlIO_list_alloc(aTHX);
1318 SV *arg = (l->tab->Getarg)
1319 ? (*l->tab->Getarg) (aTHX_ &l, NULL, 0)
1321 PerlIO_list_push(aTHX_ layera, l->tab, arg);
1322 l = *PerlIONext(&l);
1326 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1329 * Start at "top" of layer stack
1331 n = layera->cur - 1;
1333 PerlIO_funcs *t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1342 * Found that layer 'n' can do opens - call it
1344 if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) {
1345 Perl_croak(aTHX_ "More than one argument to open(,':%s')",tab->name);
1347 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1348 tab->name, layers, mode, fd, imode, perm,
1349 (void*)f, narg, (void*)args);
1350 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1353 if (n + 1 < layera->cur) {
1355 * More layers above the one that we used to open -
1358 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1, layera->cur) != 0) {
1359 /* If pushing layers fails close the file */
1366 PerlIO_list_free(aTHX_ layera);
1373 Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1376 return (*PerlIOBase(f)->tab->Read) (aTHX_ f, vbuf, count);
1378 SETERRNO(EBADF, SS$_IVCHAN);
1384 Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1387 return (*PerlIOBase(f)->tab->Unread) (aTHX_ f, vbuf, count);
1389 SETERRNO(EBADF, SS$_IVCHAN);
1395 Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1398 return (*PerlIOBase(f)->tab->Write) (aTHX_ f, vbuf, count);
1400 SETERRNO(EBADF, SS$_IVCHAN);
1406 Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
1409 return (*PerlIOBase(f)->tab->Seek) (aTHX_ f, offset, whence);
1411 SETERRNO(EBADF, SS$_IVCHAN);
1417 Perl_PerlIO_tell(pTHX_ PerlIO *f)
1420 return (*PerlIOBase(f)->tab->Tell) (aTHX_ f);
1422 SETERRNO(EBADF, SS$_IVCHAN);
1428 Perl_PerlIO_flush(pTHX_ PerlIO *f)
1432 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1433 if (tab && tab->Flush) {
1434 return (*tab->Flush) (aTHX_ f);
1437 PerlIO_debug("Cannot flush f=%p :%s\n", (void*)f, tab->name);
1438 SETERRNO(EBADF, SS$_IVCHAN);
1443 PerlIO_debug("Cannot flush f=%p\n", (void*)f);
1444 SETERRNO(EBADF, SS$_IVCHAN);
1450 * Is it good API design to do flush-all on NULL, a potentially
1451 * errorneous input? Maybe some magical value (PerlIO*
1452 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1453 * things on fflush(NULL), but should we be bound by their design
1456 PerlIO **table = &PL_perlio;
1458 while ((f = *table)) {
1460 table = (PerlIO **) (f++);
1461 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1462 if (*f && PerlIO_flush(f) != 0)
1472 PerlIOBase_flush_linebuf(pTHX)
1474 PerlIO **table = &PL_perlio;
1476 while ((f = *table)) {
1478 table = (PerlIO **) (f++);
1479 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1482 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1483 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1491 Perl_PerlIO_fill(pTHX_ PerlIO *f)
1494 return (*PerlIOBase(f)->tab->Fill) (aTHX_ f);
1496 SETERRNO(EBADF, SS$_IVCHAN);
1502 PerlIO_isutf8(PerlIO *f)
1505 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1507 SETERRNO(EBADF, SS$_IVCHAN);
1513 Perl_PerlIO_eof(pTHX_ PerlIO *f)
1516 return (*PerlIOBase(f)->tab->Eof) (aTHX_ f);
1518 SETERRNO(EBADF, SS$_IVCHAN);
1524 Perl_PerlIO_error(pTHX_ PerlIO *f)
1527 return (*PerlIOBase(f)->tab->Error) (aTHX_ f);
1529 SETERRNO(EBADF, SS$_IVCHAN);
1535 Perl_PerlIO_clearerr(pTHX_ PerlIO *f)
1538 (*PerlIOBase(f)->tab->Clearerr) (aTHX_ f);
1540 SETERRNO(EBADF, SS$_IVCHAN);
1544 Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f)
1547 (*PerlIOBase(f)->tab->Setlinebuf) (aTHX_ f);
1549 SETERRNO(EBADF, SS$_IVCHAN);
1553 PerlIO_has_base(PerlIO *f)
1555 if (PerlIOValid(f)) {
1556 return (PerlIOBase(f)->tab->Get_base != NULL);
1562 PerlIO_fast_gets(PerlIO *f)
1564 if (PerlIOValid(f) && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS)) {
1565 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1566 return (tab->Set_ptrcnt != NULL);
1572 PerlIO_has_cntptr(PerlIO *f)
1574 if (PerlIOValid(f)) {
1575 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1576 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1582 PerlIO_canset_cnt(PerlIO *f)
1584 if (PerlIOValid(f)) {
1585 PerlIOl *l = PerlIOBase(f);
1586 return (l->tab->Set_ptrcnt != NULL);
1592 Perl_PerlIO_get_base(pTHX_ PerlIO *f)
1595 return (*PerlIOBase(f)->tab->Get_base) (aTHX_ f);
1600 Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
1603 return (*PerlIOBase(f)->tab->Get_bufsiz) (aTHX_ f);
1608 Perl_PerlIO_get_ptr(pTHX_ PerlIO *f)
1610 if (PerlIOValid(f)) {
1611 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1612 if (tab->Get_ptr == NULL)
1614 return (*tab->Get_ptr) (aTHX_ f);
1620 Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
1622 if (PerlIOValid(f)) {
1623 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1624 if (tab->Get_cnt == NULL)
1626 return (*tab->Get_cnt) (aTHX_ f);
1632 Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt)
1634 if (PerlIOValid(f)) {
1635 (*PerlIOBase(f)->tab->Set_ptrcnt) (aTHX_ f, NULL, cnt);
1640 Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, int cnt)
1642 if (PerlIOValid(f)) {
1643 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1644 if (tab->Set_ptrcnt == NULL) {
1645 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
1647 (*PerlIOBase(f)->tab->Set_ptrcnt) (aTHX_ f, ptr, cnt);
1651 /*--------------------------------------------------------------------------------------*/
1653 * utf8 and raw dummy layers
1657 PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
1659 if (*PerlIONext(f)) {
1660 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1661 PerlIO_pop(aTHX_ f);
1662 if (tab->kind & PERLIO_K_UTF8)
1663 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1665 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1671 PerlIO_funcs PerlIO_utf8 = {
1674 PERLIO_K_DUMMY | PERLIO_F_UTF8,
1692 NULL, /* get_base */
1693 NULL, /* get_bufsiz */
1696 NULL, /* set_ptrcnt */
1699 PerlIO_funcs PerlIO_byte = {
1720 NULL, /* get_base */
1721 NULL, /* get_bufsiz */
1724 NULL, /* set_ptrcnt */
1728 PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1729 IV n, const char *mode, int fd, int imode, int perm,
1730 PerlIO *old, int narg, SV **args)
1732 PerlIO_funcs *tab = PerlIO_default_btm();
1733 return (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
1737 PerlIO_funcs PerlIO_raw = {
1758 NULL, /* get_base */
1759 NULL, /* get_bufsiz */
1762 NULL, /* set_ptrcnt */
1764 /*--------------------------------------------------------------------------------------*/
1765 /*--------------------------------------------------------------------------------------*/
1767 * "Methods" of the "base class"
1771 PerlIOBase_fileno(pTHX_ PerlIO *f)
1773 return PerlIOValid(f) ? PerlIO_fileno(PerlIONext(f)) : -1;
1777 PerlIO_modestr(PerlIO *f, char *buf)
1780 IV flags = PerlIOBase(f)->flags;
1781 if (flags & PERLIO_F_APPEND) {
1783 if (flags & PERLIO_F_CANREAD) {
1787 else if (flags & PERLIO_F_CANREAD) {
1789 if (flags & PERLIO_F_CANWRITE)
1792 else if (flags & PERLIO_F_CANWRITE) {
1794 if (flags & PERLIO_F_CANREAD) {
1798 #ifdef PERLIO_USING_CRLF
1799 if (!(flags & PERLIO_F_CRLF))
1807 PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
1809 PerlIOl *l = PerlIOBase(f);
1811 const char *omode = mode;
1814 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1815 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
1816 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
1817 if (tab->Set_ptrcnt != NULL)
1818 l->flags |= PERLIO_F_FASTGETS;
1820 if (*mode == '#' || *mode == 'I')
1824 l->flags |= PERLIO_F_CANREAD;
1827 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
1830 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
1833 SETERRNO(EINVAL, LIB$_INVARG);
1839 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
1842 l->flags &= ~PERLIO_F_CRLF;
1845 l->flags |= PERLIO_F_CRLF;
1848 SETERRNO(EINVAL, LIB$_INVARG);
1855 l->flags |= l->next->flags &
1856 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
1861 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
1862 f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
1863 l->flags, PerlIO_modestr(f, temp));
1869 PerlIOBase_popped(pTHX_ PerlIO *f)
1875 PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
1878 * Save the position as current head considers it
1880 Off_t old = PerlIO_tell(f);
1882 PerlIO_push(aTHX_ f, &PerlIO_pending, "r", Nullsv);
1883 PerlIOSelf(f, PerlIOBuf)->posn = old;
1884 done = PerlIOBuf_unread(aTHX_ f, vbuf, count);
1889 PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
1891 STDCHAR *buf = (STDCHAR *) vbuf;
1893 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1896 SSize_t avail = PerlIO_get_cnt(f);
1899 take = ((SSize_t)count < avail) ? count : avail;
1901 STDCHAR *ptr = PerlIO_get_ptr(f);
1902 Copy(ptr, buf, take, STDCHAR);
1903 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
1907 if (count > 0 && avail <= 0) {
1908 if (PerlIO_fill(f) != 0)
1912 return (buf - (STDCHAR *) vbuf);
1918 PerlIOBase_noop_ok(pTHX_ PerlIO *f)
1924 PerlIOBase_noop_fail(pTHX_ PerlIO *f)
1930 PerlIOBase_close(pTHX_ PerlIO *f)
1933 PerlIO *n = PerlIONext(f);
1934 if (PerlIO_flush(f) != 0)
1936 if (PerlIOValid(n) && (*PerlIOBase(n)->tab->Close)(aTHX_ n) != 0)
1938 PerlIOBase(f)->flags &=
1939 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
1944 PerlIOBase_eof(pTHX_ PerlIO *f)
1946 if (PerlIOValid(f)) {
1947 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1953 PerlIOBase_error(pTHX_ PerlIO *f)
1955 if (PerlIOValid(f)) {
1956 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1962 PerlIOBase_clearerr(pTHX_ PerlIO *f)
1964 if (PerlIOValid(f)) {
1965 PerlIO *n = PerlIONext(f);
1966 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
1973 PerlIOBase_setlinebuf(pTHX_ PerlIO *f)
1975 if (PerlIOValid(f)) {
1976 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
1981 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
1987 return sv_dup(arg, param);
1990 return newSVsv(arg);
1993 return newSVsv(arg);
1998 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2000 PerlIO *nexto = PerlIONext(o);
2001 if (PerlIOValid(nexto)) {
2002 PerlIO_funcs *tab = PerlIOBase(nexto)->tab;
2003 f = (*tab->Dup)(aTHX_ f, nexto, param, flags);
2006 PerlIO_funcs *self = PerlIOBase(o)->tab;
2009 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",
2010 self->name, (void*)f, (void*)o, (void*)param);
2012 arg = (*self->Getarg)(aTHX_ o,param,flags);
2014 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2022 #define PERLIO_MAX_REFCOUNTABLE_FD 2048
2024 perl_mutex PerlIO_mutex;
2026 int PerlIO_fd_refcnt[PERLIO_MAX_REFCOUNTABLE_FD];
2031 /* Place holder for stdstreams call ??? */
2033 MUTEX_INIT(&PerlIO_mutex);
2038 PerlIOUnix_refcnt_inc(int fd)
2040 if (fd >= 0 && fd < PERLIO_MAX_REFCOUNTABLE_FD) {
2042 MUTEX_LOCK(&PerlIO_mutex);
2044 PerlIO_fd_refcnt[fd]++;
2045 PerlIO_debug("fd %d refcnt=%d\n",fd,PerlIO_fd_refcnt[fd]);
2047 MUTEX_UNLOCK(&PerlIO_mutex);
2053 PerlIOUnix_refcnt_dec(int fd)
2056 if (fd >= 0 && fd < PERLIO_MAX_REFCOUNTABLE_FD) {
2058 MUTEX_LOCK(&PerlIO_mutex);
2060 cnt = --PerlIO_fd_refcnt[fd];
2061 PerlIO_debug("fd %d refcnt=%d\n",fd,cnt);
2063 MUTEX_UNLOCK(&PerlIO_mutex);
2070 PerlIO_cleanup(pTHX)
2074 PerlIO_debug("Cleanup %p\n",aTHX);
2076 /* Raise STDIN..STDERR refcount so we don't close them */
2077 for (i=0; i < 3; i++)
2078 PerlIOUnix_refcnt_inc(i);
2079 PerlIO_cleantable(aTHX_ &PL_perlio);
2080 /* Restore STDIN..STDERR refcount */
2081 for (i=0; i < 3; i++)
2082 PerlIOUnix_refcnt_dec(i);
2087 /*--------------------------------------------------------------------------------------*/
2089 * Bottom-most level for UNIX-like case
2093 struct _PerlIO base; /* The generic part */
2094 int fd; /* UNIX like file descriptor */
2095 int oflags; /* open/fcntl flags */
2099 PerlIOUnix_oflags(const char *mode)
2102 if (*mode == 'I' || *mode == '#')
2107 if (*++mode == '+') {
2114 oflags = O_CREAT | O_TRUNC;
2115 if (*++mode == '+') {
2124 oflags = O_CREAT | O_APPEND;
2125 if (*++mode == '+') {
2138 else if (*mode == 't') {
2140 oflags &= ~O_BINARY;
2144 * Always open in binary mode
2147 if (*mode || oflags == -1) {
2148 SETERRNO(EINVAL, LIB$_INVARG);
2155 PerlIOUnix_fileno(pTHX_ PerlIO *f)
2157 return PerlIOSelf(f, PerlIOUnix)->fd;
2161 PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
2163 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg);
2164 PerlIOUnix *s = PerlIOSelf(f, PerlIOUnix);
2165 if (*PerlIONext(f)) {
2166 /* We never call down so any pending stuff now */
2167 PerlIO_flush(PerlIONext(f));
2168 s->fd = PerlIO_fileno(PerlIONext(f));
2170 * XXX could (or should) we retrieve the oflags from the open file
2171 * handle rather than believing the "mode" we are passed in? XXX
2172 * Should the value on NULL mode be 0 or -1?
2174 s->oflags = mode ? PerlIOUnix_oflags(mode) : -1;
2176 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2181 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2182 IV n, const char *mode, int fd, int imode,
2183 int perm, PerlIO *f, int narg, SV **args)
2185 if (PerlIOValid(f)) {
2186 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
2187 (*PerlIOBase(f)->tab->Close)(aTHX_ f);
2190 char *path = SvPV_nolen(*args);
2194 imode = PerlIOUnix_oflags(mode);
2198 fd = PerlLIO_open3(path, imode, perm);
2206 f = PerlIO_allocate(aTHX);
2208 if (!PerlIOValid(f)) {
2209 s = PerlIOSelf(PerlIO_push(aTHX_ f, self, mode, PerlIOArg),
2213 s = PerlIOSelf(f, PerlIOUnix);
2217 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2218 PerlIOUnix_refcnt_inc(fd);
2224 * FIXME: pop layers ???
2232 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2234 PerlIOUnix *os = PerlIOSelf(o, PerlIOUnix);
2236 if (flags & PERLIO_DUP_FD) {
2237 fd = PerlLIO_dup(fd);
2239 if (fd >= 0 && fd < PERLIO_MAX_REFCOUNTABLE_FD) {
2240 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
2242 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2243 PerlIOUnix *s = PerlIOSelf(f, PerlIOUnix);
2245 PerlIOUnix_refcnt_inc(fd);
2254 PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2256 int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2257 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
2260 SSize_t len = PerlLIO_read(fd, vbuf, count);
2261 if (len >= 0 || errno != EINTR) {
2263 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2264 else if (len == 0 && count != 0)
2265 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2273 PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2275 int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2277 SSize_t len = PerlLIO_write(fd, vbuf, count);
2278 if (len >= 0 || errno != EINTR) {
2280 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2288 PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2291 PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, offset, whence);
2292 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2293 return (new == (Off_t) - 1) ? -1 : 0;
2297 PerlIOUnix_tell(pTHX_ PerlIO *f)
2299 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2304 PerlIOUnix_close(pTHX_ PerlIO *f)
2306 int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2308 if (PerlIOBase(f)->flags & PERLIO_F_OPEN) {
2309 if (PerlIOUnix_refcnt_dec(fd) > 0) {
2310 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2315 SETERRNO(EBADF,SS$_IVCHAN);
2318 while (PerlLIO_close(fd) != 0) {
2319 if (errno != EINTR) {
2326 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2331 PerlIO_funcs PerlIO_unix = {
2347 PerlIOBase_noop_ok, /* flush */
2348 PerlIOBase_noop_fail, /* fill */
2351 PerlIOBase_clearerr,
2352 PerlIOBase_setlinebuf,
2353 NULL, /* get_base */
2354 NULL, /* get_bufsiz */
2357 NULL, /* set_ptrcnt */
2360 /*--------------------------------------------------------------------------------------*/
2366 struct _PerlIO base;
2367 FILE *stdio; /* The stream */
2371 PerlIOStdio_fileno(pTHX_ PerlIO *f)
2373 return PerlSIO_fileno(PerlIOSelf(f, PerlIOStdio)->stdio);
2377 PerlIOStdio_mode(const char *mode, char *tmode)
2383 #ifdef PERLIO_USING_CRLF
2391 * This isn't used yet ...
2394 PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
2396 if (*PerlIONext(f)) {
2397 PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
2400 PerlSIO_fdopen(PerlIO_fileno(PerlIONext(f)), mode =
2401 PerlIOStdio_mode(mode, tmode));
2404 /* We never call down so any pending stuff now */
2405 PerlIO_flush(PerlIONext(f));
2410 return PerlIOBase_pushed(aTHX_ f, mode, arg);
2414 PerlIO_importFILE(FILE *stdio, int fl)
2420 PerlIOSelf(PerlIO_push
2421 (aTHX_(f = PerlIO_allocate(aTHX)), &PerlIO_stdio,
2422 "r+", Nullsv), PerlIOStdio);
2429 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2430 IV n, const char *mode, int fd, int imode,
2431 int perm, PerlIO *f, int narg, SV **args)
2434 if (PerlIOValid(f)) {
2435 char *path = SvPV_nolen(*args);
2436 PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
2438 PerlIOUnix_refcnt_dec(fileno(s->stdio));
2439 stdio = PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
2444 PerlIOUnix_refcnt_inc(fileno(s->stdio));
2449 char *path = SvPV_nolen(*args);
2452 fd = PerlLIO_open3(path, imode, perm);
2455 FILE *stdio = PerlSIO_fopen(path, mode);
2459 f = PerlIO_allocate(aTHX);
2461 s = PerlIOSelf(PerlIO_push(aTHX_ f, self,
2462 (mode = PerlIOStdio_mode(mode, tmode)),
2466 PerlIOUnix_refcnt_inc(fileno(s->stdio));
2481 stdio = PerlSIO_stdin;
2484 stdio = PerlSIO_stdout;
2487 stdio = PerlSIO_stderr;
2492 stdio = PerlSIO_fdopen(fd, mode =
2493 PerlIOStdio_mode(mode, tmode));
2498 f = PerlIO_allocate(aTHX);
2500 s = PerlIOSelf(PerlIO_push(aTHX_ f, self, mode, PerlIOArg), PerlIOStdio);
2502 PerlIOUnix_refcnt_inc(fileno(s->stdio));
2511 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
2513 /* This assumes no layers underneath - which is what
2514 happens, but is not how I remember it. NI-S 2001/10/16
2516 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
2517 FILE *stdio = PerlIOSelf(o, PerlIOStdio)->stdio;
2518 if (flags & PERLIO_DUP_FD) {
2519 int fd = PerlLIO_dup(fileno(stdio));
2522 stdio = fdopen(fd, PerlIO_modestr(o,mode));
2525 /* FIXME: To avoid messy error recovery if dup fails
2526 re-use the existing stdio as though flag was not set
2530 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2531 PerlIOUnix_refcnt_inc(fileno(stdio));
2537 PerlIOStdio_close(pTHX_ PerlIO *f)
2539 #ifdef SOCKS5_VERSION_NAME
2541 Sock_size_t optlen = sizeof(int);
2543 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2544 if (PerlIOUnix_refcnt_dec(fileno(stdio)) > 0) {
2545 /* Do not close it but do flush any buffers */
2546 return PerlIO_flush(f);
2549 #ifdef SOCKS5_VERSION_NAME
2551 (PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (void *) &optval,
2553 0) ? PerlSIO_fclose(stdio) : close(PerlIO_fileno(f))
2555 PerlSIO_fclose(stdio)
2564 PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
2566 FILE *s = PerlIOSelf(f, PerlIOStdio)->stdio;
2569 STDCHAR *buf = (STDCHAR *) vbuf;
2571 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
2572 * stdio does not do that for fread()
2574 int ch = PerlSIO_fgetc(s);
2581 got = PerlSIO_fread(vbuf, 1, count, s);
2586 PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2588 FILE *s = PerlIOSelf(f, PerlIOStdio)->stdio;
2589 STDCHAR *buf = ((STDCHAR *) vbuf) + count - 1;
2592 int ch = *buf-- & 0xff;
2593 if (PerlSIO_ungetc(ch, s) != ch)
2602 PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
2604 return PerlSIO_fwrite(vbuf, 1, count,
2605 PerlIOSelf(f, PerlIOStdio)->stdio);
2609 PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
2611 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2612 return PerlSIO_fseek(stdio, offset, whence);
2616 PerlIOStdio_tell(pTHX_ PerlIO *f)
2618 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2619 return PerlSIO_ftell(stdio);
2623 PerlIOStdio_flush(pTHX_ PerlIO *f)
2625 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2626 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
2627 return PerlSIO_fflush(stdio);
2632 * FIXME: This discards ungetc() and pre-read stuff which is not
2633 * right if this is just a "sync" from a layer above Suspect right
2634 * design is to do _this_ but not have layer above flush this
2635 * layer read-to-read
2638 * Not writeable - sync by attempting a seek
2641 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
2649 PerlIOStdio_fill(pTHX_ PerlIO *f)
2651 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2654 * fflush()ing read-only streams can cause trouble on some stdio-s
2656 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
2657 if (PerlSIO_fflush(stdio) != 0)
2660 c = PerlSIO_fgetc(stdio);
2661 if (c == EOF || PerlSIO_ungetc(c, stdio) != c)
2667 PerlIOStdio_eof(pTHX_ PerlIO *f)
2669 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
2673 PerlIOStdio_error(pTHX_ PerlIO *f)
2675 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
2679 PerlIOStdio_clearerr(pTHX_ PerlIO *f)
2681 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
2685 PerlIOStdio_setlinebuf(pTHX_ PerlIO *f)
2687 #ifdef HAS_SETLINEBUF
2688 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
2690 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
2696 PerlIOStdio_get_base(pTHX_ PerlIO *f)
2698 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2699 return (STDCHAR*)PerlSIO_get_base(stdio);
2703 PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f)
2705 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2706 return PerlSIO_get_bufsiz(stdio);
2710 #ifdef USE_STDIO_PTR
2712 PerlIOStdio_get_ptr(pTHX_ PerlIO *f)
2714 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2715 return (STDCHAR*)PerlSIO_get_ptr(stdio);
2719 PerlIOStdio_get_cnt(pTHX_ PerlIO *f)
2721 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2722 return PerlSIO_get_cnt(stdio);
2726 PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
2728 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2730 #ifdef STDIO_PTR_LVALUE
2731 PerlSIO_set_ptr(stdio, (void*)ptr); /* LHS STDCHAR* cast non-portable */
2732 #ifdef STDIO_PTR_LVAL_SETS_CNT
2733 if (PerlSIO_get_cnt(stdio) != (cnt)) {
2734 assert(PerlSIO_get_cnt(stdio) == (cnt));
2737 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
2739 * Setting ptr _does_ change cnt - we are done
2743 #else /* STDIO_PTR_LVALUE */
2745 #endif /* STDIO_PTR_LVALUE */
2748 * Now (or only) set cnt
2750 #ifdef STDIO_CNT_LVALUE
2751 PerlSIO_set_cnt(stdio, cnt);
2752 #else /* STDIO_CNT_LVALUE */
2753 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
2754 PerlSIO_set_ptr(stdio,
2755 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
2757 #else /* STDIO_PTR_LVAL_SETS_CNT */
2759 #endif /* STDIO_PTR_LVAL_SETS_CNT */
2760 #endif /* STDIO_CNT_LVALUE */
2765 PerlIO_funcs PerlIO_stdio = {
2767 sizeof(PerlIOStdio),
2785 PerlIOStdio_clearerr,
2786 PerlIOStdio_setlinebuf,
2788 PerlIOStdio_get_base,
2789 PerlIOStdio_get_bufsiz,
2794 #ifdef USE_STDIO_PTR
2795 PerlIOStdio_get_ptr,
2796 PerlIOStdio_get_cnt,
2797 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
2798 PerlIOStdio_set_ptrcnt
2799 #else /* STDIO_PTR_LVALUE */
2801 #endif /* STDIO_PTR_LVALUE */
2802 #else /* USE_STDIO_PTR */
2806 #endif /* USE_STDIO_PTR */
2810 PerlIO_exportFILE(PerlIO *f, int fl)
2815 stdio = fdopen(PerlIO_fileno(f), "r+");
2818 PerlIOSelf(PerlIO_push(aTHX_ f, &PerlIO_stdio, "r+", Nullsv),
2826 PerlIO_findFILE(PerlIO *f)
2830 if (l->tab == &PerlIO_stdio) {
2831 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
2834 l = *PerlIONext(&l);
2836 return PerlIO_exportFILE(f, 0);
2840 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2844 /*--------------------------------------------------------------------------------------*/
2846 * perlio buffer layer
2850 PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
2852 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2853 int fd = PerlIO_fileno(f);
2855 if (fd >= 0 && PerlLIO_isatty(fd)) {
2856 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
2858 posn = PerlIO_tell(PerlIONext(f));
2859 if (posn != (Off_t) - 1) {
2862 return PerlIOBase_pushed(aTHX_ f, mode, arg);
2866 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2867 IV n, const char *mode, int fd, int imode, int perm,
2868 PerlIO *f, int narg, SV **args)
2870 if (PerlIOValid(f)) {
2871 PerlIO *next = PerlIONext(f);
2872 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
2873 next = (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
2875 if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg) != 0) {
2880 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
2888 f = (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
2891 if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
2893 * if push fails during open, open fails. close will pop us.
2898 fd = PerlIO_fileno(f);
2899 if (init && fd == 2) {
2901 * Initial stderr is unbuffered
2903 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2905 #ifdef PERLIO_USING_CRLF
2906 # ifdef PERLIO_IS_BINMODE_FD
2907 if (PERLIO_IS_BINMODE_FD(fd))
2908 PerlIO_binmode(f, '<'/*not used*/, O_BINARY, Nullch);
2912 * do something about failing setmode()? --jhi
2914 PerlLIO_setmode(fd, O_BINARY);
2923 * This "flush" is akin to sfio's sync in that it handles files in either
2924 * read or write state
2927 PerlIOBuf_flush(pTHX_ PerlIO *f)
2929 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2931 PerlIO *n = PerlIONext(f);
2932 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
2934 * write() the buffer
2936 STDCHAR *buf = b->buf;
2938 while (p < b->ptr) {
2939 SSize_t count = PerlIO_write(n, p, b->ptr - p);
2943 else if (count < 0 || PerlIO_error(n)) {
2944 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2949 b->posn += (p - buf);
2951 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
2952 STDCHAR *buf = PerlIO_get_base(f);
2954 * Note position change
2956 b->posn += (b->ptr - buf);
2957 if (b->ptr < b->end) {
2959 * We did not consume all of it
2961 if (PerlIO_seek(n, b->posn, SEEK_SET) == 0) {
2962 /* Reload n as some layers may pop themselves on seek */
2963 b->posn = PerlIO_tell(n = PerlIONext(f));
2967 b->ptr = b->end = b->buf;
2968 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
2969 /* We check for Valid because of dubious decision to make PerlIO_flush(NULL) flush all */
2970 /* FIXME: Doing downstream flush may be sub-optimal see PerlIOBuf_fill() below */
2971 if (PerlIOValid(n) && PerlIO_flush(n) != 0)
2977 PerlIOBuf_fill(pTHX_ PerlIO *f)
2979 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2980 PerlIO *n = PerlIONext(f);
2983 * FIXME: doing the down-stream flush maybe sub-optimal if it causes
2984 * pre-read data in stdio buffer to be discarded.
2985 * However, skipping the flush also skips _our_ hosekeeping
2986 * and breaks tell tests. So we do the flush.
2988 if (PerlIO_flush(f) != 0)
2990 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
2991 PerlIOBase_flush_linebuf(aTHX);
2994 PerlIO_get_base(f); /* allocate via vtable */
2996 b->ptr = b->end = b->buf;
2997 if (PerlIO_fast_gets(n)) {
2999 * Layer below is also buffered. We do _NOT_ want to call its
3000 * ->Read() because that will loop till it gets what we asked for
3001 * which may hang on a pipe etc. Instead take anything it has to
3002 * hand, or ask it to fill _once_.
3004 avail = PerlIO_get_cnt(n);
3006 avail = PerlIO_fill(n);
3008 avail = PerlIO_get_cnt(n);
3010 if (!PerlIO_error(n) && PerlIO_eof(n))
3015 STDCHAR *ptr = PerlIO_get_ptr(n);
3016 SSize_t cnt = avail;
3017 if (avail > (SSize_t)b->bufsiz)
3019 Copy(ptr, b->buf, avail, STDCHAR);
3020 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
3024 avail = PerlIO_read(n, b->ptr, b->bufsiz);
3028 PerlIOBase(f)->flags |= PERLIO_F_EOF;
3030 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
3033 b->end = b->buf + avail;
3034 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3039 PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3041 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3042 if (PerlIOValid(f)) {
3045 return PerlIOBase_read(aTHX_ f, vbuf, count);
3051 PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3053 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
3054 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3057 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3062 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3064 * Buffer is already a read buffer, we can overwrite any chars
3065 * which have been read back to buffer start
3067 avail = (b->ptr - b->buf);
3071 * Buffer is idle, set it up so whole buffer is available for
3075 b->end = b->buf + avail;
3077 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3079 * Buffer extends _back_ from where we are now
3081 b->posn -= b->bufsiz;
3083 if (avail > (SSize_t) count) {
3085 * If we have space for more than count, just move count
3093 * In simple stdio-like ungetc() case chars will be already
3096 if (buf != b->ptr) {
3097 Copy(buf, b->ptr, avail, STDCHAR);
3101 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
3108 PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3110 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3111 const STDCHAR *buf = (const STDCHAR *) vbuf;
3115 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3118 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
3119 if ((SSize_t) count < avail)
3121 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3122 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
3137 Copy(buf, b->ptr, avail, STDCHAR);
3144 if (b->ptr >= (b->buf + b->bufsiz))
3147 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
3153 PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3156 if ((code = PerlIO_flush(f)) == 0) {
3157 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3158 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
3159 code = PerlIO_seek(PerlIONext(f), offset, whence);
3161 b->posn = PerlIO_tell(PerlIONext(f));
3168 PerlIOBuf_tell(pTHX_ PerlIO *f)
3170 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3172 * b->posn is file position where b->buf was read, or will be written
3174 Off_t posn = b->posn;
3177 * If buffer is valid adjust position by amount in buffer
3179 posn += (b->ptr - b->buf);
3185 PerlIOBuf_close(pTHX_ PerlIO *f)
3187 IV code = PerlIOBase_close(aTHX_ f);
3188 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3189 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
3193 b->ptr = b->end = b->buf;
3194 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3199 PerlIOBuf_get_ptr(pTHX_ PerlIO *f)
3201 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3208 PerlIOBuf_get_cnt(pTHX_ PerlIO *f)
3210 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3213 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
3214 return (b->end - b->ptr);
3219 PerlIOBuf_get_base(pTHX_ PerlIO *f)
3221 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3226 Newz('B',b->buf,b->bufsiz, STDCHAR);
3228 b->buf = (STDCHAR *) & b->oneword;
3229 b->bufsiz = sizeof(b->oneword);
3238 PerlIOBuf_bufsiz(pTHX_ PerlIO *f)
3240 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3243 return (b->end - b->buf);
3247 PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3249 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3253 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf) {
3254 assert(PerlIO_get_cnt(f) == cnt);
3255 assert(b->ptr >= b->buf);
3257 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3261 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3263 return PerlIOBase_dup(aTHX_ f, o, param, flags);
3268 PerlIO_funcs PerlIO_perlio = {
3288 PerlIOBase_clearerr,
3289 PerlIOBase_setlinebuf,
3294 PerlIOBuf_set_ptrcnt,
3297 /*--------------------------------------------------------------------------------------*/
3299 * Temp layer to hold unread chars when cannot do it any other way
3303 PerlIOPending_fill(pTHX_ PerlIO *f)
3306 * Should never happen
3313 PerlIOPending_close(pTHX_ PerlIO *f)
3316 * A tad tricky - flush pops us, then we close new top
3319 return PerlIO_close(f);
3323 PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
3326 * A tad tricky - flush pops us, then we seek new top
3329 return PerlIO_seek(f, offset, whence);
3334 PerlIOPending_flush(pTHX_ PerlIO *f)
3336 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3337 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
3341 PerlIO_pop(aTHX_ f);
3346 PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3352 PerlIOBuf_set_ptrcnt(aTHX_ f, ptr, cnt);
3357 PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
3359 IV code = PerlIOBase_pushed(aTHX_ f, mode, arg);
3360 PerlIOl *l = PerlIOBase(f);
3362 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
3363 * etc. get muddled when it changes mid-string when we auto-pop.
3365 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
3366 (PerlIOBase(PerlIONext(f))->
3367 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
3372 PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
3374 SSize_t avail = PerlIO_get_cnt(f);
3376 if ((SSize_t)count < avail)
3379 got = PerlIOBuf_read(aTHX_ f, vbuf, avail);
3380 if (got >= 0 && got < (SSize_t)count) {
3382 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
3383 if (more >= 0 || got == 0)
3389 PerlIO_funcs PerlIO_pending = {
3393 PerlIOPending_pushed,
3404 PerlIOPending_close,
3405 PerlIOPending_flush,
3409 PerlIOBase_clearerr,
3410 PerlIOBase_setlinebuf,
3415 PerlIOPending_set_ptrcnt,
3420 /*--------------------------------------------------------------------------------------*/
3422 * crlf - translation On read translate CR,LF to "\n" we do this by
3423 * overriding ptr/cnt entries to hand back a line at a time and keeping a
3424 * record of which nl we "lied" about. On write translate "\n" to CR,LF
3428 PerlIOBuf base; /* PerlIOBuf stuff */
3429 STDCHAR *nl; /* Position of crlf we "lied" about in the
3434 PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg)
3437 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
3438 code = PerlIOBuf_pushed(aTHX_ f, mode, arg);
3440 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
3441 f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
3442 PerlIOBase(f)->flags);
3449 PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3451 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3456 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3457 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
3459 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
3460 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3462 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3467 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
3468 b->end = b->ptr = b->buf + b->bufsiz;
3469 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3470 b->posn -= b->bufsiz;
3472 while (count > 0 && b->ptr > b->buf) {
3475 if (b->ptr - 2 >= b->buf) {
3498 PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
3500 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3503 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3504 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3505 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && (!c->nl || *c->nl == 0xd)) {
3506 STDCHAR *nl = (c->nl) ? c->nl : b->ptr;
3508 while (nl < b->end && *nl != 0xd)
3510 if (nl < b->end && *nl == 0xd) {
3512 if (nl + 1 < b->end) {
3519 * Not CR,LF but just CR
3527 * Blast - found CR as last char in buffer
3532 * They may not care, defer work as long as
3536 return (nl - b->ptr);
3540 b->ptr++; /* say we have read it as far as
3541 * flush() is concerned */
3542 b->buf++; /* Leave space in front of buffer */
3543 b->bufsiz--; /* Buffer is thus smaller */
3544 code = PerlIO_fill(f); /* Fetch some more */
3545 b->bufsiz++; /* Restore size for next time */
3546 b->buf--; /* Point at space */
3547 b->ptr = nl = b->buf; /* Which is what we hand
3549 b->posn--; /* Buffer starts here */
3550 *nl = 0xd; /* Fill in the CR */
3552 goto test; /* fill() call worked */
3554 * CR at EOF - just fall through
3556 /* Should we clear EOF though ??? */
3561 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
3567 PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3569 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3570 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3576 if (ptr == b->end && *c->nl == 0xd) {
3577 /* Defered CR at end of buffer case - we lied about count */
3589 * Test code - delete when it works ...
3591 IV flags = PerlIOBase(f)->flags;
3592 STDCHAR *chk = (c->nl) ? (c->nl+1) : b->end;
3593 if (ptr+cnt == c->nl && c->nl+1 == b->end && *c->nl == 0xd) {
3594 /* Defered CR at end of buffer case - we lied about count */
3600 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
3601 " nl=%p e=%p for %d", ptr, chk, flags, c->nl,
3609 * They have taken what we lied about
3617 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3621 PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3623 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3624 return PerlIOBuf_write(aTHX_ f, vbuf, count);
3626 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3627 const STDCHAR *buf = (const STDCHAR *) vbuf;
3628 const STDCHAR *ebuf = buf + count;
3631 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3633 while (buf < ebuf) {
3634 STDCHAR *eptr = b->buf + b->bufsiz;
3635 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3636 while (buf < ebuf && b->ptr < eptr) {
3638 if ((b->ptr + 2) > eptr) {
3646 *(b->ptr)++ = 0xd; /* CR */
3647 *(b->ptr)++ = 0xa; /* LF */
3649 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
3659 if (b->ptr >= eptr) {
3665 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
3667 return (buf - (STDCHAR *) vbuf);
3672 PerlIOCrlf_flush(pTHX_ PerlIO *f)
3674 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3679 return PerlIOBuf_flush(aTHX_ f);
3682 PerlIO_funcs PerlIO_crlf = {
3685 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF,
3687 PerlIOBase_noop_ok, /* popped */
3692 PerlIOBuf_read, /* generic read works with ptr/cnt lies
3694 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
3695 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
3703 PerlIOBase_clearerr,
3704 PerlIOBase_setlinebuf,
3709 PerlIOCrlf_set_ptrcnt,
3713 /*--------------------------------------------------------------------------------------*/
3715 * mmap as "buffer" layer
3719 PerlIOBuf base; /* PerlIOBuf stuff */
3720 Mmap_t mptr; /* Mapped address */
3721 Size_t len; /* mapped length */
3722 STDCHAR *bbuf; /* malloced buffer if map fails */
3725 static size_t page_size = 0;
3728 PerlIOMmap_map(pTHX_ PerlIO *f)
3730 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3731 IV flags = PerlIOBase(f)->flags;
3735 if (flags & PERLIO_F_CANREAD) {
3736 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3737 int fd = PerlIO_fileno(f);
3739 code = Fstat(fd, &st);
3740 if (code == 0 && S_ISREG(st.st_mode)) {
3741 SSize_t len = st.st_size - b->posn;
3745 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
3747 SETERRNO(0, SS$_NORMAL);
3748 # ifdef _SC_PAGESIZE
3749 page_size = sysconf(_SC_PAGESIZE);
3751 page_size = sysconf(_SC_PAGE_SIZE);
3753 if ((long) page_size < 0) {
3758 (void) SvUPGRADE(error, SVt_PV);
3759 msg = SvPVx(error, n_a);
3760 Perl_croak(aTHX_ "panic: sysconf: %s",
3765 "panic: sysconf: pagesize unknown");
3769 # ifdef HAS_GETPAGESIZE
3770 page_size = getpagesize();
3772 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
3773 page_size = PAGESIZE; /* compiletime, bad */
3777 if ((IV) page_size <= 0)
3778 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
3783 * This is a hack - should never happen - open should
3786 b->posn = PerlIO_tell(PerlIONext(f));
3788 posn = (b->posn / page_size) * page_size;
3789 len = st.st_size - posn;
3790 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
3791 if (m->mptr && m->mptr != (Mmap_t) - 1) {
3792 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
3793 madvise(m->mptr, len, MADV_SEQUENTIAL);
3795 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
3796 madvise(m->mptr, len, MADV_WILLNEED);
3798 PerlIOBase(f)->flags =
3799 (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
3800 b->end = ((STDCHAR *) m->mptr) + len;
3801 b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
3810 PerlIOBase(f)->flags =
3811 flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
3813 b->ptr = b->end = b->ptr;
3822 PerlIOMmap_unmap(pTHX_ PerlIO *f)
3824 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3825 PerlIOBuf *b = &m->base;
3829 code = munmap(m->mptr, m->len);
3833 if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
3836 b->ptr = b->end = b->buf;
3837 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3843 PerlIOMmap_get_base(pTHX_ PerlIO *f)
3845 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3846 PerlIOBuf *b = &m->base;
3847 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
3849 * Already have a readbuffer in progress
3855 * We have a write buffer or flushed PerlIOBuf read buffer
3857 m->bbuf = b->buf; /* save it in case we need it again */
3858 b->buf = NULL; /* Clear to trigger below */
3861 PerlIOMmap_map(aTHX_ f); /* Try and map it */
3864 * Map did not work - recover PerlIOBuf buffer if we have one
3869 b->ptr = b->end = b->buf;
3872 return PerlIOBuf_get_base(aTHX_ f);
3876 PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3878 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3879 PerlIOBuf *b = &m->base;
3880 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3882 if (b->ptr && (b->ptr - count) >= b->buf
3883 && memEQ(b->ptr - count, vbuf, count)) {
3885 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
3890 * Loose the unwritable mapped buffer
3894 * If flush took the "buffer" see if we have one from before
3896 if (!b->buf && m->bbuf)
3899 PerlIOBuf_get_base(aTHX_ f);
3903 return PerlIOBuf_unread(aTHX_ f, vbuf, count);
3907 PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
3909 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3910 PerlIOBuf *b = &m->base;
3911 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
3913 * No, or wrong sort of, buffer
3916 if (PerlIOMmap_unmap(aTHX_ f) != 0)
3920 * If unmap took the "buffer" see if we have one from before
3922 if (!b->buf && m->bbuf)
3925 PerlIOBuf_get_base(aTHX_ f);
3929 return PerlIOBuf_write(aTHX_ f, vbuf, count);
3933 PerlIOMmap_flush(pTHX_ PerlIO *f)
3935 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3936 PerlIOBuf *b = &m->base;
3937 IV code = PerlIOBuf_flush(aTHX_ f);
3939 * Now we are "synced" at PerlIOBuf level
3946 if (PerlIOMmap_unmap(aTHX_ f) != 0)
3951 * We seem to have a PerlIOBuf buffer which was not mapped
3952 * remember it in case we need one later
3961 PerlIOMmap_fill(pTHX_ PerlIO *f)
3963 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3964 IV code = PerlIO_flush(f);
3965 if (code == 0 && !b->buf) {
3966 code = PerlIOMmap_map(aTHX_ f);
3968 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
3969 code = PerlIOBuf_fill(aTHX_ f);
3975 PerlIOMmap_close(pTHX_ PerlIO *f)
3977 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3978 PerlIOBuf *b = &m->base;
3979 IV code = PerlIO_flush(f);
3983 b->ptr = b->end = b->buf;
3985 if (PerlIOBuf_close(aTHX_ f) != 0)
3991 PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
3993 return PerlIOBase_dup(aTHX_ f, o, param, flags);
3997 PerlIO_funcs PerlIO_mmap = {
4017 PerlIOBase_clearerr,
4018 PerlIOBase_setlinebuf,
4019 PerlIOMmap_get_base,
4023 PerlIOBuf_set_ptrcnt,
4026 #endif /* HAS_MMAP */
4029 Perl_PerlIO_stdin(pTHX)
4032 PerlIO_stdstreams(aTHX);
4034 return &PL_perlio[1];
4038 Perl_PerlIO_stdout(pTHX)
4041 PerlIO_stdstreams(aTHX);
4043 return &PL_perlio[2];
4047 Perl_PerlIO_stderr(pTHX)
4050 PerlIO_stdstreams(aTHX);
4052 return &PL_perlio[3];
4055 /*--------------------------------------------------------------------------------------*/
4058 PerlIO_getname(PerlIO *f, char *buf)
4063 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
4065 name = fgetname(stdio, buf);
4067 Perl_croak(aTHX_ "Don't know how to get file name");
4073 /*--------------------------------------------------------------------------------------*/
4075 * Functions which can be called on any kind of PerlIO implemented in
4079 #undef PerlIO_fdopen
4081 PerlIO_fdopen(int fd, const char *mode)
4084 return PerlIO_openn(aTHX_ Nullch, mode, fd, 0, 0, NULL, 0, NULL);
4089 PerlIO_open(const char *path, const char *mode)
4092 SV *name = sv_2mortal(newSVpvn(path, strlen(path)));
4093 return PerlIO_openn(aTHX_ Nullch, mode, -1, 0, 0, NULL, 1, &name);
4096 #undef Perlio_reopen
4098 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
4101 SV *name = sv_2mortal(newSVpvn(path, strlen(path)));
4102 return PerlIO_openn(aTHX_ Nullch, mode, -1, 0, 0, f, 1, &name);
4107 PerlIO_getc(PerlIO *f)
4111 SSize_t count = PerlIO_read(f, buf, 1);
4113 return (unsigned char) buf[0];
4118 #undef PerlIO_ungetc
4120 PerlIO_ungetc(PerlIO *f, int ch)
4125 if (PerlIO_unread(f, &buf, 1) == 1)
4133 PerlIO_putc(PerlIO *f, int ch)
4137 return PerlIO_write(f, &buf, 1);
4142 PerlIO_puts(PerlIO *f, const char *s)
4145 STRLEN len = strlen(s);
4146 return PerlIO_write(f, s, len);
4149 #undef PerlIO_rewind
4151 PerlIO_rewind(PerlIO *f)
4154 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
4158 #undef PerlIO_vprintf
4160 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
4163 SV *sv = newSVpvn("", 0);
4169 Perl_va_copy(ap, apc);
4170 sv_vcatpvf(sv, fmt, &apc);
4172 sv_vcatpvf(sv, fmt, &ap);
4175 wrote = PerlIO_write(f, s, len);
4180 #undef PerlIO_printf
4182 PerlIO_printf(PerlIO *f, const char *fmt, ...)
4187 result = PerlIO_vprintf(f, fmt, ap);
4192 #undef PerlIO_stdoutf
4194 PerlIO_stdoutf(const char *fmt, ...)
4200 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
4205 #undef PerlIO_tmpfile
4207 PerlIO_tmpfile(void)
4210 * I have no idea how portable mkstemp() is ...
4212 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
4215 FILE *stdio = PerlSIO_tmpfile();
4218 PerlIOSelf(PerlIO_push
4219 (aTHX_(f = PerlIO_allocate(aTHX)), &PerlIO_stdio,
4220 "w+", Nullsv), PerlIOStdio);
4226 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX", 0);
4227 int fd = mkstemp(SvPVX(sv));
4230 f = PerlIO_fdopen(fd, "w+");
4232 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
4234 PerlLIO_unlink(SvPVX(sv));
4244 #endif /* USE_SFIO */
4245 #endif /* PERLIO_IS_STDIO */
4247 /*======================================================================================*/
4249 * Now some functions in terms of above which may be needed even if we are
4250 * not in true PerlIO mode
4254 #undef PerlIO_setpos
4256 PerlIO_setpos(PerlIO *f, SV *pos)
4261 Off_t *posn = (Off_t *) SvPV(pos, len);
4262 if (f && len == sizeof(Off_t))
4263 return PerlIO_seek(f, *posn, SEEK_SET);
4265 SETERRNO(EINVAL, SS$_IVCHAN);
4269 #undef PerlIO_setpos
4271 PerlIO_setpos(PerlIO *f, SV *pos)
4276 Fpos_t *fpos = (Fpos_t *) SvPV(pos, len);
4277 if (f && len == sizeof(Fpos_t)) {
4278 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
4279 return fsetpos64(f, fpos);
4281 return fsetpos(f, fpos);
4285 SETERRNO(EINVAL, SS$_IVCHAN);
4291 #undef PerlIO_getpos
4293 PerlIO_getpos(PerlIO *f, SV *pos)
4296 Off_t posn = PerlIO_tell(f);
4297 sv_setpvn(pos, (char *) &posn, sizeof(posn));
4298 return (posn == (Off_t) - 1) ? -1 : 0;
4301 #undef PerlIO_getpos
4303 PerlIO_getpos(PerlIO *f, SV *pos)
4308 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
4309 code = fgetpos64(f, &fpos);
4311 code = fgetpos(f, &fpos);
4313 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
4318 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
4321 vprintf(char *pat, char *args)
4323 _doprnt(pat, args, stdout);
4324 return 0; /* wrong, but perl doesn't use the return
4329 vfprintf(FILE *fd, char *pat, char *args)
4331 _doprnt(pat, args, fd);
4332 return 0; /* wrong, but perl doesn't use the return
4338 #ifndef PerlIO_vsprintf
4340 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
4342 int val = vsprintf(s, fmt, ap);
4344 if (strlen(s) >= (STRLEN) n) {
4346 (void) PerlIO_puts(Perl_error_log,
4347 "panic: sprintf overflow - memory corrupted!\n");
4355 #ifndef PerlIO_sprintf
4357 PerlIO_sprintf(char *s, int n, const char *fmt, ...)
4362 result = PerlIO_vsprintf(s, n, fmt, ap);