This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Quick for for #ifdef mess
[perl5.git] / perlio.h
CommitLineData
76ced9ad
NIS
1#ifndef _PERLIO_H
2#define _PERLIO_H
3/*
4 Interface for perl to IO functions.
5 There is a hierachy of Configure determined #define controls:
6 USE_STDIO - forces PerlIO_xxx() to be #define-d onto stdio functions.
7 This is used for x2p subdirectory and for conservative
8 builds - "just like perl5.00X used to be".
9 This dominates over the others.
10
11 USE_PERLIO - The primary Configure variable that enables PerlIO.
12 If USE_PERLIO is _NOT_ set
13 then USE_STDIO above will be set to be conservative.
14 If USE_PERLIO is set
15 then there are two modes determined by USE_SFIO:
16
17 USE_SFIO - If set causes PerlIO_xxx() to be #define-d onto sfio functions.
18 A backward compatability mode for some specialist applications.
19
20 If USE_SFIO is not set then PerlIO_xxx() are real functions
21 defined in perlio.c which implement extra functionality
22 required for utf8 support.
23
24 One further note - the table-of-functions scheme controlled
25 by PERL_IMPLICIT_SYS turns on USE_PERLIO so that iperlsys.h can
26 #define PerlIO_xxx() to go via the function table, without having
27 to #undef them from (say) stdio forms.
28
29*/
30
31#if defined(PERL_IMPLICIT_SYS)
32#ifndef USE_PERLIO
2986a63f 33#ifndef NETWARE
76ced9ad
NIS
34# define USE_PERLIO
35#endif
36#endif
2986a63f 37#endif
76ced9ad
NIS
38
39#ifndef USE_PERLIO
40# define USE_STDIO
41#endif
42
43#ifdef USE_STDIO
44# ifndef PERLIO_IS_STDIO
45# define PERLIO_IS_STDIO
46# endif
47#endif
48
49/* -------------------- End of Configure controls ---------------------------- */
50
51/*
52 * Although we may not want stdio to be used including <stdio.h> here
53 * avoids issues where stdio.h has strange side effects
54 */
55#include <stdio.h>
56
57#if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
58#define ftell ftello
59#endif
60
61#if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
62#define fseek fseeko
63#endif
64
65#ifdef PERLIO_IS_STDIO
66/* #define PerlIO_xxxx() as equivalent stdio function */
67#include "perlsdio.h"
68#else /* PERLIO_IS_STDIO */
69#ifdef USE_SFIO
70/* #define PerlIO_xxxx() as equivalent sfio function */
71#include "perlsfio.h"
72#endif /* USE_SFIO */
73#endif /* PERLIO_IS_STDIO */
74
75#ifndef PerlIO
76/* ----------- PerlIO implementation ---------- */
77/* PerlIO not #define-d to something else - define the implementation */
78
79typedef struct _PerlIO PerlIOl;
80typedef struct _PerlIO_funcs PerlIO_funcs;
81typedef PerlIOl *PerlIO;
82#define PerlIO PerlIO
a1d180c4 83#define PERLIO_LAYERS 1
76ced9ad 84
a999f61b 85extern void PerlIO_define_layer (pTHX_ PerlIO_funcs *tab);
fcf2db38 86extern PerlIO_funcs *PerlIO_find_layer (pTHX_ const char *name, STRLEN len, int load);
e3f3bf95 87extern PerlIO * PerlIO_push (pTHX_ PerlIO *f,PerlIO_funcs *tab,const char *mode,SV *arg);
a999f61b 88extern void PerlIO_pop (pTHX_ PerlIO *f);
76ced9ad
NIS
89
90#endif /* PerlIO */
91
92/* ----------- End of implementation choices ---------- */
93
94#ifndef PERLIO_IS_STDIO
95/* Not using stdio _directly_ as PerlIO */
96
97/* We now need to determine what happens if source trys to use stdio.
98 * There are three cases based on PERLIO_NOT_STDIO which XS code
99 * can set how it wants.
100 */
101
102#ifdef PERL_CORE
103/* Make a choice for perl core code
104 - currently this is set to try and catch lingering raw stdio calls.
105 This is a known issue with some non UNIX ports which still use
106 "native" stdio features.
107*/
108#ifndef PERLIO_NOT_STDIO
109#define PERLIO_NOT_STDIO 1
110#endif
f7e7eb72
NIS
111#else
112#ifndef PERLIO_NOT_STDIO
113#define PERLIO_NOT_STDIO 0
114#endif
76ced9ad
NIS
115#endif
116
117#ifdef PERLIO_NOT_STDIO
118#if PERLIO_NOT_STDIO
119/*
120 * PERLIO_NOT_STDIO #define'd as 1
121 * Case 1: Strong denial of stdio - make all stdio calls (we can think of) errors
122 */
123#include "nostdio.h"
124#else /* if PERLIO_NOT_STDIO */
125/*
126 * PERLIO_NOT_STDIO #define'd as 0
127 * Case 2: Declares that both PerlIO and stdio can be used
128 */
129#endif /* if PERLIO_NOT_STDIO */
130#else /* ifdef PERLIO_NOT_STDIO */
131/*
132 * PERLIO_NOT_STDIO not defined
133 * Case 3: Try and fake stdio calls as PerlIO calls
134 */
135#include "fakesdio.h"
136#endif /* ifndef PERLIO_NOT_STDIO */
137#endif /* PERLIO_IS_STDIO */
138
ac27b0f5
NIS
139#define specialCopIO(sv) ((sv) != Nullsv)
140
76ced9ad
NIS
141/* ----------- fill in things that have not got #define'd ---------- */
142
143#ifndef Fpos_t
144#define Fpos_t Off_t
145#endif
146
147#ifndef EOF
148#define EOF (-1)
149#endif
150
151/* This is to catch case with no stdio */
152#ifndef BUFSIZ
153#define BUFSIZ 1024
154#endif
155
156#ifndef SEEK_SET
157#define SEEK_SET 0
158#endif
159
160#ifndef SEEK_CUR
161#define SEEK_CUR 1
162#endif
163
164#ifndef SEEK_END
165#define SEEK_END 2
166#endif
167
168/* --------------------- Now prototypes for functions --------------- */
169
adb71456
NIS
170START_EXTERN_C
171
76ced9ad
NIS
172#ifndef NEXT30_NO_ATTRIBUTE
173#ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */
174#ifdef __attribute__ /* Avoid possible redefinition errors */
175#undef __attribute__
176#endif
177#define __attribute__(attr)
178#endif
179#endif
180
181#ifndef PerlIO_init
182extern void PerlIO_init (void);
183#endif
184#ifndef PerlIO_stdoutf
185extern int PerlIO_stdoutf (const char *,...)
186 __attribute__((__format__ (__printf__, 1, 2)));
187#endif
188#ifndef PerlIO_puts
189extern int PerlIO_puts (PerlIO *,const char *);
190#endif
191#ifndef PerlIO_open
192extern PerlIO * PerlIO_open (const char *,const char *);
193#endif
6e60e805 194#ifndef PerlIO_openn
ee518936
NIS
195extern PerlIO * PerlIO_openn (pTHX_ const char *layers, const char *mode,int fd,int imode,int perm,PerlIO *old,int narg,SV **arg);
196#endif
76ced9ad
NIS
197#ifndef PerlIO_close
198extern int PerlIO_close (PerlIO *);
199#endif
200#ifndef PerlIO_eof
201extern int PerlIO_eof (PerlIO *);
202#endif
203#ifndef PerlIO_error
204extern int PerlIO_error (PerlIO *);
205#endif
206#ifndef PerlIO_clearerr
207extern void PerlIO_clearerr (PerlIO *);
208#endif
209#ifndef PerlIO_getc
210extern int PerlIO_getc (PerlIO *);
211#endif
212#ifndef PerlIO_putc
213extern int PerlIO_putc (PerlIO *,int);
214#endif
215#ifndef PerlIO_flush
216extern int PerlIO_flush (PerlIO *);
217#endif
218#ifndef PerlIO_ungetc
219extern int PerlIO_ungetc (PerlIO *,int);
220#endif
221#ifndef PerlIO_fileno
222extern int PerlIO_fileno (PerlIO *);
223#endif
224#ifndef PerlIO_fdopen
225extern PerlIO * PerlIO_fdopen (int, const char *);
226#endif
227#ifndef PerlIO_importFILE
228extern PerlIO * PerlIO_importFILE (FILE *,int);
229#endif
230#ifndef PerlIO_exportFILE
231extern FILE * PerlIO_exportFILE (PerlIO *,int);
232#endif
233#ifndef PerlIO_findFILE
234extern FILE * PerlIO_findFILE (PerlIO *);
235#endif
236#ifndef PerlIO_releaseFILE
237extern void PerlIO_releaseFILE (PerlIO *,FILE *);
238#endif
239#ifndef PerlIO_read
240extern SSize_t PerlIO_read (PerlIO *,void *,Size_t);
241#endif
a15cef0c
CB
242#ifndef PerlIO_unread
243extern SSize_t PerlIO_unread (PerlIO *,const void *,Size_t);
244#endif
76ced9ad
NIS
245#ifndef PerlIO_write
246extern SSize_t PerlIO_write (PerlIO *,const void *,Size_t);
247#endif
248#ifndef PerlIO_setlinebuf
249extern void PerlIO_setlinebuf (PerlIO *);
250#endif
251#ifndef PerlIO_printf
252extern int PerlIO_printf (PerlIO *, const char *,...)
253 __attribute__((__format__ (__printf__, 2, 3)));
254#endif
255#ifndef PerlIO_sprintf
256extern int PerlIO_sprintf (char *, int, const char *,...)
257 __attribute__((__format__ (__printf__, 3, 4)));
258#endif
259#ifndef PerlIO_vprintf
260extern int PerlIO_vprintf (PerlIO *, const char *, va_list);
261#endif
262#ifndef PerlIO_tell
263extern Off_t PerlIO_tell (PerlIO *);
264#endif
265#ifndef PerlIO_seek
266extern int PerlIO_seek (PerlIO *, Off_t, int);
267#endif
268#ifndef PerlIO_rewind
269extern void PerlIO_rewind (PerlIO *);
270#endif
271#ifndef PerlIO_has_base
272extern int PerlIO_has_base (PerlIO *);
273#endif
274#ifndef PerlIO_has_cntptr
275extern int PerlIO_has_cntptr (PerlIO *);
276#endif
277#ifndef PerlIO_fast_gets
278extern int PerlIO_fast_gets (PerlIO *);
279#endif
280#ifndef PerlIO_canset_cnt
281extern int PerlIO_canset_cnt (PerlIO *);
282#endif
283#ifndef PerlIO_get_ptr
284extern STDCHAR * PerlIO_get_ptr (PerlIO *);
285#endif
286#ifndef PerlIO_get_cnt
287extern int PerlIO_get_cnt (PerlIO *);
288#endif
289#ifndef PerlIO_set_cnt
290extern void PerlIO_set_cnt (PerlIO *,int);
291#endif
292#ifndef PerlIO_set_ptrcnt
293extern void PerlIO_set_ptrcnt (PerlIO *,STDCHAR *,int);
294#endif
295#ifndef PerlIO_get_base
296extern STDCHAR * PerlIO_get_base (PerlIO *);
297#endif
298#ifndef PerlIO_get_bufsiz
299extern int PerlIO_get_bufsiz (PerlIO *);
300#endif
301#ifndef PerlIO_tmpfile
302extern PerlIO * PerlIO_tmpfile (void);
303#endif
304#ifndef PerlIO_stdin
305extern PerlIO * PerlIO_stdin (void);
306#endif
307#ifndef PerlIO_stdout
308extern PerlIO * PerlIO_stdout (void);
309#endif
310#ifndef PerlIO_stderr
311extern PerlIO * PerlIO_stderr (void);
312#endif
313#ifndef PerlIO_getpos
766a733e 314extern int PerlIO_getpos (PerlIO *,SV *);
76ced9ad
NIS
315#endif
316#ifndef PerlIO_setpos
766a733e 317extern int PerlIO_setpos (PerlIO *,SV *);
76ced9ad
NIS
318#endif
319#ifndef PerlIO_fdupopen
5f1a76d0
NIS
320extern PerlIO * PerlIO_fdupopen (pTHX_ PerlIO *);
321#endif
11ae941d 322#if !defined(PerlIO_modestr) && !defined(PERLIO_IS_STDIO)
5f1a76d0 323extern char *PerlIO_modestr (PerlIO *,char *buf);
76ced9ad
NIS
324#endif
325#ifndef PerlIO_isutf8
326extern int PerlIO_isutf8 (PerlIO *);
327#endif
156e9b51 328#ifndef PerlIO_apply_layers
60382766
NIS
329extern int PerlIO_apply_layers (pTHX_ PerlIO *f, const char *mode, const char *names);
330#endif
331#ifndef PerlIO_binmode
332extern int PerlIO_binmode (pTHX_ PerlIO *f, int iotype, int omode, const char *names);
ac27b0f5 333#endif
a15cef0c
CB
334#ifndef PerlIO_getname
335extern char * PerlIO_getname (PerlIO *, char *);
336#endif
76ced9ad 337
13621cfb
NIS
338extern void PerlIO_destruct(pTHX);
339
11ae941d
CB
340#ifndef PERLIO_IS_STDIO
341
64e30646 342extern void PerlIO_cleanup(void);
adb71456 343
88b61e10
NIS
344extern void PerlIO_debug(const char *fmt,...);
345
11ae941d
CB
346#endif
347
adb71456
NIS
348END_EXTERN_C
349
76ced9ad 350#endif /* _PERLIO_H */