This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_length: code tidy and simplify assert
[perl5.git] / perlio.h
... / ...
CommitLineData
1/* perlio.h
2 *
3 * Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, by Larry Wall and others
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 */
10
11#ifndef PERLIO_H_
12#define PERLIO_H_
13/*
14 Interface for perl to IO functions.
15 There is a hierarchy of Configure determined #define controls:
16 USE_STDIO - No longer available via Configure. Formerly forced
17 PerlIO_xxx() to be #define-d onto stdio functions.
18 Now generates compile-time error.
19
20 USE_PERLIO - The primary Configure variable that enables PerlIO.
21 PerlIO_xxx() are real functions
22 defined in perlio.c which implement extra functionality
23 required for utf8 support.
24
25*/
26
27#ifndef USE_PERLIO
28# define USE_STDIO
29#endif
30
31#ifdef USE_STDIO
32# error "stdio is no longer supported as the default base layer -- use perlio."
33#endif
34
35/* -------------------- End of Configure controls ---------------------------- */
36
37/*
38 * Although we may not want stdio to be used including <stdio.h> here
39 * avoids issues where stdio.h has strange side effects
40 */
41#include <stdio.h>
42
43#if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
44#define ftell ftello
45#endif
46
47#if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
48#define fseek fseeko
49#endif
50
51/* BS2000 includes are sometimes a bit non standard :-( */
52#if defined(POSIX_BC) && defined(O_BINARY) && !defined(O_TEXT)
53#undef O_BINARY
54#endif
55
56#ifndef PerlIO
57/* ----------- PerlIO implementation ---------- */
58/* PerlIO not #define-d to something else - define the implementation */
59
60typedef struct _PerlIO PerlIOl;
61typedef struct _PerlIO_funcs PerlIO_funcs;
62typedef PerlIOl *PerlIO;
63#define PerlIO PerlIO
64#define PERLIO_LAYERS 1
65
66/* PERLIO_FUNCS_CONST is now on by default for efficiency, PERLIO_FUNCS_CONST
67 can be removed 1 day once stable & then PerlIO vtables are permanently RO */
68#ifdef PERLIO_FUNCS_CONST
69#define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
70#define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
71#else
72#define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
73#define PERLIO_FUNCS_CAST(funcs) (funcs)
74#endif
75
76PERL_CALLCONV void PerlIO_define_layer(pTHX_ PerlIO_funcs *tab);
77PERL_CALLCONV PerlIO_funcs *PerlIO_find_layer(pTHX_ const char *name,
78 STRLEN len,
79 int load);
80PERL_CALLCONV PerlIO *PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab),
81 const char *mode, SV *arg);
82PERL_CALLCONV void PerlIO_pop(pTHX_ PerlIO *f);
83PERL_CALLCONV AV* PerlIO_get_layers(pTHX_ PerlIO *f);
84PERL_CALLCONV void PerlIO_clone(pTHX_ PerlInterpreter *proto,
85 CLONE_PARAMS *param);
86
87#endif /* PerlIO */
88
89/* ----------- End of implementation choices ---------- */
90
91/* We now need to determine what happens if source trys to use stdio.
92 * There are three cases based on PERLIO_NOT_STDIO which XS code
93 * can set how it wants.
94 */
95
96#ifdef PERL_CORE
97/* Make a choice for perl core code
98 - currently this is set to try and catch lingering raw stdio calls.
99 This is a known issue with some non UNIX ports which still use
100 "native" stdio features.
101*/
102# ifndef PERLIO_NOT_STDIO
103# define PERLIO_NOT_STDIO 1
104# endif
105#else
106# ifndef PERLIO_NOT_STDIO
107# define PERLIO_NOT_STDIO 0
108# endif
109#endif
110
111#ifdef PERLIO_NOT_STDIO
112#if PERLIO_NOT_STDIO
113/*
114 * PERLIO_NOT_STDIO #define'd as 1
115 * Case 1: Strong denial of stdio - make all stdio calls (we can think of) errors
116 */
117#include "nostdio.h"
118#else /* if PERLIO_NOT_STDIO */
119/*
120 * PERLIO_NOT_STDIO #define'd as 0
121 * Case 2: Declares that both PerlIO and stdio can be used
122 */
123#endif /* if PERLIO_NOT_STDIO */
124#else /* ifdef PERLIO_NOT_STDIO */
125/*
126 * PERLIO_NOT_STDIO not defined
127 * Case 3: Try and fake stdio calls as PerlIO calls
128 */
129#include "fakesdio.h"
130#endif /* ifndef PERLIO_NOT_STDIO */
131
132/* ----------- fill in things that have not got #define'd ---------- */
133
134#ifndef Fpos_t
135#define Fpos_t Off_t
136#endif
137
138#ifndef EOF
139#define EOF (-1)
140#endif
141
142/* This is to catch case with no stdio */
143#ifndef BUFSIZ
144#define BUFSIZ 1024
145#endif
146
147/* The default buffer size for the perlio buffering layer */
148#ifndef PERLIOBUF_DEFAULT_BUFSIZ
149#define PERLIOBUF_DEFAULT_BUFSIZ (BUFSIZ > 8192 ? BUFSIZ : 8192)
150#endif
151
152#ifndef SEEK_SET
153#define SEEK_SET 0
154#endif
155
156#ifndef SEEK_CUR
157#define SEEK_CUR 1
158#endif
159
160#ifndef SEEK_END
161#define SEEK_END 2
162#endif
163
164#define PERLIO_DUP_CLONE 1
165#define PERLIO_DUP_FD 2
166
167/* --------------------- Now prototypes for functions --------------- */
168
169START_EXTERN_C
170#ifndef __attribute__format__
171# ifdef HASATTRIBUTE_FORMAT
172# define __attribute__format__(x,y,z) __attribute__((format(x,y,z)))
173# else
174# define __attribute__format__(x,y,z)
175# endif
176#endif
177#ifndef PerlIO_init
178PERL_CALLCONV void PerlIO_init(pTHX);
179#endif
180#ifndef PerlIO_stdoutf
181PERL_CALLCONV int PerlIO_stdoutf(const char *, ...)
182 __attribute__format__(__printf__, 1, 2);
183#endif
184#ifndef PerlIO_puts
185PERL_CALLCONV int PerlIO_puts(PerlIO *, const char *);
186#endif
187#ifndef PerlIO_open
188PERL_CALLCONV PerlIO *PerlIO_open(const char *, const char *);
189#endif
190#ifndef PerlIO_openn
191PERL_CALLCONV PerlIO *PerlIO_openn(pTHX_ const char *layers, const char *mode,
192 int fd, int imode, int perm, PerlIO *old,
193 int narg, SV **arg);
194#endif
195#ifndef PerlIO_eof
196PERL_CALLCONV int PerlIO_eof(PerlIO *);
197#endif
198#ifndef PerlIO_error
199PERL_CALLCONV int PerlIO_error(PerlIO *);
200#endif
201#ifndef PerlIO_clearerr
202PERL_CALLCONV void PerlIO_clearerr(PerlIO *);
203#endif
204#ifndef PerlIO_getc
205PERL_CALLCONV int PerlIO_getc(PerlIO *);
206#endif
207#ifndef PerlIO_putc
208PERL_CALLCONV int PerlIO_putc(PerlIO *, int);
209#endif
210#ifndef PerlIO_ungetc
211PERL_CALLCONV int PerlIO_ungetc(PerlIO *, int);
212#endif
213#ifndef PerlIO_fdopen
214PERL_CALLCONV PerlIO *PerlIO_fdopen(int, const char *);
215#endif
216#ifndef PerlIO_importFILE
217PERL_CALLCONV PerlIO *PerlIO_importFILE(FILE *, const char *);
218#endif
219#ifndef PerlIO_exportFILE
220PERL_CALLCONV FILE *PerlIO_exportFILE(PerlIO *, const char *);
221#endif
222#ifndef PerlIO_findFILE
223PERL_CALLCONV FILE *PerlIO_findFILE(PerlIO *);
224#endif
225#ifndef PerlIO_releaseFILE
226PERL_CALLCONV void PerlIO_releaseFILE(PerlIO *, FILE *);
227#endif
228#ifndef PerlIO_read
229PERL_CALLCONV SSize_t PerlIO_read(PerlIO *, void *, Size_t);
230#endif
231#ifndef PerlIO_unread
232PERL_CALLCONV SSize_t PerlIO_unread(PerlIO *, const void *, Size_t);
233#endif
234#ifndef PerlIO_write
235PERL_CALLCONV SSize_t PerlIO_write(PerlIO *, const void *, Size_t);
236#endif
237#ifndef PerlIO_setlinebuf
238PERL_CALLCONV void PerlIO_setlinebuf(PerlIO *);
239#endif
240#ifndef PerlIO_printf
241PERL_CALLCONV int PerlIO_printf(PerlIO *, const char *, ...)
242 __attribute__format__(__printf__, 2, 3);
243#endif
244#ifndef PerlIO_vprintf
245PERL_CALLCONV int PerlIO_vprintf(PerlIO *, const char *, va_list);
246#endif
247#ifndef PerlIO_tell
248PERL_CALLCONV Off_t PerlIO_tell(PerlIO *);
249#endif
250#ifndef PerlIO_seek
251PERL_CALLCONV int PerlIO_seek(PerlIO *, Off_t, int);
252#endif
253#ifndef PerlIO_rewind
254PERL_CALLCONV void PerlIO_rewind(PerlIO *);
255#endif
256#ifndef PerlIO_has_base
257PERL_CALLCONV int PerlIO_has_base(PerlIO *);
258#endif
259#ifndef PerlIO_has_cntptr
260PERL_CALLCONV int PerlIO_has_cntptr(PerlIO *);
261#endif
262#ifndef PerlIO_fast_gets
263PERL_CALLCONV int PerlIO_fast_gets(PerlIO *);
264#endif
265#ifndef PerlIO_canset_cnt
266PERL_CALLCONV int PerlIO_canset_cnt(PerlIO *);
267#endif
268#ifndef PerlIO_get_ptr
269PERL_CALLCONV STDCHAR *PerlIO_get_ptr(PerlIO *);
270#endif
271#ifndef PerlIO_get_cnt
272PERL_CALLCONV SSize_t PerlIO_get_cnt(PerlIO *);
273#endif
274#ifndef PerlIO_set_cnt
275PERL_CALLCONV void PerlIO_set_cnt(PerlIO *, SSize_t);
276#endif
277#ifndef PerlIO_set_ptrcnt
278PERL_CALLCONV void PerlIO_set_ptrcnt(PerlIO *, STDCHAR *, SSize_t);
279#endif
280#ifndef PerlIO_get_base
281PERL_CALLCONV STDCHAR *PerlIO_get_base(PerlIO *);
282#endif
283#ifndef PerlIO_get_bufsiz
284PERL_CALLCONV SSize_t PerlIO_get_bufsiz(PerlIO *);
285#endif
286#ifndef PerlIO_tmpfile
287PERL_CALLCONV PerlIO *PerlIO_tmpfile(void);
288#endif
289#ifndef PerlIO_stdin
290PERL_CALLCONV PerlIO *PerlIO_stdin(void);
291#endif
292#ifndef PerlIO_stdout
293PERL_CALLCONV PerlIO *PerlIO_stdout(void);
294#endif
295#ifndef PerlIO_stderr
296PERL_CALLCONV PerlIO *PerlIO_stderr(void);
297#endif
298#ifndef PerlIO_getpos
299PERL_CALLCONV int PerlIO_getpos(PerlIO *, SV *);
300#endif
301#ifndef PerlIO_setpos
302PERL_CALLCONV int PerlIO_setpos(PerlIO *, SV *);
303#endif
304#ifndef PerlIO_fdupopen
305PERL_CALLCONV PerlIO *PerlIO_fdupopen(pTHX_ PerlIO *, CLONE_PARAMS *, int);
306#endif
307#if !defined(PerlIO_modestr)
308PERL_CALLCONV char *PerlIO_modestr(PerlIO *, char *buf);
309#endif
310#ifndef PerlIO_isutf8
311PERL_CALLCONV int PerlIO_isutf8(PerlIO *);
312#endif
313#ifndef PerlIO_apply_layers
314PERL_CALLCONV int PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode,
315 const char *names);
316#endif
317#ifndef PerlIO_binmode
318PERL_CALLCONV int PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int omode,
319 const char *names);
320#endif
321#ifndef PerlIO_getname
322PERL_CALLCONV char *PerlIO_getname(PerlIO *, char *);
323#endif
324
325PERL_CALLCONV void PerlIO_destruct(pTHX);
326
327PERL_CALLCONV int PerlIO_intmode2str(int rawmode, char *mode, int *writing);
328
329#ifdef PERLIO_LAYERS
330PERL_CALLCONV void PerlIO_cleanup(pTHX);
331
332PERL_CALLCONV void PerlIO_debug(const char *fmt, ...)
333 __attribute__format__(__printf__, 1, 2);
334typedef struct PerlIO_list_s PerlIO_list_t;
335
336#endif
337
338END_EXTERN_C
339#endif /* PERLIO_H_ */
340
341/*
342 * ex: set ts=8 sts=4 sw=4 et:
343 */