2 * perlio.c Copyright (c) 1996-2001, 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 * If we have ActivePerl-like PERL_IMPLICIT_SYS then we need a dTHX to get
9 * at the dispatch tables, even when we do not need it for other reasons.
10 * Invent a dSYS macro to abstract this out
12 #ifdef PERL_IMPLICIT_SYS
25 #define PERLIO_NOT_STDIO 0
26 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
32 * This file provides those parts of PerlIO abstraction
33 * which are not #defined in perlio.h.
34 * Which these are depends on various Configure #ifdef's
38 #define PERL_IN_PERLIO_C
43 #undef PerlMemShared_calloc
44 #define PerlMemShared_calloc(x,y) calloc(x,y)
45 #undef PerlMemShared_free
46 #define PerlMemShared_free(x) free(x)
49 perlsio_binmode(FILE *fp, int iotype, int mode)
52 * This used to be contents of do_binmode in doio.c
55 # if defined(atarist) || defined(__MINT__)
58 ((FILE *) fp)->_flag |= _IOBIN;
60 ((FILE *) fp)->_flag &= ~_IOBIN;
67 if (PerlLIO_setmode(fp, mode) != -1) {
69 if (PerlLIO_setmode(fileno(fp), mode) != -1) {
71 # if defined(WIN32) && defined(__BORLANDC__)
73 * The translation mode of the stream is maintained independent of
74 * the translation mode of the fd in the Borland RTL (heavy
75 * digging through their runtime sources reveal). User has to set
76 * the mode explicitly for the stream (though they don't document
77 * this anywhere). GSAR 97-5-24
91 # if defined(USEMYBINMODE)
92 if (my_binmode(fp, iotype, mode) != FALSE)
102 #ifndef PERLIO_LAYERS
104 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
106 if (!names || !*names || strEQ(names, ":crlf") || strEQ(names, ":raw")) {
109 Perl_croak(aTHX_ "Cannot apply \"%s\" in non-PerlIO perl", names);
117 PerlIO_destruct(pTHX)
122 PerlIO_binmode(pTHX_ PerlIO *fp, int iotype, int mode, const char *names)
127 return perlsio_binmode(fp, iotype, mode);
132 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param)
135 int fd = PerlLIO_dup(PerlIO_fileno(f));
137 /* the r+ is a hack */
138 return PerlIO_fdopen(fd, "r+");
143 SETERRNO(EBADF, SS$_IVCHAN);
150 * De-mux PerlIO_openn() into fdopen, freopen and fopen type entries
154 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
155 int imode, int perm, PerlIO *old, int narg, SV **args)
158 if (*args == &PL_sv_undef)
159 return PerlIO_tmpfile();
161 char *name = SvPV_nolen(*args);
163 fd = PerlLIO_open3(name, imode, perm);
165 return PerlIO_fdopen(fd, (char *) mode + 1);
168 return PerlIO_reopen(name, mode, old);
171 return PerlIO_open(name, mode);
176 return PerlIO_fdopen(fd, (char *) mode);
181 XS(XS_PerlIO__Layer__find)
185 Perl_croak(aTHX_ "Usage class->find(name[,load])");
187 char *name = SvPV_nolen(ST(1));
188 ST(0) = (strEQ(name, "crlf")
189 || strEQ(name, "raw")) ? &PL_sv_yes : &PL_sv_undef;
196 Perl_boot_core_PerlIO(pTHX)
198 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
204 #ifdef PERLIO_IS_STDIO
210 * Does nothing (yet) except force this file to be included in perl
211 * binary. That allows this file to force inclusion of other functions
212 * that may be required by loadable extensions e.g. for
213 * FileHandle::tmpfile
217 #undef PerlIO_tmpfile
224 #else /* PERLIO_IS_STDIO */
232 * This section is just to make sure these functions get pulled in from
236 #undef PerlIO_tmpfile
247 * Force this file to be included in perl binary. Which allows this
248 * file to force inclusion of other functions that may be required by
249 * loadable extensions e.g. for FileHandle::tmpfile
253 * Hack sfio does its own 'autoflush' on stdout in common cases. Flush
254 * results in a lot of lseek()s to regular files and lot of small
257 sfset(sfstdout, SF_SHARE, 0);
261 PerlIO_importFILE(FILE *stdio, int fl)
263 int fd = fileno(stdio);
264 PerlIO *r = PerlIO_fdopen(fd, "r+");
269 PerlIO_findFILE(PerlIO *pio)
271 int fd = PerlIO_fileno(pio);
272 FILE *f = fdopen(fd, "r+");
274 if (!f && errno == EINVAL)
276 if (!f && errno == EINVAL)
283 /*======================================================================================*/
285 * Implement all the PerlIO interface ourselves.
291 * We _MUST_ have <unistd.h> if we are using lseek() and may have large
298 #include <sys/mman.h>
302 void PerlIO_debug(const char *fmt, ...)
303 __attribute__ ((format(__printf__, 1, 2)));
306 PerlIO_debug(const char *fmt, ...)
313 char *s = PerlEnv_getenv("PERLIO_DEBUG");
315 dbg = PerlLIO_open3(s, O_WRONLY | O_CREAT | O_APPEND, 0666);
322 /* Use fixed buffer as sv_catpvf etc. needs SVs */
326 s = CopFILE(PL_curcop);
329 sprintf(buffer, "%s:%" IVdf " ", s, (IV) CopLINE(PL_curcop));
330 len = strlen(buffer);
331 vsprintf(buffer+len, fmt, ap);
332 PerlLIO_write(dbg, buffer, strlen(buffer));
334 SV *sv = newSVpvn("", 0);
337 s = CopFILE(PL_curcop);
340 Perl_sv_catpvf(aTHX_ sv, "%s:%" IVdf " ", s,
341 (IV) CopLINE(PL_curcop));
342 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
345 PerlLIO_write(dbg, s, len);
352 /*--------------------------------------------------------------------------------------*/
355 * Inner level routines
359 * Table of pointers to the PerlIO structs (malloc'ed)
361 PerlIO *_perlio = NULL;
362 #define PERLIO_TABLE_SIZE 64
367 PerlIO_allocate(pTHX)
370 * Find a free slot in the table, allocating new table as necessary
375 while ((f = *last)) {
377 last = (PerlIO **) (f);
378 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
384 f = PerlMemShared_calloc(PERLIO_TABLE_SIZE, sizeof(PerlIO));
393 PerlIO_cleantable(pTHX_ PerlIO **tablep)
395 PerlIO *table = *tablep;
398 PerlIO_cleantable(aTHX_(PerlIO **) & (table[0]));
399 for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) {
400 PerlIO *f = table + i;
405 PerlMemShared_free(table);
410 PerlIO_list_t *PerlIO_known_layers;
411 PerlIO_list_t *PerlIO_def_layerlist;
414 PerlIO_list_alloc(void)
417 Newz('L', list, 1, PerlIO_list_t);
423 PerlIO_list_free(PerlIO_list_t *list)
426 if (--list->refcnt == 0) {
430 for (i = 0; i < list->cur; i++) {
431 if (list->array[i].arg)
432 SvREFCNT_dec(list->array[i].arg);
434 Safefree(list->array);
442 PerlIO_list_push(PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg)
446 if (list->cur >= list->len) {
449 Renew(list->array, list->len, PerlIO_pair_t);
451 New('l', list->array, list->len, PerlIO_pair_t);
453 p = &(list->array[list->cur++]);
455 if ((p->arg = arg)) {
462 PerlIO_cleanup_layers(pTHX_ void *data)
465 PerlIO_known_layers = Nullhv;
466 PerlIO_def_layerlist = Nullav;
474 PerlIO_cleantable(aTHX_ & _perlio);
478 PerlIO_destruct(pTHX)
480 PerlIO **table = &_perlio;
482 while ((f = *table)) {
484 table = (PerlIO **) (f++);
485 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
489 if (l->tab->kind & PERLIO_K_DESTRUCT) {
490 PerlIO_debug("Destruct popping %s\n", l->tab->name);
504 PerlIO_pop(pTHX_ PerlIO *f)
508 PerlIO_debug("PerlIO_pop f=%p %s\n", f, l->tab->name);
509 if (l->tab->Popped) {
511 * If popped returns non-zero do not free its layer structure
512 * it has either done so itself, or it is shared and still in
515 if ((*l->tab->Popped) (f) != 0)
519 PerlMemShared_free(l);
523 /*--------------------------------------------------------------------------------------*/
525 * XS Interface for perl code
529 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
532 if ((SSize_t) len <= 0)
534 for (i = 0; i < PerlIO_known_layers->cur; i++) {
535 PerlIO_funcs *f = PerlIO_known_layers->array[i].funcs;
536 if (memEQ(f->name, name, len)) {
537 PerlIO_debug("%.*s => %p\n", (int) len, name, f);
541 if (load && PL_subname && PerlIO_def_layerlist
542 && PerlIO_def_layerlist->cur >= 2) {
543 SV *pkgsv = newSVpvn("PerlIO", 6);
544 SV *layer = newSVpvn(name, len);
547 * The two SVs are magically freed by load_module
549 Perl_load_module(aTHX_ 0, pkgsv, Nullsv, layer, Nullsv);
551 return PerlIO_find_layer(aTHX_ name, len, 0);
553 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
557 #ifdef USE_ATTRIBUTES_FOR_PERLIO
560 perlio_mg_set(pTHX_ SV *sv, MAGIC *mg)
563 IO *io = GvIOn((GV *) SvRV(sv));
564 PerlIO *ifp = IoIFP(io);
565 PerlIO *ofp = IoOFP(io);
566 Perl_warn(aTHX_ "set %" SVf " %p %p %p", sv, io, ifp, ofp);
572 perlio_mg_get(pTHX_ SV *sv, MAGIC *mg)
575 IO *io = GvIOn((GV *) SvRV(sv));
576 PerlIO *ifp = IoIFP(io);
577 PerlIO *ofp = IoOFP(io);
578 Perl_warn(aTHX_ "get %" SVf " %p %p %p", sv, io, ifp, ofp);
584 perlio_mg_clear(pTHX_ SV *sv, MAGIC *mg)
586 Perl_warn(aTHX_ "clear %" SVf, sv);
591 perlio_mg_free(pTHX_ SV *sv, MAGIC *mg)
593 Perl_warn(aTHX_ "free %" SVf, sv);
597 MGVTBL perlio_vtab = {
605 XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
608 SV *sv = SvRV(ST(1));
613 sv_magic(sv, (SV *) av, PERL_MAGIC_ext, NULL, 0);
615 mg = mg_find(sv, PERL_MAGIC_ext);
616 mg->mg_virtual = &perlio_vtab;
618 Perl_warn(aTHX_ "attrib %" SVf, sv);
619 for (i = 2; i < items; i++) {
621 const char *name = SvPV(ST(i), len);
622 SV *layer = PerlIO_find_layer(aTHX_ name, len, 1);
624 av_push(av, SvREFCNT_inc(layer));
635 #endif /* USE_ATTIBUTES_FOR_PERLIO */
638 PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab)
640 HV *stash = gv_stashpv("PerlIO::Layer", TRUE);
641 SV *sv = sv_bless(newRV_noinc(newSViv(PTR2IV(tab))), stash);
645 XS(XS_PerlIO__Layer__find)
649 Perl_croak(aTHX_ "Usage class->find(name[,load])");
652 char *name = SvPV(ST(1), len);
653 bool load = (items > 2) ? SvTRUE(ST(2)) : 0;
654 PerlIO_funcs *layer = PerlIO_find_layer(aTHX_ name, len, load);
656 (layer) ? sv_2mortal(PerlIO_tab_sv(aTHX_ layer)) :
663 PerlIO_define_layer(pTHX_ PerlIO_funcs *tab)
665 if (!PerlIO_known_layers)
666 PerlIO_known_layers = PerlIO_list_alloc();
667 PerlIO_list_push(PerlIO_known_layers, tab, Nullsv);
668 PerlIO_debug("define %s %p\n", tab->name, tab);
672 PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names)
675 const char *s = names;
677 while (isSPACE(*s) || *s == ':')
682 const char *as = Nullch;
684 if (!isIDFIRST(*s)) {
686 * Message is consistent with how attribute lists are
687 * passed. Even though this means "foo : : bar" is
688 * seen as an invalid separator character.
690 char q = ((*s == '\'') ? '"' : '\'');
692 "perlio: invalid separator character %c%c%c in layer specification list",
698 } while (isALNUM(*e));
714 * It's a nul terminated string, not allowed
715 * to \ the terminating null. Anything other
716 * character is passed over.
727 "perlio: argument list not closed for layer \"%.*s\"",
739 PerlIO_funcs *layer =
740 PerlIO_find_layer(aTHX_ s, llen, 1);
742 PerlIO_list_push(av, layer,
748 Perl_warn(aTHX_ "perlio: unknown layer \"%.*s\"",
761 PerlIO_default_buffer(pTHX_ PerlIO_list_t *av)
763 PerlIO_funcs *tab = &PerlIO_perlio;
764 if (O_BINARY != O_TEXT) {
768 if (PerlIO_stdio.Set_ptrcnt) {
772 PerlIO_debug("Pushing %s\n", tab->name);
773 PerlIO_list_push(av, PerlIO_find_layer(aTHX_ tab->name, 0, 0),
778 PerlIO_arg_fetch(PerlIO_list_t *av, IV n)
780 return av->array[n].arg;
784 PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def)
786 if (n >= 0 && n < av->cur) {
787 PerlIO_debug("Layer %" IVdf " is %s\n", n,
788 av->array[n].funcs->name);
789 return av->array[n].funcs;
792 Perl_croak(aTHX_ "panic: PerlIO layer array corrupt");
797 PerlIO_default_layers(pTHX)
799 if (!PerlIO_def_layerlist) {
800 const char *s = (PL_tainting) ? Nullch : PerlEnv_getenv("PERLIO");
801 PerlIO_funcs *osLayer = &PerlIO_unix;
802 PerlIO_def_layerlist = PerlIO_list_alloc();
803 PerlIO_define_layer(aTHX_ & PerlIO_unix);
804 #if defined(WIN32) && !defined(UNDER_CE)
805 PerlIO_define_layer(aTHX_ & PerlIO_win32);
807 osLayer = &PerlIO_win32;
810 PerlIO_define_layer(aTHX_ & PerlIO_raw);
811 PerlIO_define_layer(aTHX_ & PerlIO_perlio);
812 PerlIO_define_layer(aTHX_ & PerlIO_stdio);
813 PerlIO_define_layer(aTHX_ & PerlIO_crlf);
815 PerlIO_define_layer(aTHX_ & PerlIO_mmap);
817 PerlIO_define_layer(aTHX_ & PerlIO_utf8);
818 PerlIO_define_layer(aTHX_ & PerlIO_byte);
819 PerlIO_list_push(PerlIO_def_layerlist,
820 PerlIO_find_layer(aTHX_ osLayer->name, 0, 0),
823 PerlIO_parse_layers(aTHX_ PerlIO_def_layerlist, s);
826 PerlIO_default_buffer(aTHX_ PerlIO_def_layerlist);
829 if (PerlIO_def_layerlist->cur < 2) {
830 PerlIO_default_buffer(aTHX_ PerlIO_def_layerlist);
832 return PerlIO_def_layerlist;
836 Perl_boot_core_PerlIO(pTHX)
838 #ifdef USE_ATTRIBUTES_FOR_PERLIO
839 newXS("io::MODIFY_SCALAR_ATTRIBUTES", XS_io_MODIFY_SCALAR_ATTRIBUTES,
842 newXS("PerlIO::Layer::find", XS_PerlIO__Layer__find, __FILE__);
846 PerlIO_default_layer(pTHX_ I32 n)
848 PerlIO_list_t *av = PerlIO_default_layers(aTHX);
851 return PerlIO_layer_fetch(aTHX_ av, n, &PerlIO_stdio);
854 #define PerlIO_default_top() PerlIO_default_layer(aTHX_ -1)
855 #define PerlIO_default_btm() PerlIO_default_layer(aTHX_ 0)
858 PerlIO_stdstreams(pTHX)
861 PerlIO_allocate(aTHX);
862 PerlIO_fdopen(0, "Ir" PERLIO_STDTEXT);
863 PerlIO_fdopen(1, "Iw" PERLIO_STDTEXT);
864 PerlIO_fdopen(2, "Iw" PERLIO_STDTEXT);
869 PerlIO_push(pTHX_ PerlIO *f, PerlIO_funcs *tab, const char *mode, SV *arg)
872 l = PerlMemShared_calloc(tab->size, sizeof(char));
874 Zero(l, tab->size, char);
878 PerlIO_debug("PerlIO_push f=%p %s %s %p\n", f, tab->name,
879 (mode) ? mode : "(Null)", arg);
880 if ((*l->tab->Pushed) (f, mode, arg) != 0) {
889 PerlIOPop_pushed(PerlIO *f, const char *mode, SV *arg)
902 PerlIORaw_pushed(PerlIO *f, const char *mode, SV *arg)
905 * Remove the dummy layer
910 * Pop back to bottom layer
914 while (!(PerlIOBase(f)->tab->kind & PERLIO_K_RAW)) {
915 if (*PerlIONext(f)) {
920 * Nothing bellow - push unix on top then remove it
922 if (PerlIO_push(aTHX_ f, PerlIO_default_btm(), mode, arg)) {
923 PerlIO_pop(aTHX_ PerlIONext(f));
928 PerlIO_debug(":raw f=%p :%s\n", f, PerlIOBase(f)->tab->name);
935 PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
936 PerlIO_list_t *layers, IV n)
938 IV max = layers->cur;
941 PerlIO_funcs *tab = PerlIO_layer_fetch(aTHX_ layers, n, NULL);
943 if (!PerlIO_push(aTHX_ f, tab, mode, PerlIOArg)) {
954 PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode, const char *names)
958 PerlIO_list_t *layers = PerlIO_list_alloc();
959 code = PerlIO_parse_layers(aTHX_ layers, names);
961 code = PerlIO_apply_layera(aTHX_ f, mode, layers, 0);
963 PerlIO_list_free(layers);
969 /*--------------------------------------------------------------------------------------*/
971 * Given the abstraction above the public API functions
975 PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int mode, const char *names)
977 PerlIO_debug("PerlIO_binmode f=%p %s %c %x %s\n",
978 f, PerlIOBase(f)->tab->name, iotype, mode,
979 (names) ? names : "(Null)");
981 if (!names && (O_TEXT != O_BINARY && (mode & O_BINARY))) {
984 if (PerlIOBase(top)->tab == &PerlIO_crlf) {
985 PerlIOBase(top)->flags &= ~PERLIO_F_CRLF;
988 top = PerlIONext(top);
992 return PerlIO_apply_layers(aTHX_ f, NULL, names) == 0 ? TRUE : FALSE;
997 PerlIO__close(PerlIO *f)
1000 return (*PerlIOBase(f)->tab->Close) (f);
1002 SETERRNO(EBADF, SS$_IVCHAN);
1007 #undef PerlIO_fdupopen
1009 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param)
1012 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1014 PerlIO_debug("fdupopen f=%p param=%p\n",f,param);
1015 new = (*tab->Dup)(aTHX_ PerlIO_allocate(aTHX),f,param);
1019 SETERRNO(EBADF, SS$_IVCHAN);
1026 PerlIO_close(PerlIO *f)
1031 code = (*PerlIOBase(f)->tab->Close) (f);
1033 PerlIO_pop(aTHX_ f);
1039 #undef PerlIO_fileno
1041 PerlIO_fileno(PerlIO *f)
1044 return (*PerlIOBase(f)->tab->Fileno) (f);
1046 SETERRNO(EBADF, SS$_IVCHAN);
1052 PerlIO_context_layers(pTHX_ const char *mode)
1054 const char *type = NULL;
1056 * Need to supply default layer info from open.pm
1059 SV *layers = PL_curcop->cop_io;
1062 type = SvPV(layers, len);
1063 if (type && mode[0] != 'r') {
1065 * Skip to write part
1067 const char *s = strchr(type, 0);
1068 if (s && (s - type) < len) {
1077 static PerlIO_funcs *
1078 PerlIO_layer_from_ref(pTHX_ SV *sv)
1081 * For any scalar type load the handler which is bundled with perl
1083 if (SvTYPE(sv) < SVt_PVAV)
1084 return PerlIO_find_layer(aTHX_ "Scalar", 6, 1);
1087 * For other types allow if layer is known but don't try and load it
1089 switch (SvTYPE(sv)) {
1091 return PerlIO_find_layer(aTHX_ "Array", 5, 0);
1093 return PerlIO_find_layer(aTHX_ "Hash", 4, 0);
1095 return PerlIO_find_layer(aTHX_ "Code", 4, 0);
1097 return PerlIO_find_layer(aTHX_ "Glob", 4, 0);
1103 PerlIO_resolve_layers(pTHX_ const char *layers,
1104 const char *mode, int narg, SV **args)
1106 PerlIO_list_t *def = PerlIO_default_layers(aTHX);
1109 PerlIO_stdstreams(aTHX);
1113 * If it is a reference but not an object see if we have a handler
1116 if (SvROK(arg) && !sv_isobject(arg)) {
1117 PerlIO_funcs *handler = PerlIO_layer_from_ref(aTHX_ SvRV(arg));
1119 def = PerlIO_list_alloc();
1120 PerlIO_list_push(def, handler, &PL_sv_undef);
1124 * Don't fail if handler cannot be found :Via(...) etc. may do
1125 * something sensible else we will just stringfy and open
1131 layers = PerlIO_context_layers(aTHX_ mode);
1132 if (layers && *layers) {
1136 av = PerlIO_list_alloc();
1137 for (i = 0; i < def->cur; i++) {
1138 PerlIO_list_push(av, def->array[i].funcs,
1145 PerlIO_parse_layers(aTHX_ av, layers);
1156 PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
1157 int imode, int perm, PerlIO *f, int narg, SV **args)
1159 if (!f && narg == 1 && *args == &PL_sv_undef) {
1160 if ((f = PerlIO_tmpfile())) {
1162 layers = PerlIO_context_layers(aTHX_ mode);
1163 if (layers && *layers)
1164 PerlIO_apply_layers(aTHX_ f, mode, layers);
1168 PerlIO_list_t *layera = NULL;
1170 PerlIO_funcs *tab = NULL;
1173 * This is "reopen" - it is not tested as perl does not use it
1177 layera = PerlIO_list_alloc();
1180 (l->tab->Getarg) ? (*l->tab->
1181 Getarg) (&l) : &PL_sv_undef;
1182 PerlIO_list_push(layera, l->tab, arg);
1183 l = *PerlIONext(&l);
1187 layera = PerlIO_resolve_layers(aTHX_ layers, mode, narg, args);
1190 * Start at "top" of layer stack
1192 n = layera->cur - 1;
1194 PerlIO_funcs *t = PerlIO_layer_fetch(aTHX_ layera, n, NULL);
1203 * Found that layer 'n' can do opens - call it
1205 PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n",
1206 tab->name, layers, mode, fd, imode, perm, f, narg,
1208 f = (*tab->Open) (aTHX_ tab, layera, n, mode, fd, imode, perm,
1211 if (n + 1 < layera->cur) {
1213 * More layers above the one that we used to open -
1216 if (PerlIO_apply_layera(aTHX_ f, mode, layera, n + 1)
1223 PerlIO_list_free(layera);
1229 #undef PerlIO_fdopen
1231 PerlIO_fdopen(int fd, const char *mode)
1234 return PerlIO_openn(aTHX_ Nullch, mode, fd, 0, 0, NULL, 0, NULL);
1239 PerlIO_open(const char *path, const char *mode)
1242 SV *name = sv_2mortal(newSVpvn(path, strlen(path)));
1243 return PerlIO_openn(aTHX_ Nullch, mode, -1, 0, 0, NULL, 1, &name);
1246 #undef PerlIO_reopen
1248 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
1251 SV *name = sv_2mortal(newSVpvn(path, strlen(path)));
1252 return PerlIO_openn(aTHX_ Nullch, mode, -1, 0, 0, f, 1, &name);
1257 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
1260 return (*PerlIOBase(f)->tab->Read) (f, vbuf, count);
1262 SETERRNO(EBADF, SS$_IVCHAN);
1267 #undef PerlIO_unread
1269 PerlIO_unread(PerlIO *f, const void *vbuf, Size_t count)
1272 return (*PerlIOBase(f)->tab->Unread) (f, vbuf, count);
1274 SETERRNO(EBADF, SS$_IVCHAN);
1281 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
1284 return (*PerlIOBase(f)->tab->Write) (f, vbuf, count);
1286 SETERRNO(EBADF, SS$_IVCHAN);
1293 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
1296 return (*PerlIOBase(f)->tab->Seek) (f, offset, whence);
1298 SETERRNO(EBADF, SS$_IVCHAN);
1305 PerlIO_tell(PerlIO *f)
1308 return (*PerlIOBase(f)->tab->Tell) (f);
1310 SETERRNO(EBADF, SS$_IVCHAN);
1317 PerlIO_flush(PerlIO *f)
1321 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1322 if (tab && tab->Flush) {
1323 return (*tab->Flush) (f);
1326 PerlIO_debug("Cannot flush f=%p :%s\n", f, tab->name);
1327 SETERRNO(EBADF, SS$_IVCHAN);
1332 PerlIO_debug("Cannot flush f=%p\n", f);
1333 SETERRNO(EBADF, SS$_IVCHAN);
1339 * Is it good API design to do flush-all on NULL, a potentially
1340 * errorneous input? Maybe some magical value (PerlIO*
1341 * PERLIO_FLUSH_ALL = (PerlIO*)-1;)? Yes, stdio does similar
1342 * things on fflush(NULL), but should we be bound by their design
1345 PerlIO **table = &_perlio;
1347 while ((f = *table)) {
1349 table = (PerlIO **) (f++);
1350 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1351 if (*f && PerlIO_flush(f) != 0)
1361 PerlIOBase_flush_linebuf()
1363 PerlIO **table = &_perlio;
1365 while ((f = *table)) {
1367 table = (PerlIO **) (f++);
1368 for (i = 1; i < PERLIO_TABLE_SIZE; i++) {
1371 flags & (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1372 == (PERLIO_F_LINEBUF | PERLIO_F_CANWRITE))
1381 PerlIO_fill(PerlIO *f)
1384 return (*PerlIOBase(f)->tab->Fill) (f);
1386 SETERRNO(EBADF, SS$_IVCHAN);
1391 #undef PerlIO_isutf8
1393 PerlIO_isutf8(PerlIO *f)
1396 return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0;
1398 SETERRNO(EBADF, SS$_IVCHAN);
1405 PerlIO_eof(PerlIO *f)
1408 return (*PerlIOBase(f)->tab->Eof) (f);
1410 SETERRNO(EBADF, SS$_IVCHAN);
1417 PerlIO_error(PerlIO *f)
1420 return (*PerlIOBase(f)->tab->Error) (f);
1422 SETERRNO(EBADF, SS$_IVCHAN);
1427 #undef PerlIO_clearerr
1429 PerlIO_clearerr(PerlIO *f)
1432 (*PerlIOBase(f)->tab->Clearerr) (f);
1434 SETERRNO(EBADF, SS$_IVCHAN);
1437 #undef PerlIO_setlinebuf
1439 PerlIO_setlinebuf(PerlIO *f)
1442 (*PerlIOBase(f)->tab->Setlinebuf) (f);
1444 SETERRNO(EBADF, SS$_IVCHAN);
1447 #undef PerlIO_has_base
1449 PerlIO_has_base(PerlIO *f)
1452 return (PerlIOBase(f)->tab->Get_base != NULL);
1457 #undef PerlIO_fast_gets
1459 PerlIO_fast_gets(PerlIO *f)
1461 if (f && *f && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS)) {
1462 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1463 return (tab->Set_ptrcnt != NULL);
1468 #undef PerlIO_has_cntptr
1470 PerlIO_has_cntptr(PerlIO *f)
1473 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1474 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
1479 #undef PerlIO_canset_cnt
1481 PerlIO_canset_cnt(PerlIO *f)
1484 PerlIOl *l = PerlIOBase(f);
1485 return (l->tab->Set_ptrcnt != NULL);
1490 #undef PerlIO_get_base
1492 PerlIO_get_base(PerlIO *f)
1495 return (*PerlIOBase(f)->tab->Get_base) (f);
1499 #undef PerlIO_get_bufsiz
1501 PerlIO_get_bufsiz(PerlIO *f)
1504 return (*PerlIOBase(f)->tab->Get_bufsiz) (f);
1508 #undef PerlIO_get_ptr
1510 PerlIO_get_ptr(PerlIO *f)
1512 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1513 if (tab->Get_ptr == NULL)
1515 return (*tab->Get_ptr) (f);
1518 #undef PerlIO_get_cnt
1520 PerlIO_get_cnt(PerlIO *f)
1522 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1523 if (tab->Get_cnt == NULL)
1525 return (*tab->Get_cnt) (f);
1528 #undef PerlIO_set_cnt
1530 PerlIO_set_cnt(PerlIO *f, int cnt)
1532 (*PerlIOBase(f)->tab->Set_ptrcnt) (f, NULL, cnt);
1535 #undef PerlIO_set_ptrcnt
1537 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR * ptr, int cnt)
1539 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1540 if (tab->Set_ptrcnt == NULL) {
1542 Perl_croak(aTHX_ "PerlIO buffer snooping abuse");
1544 (*PerlIOBase(f)->tab->Set_ptrcnt) (f, ptr, cnt);
1547 /*--------------------------------------------------------------------------------------*/
1549 * utf8 and raw dummy layers
1553 PerlIOUtf8_pushed(PerlIO *f, const char *mode, SV *arg)
1555 if (PerlIONext(f)) {
1557 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1558 PerlIO_pop(aTHX_ f);
1559 if (tab->kind & PERLIO_K_UTF8)
1560 PerlIOBase(f)->flags |= PERLIO_F_UTF8;
1562 PerlIOBase(f)->flags &= ~PERLIO_F_UTF8;
1568 PerlIO_funcs PerlIO_utf8 = {
1571 PERLIO_K_DUMMY | PERLIO_F_UTF8,
1589 NULL, /* get_base */
1590 NULL, /* get_bufsiz */
1593 NULL, /* set_ptrcnt */
1596 PerlIO_funcs PerlIO_byte = {
1617 NULL, /* get_base */
1618 NULL, /* get_bufsiz */
1621 NULL, /* set_ptrcnt */
1625 PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1626 IV n, const char *mode, int fd, int imode, int perm,
1627 PerlIO *old, int narg, SV **args)
1629 PerlIO_funcs *tab = PerlIO_default_btm();
1630 return (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
1634 PerlIO_funcs PerlIO_raw = {
1655 NULL, /* get_base */
1656 NULL, /* get_bufsiz */
1659 NULL, /* set_ptrcnt */
1661 /*--------------------------------------------------------------------------------------*/
1662 /*--------------------------------------------------------------------------------------*/
1664 * "Methods" of the "base class"
1668 PerlIOBase_fileno(PerlIO *f)
1670 return PerlIO_fileno(PerlIONext(f));
1674 PerlIO_modestr(PerlIO *f, char *buf)
1677 IV flags = PerlIOBase(f)->flags;
1678 if (flags & PERLIO_F_APPEND) {
1680 if (flags & PERLIO_F_CANREAD) {
1684 else if (flags & PERLIO_F_CANREAD) {
1686 if (flags & PERLIO_F_CANWRITE)
1689 else if (flags & PERLIO_F_CANWRITE) {
1691 if (flags & PERLIO_F_CANREAD) {
1695 #if O_TEXT != O_BINARY
1696 if (!(flags & PERLIO_F_CRLF))
1704 PerlIOBase_pushed(PerlIO *f, const char *mode, SV *arg)
1706 PerlIOl *l = PerlIOBase(f);
1708 const char *omode = mode;
1711 PerlIO_funcs *tab = PerlIOBase(f)->tab;
1712 l->flags &= ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE |
1713 PERLIO_F_TRUNCATE | PERLIO_F_APPEND);
1714 if (tab->Set_ptrcnt != NULL)
1715 l->flags |= PERLIO_F_FASTGETS;
1717 if (*mode == '#' || *mode == 'I')
1721 l->flags |= PERLIO_F_CANREAD;
1724 l->flags |= PERLIO_F_APPEND | PERLIO_F_CANWRITE;
1727 l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE;
1730 SETERRNO(EINVAL, LIB$_INVARG);
1736 l->flags |= PERLIO_F_CANREAD | PERLIO_F_CANWRITE;
1739 l->flags &= ~PERLIO_F_CRLF;
1742 l->flags |= PERLIO_F_CRLF;
1745 SETERRNO(EINVAL, LIB$_INVARG);
1752 l->flags |= l->next->flags &
1753 (PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_TRUNCATE |
1758 PerlIO_debug("PerlIOBase_pushed f=%p %s %s fl=%08" UVxf " (%s)\n",
1759 f, PerlIOBase(f)->tab->name, (omode) ? omode : "(Null)",
1760 l->flags, PerlIO_modestr(f, temp));
1766 PerlIOBase_popped(PerlIO *f)
1772 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
1776 * Save the position as current head considers it
1778 Off_t old = PerlIO_tell(f);
1780 PerlIO_push(aTHX_ f, &PerlIO_pending, "r", Nullsv);
1781 PerlIOSelf(f, PerlIOBuf)->posn = old;
1782 done = PerlIOBuf_unread(f, vbuf, count);
1787 PerlIOBase_read(PerlIO *f, void *vbuf, Size_t count)
1789 STDCHAR *buf = (STDCHAR *) vbuf;
1791 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1794 SSize_t avail = PerlIO_get_cnt(f);
1797 take = (count < avail) ? count : avail;
1799 STDCHAR *ptr = PerlIO_get_ptr(f);
1800 Copy(ptr, buf, take, STDCHAR);
1801 PerlIO_set_ptrcnt(f, ptr + take, (avail -= take));
1805 if (count > 0 && avail <= 0) {
1806 if (PerlIO_fill(f) != 0)
1810 return (buf - (STDCHAR *) vbuf);
1816 PerlIOBase_noop_ok(PerlIO *f)
1822 PerlIOBase_noop_fail(PerlIO *f)
1828 PerlIOBase_close(PerlIO *f)
1831 PerlIO *n = PerlIONext(f);
1832 if (PerlIO_flush(f) != 0)
1834 if (n && *n && (*PerlIOBase(n)->tab->Close) (n) != 0)
1836 PerlIOBase(f)->flags &=
1837 ~(PERLIO_F_CANREAD | PERLIO_F_CANWRITE | PERLIO_F_OPEN);
1842 PerlIOBase_eof(PerlIO *f)
1845 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
1851 PerlIOBase_error(PerlIO *f)
1854 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
1860 PerlIOBase_clearerr(PerlIO *f)
1863 PerlIO *n = PerlIONext(f);
1864 PerlIOBase(f)->flags &= ~(PERLIO_F_ERROR | PERLIO_F_EOF);
1871 PerlIOBase_setlinebuf(PerlIO *f)
1874 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF;
1878 /*--------------------------------------------------------------------------------------*/
1880 * Bottom-most level for UNIX-like case
1884 struct _PerlIO base; /* The generic part */
1885 int fd; /* UNIX like file descriptor */
1886 int oflags; /* open/fcntl flags */
1890 PerlIOUnix_oflags(const char *mode)
1893 if (*mode == 'I' || *mode == '#')
1898 if (*++mode == '+') {
1905 oflags = O_CREAT | O_TRUNC;
1906 if (*++mode == '+') {
1915 oflags = O_CREAT | O_APPEND;
1916 if (*++mode == '+') {
1929 else if (*mode == 't') {
1931 oflags &= ~O_BINARY;
1935 * Always open in binary mode
1938 if (*mode || oflags == -1) {
1939 SETERRNO(EINVAL, LIB$_INVARG);
1946 PerlIOUnix_fileno(PerlIO *f)
1948 return PerlIOSelf(f, PerlIOUnix)->fd;
1952 PerlIOUnix_pushed(PerlIO *f, const char *mode, SV *arg)
1954 IV code = PerlIOBase_pushed(f, mode, arg);
1955 if (*PerlIONext(f)) {
1956 PerlIOUnix *s = PerlIOSelf(f, PerlIOUnix);
1957 s->fd = PerlIO_fileno(PerlIONext(f));
1959 * XXX could (or should) we retrieve the oflags from the open file
1960 * handle rather than believing the "mode" we are passed in? XXX
1961 * Should the value on NULL mode be 0 or -1?
1963 s->oflags = mode ? PerlIOUnix_oflags(mode) : -1;
1965 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
1970 PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
1971 IV n, const char *mode, int fd, int imode,
1972 int perm, PerlIO *f, int narg, SV **args)
1975 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
1976 (*PerlIOBase(f)->tab->Close) (f);
1979 char *path = SvPV_nolen(*args);
1983 imode = PerlIOUnix_oflags(mode);
1987 fd = PerlLIO_open3(path, imode, perm);
1995 f = PerlIO_allocate(aTHX);
1996 s = PerlIOSelf(PerlIO_push(aTHX_ f, self, mode, PerlIOArg),
2000 s = PerlIOSelf(f, PerlIOUnix);
2003 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
2009 * FIXME: pop layers ???
2017 PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param)
2023 return sv_dup(arg, param);
2026 return newSVsv(arg);
2029 return newSVsv(arg);
2034 PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param)
2036 PerlIO *nexto = PerlIONext(o);
2038 PerlIO_funcs *tab = PerlIOBase(nexto)->tab;
2039 f = (*tab->Dup)(aTHX_ f, nexto, param);
2042 PerlIO_funcs *self = PerlIOBase(o)->tab;
2045 PerlIO_debug("PerlIOBase_dup %s f=%p o=%p param=%p\n",self->name,f,o,param);
2047 arg = (*self->Getarg)(o);
2049 arg = PerlIO_sv_dup(aTHX_ arg, param);
2052 f = PerlIO_push(aTHX_ f, self, PerlIO_modestr(o,buf), arg);
2061 PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param)
2063 PerlIOUnix *os = PerlIOSelf(o, PerlIOUnix);
2064 int fd = PerlLIO_dup(os->fd);
2066 f = PerlIOBase_dup(aTHX_ f, o, param);
2068 /* If all went well overwrite fd in dup'ed lay with the dup()'ed fd */
2069 PerlIOUnix *s = PerlIOSelf(f, PerlIOUnix);
2082 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
2085 int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2086 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
2089 SSize_t len = PerlLIO_read(fd, vbuf, count);
2090 if (len >= 0 || errno != EINTR) {
2092 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2093 else if (len == 0 && count != 0)
2094 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2102 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
2105 int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2107 SSize_t len = PerlLIO_write(fd, vbuf, count);
2108 if (len >= 0 || errno != EINTR) {
2110 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2118 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
2122 PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, offset, whence);
2123 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2124 return (new == (Off_t) - 1) ? -1 : 0;
2128 PerlIOUnix_tell(PerlIO *f)
2131 return PerlLIO_lseek(PerlIOSelf(f, PerlIOUnix)->fd, 0, SEEK_CUR);
2136 PerlIOUnix_close(PerlIO *f)
2139 int fd = PerlIOSelf(f, PerlIOUnix)->fd;
2141 while (PerlLIO_close(fd) != 0) {
2142 if (errno != EINTR) {
2149 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
2154 PerlIO_funcs PerlIO_unix = {
2170 PerlIOBase_noop_ok, /* flush */
2171 PerlIOBase_noop_fail, /* fill */
2174 PerlIOBase_clearerr,
2175 PerlIOBase_setlinebuf,
2176 NULL, /* get_base */
2177 NULL, /* get_bufsiz */
2180 NULL, /* set_ptrcnt */
2183 /*--------------------------------------------------------------------------------------*/
2189 struct _PerlIO base;
2190 FILE *stdio; /* The stream */
2194 PerlIOStdio_fileno(PerlIO *f)
2197 return PerlSIO_fileno(PerlIOSelf(f, PerlIOStdio)->stdio);
2201 PerlIOStdio_mode(const char *mode, char *tmode)
2207 if (O_BINARY != O_TEXT) {
2215 * This isn't used yet ...
2218 PerlIOStdio_pushed(PerlIO *f, const char *mode, SV *arg)
2220 if (*PerlIONext(f)) {
2222 PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
2225 PerlSIO_fdopen(PerlIO_fileno(PerlIONext(f)), mode =
2226 PerlIOStdio_mode(mode, tmode));
2232 return PerlIOBase_pushed(f, mode, arg);
2235 #undef PerlIO_importFILE
2237 PerlIO_importFILE(FILE *stdio, int fl)
2243 PerlIOSelf(PerlIO_push
2244 (aTHX_(f = PerlIO_allocate(aTHX)), &PerlIO_stdio,
2245 "r+", Nullsv), PerlIOStdio);
2252 PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2253 IV n, const char *mode, int fd, int imode,
2254 int perm, PerlIO *f, int narg, SV **args)
2258 char *path = SvPV_nolen(*args);
2259 PerlIOStdio *s = PerlIOSelf(f, PerlIOStdio);
2261 PerlSIO_freopen(path, (mode = PerlIOStdio_mode(mode, tmode)),
2270 char *path = SvPV_nolen(*args);
2273 fd = PerlLIO_open3(path, imode, perm);
2276 FILE *stdio = PerlSIO_fopen(path, mode);
2279 PerlIOSelf(PerlIO_push
2280 (aTHX_(f = PerlIO_allocate(aTHX)), self,
2281 (mode = PerlIOStdio_mode(mode, tmode)),
2299 stdio = PerlSIO_stdin;
2302 stdio = PerlSIO_stdout;
2305 stdio = PerlSIO_stderr;
2310 stdio = PerlSIO_fdopen(fd, mode =
2311 PerlIOStdio_mode(mode, tmode));
2315 PerlIOSelf(PerlIO_push
2316 (aTHX_(f = PerlIO_allocate(aTHX)), self,
2317 mode, PerlIOArg), PerlIOStdio);
2327 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
2330 FILE *s = PerlIOSelf(f, PerlIOStdio)->stdio;
2333 STDCHAR *buf = (STDCHAR *) vbuf;
2335 * Perl is expecting PerlIO_getc() to fill the buffer Linux's
2336 * stdio does not do that for fread()
2338 int ch = PerlSIO_fgetc(s);
2345 got = PerlSIO_fread(vbuf, 1, count, s);
2350 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
2353 FILE *s = PerlIOSelf(f, PerlIOStdio)->stdio;
2354 STDCHAR *buf = ((STDCHAR *) vbuf) + count - 1;
2357 int ch = *buf-- & 0xff;
2358 if (PerlSIO_ungetc(ch, s) != ch)
2367 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
2370 return PerlSIO_fwrite(vbuf, 1, count,
2371 PerlIOSelf(f, PerlIOStdio)->stdio);
2375 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
2378 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2379 return PerlSIO_fseek(stdio, offset, whence);
2383 PerlIOStdio_tell(PerlIO *f)
2386 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2387 return PerlSIO_ftell(stdio);
2391 PerlIOStdio_close(PerlIO *f)
2394 #ifdef SOCKS5_VERSION_NAME
2396 Sock_size_t optlen = sizeof(int);
2398 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2400 #ifdef SOCKS5_VERSION_NAME
2402 (PerlIO_fileno(f), SOL_SOCKET, SO_TYPE, (void *) &optval,
2404 0) ? PerlSIO_fclose(stdio) : close(PerlIO_fileno(f))
2406 PerlSIO_fclose(stdio)
2413 PerlIOStdio_flush(PerlIO *f)
2416 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2417 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
2418 return PerlSIO_fflush(stdio);
2423 * FIXME: This discards ungetc() and pre-read stuff which is not
2424 * right if this is just a "sync" from a layer above Suspect right
2425 * design is to do _this_ but not have layer above flush this
2426 * layer read-to-read
2429 * Not writeable - sync by attempting a seek
2432 if (PerlSIO_fseek(stdio, (Off_t) 0, SEEK_CUR) != 0)
2440 PerlIOStdio_fill(PerlIO *f)
2443 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2446 * fflush()ing read-only streams can cause trouble on some stdio-s
2448 if ((PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) {
2449 if (PerlSIO_fflush(stdio) != 0)
2452 c = PerlSIO_fgetc(stdio);
2453 if (c == EOF || PerlSIO_ungetc(c, stdio) != c)
2459 PerlIOStdio_eof(PerlIO *f)
2462 return PerlSIO_feof(PerlIOSelf(f, PerlIOStdio)->stdio);
2466 PerlIOStdio_error(PerlIO *f)
2469 return PerlSIO_ferror(PerlIOSelf(f, PerlIOStdio)->stdio);
2473 PerlIOStdio_clearerr(PerlIO *f)
2476 PerlSIO_clearerr(PerlIOSelf(f, PerlIOStdio)->stdio);
2480 PerlIOStdio_setlinebuf(PerlIO *f)
2483 #ifdef HAS_SETLINEBUF
2484 PerlSIO_setlinebuf(PerlIOSelf(f, PerlIOStdio)->stdio);
2486 PerlSIO_setvbuf(PerlIOSelf(f, PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
2492 PerlIOStdio_get_base(PerlIO *f)
2495 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2496 return PerlSIO_get_base(stdio);
2500 PerlIOStdio_get_bufsiz(PerlIO *f)
2503 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2504 return PerlSIO_get_bufsiz(stdio);
2508 #ifdef USE_STDIO_PTR
2510 PerlIOStdio_get_ptr(PerlIO *f)
2513 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2514 return PerlSIO_get_ptr(stdio);
2518 PerlIOStdio_get_cnt(PerlIO *f)
2521 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2522 return PerlSIO_get_cnt(stdio);
2526 PerlIOStdio_set_ptrcnt(PerlIO *f, STDCHAR * ptr, SSize_t cnt)
2528 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
2531 #ifdef STDIO_PTR_LVALUE
2532 PerlSIO_set_ptr(stdio, ptr);
2533 #ifdef STDIO_PTR_LVAL_SETS_CNT
2534 if (PerlSIO_get_cnt(stdio) != (cnt)) {
2536 assert(PerlSIO_get_cnt(stdio) == (cnt));
2539 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
2541 * Setting ptr _does_ change cnt - we are done
2545 #else /* STDIO_PTR_LVALUE */
2547 #endif /* STDIO_PTR_LVALUE */
2550 * Now (or only) set cnt
2552 #ifdef STDIO_CNT_LVALUE
2553 PerlSIO_set_cnt(stdio, cnt);
2554 #else /* STDIO_CNT_LVALUE */
2555 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
2556 PerlSIO_set_ptr(stdio,
2557 PerlSIO_get_ptr(stdio) + (PerlSIO_get_cnt(stdio) -
2559 #else /* STDIO_PTR_LVAL_SETS_CNT */
2561 #endif /* STDIO_PTR_LVAL_SETS_CNT */
2562 #endif /* STDIO_CNT_LVALUE */
2568 PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param)
2570 /* This assumes no layers underneath - which is what
2571 happens, but is not how I remember it. NI-S 2001/10/16
2573 int fd = PerlLIO_dup(PerlIO_fileno(o));
2576 FILE *stdio = PerlSIO_fdopen(fd, PerlIO_modestr(o, buf));
2578 if ((f = PerlIOBase_dup(aTHX_ f, o, param))) {
2579 PerlIOSelf(f, PerlIOStdio)->stdio = stdio;
2582 PerlSIO_fclose(stdio);
2593 PerlIO_funcs PerlIO_stdio = {
2595 sizeof(PerlIOStdio),
2613 PerlIOStdio_clearerr,
2614 PerlIOStdio_setlinebuf,
2616 PerlIOStdio_get_base,
2617 PerlIOStdio_get_bufsiz,
2622 #ifdef USE_STDIO_PTR
2623 PerlIOStdio_get_ptr,
2624 PerlIOStdio_get_cnt,
2625 #if (defined(STDIO_PTR_LVALUE) && (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
2626 PerlIOStdio_set_ptrcnt
2627 #else /* STDIO_PTR_LVALUE */
2629 #endif /* STDIO_PTR_LVALUE */
2630 #else /* USE_STDIO_PTR */
2634 #endif /* USE_STDIO_PTR */
2637 #undef PerlIO_exportFILE
2639 PerlIO_exportFILE(PerlIO *f, int fl)
2643 stdio = fdopen(PerlIO_fileno(f), "r+");
2647 PerlIOSelf(PerlIO_push(aTHX_ f, &PerlIO_stdio, "r+", Nullsv),
2654 #undef PerlIO_findFILE
2656 PerlIO_findFILE(PerlIO *f)
2660 if (l->tab == &PerlIO_stdio) {
2661 PerlIOStdio *s = PerlIOSelf(&l, PerlIOStdio);
2664 l = *PerlIONext(&l);
2666 return PerlIO_exportFILE(f, 0);
2669 #undef PerlIO_releaseFILE
2671 PerlIO_releaseFILE(PerlIO *p, FILE *f)
2675 /*--------------------------------------------------------------------------------------*/
2677 * perlio buffer layer
2681 PerlIOBuf_pushed(PerlIO *f, const char *mode, SV *arg)
2684 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2685 int fd = PerlIO_fileno(f);
2687 if (fd >= 0 && PerlLIO_isatty(fd)) {
2688 PerlIOBase(f)->flags |= PERLIO_F_LINEBUF | PERLIO_F_TTY;
2690 posn = PerlIO_tell(PerlIONext(f));
2691 if (posn != (Off_t) - 1) {
2694 return PerlIOBase_pushed(f, mode, arg);
2698 PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
2699 IV n, const char *mode, int fd, int imode, int perm,
2700 PerlIO *f, int narg, SV **args)
2703 PerlIO *next = PerlIONext(f);
2705 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
2707 (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
2710 || (*PerlIOBase(f)->tab->Pushed) (f, mode, PerlIOArg) != 0) {
2716 PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIO_default_btm());
2724 f = (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
2727 PerlIO_push(aTHX_ f, self, mode, PerlIOArg);
2728 fd = PerlIO_fileno(f);
2729 #if O_BINARY != O_TEXT
2731 * do something about failing setmode()? --jhi
2733 PerlLIO_setmode(fd, O_BINARY);
2735 if (init && fd == 2) {
2737 * Initial stderr is unbuffered
2739 PerlIOBase(f)->flags |= PERLIO_F_UNBUF;
2747 * This "flush" is akin to sfio's sync in that it handles files in either
2748 * read or write state
2751 PerlIOBuf_flush(PerlIO *f)
2753 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2755 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF) {
2757 * write() the buffer
2759 STDCHAR *buf = b->buf;
2761 PerlIO *n = PerlIONext(f);
2762 while (p < b->ptr) {
2763 SSize_t count = PerlIO_write(n, p, b->ptr - p);
2767 else if (count < 0 || PerlIO_error(n)) {
2768 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2773 b->posn += (p - buf);
2775 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
2776 STDCHAR *buf = PerlIO_get_base(f);
2778 * Note position change
2780 b->posn += (b->ptr - buf);
2781 if (b->ptr < b->end) {
2783 * We did not consume all of it
2785 if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) == 0) {
2786 b->posn = PerlIO_tell(PerlIONext(f));
2790 b->ptr = b->end = b->buf;
2791 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
2793 * FIXME: Is this right for read case ?
2795 if (PerlIO_flush(PerlIONext(f)) != 0)
2801 PerlIOBuf_fill(PerlIO *f)
2803 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2804 PerlIO *n = PerlIONext(f);
2807 * FIXME: doing the down-stream flush is a bad idea if it causes
2808 * pre-read data in stdio buffer to be discarded but this is too
2809 * simplistic - as it skips _our_ hosekeeping and breaks tell tests.
2810 * if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) { }
2812 if (PerlIO_flush(f) != 0)
2814 if (PerlIOBase(f)->flags & PERLIO_F_TTY)
2815 PerlIOBase_flush_linebuf();
2818 PerlIO_get_base(f); /* allocate via vtable */
2820 b->ptr = b->end = b->buf;
2821 if (PerlIO_fast_gets(n)) {
2823 * Layer below is also buffered We do _NOT_ want to call its
2824 * ->Read() because that will loop till it gets what we asked for
2825 * which may hang on a pipe etc. Instead take anything it has to
2826 * hand, or ask it to fill _once_.
2828 avail = PerlIO_get_cnt(n);
2830 avail = PerlIO_fill(n);
2832 avail = PerlIO_get_cnt(n);
2834 if (!PerlIO_error(n) && PerlIO_eof(n))
2839 STDCHAR *ptr = PerlIO_get_ptr(n);
2840 SSize_t cnt = avail;
2841 if (avail > b->bufsiz)
2843 Copy(ptr, b->buf, avail, STDCHAR);
2844 PerlIO_set_ptrcnt(n, ptr + avail, cnt - avail);
2848 avail = PerlIO_read(n, b->ptr, b->bufsiz);
2852 PerlIOBase(f)->flags |= PERLIO_F_EOF;
2854 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
2857 b->end = b->buf + avail;
2858 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2863 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
2865 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2869 return PerlIOBase_read(f, vbuf, count);
2875 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
2877 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
2878 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2881 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
2886 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
2888 * Buffer is already a read buffer, we can overwrite any chars
2889 * which have been read back to buffer start
2891 avail = (b->ptr - b->buf);
2895 * Buffer is idle, set it up so whole buffer is available for
2899 b->end = b->buf + avail;
2901 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
2903 * Buffer extends _back_ from where we are now
2905 b->posn -= b->bufsiz;
2907 if (avail > (SSize_t) count) {
2909 * If we have space for more than count, just move count
2917 * In simple stdio-like ungetc() case chars will be already
2920 if (buf != b->ptr) {
2921 Copy(buf, b->ptr, avail, STDCHAR);
2925 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2932 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
2934 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2935 const STDCHAR *buf = (const STDCHAR *) vbuf;
2939 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
2942 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
2943 if ((SSize_t) count < avail)
2945 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
2946 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
2961 Copy(buf, b->ptr, avail, STDCHAR);
2968 if (b->ptr >= (b->buf + b->bufsiz))
2971 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
2977 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
2980 if ((code = PerlIO_flush(f)) == 0) {
2981 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2982 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
2983 code = PerlIO_seek(PerlIONext(f), offset, whence);
2985 b->posn = PerlIO_tell(PerlIONext(f));
2992 PerlIOBuf_tell(PerlIO *f)
2994 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
2996 * b->posn is file position where b->buf was read, or will be written
2998 Off_t posn = b->posn;
3001 * If buffer is valid adjust position by amount in buffer
3003 posn += (b->ptr - b->buf);
3009 PerlIOBuf_close(PerlIO *f)
3011 IV code = PerlIOBase_close(f);
3012 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3013 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
3014 PerlMemShared_free(b->buf);
3017 b->ptr = b->end = b->buf;
3018 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3023 PerlIOBuf_get_ptr(PerlIO *f)
3025 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3032 PerlIOBuf_get_cnt(PerlIO *f)
3034 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3037 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
3038 return (b->end - b->ptr);
3043 PerlIOBuf_get_base(PerlIO *f)
3045 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3049 b->buf = PerlMemShared_calloc(b->bufsiz, sizeof(STDCHAR));
3051 b->buf = (STDCHAR *) & b->oneword;
3052 b->bufsiz = sizeof(b->oneword);
3061 PerlIOBuf_bufsiz(PerlIO *f)
3063 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3066 return (b->end - b->buf);
3070 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3072 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3076 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf) {
3078 assert(PerlIO_get_cnt(f) == cnt);
3079 assert(b->ptr >= b->buf);
3081 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3085 PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param)
3087 return PerlIOBase_dup(aTHX_ f, o, param);
3092 PerlIO_funcs PerlIO_perlio = {
3112 PerlIOBase_clearerr,
3113 PerlIOBase_setlinebuf,
3118 PerlIOBuf_set_ptrcnt,
3121 /*--------------------------------------------------------------------------------------*/
3123 * Temp layer to hold unread chars when cannot do it any other way
3127 PerlIOPending_fill(PerlIO *f)
3130 * Should never happen
3137 PerlIOPending_close(PerlIO *f)
3140 * A tad tricky - flush pops us, then we close new top
3143 return PerlIO_close(f);
3147 PerlIOPending_seek(PerlIO *f, Off_t offset, int whence)
3150 * A tad tricky - flush pops us, then we seek new top
3153 return PerlIO_seek(f, offset, whence);
3158 PerlIOPending_flush(PerlIO *f)
3161 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3162 if (b->buf && b->buf != (STDCHAR *) & b->oneword) {
3163 PerlMemShared_free(b->buf);
3166 PerlIO_pop(aTHX_ f);
3171 PerlIOPending_set_ptrcnt(PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3177 PerlIOBuf_set_ptrcnt(f, ptr, cnt);
3182 PerlIOPending_pushed(PerlIO *f, const char *mode, SV *arg)
3184 IV code = PerlIOBase_pushed(f, mode, arg);
3185 PerlIOl *l = PerlIOBase(f);
3187 * Our PerlIO_fast_gets must match what we are pushed on, or sv_gets()
3188 * etc. get muddled when it changes mid-string when we auto-pop.
3190 l->flags = (l->flags & ~(PERLIO_F_FASTGETS | PERLIO_F_UTF8)) |
3191 (PerlIOBase(PerlIONext(f))->
3192 flags & (PERLIO_F_FASTGETS | PERLIO_F_UTF8));
3197 PerlIOPending_read(PerlIO *f, void *vbuf, Size_t count)
3199 SSize_t avail = PerlIO_get_cnt(f);
3204 got = PerlIOBuf_read(f, vbuf, avail);
3205 if (got >= 0 && got < count) {
3207 PerlIO_read(f, ((STDCHAR *) vbuf) + got, count - got);
3208 if (more >= 0 || got == 0)
3214 PerlIO_funcs PerlIO_pending = {
3218 PerlIOPending_pushed,
3229 PerlIOPending_close,
3230 PerlIOPending_flush,
3234 PerlIOBase_clearerr,
3235 PerlIOBase_setlinebuf,
3240 PerlIOPending_set_ptrcnt,
3245 /*--------------------------------------------------------------------------------------*/
3247 * crlf - translation On read translate CR,LF to "\n" we do this by
3248 * overriding ptr/cnt entries to hand back a line at a time and keeping a
3249 * record of which nl we "lied" about. On write translate "\n" to CR,LF
3253 PerlIOBuf base; /* PerlIOBuf stuff */
3254 STDCHAR *nl; /* Position of crlf we "lied" about in the
3259 PerlIOCrlf_pushed(PerlIO *f, const char *mode, SV *arg)
3262 PerlIOBase(f)->flags |= PERLIO_F_CRLF;
3263 code = PerlIOBuf_pushed(f, mode, arg);
3265 PerlIO_debug("PerlIOCrlf_pushed f=%p %s %s fl=%08" UVxf "\n",
3266 f, PerlIOBase(f)->tab->name, (mode) ? mode : "(Null)",
3267 PerlIOBase(f)->flags);
3274 PerlIOCrlf_unread(PerlIO *f, const void *vbuf, Size_t count)
3276 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3281 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3282 return PerlIOBuf_unread(f, vbuf, count);
3284 const STDCHAR *buf = (const STDCHAR *) vbuf + count;
3285 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3287 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3292 if (!(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
3293 b->end = b->ptr = b->buf + b->bufsiz;
3294 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3295 b->posn -= b->bufsiz;
3297 while (count > 0 && b->ptr > b->buf) {
3300 if (b->ptr - 2 >= b->buf) {
3323 PerlIOCrlf_get_cnt(PerlIO *f)
3325 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3328 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF) {
3329 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3330 if ((PerlIOBase(f)->flags & PERLIO_F_CRLF) && !c->nl) {
3331 STDCHAR *nl = b->ptr;
3333 while (nl < b->end && *nl != 0xd)
3335 if (nl < b->end && *nl == 0xd) {
3337 if (nl + 1 < b->end) {
3344 * Not CR,LF but just CR
3352 * Blast - found CR as last char in buffer
3356 * They may not care, defer work as long as
3359 return (nl - b->ptr);
3363 b->ptr++; /* say we have read it as far as
3364 * flush() is concerned */
3365 b->buf++; /* Leave space an front of buffer */
3366 b->bufsiz--; /* Buffer is thus smaller */
3367 code = PerlIO_fill(f); /* Fetch some more */
3368 b->bufsiz++; /* Restore size for next time */
3369 b->buf--; /* Point at space */
3370 b->ptr = nl = b->buf; /* Which is what we hand
3372 b->posn--; /* Buffer starts here */
3373 *nl = 0xd; /* Fill in the CR */
3375 goto test; /* fill() call worked */
3377 * CR at EOF - just fall through
3383 return (((c->nl) ? (c->nl + 1) : b->end) - b->ptr);
3389 PerlIOCrlf_set_ptrcnt(PerlIO *f, STDCHAR * ptr, SSize_t cnt)
3391 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3392 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3393 IV flags = PerlIOBase(f)->flags;
3401 if ((flags & PERLIO_F_CRLF) && ptr > b->buf && ptr[-1] == 0xd)
3408 * Test code - delete when it works ...
3415 if ((flags & PERLIO_F_CRLF) && chk > b->buf && chk[-1] == 0xd)
3422 Perl_croak(aTHX_ "ptr wrong %p != %p fl=%08" UVxf
3423 " nl=%p e=%p for %d", ptr, chk, flags, c->nl,
3430 * They have taken what we lied about
3438 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
3442 PerlIOCrlf_write(PerlIO *f, const void *vbuf, Size_t count)
3444 if (!(PerlIOBase(f)->flags & PERLIO_F_CRLF))
3445 return PerlIOBuf_write(f, vbuf, count);
3447 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3448 const STDCHAR *buf = (const STDCHAR *) vbuf;
3449 const STDCHAR *ebuf = buf + count;
3452 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
3454 while (buf < ebuf) {
3455 STDCHAR *eptr = b->buf + b->bufsiz;
3456 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
3457 while (buf < ebuf && b->ptr < eptr) {
3459 if ((b->ptr + 2) > eptr) {
3467 *(b->ptr)++ = 0xd; /* CR */
3468 *(b->ptr)++ = 0xa; /* LF */
3470 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF) {
3480 if (b->ptr >= eptr) {
3486 if (PerlIOBase(f)->flags & PERLIO_F_UNBUF)
3488 return (buf - (STDCHAR *) vbuf);
3493 PerlIOCrlf_flush(PerlIO *f)
3495 PerlIOCrlf *c = PerlIOSelf(f, PerlIOCrlf);
3500 return PerlIOBuf_flush(f);
3503 PerlIO_funcs PerlIO_crlf = {
3506 PERLIO_K_BUFFERED | PERLIO_K_CANCRLF,
3508 PerlIOBase_noop_ok, /* popped */
3513 PerlIOBuf_read, /* generic read works with ptr/cnt lies
3515 PerlIOCrlf_unread, /* Put CR,LF in buffer for each '\n' */
3516 PerlIOCrlf_write, /* Put CR,LF in buffer for each '\n' */
3524 PerlIOBase_clearerr,
3525 PerlIOBase_setlinebuf,
3530 PerlIOCrlf_set_ptrcnt,
3534 /*--------------------------------------------------------------------------------------*/
3536 * mmap as "buffer" layer
3540 PerlIOBuf base; /* PerlIOBuf stuff */
3541 Mmap_t mptr; /* Mapped address */
3542 Size_t len; /* mapped length */
3543 STDCHAR *bbuf; /* malloced buffer if map fails */
3546 static size_t page_size = 0;
3549 PerlIOMmap_map(PerlIO *f)
3552 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3553 IV flags = PerlIOBase(f)->flags;
3557 if (flags & PERLIO_F_CANREAD) {
3558 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3559 int fd = PerlIO_fileno(f);
3561 code = fstat(fd, &st);
3562 if (code == 0 && S_ISREG(st.st_mode)) {
3563 SSize_t len = st.st_size - b->posn;
3567 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE))
3569 SETERRNO(0, SS$_NORMAL);
3570 # ifdef _SC_PAGESIZE
3571 page_size = sysconf(_SC_PAGESIZE);
3573 page_size = sysconf(_SC_PAGE_SIZE);
3575 if ((long) page_size < 0) {
3580 (void) SvUPGRADE(error, SVt_PV);
3581 msg = SvPVx(error, n_a);
3582 Perl_croak(aTHX_ "panic: sysconf: %s",
3587 "panic: sysconf: pagesize unknown");
3591 # ifdef HAS_GETPAGESIZE
3592 page_size = getpagesize();
3594 # if defined(I_SYS_PARAM) && defined(PAGESIZE)
3595 page_size = PAGESIZE; /* compiletime, bad */
3599 if ((IV) page_size <= 0)
3600 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
3605 * This is a hack - should never happen - open should
3608 b->posn = PerlIO_tell(PerlIONext(f));
3610 posn = (b->posn / page_size) * page_size;
3611 len = st.st_size - posn;
3612 m->mptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, posn);
3613 if (m->mptr && m->mptr != (Mmap_t) - 1) {
3614 #if 0 && defined(HAS_MADVISE) && defined(MADV_SEQUENTIAL)
3615 madvise(m->mptr, len, MADV_SEQUENTIAL);
3617 #if 0 && defined(HAS_MADVISE) && defined(MADV_WILLNEED)
3618 madvise(m->mptr, len, MADV_WILLNEED);
3620 PerlIOBase(f)->flags =
3621 (flags & ~PERLIO_F_EOF) | PERLIO_F_RDBUF;
3622 b->end = ((STDCHAR *) m->mptr) + len;
3623 b->buf = ((STDCHAR *) m->mptr) + (b->posn - posn);
3632 PerlIOBase(f)->flags =
3633 flags | PERLIO_F_EOF | PERLIO_F_RDBUF;
3635 b->ptr = b->end = b->ptr;
3644 PerlIOMmap_unmap(PerlIO *f)
3646 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3647 PerlIOBuf *b = &m->base;
3651 code = munmap(m->mptr, m->len);
3655 if (PerlIO_seek(PerlIONext(f), b->posn, SEEK_SET) != 0)
3658 b->ptr = b->end = b->buf;
3659 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
3665 PerlIOMmap_get_base(PerlIO *f)
3667 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3668 PerlIOBuf *b = &m->base;
3669 if (b->buf && (PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
3671 * Already have a readbuffer in progress
3677 * We have a write buffer or flushed PerlIOBuf read buffer
3679 m->bbuf = b->buf; /* save it in case we need it again */
3680 b->buf = NULL; /* Clear to trigger below */
3683 PerlIOMmap_map(f); /* Try and map it */
3686 * Map did not work - recover PerlIOBuf buffer if we have one
3691 b->ptr = b->end = b->buf;
3694 return PerlIOBuf_get_base(f);
3698 PerlIOMmap_unread(PerlIO *f, const void *vbuf, Size_t count)
3700 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3701 PerlIOBuf *b = &m->base;
3702 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
3704 if (b->ptr && (b->ptr - count) >= b->buf
3705 && memEQ(b->ptr - count, vbuf, count)) {
3707 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
3712 * Loose the unwritable mapped buffer
3716 * If flush took the "buffer" see if we have one from before
3718 if (!b->buf && m->bbuf)
3721 PerlIOBuf_get_base(f);
3725 return PerlIOBuf_unread(f, vbuf, count);
3729 PerlIOMmap_write(PerlIO *f, const void *vbuf, Size_t count)
3731 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3732 PerlIOBuf *b = &m->base;
3733 if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) {
3735 * No, or wrong sort of, buffer
3738 if (PerlIOMmap_unmap(f) != 0)
3742 * If unmap took the "buffer" see if we have one from before
3744 if (!b->buf && m->bbuf)
3747 PerlIOBuf_get_base(f);
3751 return PerlIOBuf_write(f, vbuf, count);
3755 PerlIOMmap_flush(PerlIO *f)
3757 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3758 PerlIOBuf *b = &m->base;
3759 IV code = PerlIOBuf_flush(f);
3761 * Now we are "synced" at PerlIOBuf level
3768 if (PerlIOMmap_unmap(f) != 0)
3773 * We seem to have a PerlIOBuf buffer which was not mapped
3774 * remember it in case we need one later
3783 PerlIOMmap_fill(PerlIO *f)
3785 PerlIOBuf *b = PerlIOSelf(f, PerlIOBuf);
3786 IV code = PerlIO_flush(f);
3787 if (code == 0 && !b->buf) {
3788 code = PerlIOMmap_map(f);
3790 if (code == 0 && !(PerlIOBase(f)->flags & PERLIO_F_RDBUF)) {
3791 code = PerlIOBuf_fill(f);
3797 PerlIOMmap_close(PerlIO *f)
3799 PerlIOMmap *m = PerlIOSelf(f, PerlIOMmap);
3800 PerlIOBuf *b = &m->base;
3801 IV code = PerlIO_flush(f);
3805 b->ptr = b->end = b->buf;
3807 if (PerlIOBuf_close(f) != 0)
3813 PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param)
3815 return PerlIOBase_dup(aTHX_ f, o, param);
3819 PerlIO_funcs PerlIO_mmap = {
3839 PerlIOBase_clearerr,
3840 PerlIOBase_setlinebuf,
3841 PerlIOMmap_get_base,
3845 PerlIOBuf_set_ptrcnt,
3848 #endif /* HAS_MMAP */
3855 call_atexit(PerlIO_cleanup_layers, NULL);
3859 atexit(&PerlIO_cleanup);
3870 PerlIO_stdstreams(aTHX);
3875 #undef PerlIO_stdout
3881 PerlIO_stdstreams(aTHX);
3886 #undef PerlIO_stderr
3892 PerlIO_stdstreams(aTHX);
3897 /*--------------------------------------------------------------------------------------*/
3899 #undef PerlIO_getname
3901 PerlIO_getname(PerlIO *f, char *buf)
3906 FILE *stdio = PerlIOSelf(f, PerlIOStdio)->stdio;
3908 name = fgetname(stdio, buf);
3910 Perl_croak(aTHX_ "Don't know how to get file name");
3916 /*--------------------------------------------------------------------------------------*/
3918 * Functions which can be called on any kind of PerlIO implemented in
3924 PerlIO_getc(PerlIO *f)
3927 SSize_t count = PerlIO_read(f, buf, 1);
3929 return (unsigned char) buf[0];
3934 #undef PerlIO_ungetc
3936 PerlIO_ungetc(PerlIO *f, int ch)
3940 if (PerlIO_unread(f, &buf, 1) == 1)
3948 PerlIO_putc(PerlIO *f, int ch)
3951 return PerlIO_write(f, &buf, 1);
3956 PerlIO_puts(PerlIO *f, const char *s)
3958 STRLEN len = strlen(s);
3959 return PerlIO_write(f, s, len);
3962 #undef PerlIO_rewind
3964 PerlIO_rewind(PerlIO *f)
3966 PerlIO_seek(f, (Off_t) 0, SEEK_SET);
3970 #undef PerlIO_vprintf
3972 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
3975 SV *sv = newSVpvn("", 0);
3981 Perl_va_copy(ap, apc);
3982 sv_vcatpvf(sv, fmt, &apc);
3984 sv_vcatpvf(sv, fmt, &ap);
3987 wrote = PerlIO_write(f, s, len);
3992 #undef PerlIO_printf
3994 PerlIO_printf(PerlIO *f, const char *fmt, ...)
3999 result = PerlIO_vprintf(f, fmt, ap);
4004 #undef PerlIO_stdoutf
4006 PerlIO_stdoutf(const char *fmt, ...)
4011 result = PerlIO_vprintf(PerlIO_stdout(), fmt, ap);
4016 #undef PerlIO_tmpfile
4018 PerlIO_tmpfile(void)
4021 * I have no idea how portable mkstemp() is ...
4023 #if defined(WIN32) || !defined(HAVE_MKSTEMP)
4026 FILE *stdio = PerlSIO_tmpfile();
4029 PerlIOSelf(PerlIO_push
4030 (aTHX_(f = PerlIO_allocate(aTHX)), &PerlIO_stdio,
4031 "w+", Nullsv), PerlIOStdio);
4037 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX", 0);
4038 int fd = mkstemp(SvPVX(sv));
4041 f = PerlIO_fdopen(fd, "w+");
4043 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
4045 PerlLIO_unlink(SvPVX(sv));
4055 #endif /* USE_SFIO */
4056 #endif /* PERLIO_IS_STDIO */
4058 /*======================================================================================*/
4060 * Now some functions in terms of above which may be needed even if we are
4061 * not in true PerlIO mode
4065 #undef PerlIO_setpos
4067 PerlIO_setpos(PerlIO *f, SV *pos)
4072 Off_t *posn = (Off_t *) SvPV(pos, len);
4073 if (f && len == sizeof(Off_t))
4074 return PerlIO_seek(f, *posn, SEEK_SET);
4076 SETERRNO(EINVAL, SS$_IVCHAN);
4080 #undef PerlIO_setpos
4082 PerlIO_setpos(PerlIO *f, SV *pos)
4087 Fpos_t *fpos = (Fpos_t *) SvPV(pos, len);
4088 if (f && len == sizeof(Fpos_t)) {
4089 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
4090 return fsetpos64(f, fpos);
4092 return fsetpos(f, fpos);
4096 SETERRNO(EINVAL, SS$_IVCHAN);
4102 #undef PerlIO_getpos
4104 PerlIO_getpos(PerlIO *f, SV *pos)
4107 Off_t posn = PerlIO_tell(f);
4108 sv_setpvn(pos, (char *) &posn, sizeof(posn));
4109 return (posn == (Off_t) - 1) ? -1 : 0;
4112 #undef PerlIO_getpos
4114 PerlIO_getpos(PerlIO *f, SV *pos)
4119 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
4120 code = fgetpos64(f, &fpos);
4122 code = fgetpos(f, &fpos);
4124 sv_setpvn(pos, (char *) &fpos, sizeof(fpos));
4129 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
4132 vprintf(char *pat, char *args)
4134 _doprnt(pat, args, stdout);
4135 return 0; /* wrong, but perl doesn't use the return
4140 vfprintf(FILE *fd, char *pat, char *args)
4142 _doprnt(pat, args, fd);
4143 return 0; /* wrong, but perl doesn't use the return
4149 #ifndef PerlIO_vsprintf
4151 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
4153 int val = vsprintf(s, fmt, ap);
4155 if (strlen(s) >= (STRLEN) n) {
4157 (void) PerlIO_puts(Perl_error_log,
4158 "panic: sprintf overflow - memory corrupted!\n");
4166 #ifndef PerlIO_sprintf
4168 PerlIO_sprintf(char *s, int n, const char *fmt, ...)
4173 result = PerlIO_vsprintf(s, n, fmt, ap);