]>
Commit | Line | Data |
---|---|---|
6599da04 JM |
1 | /* |
2 | Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation | |
3 | ||
4 | This file is part of the GNU IO Library. This library is free | |
5 | software; you can redistribute it and/or modify it under the | |
6 | terms of the GNU General Public License as published by the | |
7 | Free Software Foundation; either version 2, or (at your option) | |
8 | any later version. | |
9 | ||
10 | This library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this library; see the file COPYING. If not, write to the Free | |
17 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
18 | ||
19 | As a special exception, if you link this library with files | |
20 | compiled with a GNU compiler to produce an executable, this does not cause | |
21 | the resulting executable to be covered by the GNU General Public License. | |
22 | This exception does not however invalidate any other reasons why | |
23 | the executable file might be covered by the GNU General Public License. */ | |
24 | ||
25 | /* This is part of the iostream library. Written by Per Bothner. */ | |
26 | ||
27 | #ifndef _IO_STDIO_H | |
28 | #define _IO_STDIO_H | |
29 | ||
30 | #include <_G_config.h> | |
31 | #define _IO_pos_t _G_fpos_t /* obsolete */ | |
32 | #define _IO_fpos_t _G_fpos_t | |
33 | #define _IO_size_t _G_size_t | |
34 | #define _IO_ssize_t _G_ssize_t | |
35 | #define _IO_off_t _G_off_t | |
36 | #define _IO_pid_t _G_pid_t | |
37 | #define _IO_uid_t _G_uid_t | |
38 | #define _IO_HAVE_SYS_WAIT _G_HAVE_SYS_WAIT | |
39 | #define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE | |
40 | #define _IO_BUFSIZ _G_BUFSIZ | |
41 | #define _IO_va_list _G_va_list | |
42 | ||
43 | #ifdef _G_NEED_STDARG_H | |
44 | /* This define avoids name pollution if we're using GNU stdarg.h */ | |
45 | #define __need___va_list | |
46 | #include <stdarg.h> | |
47 | #ifdef __GNUC_VA_LIST | |
48 | #undef _IO_va_list | |
49 | #define _IO_va_list __gnuc_va_list | |
50 | #endif /* __GNUC_VA_LIST */ | |
51 | #endif | |
52 | ||
53 | #ifndef __P | |
54 | #if _G_HAVE_SYS_CDEFS | |
55 | #include <sys/cdefs.h> | |
56 | #else | |
57 | #ifdef __STDC__ | |
58 | #define __P(protos) protos | |
59 | #else | |
60 | #define __P(protos) () | |
61 | #endif | |
62 | #endif | |
63 | #endif /*!__P*/ | |
64 | ||
65 | /* For backward compatibility */ | |
66 | #ifndef _PARAMS | |
67 | #define _PARAMS(protos) __P(protos) | |
68 | #endif /*!_PARAMS*/ | |
69 | ||
70 | #ifndef __STDC__ | |
71 | #define const | |
72 | #endif | |
73 | #ifndef _G_NO_USE_DTOA | |
74 | #define _IO_USE_DTOA | |
75 | #else | |
76 | #undef _IO_USE_DTOA | |
77 | #endif | |
78 | #define _IO_UNIFIED_JUMPTABLES 1 | |
79 | ||
80 | #if 0 | |
81 | #ifdef _IO_NEED_STDARG_H | |
82 | #include <stdarg.h> | |
83 | #endif | |
84 | #endif | |
85 | ||
86 | #ifndef EOF | |
87 | #define EOF (-1) | |
88 | #endif | |
89 | #ifndef NULL | |
90 | #ifdef __GNUG__ | |
91 | #define NULL (__null) | |
92 | #else | |
93 | #if !defined(__cplusplus) | |
94 | #define NULL ((void*)0) | |
95 | #else | |
96 | #define NULL (0) | |
97 | #endif | |
98 | #endif | |
99 | #endif | |
100 | ||
101 | #define _IOS_INPUT 1 | |
102 | #define _IOS_OUTPUT 2 | |
103 | #define _IOS_ATEND 4 | |
104 | #define _IOS_APPEND 8 | |
105 | #define _IOS_TRUNC 16 | |
106 | #define _IOS_NOCREATE 32 | |
107 | #define _IOS_NOREPLACE 64 | |
108 | #define _IOS_BIN 128 | |
109 | ||
110 | /* Magic numbers and bits for the _flags field. | |
111 | The magic numbers use the high-order bits of _flags; | |
112 | the remaining bits are abailable for variable flags. | |
113 | Note: The magic numbers must all be negative if stdio | |
114 | emulation is desired. */ | |
115 | ||
116 | #define _IO_MAGIC 0xFBAD0000 /* Magic number */ | |
117 | #define _OLD_STDIO_MAGIC 0xFABC0000 /* Emulate old stdio. */ | |
118 | #define _IO_MAGIC_MASK 0xFFFF0000 | |
119 | #define _IO_USER_BUF 1 /* User owns buffer; don't delete it on close. */ | |
120 | #define _IO_UNBUFFERED 2 | |
121 | #define _IO_NO_READS 4 /* Reading not allowed */ | |
122 | #define _IO_NO_WRITES 8 /* Writing not allowd */ | |
123 | #define _IO_EOF_SEEN 0x10 | |
124 | #define _IO_ERR_SEEN 0x20 | |
125 | #define _IO_DELETE_DONT_CLOSE 0x40 /* Don't call close(_fileno) on cleanup. */ | |
126 | #define _IO_LINKED 0x80 /* Set if linked (using _chain) to streambuf::_list_all.*/ | |
127 | #define _IO_IN_BACKUP 0x100 | |
128 | #define _IO_LINE_BUF 0x200 | |
129 | #define _IO_TIED_PUT_GET 0x400 /* Set if put and get pointer logicly tied. */ | |
130 | #define _IO_CURRENTLY_PUTTING 0x800 | |
131 | #define _IO_IS_APPENDING 0x1000 | |
132 | #define _IO_IS_FILEBUF 0x2000 | |
133 | ||
134 | /* These are "formatting flags" matching the iostream fmtflags enum values. */ | |
135 | #define _IO_SKIPWS 01 | |
136 | #define _IO_LEFT 02 | |
137 | #define _IO_RIGHT 04 | |
138 | #define _IO_INTERNAL 010 | |
139 | #define _IO_DEC 020 | |
140 | #define _IO_OCT 040 | |
141 | #define _IO_HEX 0100 | |
142 | #define _IO_SHOWBASE 0200 | |
143 | #define _IO_SHOWPOINT 0400 | |
144 | #define _IO_UPPERCASE 01000 | |
145 | #define _IO_SHOWPOS 02000 | |
146 | #define _IO_SCIENTIFIC 04000 | |
147 | #define _IO_FIXED 010000 | |
148 | #define _IO_UNITBUF 020000 | |
149 | #define _IO_STDIO 040000 | |
150 | #define _IO_DONT_CLOSE 0100000 | |
151 | ||
152 | /* A streammarker remembers a position in a buffer. */ | |
153 | ||
154 | struct _IO_jump_t; struct _IO_FILE; | |
155 | ||
156 | struct _IO_marker { | |
157 | struct _IO_marker *_next; | |
158 | struct _IO_FILE *_sbuf; | |
159 | /* If _pos >= 0 | |
160 | it points to _buf->Gbase()+_pos. FIXME comment */ | |
161 | /* if _pos < 0, it points to _buf->eBptr()+_pos. FIXME comment */ | |
162 | int _pos; | |
163 | #if 0 | |
164 | void set_streampos(streampos sp) { _spos = sp; } | |
165 | void set_offset(int offset) { _pos = offset; _spos = (streampos)(-2); } | |
166 | public: | |
167 | streammarker(streambuf *sb); | |
168 | ~streammarker(); | |
169 | int saving() { return _spos == -2; } | |
170 | int delta(streammarker&); | |
171 | int delta(); | |
172 | #endif | |
173 | }; | |
174 | ||
175 | struct _IO_FILE { | |
176 | #if _G_USE_INT32_FLAGS | |
177 | _G_int32_t _flags; /* High-order word is _IO_MAGIC; rest is flags. */ | |
178 | #else | |
179 | int _flags; | |
180 | #endif | |
181 | #define _IO_file_flags _flags | |
182 | ||
183 | /* The following pointers correspond to the C++ streambuf protocol. */ | |
184 | /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ | |
185 | char* _IO_read_ptr; /* Current read pointer */ | |
186 | char* _IO_read_end; /* End of get area. */ | |
187 | char* _IO_read_base; /* Start of putback+get area. */ | |
188 | char* _IO_write_base; /* Start of put area. */ | |
189 | char* _IO_write_ptr; /* Current put pointer. */ | |
190 | char* _IO_write_end; /* End of put area. */ | |
191 | char* _IO_buf_base; /* Start of reserve area. */ | |
192 | char* _IO_buf_end; /* End of reserve area. */ | |
193 | /* The following fields are used to support backing up and undo. */ | |
194 | char *_IO_save_base; /* Pointer to start of non-current get area. */ | |
195 | char *_IO_backup_base; /* Pointer to first valid character of backup area */ | |
196 | char *_IO_save_end; /* Pointer to end of non-current get area. */ | |
197 | ||
198 | struct _IO_marker *_markers; | |
199 | ||
200 | struct _IO_FILE *_chain; | |
201 | ||
202 | int _fileno; | |
203 | int _blksize; | |
204 | _IO_off_t _offset; | |
205 | ||
206 | #define __HAVE_COLUMN /* temporary */ | |
207 | /* 1+column number of pbase(); 0 is unknown. */ | |
208 | unsigned short _cur_column; | |
209 | char _unused; | |
210 | char _shortbuf[1]; | |
211 | ||
212 | /* char* _save_gptr; char* _save_egptr; */ | |
213 | }; | |
214 | ||
215 | #ifndef __cplusplus | |
216 | typedef struct _IO_FILE _IO_FILE; | |
217 | #endif | |
218 | ||
219 | struct _IO_FILE_plus; | |
220 | extern struct _IO_FILE_plus _IO_stdin_, _IO_stdout_, _IO_stderr_; | |
221 | #define _IO_stdin ((_IO_FILE*)(&_IO_stdin_)) | |
222 | #define _IO_stdout ((_IO_FILE*)(&_IO_stdout_)) | |
223 | #define _IO_stderr ((_IO_FILE*)(&_IO_stderr_)) | |
224 | ||
225 | #ifdef __cplusplus | |
226 | extern "C" { | |
227 | #endif | |
228 | ||
229 | extern int __underflow __P((_IO_FILE*)); | |
230 | extern int __uflow __P((_IO_FILE*)); | |
231 | extern int __overflow __P((_IO_FILE*, int)); | |
232 | ||
233 | #define _IO_getc(_fp) \ | |
234 | ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end ? __uflow(_fp) \ | |
235 | : *(unsigned char*)(_fp)->_IO_read_ptr++) | |
236 | #define _IO_peekc(_fp) \ | |
237 | ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end \ | |
238 | && __underflow(_fp) == EOF ? EOF \ | |
239 | : *(unsigned char*)(_fp)->_IO_read_ptr) | |
240 | ||
241 | #define _IO_putc(_ch, _fp) \ | |
242 | (((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end) \ | |
243 | ? __overflow(_fp, (unsigned char)(_ch)) \ | |
244 | : (unsigned char)(*(_fp)->_IO_write_ptr++ = (_ch))) | |
245 | ||
246 | #define _IO_feof(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0) | |
247 | #define _IO_ferror(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0) | |
248 | ||
249 | /* This one is for Emacs. */ | |
250 | #define _IO_PENDING_OUTPUT_COUNT(_fp) \ | |
251 | ((_fp)->_IO_write_ptr - (_fp)->_IO_write_base) | |
252 | ||
253 | extern int _IO_vfscanf __P((_IO_FILE*, const char*, _IO_va_list, int*)); | |
254 | extern int _IO_vfprintf __P((_IO_FILE*, const char*, _IO_va_list)); | |
255 | extern _IO_ssize_t _IO_padn __P((_IO_FILE *, int, _IO_ssize_t)); | |
256 | extern _IO_size_t _IO_sgetn __P((_IO_FILE *, void*, _IO_size_t)); | |
257 | ||
258 | extern _IO_fpos_t _IO_seekoff __P((_IO_FILE*, _IO_off_t, int, int)); | |
259 | extern _IO_fpos_t _IO_seekpos __P((_IO_FILE*, _IO_fpos_t, int)); | |
260 | ||
261 | extern void _IO_free_backup_area __P((_IO_FILE*)); | |
262 | ||
263 | #ifdef __cplusplus | |
264 | } | |
265 | #endif | |
266 | ||
267 | #endif /* _IO_STDIO_H */ |