This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate changes #7971(perlio),8982,9061,9062,9068,9069,
[perl5.git] / perlio.c
1 /*    perlio.c
2  *
3  *    Copyright (c) 1996-2000, Nick Ing-Simmons
4  *
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.
7  *
8  */
9
10
11 #define VOIDUSED 1
12 #include "config.h"
13
14 #define PERLIO_NOT_STDIO 0 
15 #if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO)
16 #define PerlIO FILE
17 #endif
18 /*
19  * This file provides those parts of PerlIO abstraction 
20  * which are not #defined in iperlsys.h.
21  * Which these are depends on various Configure #ifdef's 
22  */
23
24 #include "EXTERN.h"
25 #define PERL_IN_PERLIO_C
26 #include "perl.h"
27
28 #if !defined(PERL_IMPLICIT_SYS)
29
30 #ifdef PERLIO_IS_STDIO 
31
32 void
33 PerlIO_init(void)
34 {
35  /* Does nothing (yet) except force this file to be included 
36     in perl binary. That allows this file to force inclusion
37     of other functions that may be required by loadable 
38     extensions e.g. for FileHandle::tmpfile  
39  */
40 }
41
42 #undef PerlIO_tmpfile
43 PerlIO *
44 PerlIO_tmpfile(void)
45 {
46  return tmpfile();
47 }
48
49 #else /* PERLIO_IS_STDIO */
50
51 #ifdef USE_SFIO
52
53 #undef HAS_FSETPOS
54 #undef HAS_FGETPOS
55
56 /* This section is just to make sure these functions 
57    get pulled in from libsfio.a
58 */
59
60 #undef PerlIO_tmpfile
61 PerlIO *
62 PerlIO_tmpfile(void)
63 {
64  return sftmp(0);
65 }
66
67 void
68 PerlIO_init(void)
69 {
70  /* Force this file to be included  in perl binary. Which allows 
71   *  this file to force inclusion  of other functions that may be 
72   *  required by loadable  extensions e.g. for FileHandle::tmpfile  
73   */
74
75  /* Hack
76   * sfio does its own 'autoflush' on stdout in common cases.
77   * Flush results in a lot of lseek()s to regular files and 
78   * lot of small writes to pipes.
79   */
80  sfset(sfstdout,SF_SHARE,0);
81 }
82
83 #else /* USE_SFIO */
84
85 /* Implement all the PerlIO interface using stdio. 
86    - this should be only file to include <stdio.h>
87 */
88
89 #undef PerlIO_stderr
90 PerlIO *
91 PerlIO_stderr(void)
92 {
93  return (PerlIO *) stderr;
94 }
95
96 #undef PerlIO_stdin
97 PerlIO *
98 PerlIO_stdin(void)
99 {
100  return (PerlIO *) stdin;
101 }
102
103 #undef PerlIO_stdout
104 PerlIO *
105 PerlIO_stdout(void)
106 {
107  return (PerlIO *) stdout;
108 }
109
110 #undef PerlIO_fast_gets
111 int 
112 PerlIO_fast_gets(PerlIO *f)
113 {
114 #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
115  return 1;
116 #else
117  return 0;
118 #endif
119 }
120
121 #undef PerlIO_has_cntptr
122 int 
123 PerlIO_has_cntptr(PerlIO *f)
124 {
125 #if defined(USE_STDIO_PTR)
126  return 1;
127 #else
128  return 0;
129 #endif
130 }
131
132 #undef PerlIO_canset_cnt
133 int 
134 PerlIO_canset_cnt(PerlIO *f)
135 {
136 #if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
137  return 1;
138 #else
139  return 0;
140 #endif
141 }
142
143 #undef PerlIO_set_cnt
144 void
145 PerlIO_set_cnt(PerlIO *f, int cnt)
146 {
147  dTHX;
148  if (cnt < -1 && ckWARN_d(WARN_INTERNAL))
149   Perl_warner(aTHX_ WARN_INTERNAL, "Setting cnt to %d\n",cnt);
150 #if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
151  FILE_cnt(f) = cnt;
152 #else
153  Perl_croak(aTHX_ "Cannot set 'cnt' of FILE * on this system");
154 #endif
155 }
156
157 #undef PerlIO_set_ptrcnt
158 void
159 PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
160 {
161  dTHX;
162 #ifdef FILE_bufsiz
163  STDCHAR *e = FILE_base(f) + FILE_bufsiz(f);
164  int ec = e - ptr;
165  if (ptr > e + 1 && ckWARN_d(WARN_INTERNAL))
166   Perl_warner(aTHX_ WARN_INTERNAL, "Setting ptr %p > end+1 %p\n", ptr, e + 1);
167  if (cnt != ec && ckWARN_d(WARN_INTERNAL))
168   Perl_warner(aTHX_ WARN_INTERNAL, "Setting cnt to %d, ptr implies %d\n",cnt,ec);
169 #endif
170 #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE)
171   FILE_ptr(f) = ptr;
172 #else
173   Perl_croak(aTHX_ "Cannot set 'ptr' of FILE * on this system");
174 #endif
175 #if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE) && defined (STDIO_PTR_LVAL_NOCHANGE_CNT)
176   FILE_cnt(f) = cnt;
177 #else
178 #if defined(STDIO_PTR_LVAL_SETS_CNT)
179   assert (FILE_cnt(f) == cnt);
180 #else
181   Perl_croak(aTHX_ "Cannot set 'cnt' of FILE * on this system when setting 'ptr'");
182 #endif
183 #endif
184 }
185
186 #undef PerlIO_get_cnt
187 int 
188 PerlIO_get_cnt(PerlIO *f)
189 {
190 #ifdef FILE_cnt
191  return FILE_cnt(f);
192 #else
193  dTHX;
194  Perl_croak(aTHX_ "Cannot get 'cnt' of FILE * on this system");
195  return -1;
196 #endif
197 }
198
199 #undef PerlIO_get_bufsiz
200 int 
201 PerlIO_get_bufsiz(PerlIO *f)
202 {
203 #ifdef FILE_bufsiz
204  return FILE_bufsiz(f);
205 #else
206  dTHX;
207  Perl_croak(aTHX_ "Cannot get 'bufsiz' of FILE * on this system");
208  return -1;
209 #endif
210 }
211
212 #undef PerlIO_get_ptr
213 STDCHAR *
214 PerlIO_get_ptr(PerlIO *f)
215 {
216 #ifdef FILE_ptr
217  return FILE_ptr(f);
218 #else
219  dTHX;
220  Perl_croak(aTHX_ "Cannot get 'ptr' of FILE * on this system");
221  return NULL;
222 #endif
223 }
224
225 #undef PerlIO_get_base
226 STDCHAR *
227 PerlIO_get_base(PerlIO *f)
228 {
229 #ifdef FILE_base
230  return FILE_base(f);
231 #else
232  dTHX;
233  Perl_croak(aTHX_ "Cannot get 'base' of FILE * on this system");
234  return NULL;
235 #endif
236 }
237
238 #undef PerlIO_has_base 
239 int 
240 PerlIO_has_base(PerlIO *f)
241 {
242 #ifdef FILE_base
243  return 1;
244 #else
245  return 0;
246 #endif
247 }
248
249 #undef PerlIO_puts
250 int
251 PerlIO_puts(PerlIO *f, const char *s)
252 {
253  return fputs(s,f);
254 }
255
256 #undef PerlIO_open 
257 PerlIO * 
258 PerlIO_open(const char *path, const char *mode)
259 {
260  return fopen(path,mode);
261 }
262
263 #undef PerlIO_fdopen
264 PerlIO * 
265 PerlIO_fdopen(int fd, const char *mode)
266 {
267  return fdopen(fd,mode);
268 }
269
270 #undef PerlIO_reopen
271 PerlIO * 
272 PerlIO_reopen(const char *name, const char *mode, PerlIO *f)
273 {
274  return freopen(name,mode,f);
275 }
276
277 #undef PerlIO_close
278 int      
279 PerlIO_close(PerlIO *f)
280 {
281  return fclose(f);
282 }
283
284 #undef PerlIO_eof
285 int      
286 PerlIO_eof(PerlIO *f)
287 {
288  return feof(f);
289 }
290
291 #undef PerlIO_getname
292 char *
293 PerlIO_getname(PerlIO *f, char *buf)
294 {
295 #ifdef VMS
296  return fgetname(f,buf);
297 #else
298  dTHX;
299  Perl_croak(aTHX_ "Don't know how to get file name");
300  return NULL;
301 #endif
302 }
303
304 #undef PerlIO_getc
305 int      
306 PerlIO_getc(PerlIO *f)
307 {
308  return fgetc(f);
309 }
310
311 #undef PerlIO_error
312 int      
313 PerlIO_error(PerlIO *f)
314 {
315  return ferror(f);
316 }
317
318 #undef PerlIO_clearerr
319 void
320 PerlIO_clearerr(PerlIO *f)
321 {
322  clearerr(f);
323 }
324
325 #undef PerlIO_flush
326 int      
327 PerlIO_flush(PerlIO *f)
328 {
329  return Fflush(f);
330 }
331
332 #undef PerlIO_fileno
333 int      
334 PerlIO_fileno(PerlIO *f)
335 {
336  return fileno(f);
337 }
338
339 #undef PerlIO_setlinebuf
340 void
341 PerlIO_setlinebuf(PerlIO *f)
342 {
343 #ifdef HAS_SETLINEBUF
344     setlinebuf(f);
345 #else
346 #  ifdef __BORLANDC__ /* Borland doesn't like NULL size for _IOLBF */
347     setvbuf(f, Nullch, _IOLBF, BUFSIZ);
348 #  else
349     setvbuf(f, Nullch, _IOLBF, 0);
350 #  endif
351 #endif
352 }
353
354 #undef PerlIO_putc
355 int      
356 PerlIO_putc(PerlIO *f, int ch)
357 {
358  return putc(ch,f);
359 }
360
361 #undef PerlIO_ungetc
362 int      
363 PerlIO_ungetc(PerlIO *f, int ch)
364 {
365  return ungetc(ch,f);
366 }
367
368 #undef PerlIO_read
369 SSize_t
370 PerlIO_read(PerlIO *f, void *buf, Size_t count)
371 {
372  return fread(buf,1,count,f);
373 }
374
375 #undef PerlIO_write
376 SSize_t
377 PerlIO_write(PerlIO *f, const void *buf, Size_t count)
378 {
379  return fwrite1(buf,1,count,f);
380 }
381
382 #undef PerlIO_vprintf
383 int      
384 PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
385 {
386  return vfprintf(f,fmt,ap);
387 }
388
389 #undef PerlIO_tell
390 Off_t
391 PerlIO_tell(PerlIO *f)
392 {
393 #if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
394  return ftello(f);
395 #else
396  return ftell(f);
397 #endif
398 }
399
400 #undef PerlIO_seek
401 int
402 PerlIO_seek(PerlIO *f, Off_t offset, int whence)
403 {
404 #if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
405  return fseeko(f,offset,whence);
406 #else
407  return fseek(f,offset,whence);
408 #endif
409 }
410
411 #undef PerlIO_rewind
412 void
413 PerlIO_rewind(PerlIO *f)
414 {
415  rewind(f);
416 }
417
418 #undef PerlIO_printf
419 int      
420 PerlIO_printf(PerlIO *f,const char *fmt,...)
421 {
422  va_list ap;
423  int result;
424  va_start(ap,fmt);
425  result = vfprintf(f,fmt,ap);
426  va_end(ap);
427  return result;
428 }
429
430 #undef PerlIO_stdoutf
431 int      
432 PerlIO_stdoutf(const char *fmt,...)
433 {
434  va_list ap;
435  int result;
436  va_start(ap,fmt);
437  result = PerlIO_vprintf(PerlIO_stdout(),fmt,ap);
438  va_end(ap);
439  return result;
440 }
441
442 #undef PerlIO_tmpfile
443 PerlIO *
444 PerlIO_tmpfile(void)
445 {
446  return tmpfile();
447 }
448
449 #undef PerlIO_importFILE
450 PerlIO *
451 PerlIO_importFILE(FILE *f, int fl)
452 {
453  return f;
454 }
455
456 #undef PerlIO_exportFILE
457 FILE *
458 PerlIO_exportFILE(PerlIO *f, int fl)
459 {
460  return f;
461 }
462
463 #undef PerlIO_findFILE
464 FILE *
465 PerlIO_findFILE(PerlIO *f)
466 {
467  return f;
468 }
469
470 #undef PerlIO_releaseFILE
471 void
472 PerlIO_releaseFILE(PerlIO *p, FILE *f)
473 {
474 }
475
476 void
477 PerlIO_init(void)
478 {
479  /* Does nothing (yet) except force this file to be included 
480     in perl binary. That allows this file to force inclusion
481     of other functions that may be required by loadable 
482     extensions e.g. for FileHandle::tmpfile  
483  */
484 }
485
486 #endif /* USE_SFIO */
487 #endif /* PERLIO_IS_STDIO */
488
489 #ifndef HAS_FSETPOS
490 #undef PerlIO_setpos
491 int
492 #ifdef USE_SFIO
493 PerlIO_setpos(PerlIO *f, const Off_t *pos)
494 #else
495 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
496 #endif
497 {
498  return PerlIO_seek(f,*pos,0); 
499 }
500 #else
501 #ifndef PERLIO_IS_STDIO
502 #undef PerlIO_setpos
503 int
504 PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
505 {
506 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
507  return fsetpos64(f, pos);
508 #else
509  return fsetpos(f, pos);
510 #endif
511 }
512 #endif
513 #endif
514
515 #ifndef HAS_FGETPOS
516 #undef PerlIO_getpos
517 int
518 #ifdef USE_SFIO
519 PerlIO_getpos(PerlIO *f, Off_t *pos)
520 {
521  *pos = PerlIO_seek(f,0,0);
522  return 0;
523 }
524 #else
525 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
526 {
527  *pos = PerlIO_tell(f);
528  return 0;
529 }
530 #endif
531 #else
532 #ifndef PERLIO_IS_STDIO
533 #undef PerlIO_getpos
534 int
535 PerlIO_getpos(PerlIO *f, Fpos_t *pos)
536 {
537 #if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
538  return fgetpos64(f, pos);
539 #else
540  return fgetpos(f, pos);
541 #endif
542 }
543 #endif
544 #endif
545
546 #if (defined(PERLIO_IS_STDIO) || !defined(USE_SFIO)) && !defined(HAS_VPRINTF)
547
548 int
549 vprintf(char *pat, char *args)
550 {
551     _doprnt(pat, args, stdout);
552     return 0;           /* wrong, but perl doesn't use the return value */
553 }
554
555 int
556 vfprintf(FILE *fd, char *pat, char *args)
557 {
558     _doprnt(pat, args, fd);
559     return 0;           /* wrong, but perl doesn't use the return value */
560 }
561
562 #endif
563
564 #ifndef PerlIO_vsprintf
565 int 
566 PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
567 {
568  int val = vsprintf(s, fmt, ap);
569  if (n >= 0)
570   {
571    if (strlen(s) >= (STRLEN)n)
572     {
573      dTHX;
574      PerlIO_puts(Perl_error_log,"panic: sprintf overflow - memory corrupted!\n");
575      my_exit(1);
576     }
577   }
578  return val;
579 }
580 #endif
581
582 #ifndef PerlIO_sprintf
583 int      
584 PerlIO_sprintf(char *s, int n, const char *fmt,...)
585 {
586  va_list ap;
587  int result;
588  va_start(ap,fmt);
589  result = PerlIO_vsprintf(s, n, fmt, ap);
590  va_end(ap);
591  return result;
592 }
593 #endif
594
595 #endif /* !PERL_IMPLICIT_SYS */
596