First public contribution.
3 * Silicon Graphics Computer Systems, Inc.
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
20 // WARNING: This is an internal header file, included by other C++
21 // standard library headers. You should not attempt to use this header
25 #ifndef _STLP_STDIO_FILE_H
26 #define _STLP_STDIO_FILE_H
28 // This file provides a low-level interface between the internal
29 // representation of struct FILE, from the C stdio library, and
30 // the C++ I/O library. The C++ I/O library views a FILE object as
31 // a collection of three pointers: the beginning of the buffer, the
32 // current read/write position, and the end of the buffer.
35 // - char* _FILE_[IO]_begin(const FILE *__f);
36 // Returns a pointer to the beginning of the buffer.
37 // - char* _FILE_[IO]_next(const FILE *__f);
38 // Returns the current read/write position within the buffer.
39 // - char* _FILE_[IO]_end(const FILE *__f);
40 // Returns a pointer immediately past the end of the buffer.
41 // - char* _FILE_[IO]_avail(const FILE *__f);
42 // Returns the number of characters remaining in the buffer, i.e.
43 // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
44 // - char& _FILE_[IO]_preincr(FILE *__f)
45 // Increments the current read/write position by 1, returning the
46 // character at the old position.
47 // - char& _FILE_[IO]_postincr(FILE *__f)
48 // Increments the current read/write position by 1, returning the
49 // character at the old position.
50 // - char& _FILE_[IO]_predecr(FILE *__f)
51 // Decrements the current read/write position by 1, returning the
52 // character at the old position.
53 // - char& _FILE_[IO]_postdecr(FILE *__f)
54 // Decrements the current read/write position by 1, returning the
55 // character at the old position.
56 // - void _FILE_[IO]_bump(FILE *__f, int __n)
57 // Increments the current read/write position by __n.
58 // - void _FILE_[IO]_set(FILE *__f, char* __begin, char* __next, char* __end);
59 // Sets the beginning of the bufer to __begin, the current read/write
60 // position to __next, and the buffer's past-the-end pointer to __end.
61 // If any of those pointers is null, then all of them must be null.
63 // Each function comes in two versions, one for a FILE used as an input
64 // buffer and one for a FILE used as an output buffer. In some stdio
65 // implementations the two functions are identical, but in others they are
75 #if defined(__MSL__) && !defined(N_PLAT_NLM)
76 # include <unix.h> // get the definition of fileno
81 //----------------------------------------------------------------------
82 // Implementation for eMbedded Visual C++ 3.0 and 4.2 (.NET)
83 #if defined (_STLP_WCE)
85 inline int _FILE_fd(const FILE *__f) { return (int)::_fileno((FILE*)__f); }
87 # undef _STLP_FILE_I_O_IDENTICAL
89 // Implementation for the IRIX C library.
90 // Solaris interface looks to be identical.
91 #elif !defined(_STLP_USE_GLIBC) && \
93 ( defined(__sun) && ! defined (_LP64) ) || \
94 defined (__osf__) || defined(__DECCXX) || \
95 (defined (_STLP_MSVC) && !defined (_STLP_WCE_EVC3)) || \
96 defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP) || defined (_AIX) || defined (_CRAY))
98 #if defined (_STLP_MSVC) || defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP)
99 typedef char* _File_ptr_type;
101 typedef unsigned char* _File_ptr_type;
104 inline int _FILE_fd(const FILE *__f) { return __f->_file; }
105 inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
106 inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
107 inline char* _FILE_I_end(const FILE *__f)
108 { return (char*) __f->_ptr + __f->_cnt; }
110 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
112 inline char& _FILE_I_preincr(FILE *__f)
113 { --__f->_cnt; return *(char*) (++__f->_ptr); }
114 inline char& _FILE_I_postincr(FILE *__f)
115 { --__f->_cnt; return *(char*) (__f->_ptr++); }
116 inline char& _FILE_I_predecr(FILE *__f)
117 { ++__f->_cnt; return *(char*) (--__f->_ptr); }
118 inline char& _FILE_I_postdecr(FILE *__f)
119 { ++__f->_cnt; return *(char*) (__f->_ptr--); }
120 inline void _FILE_I_bump(FILE *__f, int __n)
121 { __f->_ptr += __n; __f->_cnt -= __n; }
123 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
124 __f->_base = (_File_ptr_type) __begin;
125 __f->_ptr = (_File_ptr_type) __next;
126 __f->_cnt = __end - __next;
129 # define _STLP_FILE_I_O_IDENTICAL 1
131 #elif defined(__EMX__)
133 inline int _FILE_fd(const FILE* __f) { return __f->_handle; }
134 inline char* _FILE_I_begin(const FILE* __f) { return (char*) __f->_buffer; }
135 inline char* _FILE_I_next(const FILE* __f) { return (char*) __f->_ptr; }
136 inline char* _FILE_I_end(const FILE* __f) { return (char *) __f->_ptr + __f->_rcount; }
137 inline ptrdiff_t _FILE_I_avail(const FILE* __f) { return __f->_rcount; }
138 inline char& _FILE_I_preincr(FILE* __f) { --__f->_rcount; return *(char*) (++__f->_ptr); }
139 inline char& _FILE_I_postincr(FILE* __f) { --__f->_rcount; return *(char*) (__f->_ptr++); }
140 inline char& _FILE_I_predecr(FILE* __f) { ++__f->_rcount; return *(char*) (--__f->_ptr); }
141 inline char& _FILE_I_postdecr(FILE* __f) { ++__f->_rcount; return *(char*) (__f->_ptr--); }
142 inline void _FILE_I_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_rcount -= __n; }
143 inline void _FILE_I_set(FILE* __f, char* __begin, char* __next, char* __end) {
144 __f->_buffer = __begin;
146 __f->_rcount = __end - __next;
149 inline char* _FILE_O_begin(const FILE* __f) { return (char*) __f->_buffer; }
150 inline char* _FILE_O_next(const FILE* __f) { return (char*) __f->_ptr; }
151 inline char* _FILE_O_end(const FILE* __f) { return (char*) __f->_ptr + __f->_wcount; }
152 inline ptrdiff_t _FILE_O_avail(const FILE* __f) { return __f->_wcount; }
153 inline char& _FILE_O_preincr(FILE* __f) { --__f->_wcount; return *(char*) (++__f->_ptr); }
154 inline char& _FILE_O_postincr(FILE* __f) { --__f->_wcount; return *(char*) (__f->_ptr++); }
155 inline char& _FILE_O_predecr(FILE* __f) { ++__f->_wcount; return *(char*) (--__f->_ptr); }
156 inline char& _FILE_O_postdecr(FILE* __f) { ++__f->_wcount; return *(char*) (__f->_ptr--); }
157 inline void _FILE_O_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_wcount -= __n; }
158 inline void _FILE_O_set(FILE* __f, char* __begin, char* __next, char* __end) {
159 __f->_buffer = __begin;
161 __f->_wcount = __end - __next;
165 # undef _STLP_FILE_I_O_IDENTICAL
167 # elif defined(_STLP_SCO_OPENSERVER) || defined(__NCR_SVR)
169 typedef unsigned char* _File_ptr_type;
171 inline int _FILE_fd(const FILE *__f) { return __f->__file; }
172 inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__base; }
173 inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__ptr; }
174 inline char* _FILE_I_end(const FILE *__f)
175 { return (char*) __f->__ptr + __f->__cnt; }
177 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
179 inline char& _FILE_I_preincr(FILE *__f)
180 { --__f->__cnt; return *(char*) (++__f->__ptr); }
181 inline char& _FILE_I_postincr(FILE *__f)
182 { --__f->__cnt; return *(char*) (__f->__ptr++); }
183 inline char& _FILE_I_predecr(FILE *__f)
184 { ++__f->__cnt; return *(char*) (--__f->__ptr); }
185 inline char& _FILE_I_postdecr(FILE *__f)
186 { ++__f->__cnt; return *(char*) (__f->__ptr--); }
187 inline void _FILE_I_bump(FILE *__f, int __n)
188 { __f->__ptr += __n; __f->__cnt -= __n; }
190 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
191 __f->__base = (_File_ptr_type) __begin;
192 __f->__ptr = (_File_ptr_type) __next;
193 __f->__cnt = __end - __next;
196 # define _STLP_FILE_I_O_IDENTICAL 1
198 # elif defined(__sun) && defined( _LP64)
200 typedef long _File_ptr_type;
202 inline int _FILE_fd(const FILE *__f) { return (int) __f->__pad[2]; }
203 inline char* _FILE_I_begin(const FILE *__f) { return (char*)
205 inline char* _FILE_I_next(const FILE *__f) { return (char*)
207 inline char* _FILE_I_end(const FILE *__f)
208 { return (char*) __f->__pad[0] + __f->__pad[3]; }
210 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__pad[3]; }
212 inline char& _FILE_I_preincr(FILE *__f)
213 { --__f->__pad[3]; return *(char*) (++__f->__pad[0]); }
214 inline char& _FILE_I_postincr(FILE *__f)
215 { --__f->__pad[3]; return *(char*) (__f->__pad[0]++); }
216 inline char& _FILE_I_predecr(FILE *__f)
217 { ++__f->__pad[3]; return *(char*) (--__f->__pad[0]); }
218 inline char& _FILE_I_postdecr(FILE *__f)
219 { ++__f->__pad[3]; return *(char*) (__f->__pad[0]--); }
220 inline void _FILE_I_bump(FILE *__f, long __n)
221 { __f->__pad[0] += __n; __f->__pad[3] -= __n; }
223 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
225 __f->__pad[1] = (_File_ptr_type) __begin;
226 __f->__pad[0] = (_File_ptr_type) __next;
227 __f->__pad[3] = __end - __next;
230 # define _STLP_FILE_I_O_IDENTICAL
232 #elif defined (__CYGWIN__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
233 || defined(__amigaos__) || ( defined(__GNUC__) && defined(__APPLE__) )
235 inline int _FILE_fd(const FILE *__f) { return __f->_file; }
236 inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_bf._base; }
237 inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_p; }
238 inline char* _FILE_I_end(const FILE *__f)
239 { return (char*) __f->_p + __f->_r; }
241 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_r; }
243 #if ( defined(__GNUC__) && defined(__APPLE__) )
244 inline char& _FILE_I_preincr(FILE *__f)
245 { --__f->_r; return *(char*) (++__f->_p); }
246 inline char& _FILE_I_postincr(FILE *__f)
247 { --__f->_r; return *(char*) (__f->_p++); }
248 inline char& _FILE_I_predecr(FILE *__f)
249 { ++__f->_r; return *(char*) (--__f->_p); }
250 inline char& _FILE_I_postdecr(FILE *__f)
251 { ++__f->_r; return *(char*) (__f->_p--); }
252 inline void _FILE_I_bump(FILE *__f, int __n)
253 { __f->_p += __n; __f->_r -= __n; }
255 inline char& _FILE_I_preincr(FILE *__f)
256 { --__f->_r; --__f->_bf._size; return *(char*) (++__f->_p); }
257 inline char& _FILE_I_postincr(FILE *__f)
258 { --__f->_r; --__f->_bf._size; return *(char*) (__f->_p++); }
259 inline char& _FILE_I_predecr(FILE *__f)
260 { ++__f->_r; ++ __f->_bf._size; return *(char*) (--__f->_p); }
261 inline char& _FILE_I_postdecr(FILE *__f)
262 { ++__f->_r; ++__f->_bf._size; return *(char*) (__f->_p--); }
263 inline void _FILE_I_bump(FILE *__f, int __n)
264 { __f->_p += __n; __f->_bf._size+=__n; __f->_r -= __n; }
267 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
268 __f->_bf._base = (unsigned char*) __begin;
269 __f->_p = (unsigned char*) __next;
270 __f->_r = __f->_bf._size = __end - __next;
272 inline char* _FILE_O_begin(const FILE *__f) { return (char*) __f->_bf._base; }
273 inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->_p; }
274 inline char* _FILE_O_end(const FILE *__f)
275 { return (char*) __f->_p + __f->_w; }
277 inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->_w; }
279 #if ( defined(__GNUC__) && defined(__APPLE__) )
280 inline char& _FILE_O_preincr(FILE *__f)
281 { --__f->_w; return *(char*) (++__f->_p); }
282 inline char& _FILE_O_postincr(FILE *__f)
283 { --__f->_w; return *(char*) (__f->_p++); }
284 inline char& _FILE_O_predecr(FILE *__f)
285 { ++__f->_w; return *(char*) (--__f->_p); }
286 inline char& _FILE_O_postdecr(FILE *__f)
287 { ++__f->_w; return *(char*) (__f->_p--); }
288 inline void _FILE_O_bump(FILE *__f, int __n)
289 { __f->_p += __n; __f->_w -= __n; }
291 inline char& _FILE_O_preincr(FILE *__f)
292 { --__f->_w; --__f->_bf._size; return *(char*) (++__f->_p); }
293 inline char& _FILE_O_postincr(FILE *__f)
294 { --__f->_w; --__f->_bf._size; return *(char*) (__f->_p++); }
295 inline char& _FILE_O_predecr(FILE *__f)
296 { ++__f->_w; ++__f->_bf._size; return *(char*) (--__f->_p); }
297 inline char& _FILE_O_postdecr(FILE *__f)
298 { ++__f->_w; ++__f->_bf._size; return *(char*) (__f->_p--); }
299 inline void _FILE_O_bump(FILE *__f, int __n)
300 { __f->_p += __n; __f->_bf._size+=__n; __f->_w -= __n; }
303 inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end) {
304 __f->_bf._base = (unsigned char*) __begin;
305 __f->_p = (unsigned char*) __next;
306 __f->_w = __f->_bf._size = __end - __next;
309 # undef _STLP_FILE_I_O_IDENTICAL
311 #elif defined(_STLP_USE_UCLIBC) /* should be before _STLP_USE_GLIBC */
312 inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE *,__f)); }
313 #elif defined(_STLP_USE_GLIBC)
315 inline int _FILE_fd(const FILE *__f) { return __f->_fileno; }
316 inline char* _FILE_I_begin(const FILE *__f) { return __f->_IO_read_base; }
317 inline char* _FILE_I_next(const FILE *__f) { return __f->_IO_read_ptr; }
318 inline char* _FILE_I_end(const FILE *__f) { return __f->_IO_read_end; }
320 inline ptrdiff_t _FILE_I_avail(const FILE *__f)
321 { return __f->_IO_read_end - __f->_IO_read_ptr; }
323 inline char& _FILE_I_preincr(FILE *__f) { return *++__f->_IO_read_ptr; }
324 inline char& _FILE_I_postincr(FILE *__f) { return *__f->_IO_read_ptr++; }
325 inline char& _FILE_I_predecr(FILE *__f) { return *--__f->_IO_read_ptr; }
326 inline char& _FILE_I_postdecr(FILE *__f) { return *__f->_IO_read_ptr--; }
327 inline void _FILE_I_bump(FILE *__f, int __n) { __f->_IO_read_ptr += __n; }
329 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
330 __f->_IO_read_base = __begin;
331 __f->_IO_read_ptr = __next;
332 __f->_IO_read_end = __end;
335 inline char* _FILE_O_begin(const FILE *__f) { return __f->_IO_write_base; }
336 inline char* _FILE_O_next(const FILE *__f) { return __f->_IO_write_ptr; }
337 inline char* _FILE_O_end(const FILE *__f) { return __f->_IO_write_end; }
339 inline ptrdiff_t _FILE_O_avail(const FILE *__f)
340 { return __f->_IO_write_end - __f->_IO_write_ptr; }
342 inline char& _FILE_O_preincr(FILE *__f) { return *++__f->_IO_write_ptr; }
343 inline char& _FILE_O_postincr(FILE *__f) { return *__f->_IO_write_ptr++; }
344 inline char& _FILE_O_predecr(FILE *__f) { return *--__f->_IO_write_ptr; }
345 inline char& _FILE_O_postdecr(FILE *__f) { return *__f->_IO_write_ptr--; }
346 inline void _FILE_O_bump(FILE *__f, int __n) { __f->_IO_write_ptr += __n; }
348 inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end) {
349 __f->_IO_write_base = __begin;
350 __f->_IO_write_ptr = __next;
351 __f->_IO_write_end = __end;
355 #elif defined(__hpux) /* && defined(__hppa) && defined(__HP_aCC)) */
357 #ifndef _INCLUDE_HPUX_SOURCE
358 extern "C" unsigned char *__bufendtab[];
360 # define _bufend(__p) \
361 (*(((__p)->__flag & _IOEXT) ? &(((_FILEX *)(__p))->__bufendp) \
362 : &(__bufendtab[(__p) - __iob])))
364 # define _bufsiz(__p) (_bufend(__p) - (__p)->__base)
365 #endif /* _INCLUDE_HPUX_SOURCE */
367 #if defined(_STLP_HPACC_BROKEN_BUFEND)
369 # define _bufend(__p) \
370 (*(((__p)->__flag & _IOEXT) ? &((__REINTERPRET_CAST(_FILEX*,(__p)))->__bufendp) \
371 : &(__bufendtab[__REINTERPRET_CAST(FILE*,(__p)) - __iob])))
374 inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE *,__f)); }
375 inline char* _FILE_I_begin(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__base)); }
376 inline char* _FILE_I_next(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__ptr)); }
377 inline char* _FILE_I_end(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__ptr +__f->__cnt)); }
379 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
381 inline char& _FILE_I_preincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, ++__f->__ptr); }
382 inline char& _FILE_I_postincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, __f->__ptr++); }
383 inline char& _FILE_I_predecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,--__f->__ptr); }
384 inline char& _FILE_I_postdecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,__f->__ptr--); }
385 inline void _FILE_I_bump(FILE *__f, int __n) { __f->__cnt -= __n; __f->__ptr += __n; }
387 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
389 if( (unsigned long) (__f - &__iob[0]) > _NFILE)
390 __f->__flag |= _IOEXT; // used by stdio's _bufend macro and goodness knows what else...
392 __f->__cnt = __end - __next;
393 __f->__base = __REINTERPRET_CAST(unsigned char*, __begin);
394 __f->__ptr = __REINTERPRET_CAST(unsigned char*, __next);
395 _bufend(__f) = __REINTERPRET_CAST(unsigned char*, __end);
398 // For HPUX stdio, input and output FILE manipulation is identical.
400 # define _STLP_FILE_I_O_IDENTICAL
402 #elif defined (__BORLANDC__)
404 typedef unsigned char* _File_ptr_type;
406 inline int _FILE_fd(const FILE *__f) { return __f->fd; }
407 inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->buffer;
409 inline char* _FILE_I_next(const FILE *__f)
410 { return (char*)__f->curp; }
411 inline char* _FILE_I_end(const FILE *__f)
412 { return (char*) __f->curp + __f->level; }
414 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->level; }
416 inline char& _FILE_I_preincr(FILE *__f)
417 { --__f->level; return *(char*) (++__f->curp); }
418 inline char& _FILE_I_postincr(FILE *__f)
419 { --__f->level; return *(char*) (__f->curp++); }
420 inline char& _FILE_I_predecr(FILE *__f)
421 { ++__f->level; return *(char*) (--__f->curp); }
422 inline char& _FILE_I_postdecr(FILE *__f)
423 { ++__f->level; return *(char*) (__f->curp--); }
424 inline void _FILE_I_bump(FILE *__f, int __n)
425 { __f->curp += __n; __f->level -= __n; }
427 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
428 __f->buffer = (_File_ptr_type) __begin;
429 __f->curp = (_File_ptr_type) __next;
430 __f->level = __end - __next;
433 # define _STLP_FILE_I_O_IDENTICAL
435 #elif defined( __MWERKS__ )
437 // using MWERKS-specific defines here to detect other OS targets
438 // dwa: I'm not sure they provide fileno for all OS's, but this should
439 // work for Win32 and WinCE
442 // Hmm, at least for Novell NetWare __dest_os == __mac_os true too..
443 // May be both __dest_os and __mac_os defined and empty? - ptr
444 # if __dest_os == __mac_os
445 inline int _FILE_fd(const FILE *__f) { return ::fileno(__CONST_CAST(FILE*, __f)); }
447 inline int _FILE_fd(const FILE *__f) { return ::_fileno(__CONST_CAST(FILE*, __f)); }
448 # endif // __dest_os == __mac_os
450 // Returns a pointer to the beginning of the buffer.
451 inline char* _FILE_I_begin(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer); }
452 // Returns the current read/write position within the buffer.
453 inline char* _FILE_I_next(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr); }
455 // Returns a pointer immediately past the end of the buffer.
456 inline char* _FILE_I_end(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr + __f->buffer_len); }
458 // Returns the number of characters remaining in the buffer, i.e.
459 // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
460 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->buffer_len; }
462 // Increments the current read/write position by 1, returning the
463 // character at the old position.
464 inline char& _FILE_I_preincr(FILE *__f)
465 { --__f->buffer_len; return *(char*) (++__f->buffer_ptr); }
466 inline char& _FILE_I_postincr(FILE *__f)
467 { --__f->buffer_len; return *(char*) (__f->buffer_ptr++); }
468 inline char& _FILE_I_predecr(FILE *__f)
469 { ++__f->buffer_len; return *(char*) (--__f->buffer_ptr); }
470 inline char& _FILE_I_postdecr(FILE *__f)
471 { ++__f->buffer_len; return *(char*) (__f->buffer_ptr--); }
472 inline void _FILE_I_bump(FILE *__f, int __n)
473 { __f->buffer_ptr += __n; __f->buffer_len -= __n; }
475 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
476 __f->buffer = __REINTERPRET_CAST(unsigned char*, __begin);
477 __f->buffer_ptr = __REINTERPRET_CAST(unsigned char*, __next);
478 __f->buffer_len = __end - __next;
479 __f->buffer_size = __end - __begin;
481 #else // N_PLAT_NLM - ptr
482 inline int _FILE_fd(const FILE *__f) { return __f->_file; }
483 inline char* _FILE_I_begin(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_base); }
484 // Returns the current read/write position within the buffer.
485 inline char* _FILE_I_next(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr); }
487 // Returns a pointer immediately past the end of the buffer.
488 inline char* _FILE_I_end(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr + __f->_avail); }
490 // Returns the number of characters remaining in the buffer, i.e.
491 // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
492 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_avail; }
494 // Increments the current read/write position by 1, returning the
495 // character at the old position.
496 inline char& _FILE_I_preincr(FILE *__f)
497 { --__f->_avail; return *(char*) (++__f->_ptr); }
498 inline char& _FILE_I_postincr(FILE *__f)
499 { --__f->_avail; return *(char*) (__f->_ptr++); }
500 inline char& _FILE_I_predecr(FILE *__f)
501 { ++__f->_avail; return *(char*) (--__f->_ptr); }
502 inline char& _FILE_I_postdecr(FILE *__f)
503 { ++__f->_avail; return *(char*) (__f->_ptr--); }
504 inline void _FILE_I_bump(FILE *__f, int __n)
505 { __f->_ptr += __n; __f->_avail -= __n; }
507 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
508 __f->_base = __REINTERPRET_CAST(unsigned char*, __begin);
509 __f->_ptr = __REINTERPRET_CAST(unsigned char*, __next);
510 __f->_avail = __end - __next;
515 # define _STLP_FILE_I_O_IDENTICAL
517 #elif defined(__DMC__)
519 inline int _FILE_fd(const FILE *__f) { return __f->_file; }
521 // Returns a pointer to the beginning of the buffer.
522 inline char* _FILE_I_begin(const FILE *__f) { return __f->_base; }
524 // Returns the current read/write position within the buffer.
525 inline char* _FILE_I_next(const FILE *__f) { return __f->_ptr; }
527 // Returns a pointer immediately past the end of the buffer.
528 inline char* _FILE_I_end(const FILE *__f) { return __f->_ptr + __f->_cnt; }
530 // Returns the number of characters remaining in the buffer, i.e.
531 // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
532 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
534 // Increments the current read/write position by 1, returning the
535 // character at the NEW position.
536 inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return *(++__f->_ptr); }
539 // Increments the current read/write position by 1, returning the
540 // character at the old position.
541 inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return *(__f->_ptr++); }
543 // Decrements the current read/write position by 1, returning the
544 // character at the NEW position.
545 inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return *(--__f->_ptr); }
547 // Decrements the current read/write position by 1, returning the
548 // character at the old position.
549 inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return *(__f->_ptr--); }
551 // Increments the current read/write position by __n.
552 inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
554 // Sets the beginning of the bufer to __begin, the current read/write
555 // position to __next, and the buffer's past-the-end pointer to __end.
556 // If any of those pointers is null, then all of them must be null.
557 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
559 __f->_base = __begin;
561 __f->_cnt = __end - __next;
562 __f->_bufsiz = __end - __begin;
565 # define _STLP_FILE_I_O_IDENTICAL
567 #elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW
569 inline int _FILE_fd(const FILE *__f) { return __f->_file; }
571 // Returns a pointer to the beginning of the buffer.
572 inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
574 // Returns the current read/write position within the buffer.
575 inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
577 // Returns a pointer immediately past the end of the buffer.
578 inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->_end; }
580 // Returns the number of characters remaining in the buffer, i.e.
581 // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
582 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
584 // Increments the current read/write position by 1, returning the
585 // character at the NEW position.
586 inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return*(char*) (++__f->_ptr); }
589 // Increments the current read/write position by 1, returning the
590 // character at the old position.
591 inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return*(char*) (__f->_ptr++); }
593 // Decrements the current read/write position by 1, returning the
594 // character at the NEW position.
595 inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return*(char*) (--__f->_ptr); }
597 // Decrements the current read/write position by 1, returning the
598 // character at the old position.
599 inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return*(char*) (__f->_ptr--); }
601 // Increments the current read/write position by __n.
602 inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
604 // Sets the beginning of the bufer to __begin, the current read/write
605 // position to __next, and the buffer's past-the-end pointer to __end.
606 // If any of those pointers is null, then all of them must be null.
607 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
609 __f->_base = (unsigned char*)__begin;
610 __f->_ptr = (unsigned char*)__next;
611 __f->_end = (unsigned char*)__end;
612 __f->_cnt = __end - __next;
613 __f->_size = __end - __begin;
616 # define _STLP_FILE_I_O_IDENTICAL
618 #elif defined (__MVS__)
620 typedef unsigned char* _File_ptr_type;
622 inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE
624 inline char* _FILE_I_begin(const FILE *__f) { return (char*)
625 __f->__fp->__bufPtr; }
626 inline char* _FILE_I_next(const FILE *__f) { return (char*)
627 __f->__fp->__bufPtr; }
628 inline char* _FILE_I_end(const FILE *__f)
629 { return (char*) __f->__fp->__bufPtr + __f->__fp->__countIn; }
631 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
632 __f->__fp->__countIn; }
634 inline char& _FILE_I_preincr(FILE *__f)
635 { --__f->__fp->__countIn; return *(char*) (++__f->__fp->__bufPtr); }
636 inline char& _FILE_I_postincr(FILE *__f)
637 { --__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr++); }
638 inline char& _FILE_I_predecr(FILE *__f)
639 { ++__f->__fp->__countIn; return *(char*) (--__f->__fp->__bufPtr); }
640 inline char& _FILE_I_postdecr(FILE *__f)
641 { ++__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr--); }
642 inline void _FILE_I_bump(FILE *__f, int __n)
643 { __f->__fp->__bufPtr += __n; __f->__fp->__countIn -= __n; }
645 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
647 // __f->_base = (_File_ptr_type) __begin;
649 __f->__fp->__bufPtr = (_File_ptr_type) __next;
650 __f->__fp->__countIn = __end - __next;
654 inline char* _FILE_O_begin(const FILE *__f) { return (char*)__f->__fp->__bufPtr;}
655 inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->__fp->__bufPtr;}
656 inline char* _FILE_O_end(const FILE *__f) { return (char*) __f->__fp->__bufPtr + __f->__fp->__countOut; }
657 inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->__fp->__countOut; }
659 inline char& _FILE_O_preincr(FILE *__f)
660 { --__f->__fp->__countOut; return *(char*) (++__f->__fp->__bufPtr); }
661 inline char& _FILE_O_postincr(FILE *__f)
662 { --__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr++); }
663 inline char& _FILE_O_predecr(FILE *__f)
664 { ++__f->__fp->__countOut; return *(char*) (--__f->__fp->__bufPtr); }
665 inline char& _FILE_O_postdecr(FILE *__f)
666 { ++__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr--); }
667 inline void _FILE_O_bump(FILE *__f, int __n)
668 { __f->__fp->__bufPtr += __n; __f->__fp->__countOut -= __n; }
670 inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char*
672 // __f->_base = (_File_ptr_type) __begin;
674 __f->__fp->__bufPtr = (_File_ptr_type) __next;
675 __f->__fp->__countOut = __end - __next;
679 #elif defined(__QNXNTO__)
681 inline int _FILE_fd(const FILE *__f) { return __f->_handle;
683 inline char* _FILE_I_begin(const FILE *__f) { return
684 (char*) __f->_base; }
685 inline char* _FILE_I_next(const FILE *__f) { return
687 inline char* _FILE_I_end(const FILE *__f)
688 { return (char*) __f->_ptr + __f->_cnt; }
690 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
693 inline char& _FILE_I_preincr(FILE *__f)
694 { --__f->_cnt; return *(char*) (++__f->_ptr); }
695 inline char& _FILE_I_postincr(FILE *__f)
696 { --__f->_cnt; return *(char*) (__f->_ptr++); }
697 inline char& _FILE_I_predecr(FILE *__f)
698 { ++__f->_cnt; return *(char*) (--__f->_ptr); }
699 inline char& _FILE_I_postdecr(FILE *__f)
700 { ++__f->_cnt; return *(char*) (__f->_ptr--); }
701 inline void _FILE_I_bump(FILE *__f, int __n)
702 { __f->_ptr += __n; __f->_cnt -= __n; }
704 inline void _FILE_I_set(FILE *__f, char* __begin, char*
707 __f->_base = (unsigned char*) __begin;
708 __f->_ptr = (unsigned char*) __next;
709 __f->_cnt = __end - __next;
712 # define _STLP_FILE_I_O_IDENTICAL
714 #elif defined(__WATCOMC__) // Nikolaev
716 inline int _FILE_fd (const FILE *__f) { return __f->_handle;}
717 inline char* _FILE_I_begin (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_link); }
718 inline char* _FILE_I_next (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr); }
719 inline char* _FILE_I_end (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr + __f->_cnt); }
720 inline ptrdiff_t _FILE_I_avail (const FILE *__f) { return __f->_cnt; }
722 inline char& _FILE_I_preincr(FILE *__f)
725 return *__REINTERPRET_CAST(char*, ++__f->_ptr);
728 inline char& _FILE_I_postincr(FILE *__f)
731 return *__REINTERPRET_CAST(char*, __f->_ptr++);
734 inline char& _FILE_I_predecr(FILE *__f)
737 return *__REINTERPRET_CAST(char*, --__f->_ptr);
740 inline char& _FILE_I_postdecr(FILE *__f)
743 return *__REINTERPRET_CAST(char*, __f->_ptr--);
746 inline void _FILE_I_bump(FILE *__f, int __n)
752 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
754 __f->_link = __REINTERPRET_CAST(__stream_link*, __begin);
755 __f->_ptr = __REINTERPRET_CAST(unsigned char*, __next);
756 __f->_cnt = __end - __next;
759 # define _STLP_FILE_I_O_IDENTICAL
761 #elif defined (__Lynx__)
763 // the prototypes are taken from LynxOS patch for STLport 4.0
764 inline int _FILE_fd(const FILE *__f) { return __f->_fd; }
765 inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
766 inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
767 inline char* _FILE_I_end(const FILE *__f)
768 { return (char*) __f->_ptr + __f->_cnt; }
770 inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
772 inline char& _FILE_I_preincr(FILE *__f)
773 { --__f->_cnt; return *(char*) (++__f->_ptr); }
774 inline char& _FILE_I_postincr(FILE *__f)
775 { --__f->_cnt; return *(char*) (__f->_ptr++); }
776 inline char& _FILE_I_predecr(FILE *__f)
777 { ++__f->_cnt; return *(char*) (--__f->_ptr); }
778 inline char& _FILE_I_postdecr(FILE *__f)
779 { ++__f->_cnt; return *(char*) (__f->_ptr--); }
780 inline void _FILE_I_bump(FILE *__f, int __n)
781 { __f->_ptr += __n; __f->_cnt -= __n; }
783 inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
784 __f->_base = __begin;
786 __f->_cnt = __end - __next;
788 # define _STLP_FILE_I_O_IDENTICAL
790 #else /* A C library that we don't have an implementation for. */
792 # error The C++ I/O library is not configured for this compiler
797 // For most stdio's , input and output FILE manipulation is identical.
798 # ifdef _STLP_FILE_I_O_IDENTICAL
799 inline char* _FILE_O_begin(const FILE *__f) { return _FILE_I_begin(__f); }
800 inline char* _FILE_O_next(const FILE *__f) { return _FILE_I_next(__f); }
801 inline char* _FILE_O_end(const FILE *__f) { return _FILE_I_end(__f); }
803 inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return _FILE_I_avail(__f); }
805 inline char& _FILE_O_preincr(FILE *__f) { return _FILE_I_preincr(__f); }
806 inline char& _FILE_O_postincr(FILE *__f) { return _FILE_I_postincr(__f); }
807 inline char& _FILE_O_predecr(FILE *__f) { return _FILE_I_predecr(__f); }
808 inline char& _FILE_O_postdecr(FILE *__f) { return _FILE_I_postdecr(__f); }
810 inline void _FILE_O_bump(FILE *__f, int __n) { _FILE_I_bump(__f, __n); }
811 inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end)
812 { _FILE_I_set(__f, __begin, __next, __end); }
817 #endif /* _STLP_STDIO_FILE_H */