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