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