3 * Copyright (c) 1996-2000, Nick Ing-Simmons
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
17 #define PERLIO_NOT_STDIO 0
18 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
19 /* #define PerlIO FILE */
22 * This file provides those parts of PerlIO abstraction
23 * which are not #defined in iperlsys.h.
24 * Which these are depends on various Configure #ifdef's
28 #define PERL_IN_PERLIO_C
31 #if !defined(PERL_IMPLICIT_SYS)
33 #ifdef PERLIO_IS_STDIO
38 /* Does nothing (yet) except force this file to be included
39 in perl binary. That allows this file to force inclusion
40 of other functions that may be required by loadable
41 extensions e.g. for FileHandle::tmpfile
52 #else /* PERLIO_IS_STDIO */
59 /* This section is just to make sure these functions
60 get pulled in from libsfio.a
73 /* Force this file to be included in perl binary. Which allows
74 * this file to force inclusion of other functions that may be
75 * required by loadable extensions e.g. for FileHandle::tmpfile
79 * sfio does its own 'autoflush' on stdout in common cases.
80 * Flush results in a lot of lseek()s to regular files and
81 * lot of small writes to pipes.
83 sfset(sfstdout,SF_SHARE,0);
87 /*======================================================================================*/
88 /* Implement all the PerlIO interface ourselves.
91 /* We _MUST_ have <unistd.h> if we are using lseek() and may have large files */
97 void PerlIO_debug(char *fmt,...) __attribute__((format(printf,1,2)));
100 PerlIO_debug(char *fmt,...)
105 char *s = getenv("PERLIO_DEBUG");
107 dbg = open(s,O_WRONLY|O_CREAT|O_APPEND,0666);
115 SV *sv = newSVpvn("",0);
119 Perl_sv_catpvf(aTHX_ sv, "%s:%"IVdf" ",
120 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
121 Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap);
130 /*--------------------------------------------------------------------------------------*/
137 IV (*Fileno)(PerlIO *f);
138 PerlIO * (*Fdopen)(int fd, const char *mode);
139 PerlIO * (*Open)(const char *path, const char *mode);
140 int (*Reopen)(const char *path, const char *mode, PerlIO *f);
141 /* Unix-like functions - cf sfio line disciplines */
142 SSize_t (*Read)(PerlIO *f, void *vbuf, Size_t count);
143 SSize_t (*Unread)(PerlIO *f, const void *vbuf, Size_t count);
144 SSize_t (*Write)(PerlIO *f, const void *vbuf, Size_t count);
145 IV (*Seek)(PerlIO *f, Off_t offset, int whence);
146 Off_t (*Tell)(PerlIO *f);
147 IV (*Close)(PerlIO *f);
148 /* Stdio-like buffered IO functions */
149 IV (*Flush)(PerlIO *f);
150 IV (*Eof)(PerlIO *f);
151 IV (*Error)(PerlIO *f);
152 void (*Clearerr)(PerlIO *f);
153 void (*Setlinebuf)(PerlIO *f);
154 /* Perl's snooping functions */
155 STDCHAR * (*Get_base)(PerlIO *f);
156 Size_t (*Get_bufsiz)(PerlIO *f);
157 STDCHAR * (*Get_ptr)(PerlIO *f);
158 SSize_t (*Get_cnt)(PerlIO *f);
159 void (*Set_ptrcnt)(PerlIO *f,STDCHAR *ptr,SSize_t cnt);
165 PerlIOl * next; /* Lower layer */
166 PerlIO_funcs * tab; /* Functions for this layer */
167 IV flags; /* Various flags for state */
170 /*--------------------------------------------------------------------------------------*/
173 #define PERLIO_F_EOF 0x0010000
174 #define PERLIO_F_CANWRITE 0x0020000
175 #define PERLIO_F_CANREAD 0x0040000
176 #define PERLIO_F_ERROR 0x0080000
177 #define PERLIO_F_TRUNCATE 0x0100000
178 #define PERLIO_F_APPEND 0x0200000
179 #define PERLIO_F_BINARY 0x0400000
180 #define PERLIO_F_TEMP 0x0800000
181 #define PERLIO_F_LINEBUF 0x0100000
182 #define PERLIO_F_WRBUF 0x2000000
183 #define PERLIO_F_RDBUF 0x4000000
184 #define PERLIO_F_OPEN 0x8000000
186 #define PerlIOBase(f) (*(f))
187 #define PerlIOSelf(f,type) ((type *)PerlIOBase(f))
188 #define PerlIONext(f) (&(PerlIOBase(f)->next))
190 /*--------------------------------------------------------------------------------------*/
191 /* Inner level routines */
193 /* Table of pointers to the PerlIO structs (malloc'ed) */
194 PerlIO **_perlio = NULL;
195 int _perlio_size = 0;
198 PerlIO_allocate(void)
200 /* Find a free slot in the table, growing table as necessary */
205 PerlIO **table = _perlio;
206 while (i < _perlio_size)
211 Newz('F',f,1,PerlIO);
218 PerlIO_debug(__FUNCTION__ " f=%p\n",f);
223 Newz('I',table,_perlio_size+16,PerlIO *);
226 Copy(_perlio,table,_perlio_size,PerlIO *);
235 PerlIO_pop(PerlIO *f)
247 PerlIO_close(PerlIO *f)
249 int code = (*PerlIOBase(f)->tab->Close)(f);
260 /* Close all the files */
262 for (i=_perlio_size-1; i >= 0; i--)
264 PerlIO *f = _perlio[i];
280 /*--------------------------------------------------------------------------------------*/
281 /* Given the abstraction above the public API functions */
285 PerlIO_fileno(PerlIO *f)
287 return (*PerlIOBase(f)->tab->Fileno)(f);
290 extern PerlIO_funcs PerlIO_unix;
291 extern PerlIO_funcs PerlIO_stdio;
292 extern PerlIO_funcs PerlIO_perlio;
294 #define PerlIO_default_top() &PerlIO_stdio
295 #define PerlIO_default_btm() &PerlIO_unix
299 PerlIO_fdopen(int fd, const char *mode)
301 PerlIO_funcs *tab = PerlIO_default_top();
302 return (*tab->Fdopen)(fd,mode);
307 PerlIO_open(const char *path, const char *mode)
309 PerlIO_funcs *tab = PerlIO_default_top();
310 return (*tab->Open)(path,mode);
314 PerlIOBase_init(PerlIO *f, const char *mode)
316 PerlIOl *l = PerlIOBase(f);
317 l->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
318 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
324 l->flags = PERLIO_F_CANREAD;
327 l->flags = PERLIO_F_APPEND|PERLIO_F_CANWRITE;
330 l->flags = PERLIO_F_TRUNCATE|PERLIO_F_CANWRITE;
341 l->flags |= PERLIO_F_CANREAD|PERLIO_F_CANWRITE;
344 l->flags |= PERLIO_F_BINARY;
356 l->flags |= l->next->flags &
357 (PERLIO_F_CANREAD|PERLIO_F_CANWRITE|
358 PERLIO_F_TRUNCATE|PERLIO_F_APPEND|PERLIO_F_BINARY);
366 PerlIO_reopen(const char *path, const char *mode, PerlIO *f)
371 if ((*PerlIOBase(f)->tab->Reopen)(path,mode,f) == 0)
373 PerlIOBase_init(f,mode);
379 return PerlIO_open(path,mode);
384 PerlIO_read(PerlIO *f, void *vbuf, Size_t count)
386 return (*PerlIOBase(f)->tab->Read)(f,vbuf,count);
391 PerlIO_ungetc(PerlIO *f, int ch)
394 if ((*PerlIOBase(f)->tab->Unread)(f,&buf,1) == 1)
401 PerlIO_write(PerlIO *f, const void *vbuf, Size_t count)
403 return (*PerlIOBase(f)->tab->Write)(f,vbuf,count);
408 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
410 return (*PerlIOBase(f)->tab->Seek)(f,offset,whence);
415 PerlIO_tell(PerlIO *f)
417 return (*PerlIOBase(f)->tab->Tell)(f);
422 PerlIO_flush(PerlIO *f)
426 return (*PerlIOBase(f)->tab->Flush)(f);
432 for (i=_perlio_size-1; i >= 0; i--)
434 if ((f = _perlio[i]))
436 if (*f && PerlIO_flush(f) != 0)
446 PerlIO_eof(PerlIO *f)
448 return (*PerlIOBase(f)->tab->Eof)(f);
453 PerlIO_error(PerlIO *f)
455 return (*PerlIOBase(f)->tab->Error)(f);
458 #undef PerlIO_clearerr
460 PerlIO_clearerr(PerlIO *f)
462 (*PerlIOBase(f)->tab->Clearerr)(f);
465 #undef PerlIO_setlinebuf
467 PerlIO_setlinebuf(PerlIO *f)
469 (*PerlIOBase(f)->tab->Setlinebuf)(f);
472 #undef PerlIO_has_base
474 PerlIO_has_base(PerlIO *f)
478 return (PerlIOBase(f)->tab->Get_base != NULL);
483 #undef PerlIO_fast_gets
485 PerlIO_fast_gets(PerlIO *f)
489 PerlIOl *l = PerlIOBase(f);
490 return (l->tab->Set_ptrcnt != NULL);
495 #undef PerlIO_has_cntptr
497 PerlIO_has_cntptr(PerlIO *f)
501 PerlIO_funcs *tab = PerlIOBase(f)->tab;
502 return (tab->Get_ptr != NULL && tab->Get_cnt != NULL);
507 #undef PerlIO_canset_cnt
509 PerlIO_canset_cnt(PerlIO *f)
513 PerlIOl *l = PerlIOBase(f);
514 return (l->tab->Set_ptrcnt != NULL);
519 #undef PerlIO_get_base
521 PerlIO_get_base(PerlIO *f)
523 return (*PerlIOBase(f)->tab->Get_base)(f);
526 #undef PerlIO_get_bufsiz
528 PerlIO_get_bufsiz(PerlIO *f)
530 return (*PerlIOBase(f)->tab->Get_bufsiz)(f);
533 #undef PerlIO_get_ptr
535 PerlIO_get_ptr(PerlIO *f)
537 return (*PerlIOBase(f)->tab->Get_ptr)(f);
540 #undef PerlIO_get_cnt
542 PerlIO_get_cnt(PerlIO *f)
544 return (*PerlIOBase(f)->tab->Get_cnt)(f);
547 #undef PerlIO_set_cnt
549 PerlIO_set_cnt(PerlIO *f,SSize_t cnt)
551 return (*PerlIOBase(f)->tab->Set_ptrcnt)(f,NULL,cnt);
554 #undef PerlIO_set_ptrcnt
556 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
558 return (*PerlIOBase(f)->tab->Set_ptrcnt)(f,ptr,cnt);
561 /*--------------------------------------------------------------------------------------*/
562 /* "Methods" of the "base class" */
565 PerlIOBase_fileno(PerlIO *f)
567 return PerlIO_fileno(PerlIONext(f));
571 PerlIO_push(PerlIO *f,PerlIO_funcs *tab,const char *mode)
574 Newc('L',l,tab->size,char,PerlIOl);
577 Zero(l,tab->size,char);
581 PerlIOBase_init(f,mode);
587 PerlIOBase_unread(PerlIO *f, const void *vbuf, Size_t count)
589 Off_t old = PerlIO_tell(f);
590 if (PerlIO_seek(f,-((Off_t)count),SEEK_CUR) == 0)
592 Off_t new = PerlIO_tell(f);
599 PerlIOBase_sync(PerlIO *f)
605 PerlIOBase_close(PerlIO *f)
608 if (PerlIO_flush(f) != 0)
610 if (PerlIO_close(PerlIONext(f)) != 0)
612 PerlIOBase(f)->flags &= ~(PERLIO_F_CANREAD|PERLIO_F_CANWRITE|PERLIO_F_OPEN);
617 PerlIOBase_eof(PerlIO *f)
621 return (PerlIOBase(f)->flags & PERLIO_F_EOF) != 0;
627 PerlIOBase_error(PerlIO *f)
631 return (PerlIOBase(f)->flags & PERLIO_F_ERROR) != 0;
637 PerlIOBase_clearerr(PerlIO *f)
641 PerlIOBase(f)->flags &= ~PERLIO_F_ERROR;
646 PerlIOBase_setlinebuf(PerlIO *f)
653 /*--------------------------------------------------------------------------------------*/
654 /* Bottom-most level for UNIX-like case */
658 struct _PerlIO base; /* The generic part */
659 int fd; /* UNIX like file descriptor */
660 int oflags; /* open/fcntl flags */
664 PerlIOUnix_oflags(const char *mode)
679 oflags = O_CREAT|O_TRUNC;
690 oflags = O_CREAT|O_APPEND;
700 if (*mode || oflags == -1)
709 PerlIOUnix_fileno(PerlIO *f)
711 return PerlIOSelf(f,PerlIOUnix)->fd;
715 PerlIOUnix_fdopen(int fd,const char *mode)
722 int oflags = PerlIOUnix_oflags(mode);
725 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_unix,mode),PerlIOUnix);
728 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
735 PerlIOUnix_open(const char *path,const char *mode)
738 int oflags = PerlIOUnix_oflags(mode);
741 int fd = open(path,oflags,0666);
744 PerlIOUnix *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_unix,mode),PerlIOUnix);
747 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
754 PerlIOUnix_reopen(const char *path, const char *mode, PerlIO *f)
756 PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
757 int oflags = PerlIOUnix_oflags(mode);
758 if (PerlIOBase(f)->flags & PERLIO_F_OPEN)
759 (*PerlIOBase(f)->tab->Close)(f);
762 int fd = open(path,oflags,0666);
767 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
775 PerlIOUnix_read(PerlIO *f, void *vbuf, Size_t count)
777 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
780 SSize_t len = read(fd,vbuf,count);
781 if (len >= 0 || errno != EINTR)
787 PerlIOUnix_write(PerlIO *f, const void *vbuf, Size_t count)
789 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
792 SSize_t len = write(fd,vbuf,count);
793 if (len >= 0 || errno != EINTR)
799 PerlIOUnix_seek(PerlIO *f, Off_t offset, int whence)
801 Off_t new = lseek(PerlIOSelf(f,PerlIOUnix)->fd,offset,whence);
802 return (new == (Off_t) -1) ? -1 : 0;
806 PerlIOUnix_tell(PerlIO *f)
808 return lseek(PerlIOSelf(f,PerlIOUnix)->fd,0,SEEK_CUR);
812 PerlIOUnix_close(PerlIO *f)
814 int fd = PerlIOSelf(f,PerlIOUnix)->fd;
816 while (close(fd) != 0)
826 PerlIOBase(f)->flags &= ~PERLIO_F_OPEN;
831 PerlIO_funcs PerlIO_unix = {
849 PerlIOBase_setlinebuf,
851 NULL, /* get_bufsiz */
854 NULL, /* set_ptrcnt */
857 /*--------------------------------------------------------------------------------------*/
858 /* stdio as a layer */
863 FILE * stdio; /* The stream */
867 PerlIOStdio_fileno(PerlIO *f)
869 return fileno(PerlIOSelf(f,PerlIOStdio)->stdio);
874 PerlIOStdio_fdopen(int fd,const char *mode)
902 stdio = fdopen(fd,mode);
905 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,mode),PerlIOStdio);
912 #undef PerlIO_importFILE
914 PerlIO_importFILE(FILE *stdio, int fl)
919 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,"r+"),PerlIOStdio);
926 PerlIOStdio_open(const char *path,const char *mode)
929 FILE *stdio = fopen(path,mode);
932 PerlIOStdio *s = PerlIOSelf(PerlIO_push(f = PerlIO_allocate(),&PerlIO_stdio,mode),PerlIOStdio);
939 PerlIOStdio_reopen(const char *path, const char *mode, PerlIO *f)
941 PerlIOStdio *s = PerlIOSelf(f,PerlIOStdio);
942 FILE *stdio = freopen(path,mode,s->stdio);
950 PerlIOStdio_read(PerlIO *f, void *vbuf, Size_t count)
952 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
956 STDCHAR *buf = (STDCHAR *) vbuf;
957 /* Perl is expecting PerlIO_getc() to fill the buffer
958 * Linux's stdio does not do that for fread()
968 got = fread(vbuf,1,count,s);
973 PerlIOStdio_unread(PerlIO *f, const void *vbuf, Size_t count)
975 FILE *s = PerlIOSelf(f,PerlIOStdio)->stdio;
976 STDCHAR *buf = ((STDCHAR *)vbuf)+count-1;
980 int ch = *buf-- & 0xff;
981 if (ungetc(ch,s) != ch)
990 PerlIOStdio_write(PerlIO *f, const void *vbuf, Size_t count)
992 return fwrite(vbuf,1,count,PerlIOSelf(f,PerlIOStdio)->stdio);
996 PerlIOStdio_seek(PerlIO *f, Off_t offset, int whence)
998 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
999 return fseek(stdio,offset,whence);
1003 PerlIOStdio_tell(PerlIO *f)
1005 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1006 return ftell(stdio);
1010 PerlIOStdio_close(PerlIO *f)
1012 return fclose(PerlIOSelf(f,PerlIOStdio)->stdio);
1016 PerlIOStdio_flush(PerlIO *f)
1018 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1019 return fflush(stdio);
1023 PerlIOStdio_eof(PerlIO *f)
1025 return feof(PerlIOSelf(f,PerlIOStdio)->stdio);
1029 PerlIOStdio_error(PerlIO *f)
1031 return ferror(PerlIOSelf(f,PerlIOStdio)->stdio);
1035 PerlIOStdio_clearerr(PerlIO *f)
1037 clearerr(PerlIOSelf(f,PerlIOStdio)->stdio);
1041 PerlIOStdio_setlinebuf(PerlIO *f)
1043 #ifdef HAS_SETLINEBUF
1044 setlinebuf(PerlIOSelf(f,PerlIOStdio)->stdio);
1046 setvbuf(PerlIOSelf(f,PerlIOStdio)->stdio, Nullch, _IOLBF, 0);
1052 PerlIOStdio_get_base(PerlIO *f)
1054 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1055 return FILE_base(stdio);
1059 PerlIOStdio_get_bufsiz(PerlIO *f)
1061 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1062 return FILE_bufsiz(stdio);
1066 #ifdef USE_STDIO_PTR
1068 PerlIOStdio_get_ptr(PerlIO *f)
1070 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1071 return FILE_ptr(stdio);
1075 PerlIOStdio_get_cnt(PerlIO *f)
1077 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1078 return FILE_cnt(stdio);
1082 PerlIOStdio_set_ptrcnt(PerlIO *f,STDCHAR *ptr,SSize_t cnt)
1084 FILE *stdio = PerlIOSelf(f,PerlIOStdio)->stdio;
1087 #ifdef STDIO_PTR_LVALUE
1088 FILE_ptr(stdio) = ptr;
1089 #ifdef STDIO_PTR_LVAL_SETS_CNT
1090 if (FILE_cnt(stdio) != (cnt))
1093 assert(FILE_cnt(stdio) == (cnt));
1096 #if (!defined(STDIO_PTR_LVAL_NOCHANGE_CNT))
1097 /* Setting ptr _does_ change cnt - we are done */
1100 #else /* STDIO_PTR_LVALUE */
1102 #endif /* STDIO_PTR_LVALUE */
1104 /* Now (or only) set cnt */
1105 #ifdef STDIO_CNT_LVALUE
1106 FILE_cnt(stdio) = cnt;
1107 #else /* STDIO_CNT_LVALUE */
1108 #if (defined(STDIO_PTR_LVALUE) && defined(STDIO_PTR_LVAL_SETS_CNT))
1109 FILE_ptr(stdio) = FILE_ptr(stdio)+(FILE_cnt(stdio)-cnt);
1110 #else /* STDIO_PTR_LVAL_SETS_CNT */
1112 #endif /* STDIO_PTR_LVAL_SETS_CNT */
1113 #endif /* STDIO_CNT_LVALUE */
1118 PerlIO_funcs PerlIO_stdio = {
1120 sizeof(PerlIOStdio),
1135 PerlIOStdio_clearerr,
1136 PerlIOStdio_setlinebuf,
1138 PerlIOStdio_get_base,
1139 PerlIOStdio_get_bufsiz,
1144 #ifdef USE_STDIO_PTR
1145 PerlIOStdio_get_ptr,
1146 PerlIOStdio_get_cnt,
1147 #if (defined(STDIO_PTR_LVALUE) && \
1148 (defined(STDIO_CNT_LVALUE) || defined(STDIO_PTR_LVAL_SETS_CNT)))
1149 PerlIOStdio_set_ptrcnt
1150 #else /* STDIO_PTR_LVALUE */
1152 #endif /* STDIO_PTR_LVALUE */
1153 #else /* USE_STDIO_PTR */
1157 #endif /* USE_STDIO_PTR */
1160 #undef PerlIO_exportFILE
1162 PerlIO_exportFILE(PerlIO *f, int fl)
1165 /* Should really push stdio discipline when we have them */
1166 return fdopen(PerlIO_fileno(f),"r+");
1169 #undef PerlIO_findFILE
1171 PerlIO_findFILE(PerlIO *f)
1173 return PerlIO_exportFILE(f,0);
1176 #undef PerlIO_releaseFILE
1178 PerlIO_releaseFILE(PerlIO *p, FILE *f)
1182 /*--------------------------------------------------------------------------------------*/
1183 /* perlio buffer layer */
1187 struct _PerlIO base;
1188 Off_t posn; /* Offset of buf into the file */
1189 STDCHAR * buf; /* Start of buffer */
1190 STDCHAR * end; /* End of valid part of buffer */
1191 STDCHAR * ptr; /* Current position in buffer */
1192 Size_t bufsiz; /* Size of buffer */
1193 IV oneword; /* Emergency buffer */
1198 PerlIOBuf_fdopen(int fd, const char *mode)
1200 PerlIO_funcs *tab = PerlIO_default_btm();
1208 f = (*tab->Fdopen)(fd,mode);
1211 /* Initial stderr is unbuffered */
1212 if (!init || fd != 2)
1214 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,&PerlIO_perlio,NULL),PerlIOBuf);
1215 b->posn = PerlIO_tell(PerlIONext(f));
1222 PerlIOBuf_open(const char *path, const char *mode)
1224 PerlIO_funcs *tab = PerlIO_default_btm();
1225 PerlIO *f = (*tab->Open)(path,mode);
1228 PerlIOBuf *b = PerlIOSelf(PerlIO_push(f,&PerlIO_perlio,NULL),PerlIOBuf);
1235 PerlIOBase_reopen(const char *path, const char *mode, PerlIO *f)
1237 return (*PerlIOBase(f)->tab->Reopen)(path,mode,PerlIONext(f));
1241 PerlIOBuf_alloc_buf(PerlIOBuf *b)
1245 New('B',b->buf,b->bufsiz,char);
1248 b->buf = (STDCHAR *)&b->oneword;
1249 b->bufsiz = sizeof(b->oneword);
1255 /* This "flush" is akin to sfio's sync in that it handles files in either
1259 PerlIOBuf_flush(PerlIO *f)
1261 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1263 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1265 /* write() the buffer */
1266 STDCHAR *p = b->buf;
1270 count = PerlIO_write(PerlIONext(f),p,b->ptr - p);
1277 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1282 b->posn += (p - b->buf);
1284 else if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1286 /* Note position change */
1287 b->posn += (b->ptr - b->buf);
1288 if (b->ptr < b->end)
1290 /* We did not consume all of it */
1291 if (PerlIO_seek(PerlIONext(f),b->posn,SEEK_SET) == 0)
1293 b->posn = PerlIO_tell(PerlIONext(f));
1297 b->ptr = b->end = b->buf;
1298 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1299 if (PerlIO_flush(PerlIONext(f)) != 0)
1305 PerlIOBuf_read(PerlIO *f, void *vbuf, Size_t count)
1307 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1308 STDCHAR *buf = (STDCHAR *) vbuf;
1313 PerlIOBuf_alloc_buf(b);
1314 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD))
1318 SSize_t avail = (b->end - b->ptr);
1319 if ((SSize_t) count < avail)
1323 Copy(b->ptr,buf,avail,char);
1329 if (count && (b->ptr >= b->end))
1332 b->ptr = b->end = b->buf;
1333 avail = PerlIO_read(PerlIONext(f),b->ptr,b->bufsiz);
1337 PerlIOBase(f)->flags |= PERLIO_F_EOF;
1339 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
1342 b->end = b->buf+avail;
1343 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1352 PerlIOBuf_unread(PerlIO *f, const void *vbuf, Size_t count)
1354 const STDCHAR *buf = (const STDCHAR *) vbuf+count;
1355 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1359 PerlIOBuf_alloc_buf(b);
1360 if (PerlIOBase(f)->flags & PERLIO_F_WRBUF)
1364 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1366 avail = (b->ptr - b->buf);
1367 if (avail > (SSize_t) count)
1374 if (avail > (SSize_t) count)
1376 b->end = b->ptr + avail;
1383 Copy(buf,b->ptr,avail,char);
1387 PerlIOBase(f)->flags &= ~ PERLIO_F_EOF;
1394 PerlIOBuf_write(PerlIO *f, const void *vbuf, Size_t count)
1396 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1397 const STDCHAR *buf = (const STDCHAR *) vbuf;
1400 PerlIOBuf_alloc_buf(b);
1401 if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE))
1405 SSize_t avail = b->bufsiz - (b->ptr - b->buf);
1406 if ((SSize_t) count < avail)
1408 PerlIOBase(f)->flags |= PERLIO_F_WRBUF;
1409 if (PerlIOBase(f)->flags & PERLIO_F_LINEBUF)
1429 Copy(buf,b->ptr,avail,char);
1436 if (b->ptr >= (b->buf + b->bufsiz))
1443 PerlIOBuf_seek(PerlIO *f, Off_t offset, int whence)
1445 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1447 code = PerlIO_flush(f);
1450 PerlIOBase(f)->flags &= ~PERLIO_F_EOF;
1451 code = PerlIO_seek(PerlIONext(f),offset,whence);
1454 b->posn = PerlIO_tell(PerlIONext(f));
1461 PerlIOBuf_tell(PerlIO *f)
1463 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1464 Off_t posn = b->posn;
1466 posn += (b->ptr - b->buf);
1471 PerlIOBuf_close(PerlIO *f)
1473 IV code = PerlIOBase_close(f);
1474 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1475 if (b->buf && b->buf != (STDCHAR *) &b->oneword)
1480 b->ptr = b->end = b->buf;
1481 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
1486 PerlIOBuf_setlinebuf(PerlIO *f)
1490 PerlIOBase(f)->flags &= ~PERLIO_F_LINEBUF;
1495 PerlIOBuf_set_cnt(PerlIO *f, int cnt)
1497 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1500 PerlIOBuf_alloc_buf(b);
1501 b->ptr = b->end - cnt;
1502 assert(b->ptr >= b->buf);
1506 PerlIOBuf_get_ptr(PerlIO *f)
1508 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1510 PerlIOBuf_alloc_buf(b);
1515 PerlIOBuf_get_cnt(PerlIO *f)
1517 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1519 PerlIOBuf_alloc_buf(b);
1520 if (PerlIOBase(f)->flags & PERLIO_F_RDBUF)
1521 return (b->end - b->ptr);
1526 PerlIOBuf_get_base(PerlIO *f)
1528 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1530 PerlIOBuf_alloc_buf(b);
1535 PerlIOBuf_bufsiz(PerlIO *f)
1537 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1539 PerlIOBuf_alloc_buf(b);
1540 return (b->end - b->buf);
1544 PerlIOBuf_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
1546 PerlIOBuf *b = PerlIOSelf(f,PerlIOBuf);
1548 PerlIOBuf_alloc_buf(b);
1550 if (PerlIO_get_cnt(f) != cnt || b->ptr < b->buf)
1553 assert(PerlIO_get_cnt(f) == cnt);
1554 assert(b->ptr >= b->buf);
1556 PerlIOBase(f)->flags |= PERLIO_F_RDBUF;
1559 PerlIO_funcs PerlIO_perlio = {
1576 PerlIOBase_clearerr,
1577 PerlIOBuf_setlinebuf,
1582 PerlIOBuf_set_ptrcnt,
1590 atexit(&PerlIO_cleanup);
1591 PerlIO_fdopen(0,"Ir");
1592 PerlIO_fdopen(1,"Iw");
1593 PerlIO_fdopen(2,"Iw");
1606 #undef PerlIO_stdout
1615 #undef PerlIO_stderr
1624 /*--------------------------------------------------------------------------------------*/
1626 #undef PerlIO_getname
1628 PerlIO_getname(PerlIO *f, char *buf)
1631 Perl_croak(aTHX_ "Don't know how to get file name");
1636 /*--------------------------------------------------------------------------------------*/
1637 /* Functions which can be called on any kind of PerlIO implemented
1643 PerlIO_getc(PerlIO *f)
1646 int count = PerlIO_read(f,&buf,1);
1648 return (unsigned char) buf;
1654 PerlIO_putc(PerlIO *f, int ch)
1657 return PerlIO_write(f,&buf,1);
1662 PerlIO_puts(PerlIO *f, const char *s)
1664 STRLEN len = strlen(s);
1665 return PerlIO_write(f,s,len);
1668 #undef PerlIO_rewind
1670 PerlIO_rewind(PerlIO *f)
1672 PerlIO_seek(f,(Off_t)0,SEEK_SET);
1676 #undef PerlIO_vprintf
1678 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
1681 SV *sv = newSVpvn("",0);
1684 sv_vcatpvf(sv, fmt, &ap);
1686 return PerlIO_write(f,s,len);
1689 #undef PerlIO_printf
1691 PerlIO_printf(PerlIO *f,const char *fmt,...)
1696 result = PerlIO_vprintf(f,fmt,ap);
1701 #undef PerlIO_stdoutf
1703 PerlIO_stdoutf(const char *fmt,...)
1708 result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
1713 #undef PerlIO_tmpfile
1715 PerlIO_tmpfile(void)
1718 /* I have no idea how portable mkstemp() is ... */
1719 SV *sv = newSVpv("/tmp/PerlIO_XXXXXX",0);
1720 int fd = mkstemp(SvPVX(sv));
1724 f = PerlIO_fdopen(fd,"w+");
1727 PerlIOBase(f)->flags |= PERLIO_F_TEMP;
1738 #endif /* USE_SFIO */
1739 #endif /* PERLIO_IS_STDIO */
1741 /*======================================================================================*/
1742 /* Now some functions in terms of above which may be needed even if
1743 we are not in true PerlIO mode
1747 #undef PerlIO_setpos
1749 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
1751 return PerlIO_seek(f,*pos,0);
1754 #ifndef PERLIO_IS_STDIO
1755 #undef PerlIO_setpos
1757 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
1759 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
1760 return fsetpos64(f, pos);
1762 return fsetpos(f, pos);
1769 #undef PerlIO_getpos
1771 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
1773 *pos = PerlIO_tell(f);
1777 #ifndef PERLIO_IS_STDIO
1778 #undef PerlIO_getpos
1780 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
1782 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
1783 return fgetpos64(f, pos);
1785 return fgetpos(f, pos);
1791 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
1794 vprintf(char *pat, char *args)
1796 _doprnt(pat, args, stdout);
1797 return 0; /* wrong, but perl doesn't use the return value */
1801 vfprintf(FILE *fd, char *pat, char *args)
1803 _doprnt(pat, args, fd);
1804 return 0; /* wrong, but perl doesn't use the return value */
1809 #ifndef PerlIO_vsprintf
1811 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
1813 int val = vsprintf(s, fmt, ap);
1816 if (strlen(s) >= (STRLEN)n)
1819 PerlIO_puts(Perl_error_log,"panic: sprintf overflow - memory corrupted!\n");
1827 #ifndef PerlIO_sprintf
1829 PerlIO_sprintf(char *s, int n, const char *fmt,...)
1834 result = PerlIO_vsprintf(s, n, fmt, ap);
1840 #endif /* !PERL_IMPLICIT_SYS */