/project/jni/stlport/src/_stdio_file.h

https://github.com/aichunyu/FFPlayer · C Header · 823 lines · 545 code · 157 blank · 121 comment · 34 complexity · 7052993cd85d1111b23c4ce5e6987512 MD5 · raw file

  1. /*
  2. * Copyright (c) 1999
  3. * Silicon Graphics Computer Systems, Inc.
  4. *
  5. * Copyright (c) 1999
  6. * Boris Fomitchev
  7. *
  8. * This material is provided "as is", with absolutely no warranty expressed
  9. * or implied. Any use is at your own risk.
  10. *
  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.
  16. *
  17. */
  18. // WARNING: This is an internal header file, included by other C++
  19. // standard library headers. You should not attempt to use this header
  20. // file directly.
  21. #ifndef _STLP_STDIO_FILE_H
  22. #define _STLP_STDIO_FILE_H
  23. // This file provides a low-level interface between the internal
  24. // representation of struct FILE, from the C stdio library, and
  25. // the C++ I/O library. The C++ I/O library views a FILE object as
  26. // a collection of three pointers: the beginning of the buffer, the
  27. // current read/write position, and the end of the buffer.
  28. // The interface:
  29. // - char* _FILE_[IO]_begin(const FILE *__f);
  30. // Returns a pointer to the beginning of the buffer.
  31. // - char* _FILE_[IO]_next(const FILE *__f);
  32. // Returns the current read/write position within the buffer.
  33. // - char* _FILE_[IO]_end(const FILE *__f);
  34. // Returns a pointer immediately past the end of the buffer.
  35. // - char* _FILE_[IO]_avail(const FILE *__f);
  36. // Returns the number of characters remaining in the buffer, i.e.
  37. // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
  38. // - char& _FILE_[IO]_preincr(FILE *__f)
  39. // Increments the current read/write position by 1, returning the
  40. // character at the old position.
  41. // - char& _FILE_[IO]_postincr(FILE *__f)
  42. // Increments the current read/write position by 1, returning the
  43. // character at the old position.
  44. // - char& _FILE_[IO]_predecr(FILE *__f)
  45. // Decrements the current read/write position by 1, returning the
  46. // character at the old position.
  47. // - char& _FILE_[IO]_postdecr(FILE *__f)
  48. // Decrements the current read/write position by 1, returning the
  49. // character at the old position.
  50. // - void _FILE_[IO]_bump(FILE *__f, int __n)
  51. // Increments the current read/write position by __n.
  52. // - void _FILE_[IO]_set(FILE *__f, char* __begin, char* __next, char* __end);
  53. // Sets the beginning of the bufer to __begin, the current read/write
  54. // position to __next, and the buffer's past-the-end pointer to __end.
  55. // If any of those pointers is null, then all of them must be null.
  56. // Each function comes in two versions, one for a FILE used as an input
  57. // buffer and one for a FILE used as an output buffer. In some stdio
  58. // implementations the two functions are identical, but in others they are
  59. // not.
  60. #ifndef _STLP_CSTDIO
  61. # include <cstdio>
  62. #endif
  63. #ifndef _STLP_CSTDDEF
  64. # include <cstddef>
  65. #endif
  66. #if defined(__MSL__) && !defined(N_PLAT_NLM)
  67. # include <unix.h> // get the definition of fileno
  68. #endif
  69. _STLP_BEGIN_NAMESPACE
  70. //----------------------------------------------------------------------
  71. // Implementation for eMbedded Visual C++ 3.0 and 4.2 (.NET)
  72. #if defined (_STLP_WCE)
  73. inline int _FILE_fd(const FILE *__f) { return (int)::_fileno((FILE*)__f); }
  74. # undef _STLP_FILE_I_O_IDENTICAL
  75. // Implementation for the IRIX C library.
  76. // Solaris interface looks to be identical.
  77. #elif !defined(_STLP_USE_GLIBC) && \
  78. ( defined(__sgi) || \
  79. ( defined(__sun) && ! defined (_LP64) ) || \
  80. defined (__osf__) || defined(__DECCXX) || \
  81. (defined (_STLP_MSVC) && !defined (_STLP_WCE_EVC3)) || \
  82. defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP) || defined (_AIX) || defined (_CRAY))
  83. #if defined (_STLP_MSVC) || defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP)
  84. typedef char* _File_ptr_type;
  85. #else
  86. typedef unsigned char* _File_ptr_type;
  87. #endif
  88. inline int _FILE_fd(const FILE *__f) { return __f->_file; }
  89. inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
  90. inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
  91. inline char* _FILE_I_end(const FILE *__f)
  92. { return (char*) __f->_ptr + __f->_cnt; }
  93. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
  94. inline char& _FILE_I_preincr(FILE *__f)
  95. { --__f->_cnt; return *(char*) (++__f->_ptr); }
  96. inline char& _FILE_I_postincr(FILE *__f)
  97. { --__f->_cnt; return *(char*) (__f->_ptr++); }
  98. inline char& _FILE_I_predecr(FILE *__f)
  99. { ++__f->_cnt; return *(char*) (--__f->_ptr); }
  100. inline char& _FILE_I_postdecr(FILE *__f)
  101. { ++__f->_cnt; return *(char*) (__f->_ptr--); }
  102. inline void _FILE_I_bump(FILE *__f, int __n)
  103. { __f->_ptr += __n; __f->_cnt -= __n; }
  104. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  105. __f->_base = (_File_ptr_type) __begin;
  106. __f->_ptr = (_File_ptr_type) __next;
  107. __f->_cnt = __end - __next;
  108. }
  109. # define _STLP_FILE_I_O_IDENTICAL 1
  110. #elif defined(__EMX__)
  111. inline int _FILE_fd(const FILE* __f) { return __f->_handle; }
  112. inline char* _FILE_I_begin(const FILE* __f) { return (char*) __f->_buffer; }
  113. inline char* _FILE_I_next(const FILE* __f) { return (char*) __f->_ptr; }
  114. inline char* _FILE_I_end(const FILE* __f) { return (char *) __f->_ptr + __f->_rcount; }
  115. inline ptrdiff_t _FILE_I_avail(const FILE* __f) { return __f->_rcount; }
  116. inline char& _FILE_I_preincr(FILE* __f) { --__f->_rcount; return *(char*) (++__f->_ptr); }
  117. inline char& _FILE_I_postincr(FILE* __f) { --__f->_rcount; return *(char*) (__f->_ptr++); }
  118. inline char& _FILE_I_predecr(FILE* __f) { ++__f->_rcount; return *(char*) (--__f->_ptr); }
  119. inline char& _FILE_I_postdecr(FILE* __f) { ++__f->_rcount; return *(char*) (__f->_ptr--); }
  120. inline void _FILE_I_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_rcount -= __n; }
  121. inline void _FILE_I_set(FILE* __f, char* __begin, char* __next, char* __end) {
  122. __f->_buffer = __begin;
  123. __f->_ptr = __next;
  124. __f->_rcount = __end - __next;
  125. }
  126. inline char* _FILE_O_begin(const FILE* __f) { return (char*) __f->_buffer; }
  127. inline char* _FILE_O_next(const FILE* __f) { return (char*) __f->_ptr; }
  128. inline char* _FILE_O_end(const FILE* __f) { return (char*) __f->_ptr + __f->_wcount; }
  129. inline ptrdiff_t _FILE_O_avail(const FILE* __f) { return __f->_wcount; }
  130. inline char& _FILE_O_preincr(FILE* __f) { --__f->_wcount; return *(char*) (++__f->_ptr); }
  131. inline char& _FILE_O_postincr(FILE* __f) { --__f->_wcount; return *(char*) (__f->_ptr++); }
  132. inline char& _FILE_O_predecr(FILE* __f) { ++__f->_wcount; return *(char*) (--__f->_ptr); }
  133. inline char& _FILE_O_postdecr(FILE* __f) { ++__f->_wcount; return *(char*) (__f->_ptr--); }
  134. inline void _FILE_O_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_wcount -= __n; }
  135. inline void _FILE_O_set(FILE* __f, char* __begin, char* __next, char* __end) {
  136. __f->_buffer = __begin;
  137. __f->_ptr = __next;
  138. __f->_wcount = __end - __next;
  139. }
  140. # undef _STLP_FILE_I_O_IDENTICAL
  141. # elif defined(_STLP_SCO_OPENSERVER) || defined(__NCR_SVR)
  142. typedef unsigned char* _File_ptr_type;
  143. inline int _FILE_fd(const FILE *__f) { return __f->__file; }
  144. inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__base; }
  145. inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__ptr; }
  146. inline char* _FILE_I_end(const FILE *__f)
  147. { return (char*) __f->__ptr + __f->__cnt; }
  148. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
  149. inline char& _FILE_I_preincr(FILE *__f)
  150. { --__f->__cnt; return *(char*) (++__f->__ptr); }
  151. inline char& _FILE_I_postincr(FILE *__f)
  152. { --__f->__cnt; return *(char*) (__f->__ptr++); }
  153. inline char& _FILE_I_predecr(FILE *__f)
  154. { ++__f->__cnt; return *(char*) (--__f->__ptr); }
  155. inline char& _FILE_I_postdecr(FILE *__f)
  156. { ++__f->__cnt; return *(char*) (__f->__ptr--); }
  157. inline void _FILE_I_bump(FILE *__f, int __n)
  158. { __f->__ptr += __n; __f->__cnt -= __n; }
  159. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  160. __f->__base = (_File_ptr_type) __begin;
  161. __f->__ptr = (_File_ptr_type) __next;
  162. __f->__cnt = __end - __next;
  163. }
  164. # define _STLP_FILE_I_O_IDENTICAL 1
  165. # elif defined(__sun) && defined( _LP64)
  166. typedef long _File_ptr_type;
  167. inline int _FILE_fd(const FILE *__f) { return (int) __f->__pad[2]; }
  168. inline char* _FILE_I_begin(const FILE *__f) { return (char*)
  169. __f->__pad[1]; }
  170. inline char* _FILE_I_next(const FILE *__f) { return (char*)
  171. __f->__pad[0]; }
  172. inline char* _FILE_I_end(const FILE *__f)
  173. { return (char*) __f->__pad[0] + __f->__pad[3]; }
  174. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__pad[3]; }
  175. inline char& _FILE_I_preincr(FILE *__f)
  176. { --__f->__pad[3]; return *(char*) (++__f->__pad[0]); }
  177. inline char& _FILE_I_postincr(FILE *__f)
  178. { --__f->__pad[3]; return *(char*) (__f->__pad[0]++); }
  179. inline char& _FILE_I_predecr(FILE *__f)
  180. { ++__f->__pad[3]; return *(char*) (--__f->__pad[0]); }
  181. inline char& _FILE_I_postdecr(FILE *__f)
  182. { ++__f->__pad[3]; return *(char*) (__f->__pad[0]--); }
  183. inline void _FILE_I_bump(FILE *__f, long __n)
  184. { __f->__pad[0] += __n; __f->__pad[3] -= __n; }
  185. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
  186. __end) {
  187. __f->__pad[1] = (_File_ptr_type) __begin;
  188. __f->__pad[0] = (_File_ptr_type) __next;
  189. __f->__pad[3] = __end - __next;
  190. }
  191. # define _STLP_FILE_I_O_IDENTICAL
  192. #elif defined (__CYGWIN__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
  193. || defined(__amigaos__) || ( defined(__GNUC__) && defined(__APPLE__) )
  194. inline int _FILE_fd(const FILE *__f) { return __f->_file; }
  195. inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_bf._base; }
  196. inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_p; }
  197. inline char* _FILE_I_end(const FILE *__f)
  198. { return (char*) __f->_p + __f->_r; }
  199. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_r; }
  200. #if ( defined(__GNUC__) && defined(__APPLE__) )
  201. inline char& _FILE_I_preincr(FILE *__f)
  202. { --__f->_r; return *(char*) (++__f->_p); }
  203. inline char& _FILE_I_postincr(FILE *__f)
  204. { --__f->_r; return *(char*) (__f->_p++); }
  205. inline char& _FILE_I_predecr(FILE *__f)
  206. { ++__f->_r; return *(char*) (--__f->_p); }
  207. inline char& _FILE_I_postdecr(FILE *__f)
  208. { ++__f->_r; return *(char*) (__f->_p--); }
  209. inline void _FILE_I_bump(FILE *__f, int __n)
  210. { __f->_p += __n; __f->_r -= __n; }
  211. #else
  212. inline char& _FILE_I_preincr(FILE *__f)
  213. { --__f->_r; --__f->_bf._size; return *(char*) (++__f->_p); }
  214. inline char& _FILE_I_postincr(FILE *__f)
  215. { --__f->_r; --__f->_bf._size; return *(char*) (__f->_p++); }
  216. inline char& _FILE_I_predecr(FILE *__f)
  217. { ++__f->_r; ++ __f->_bf._size; return *(char*) (--__f->_p); }
  218. inline char& _FILE_I_postdecr(FILE *__f)
  219. { ++__f->_r; ++__f->_bf._size; return *(char*) (__f->_p--); }
  220. inline void _FILE_I_bump(FILE *__f, int __n)
  221. { __f->_p += __n; __f->_bf._size+=__n; __f->_r -= __n; }
  222. #endif
  223. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  224. __f->_bf._base = (unsigned char*) __begin;
  225. __f->_p = (unsigned char*) __next;
  226. __f->_r = __f->_bf._size = __end - __next;
  227. }
  228. inline char* _FILE_O_begin(const FILE *__f) { return (char*) __f->_bf._base; }
  229. inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->_p; }
  230. inline char* _FILE_O_end(const FILE *__f)
  231. { return (char*) __f->_p + __f->_w; }
  232. inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->_w; }
  233. #if ( defined(__GNUC__) && defined(__APPLE__) )
  234. inline char& _FILE_O_preincr(FILE *__f)
  235. { --__f->_w; return *(char*) (++__f->_p); }
  236. inline char& _FILE_O_postincr(FILE *__f)
  237. { --__f->_w; return *(char*) (__f->_p++); }
  238. inline char& _FILE_O_predecr(FILE *__f)
  239. { ++__f->_w; return *(char*) (--__f->_p); }
  240. inline char& _FILE_O_postdecr(FILE *__f)
  241. { ++__f->_w; return *(char*) (__f->_p--); }
  242. inline void _FILE_O_bump(FILE *__f, int __n)
  243. { __f->_p += __n; __f->_w -= __n; }
  244. #else
  245. inline char& _FILE_O_preincr(FILE *__f)
  246. { --__f->_w; --__f->_bf._size; return *(char*) (++__f->_p); }
  247. inline char& _FILE_O_postincr(FILE *__f)
  248. { --__f->_w; --__f->_bf._size; return *(char*) (__f->_p++); }
  249. inline char& _FILE_O_predecr(FILE *__f)
  250. { ++__f->_w; ++__f->_bf._size; return *(char*) (--__f->_p); }
  251. inline char& _FILE_O_postdecr(FILE *__f)
  252. { ++__f->_w; ++__f->_bf._size; return *(char*) (__f->_p--); }
  253. inline void _FILE_O_bump(FILE *__f, int __n)
  254. { __f->_p += __n; __f->_bf._size+=__n; __f->_w -= __n; }
  255. #endif
  256. inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end) {
  257. __f->_bf._base = (unsigned char*) __begin;
  258. __f->_p = (unsigned char*) __next;
  259. __f->_w = __f->_bf._size = __end - __next;
  260. }
  261. # undef _STLP_FILE_I_O_IDENTICAL
  262. #elif defined(_STLP_USE_UCLIBC) /* should be before _STLP_USE_GLIBC */
  263. inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE *,__f)); }
  264. #elif defined(ANDROID) /* should be before _STLP_USE_GLIBC */
  265. inline int _FILE_fd(const FILE *__f) { return __f->_file; }
  266. #elif defined(_STLP_USE_GLIBC)
  267. inline int _FILE_fd(const FILE *__f) { return __f->_fileno; }
  268. inline char* _FILE_I_begin(const FILE *__f) { return __f->_IO_read_base; }
  269. inline char* _FILE_I_next(const FILE *__f) { return __f->_IO_read_ptr; }
  270. inline char* _FILE_I_end(const FILE *__f) { return __f->_IO_read_end; }
  271. inline ptrdiff_t _FILE_I_avail(const FILE *__f)
  272. { return __f->_IO_read_end - __f->_IO_read_ptr; }
  273. inline char& _FILE_I_preincr(FILE *__f) { return *++__f->_IO_read_ptr; }
  274. inline char& _FILE_I_postincr(FILE *__f) { return *__f->_IO_read_ptr++; }
  275. inline char& _FILE_I_predecr(FILE *__f) { return *--__f->_IO_read_ptr; }
  276. inline char& _FILE_I_postdecr(FILE *__f) { return *__f->_IO_read_ptr--; }
  277. inline void _FILE_I_bump(FILE *__f, int __n) { __f->_IO_read_ptr += __n; }
  278. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  279. __f->_IO_read_base = __begin;
  280. __f->_IO_read_ptr = __next;
  281. __f->_IO_read_end = __end;
  282. }
  283. inline char* _FILE_O_begin(const FILE *__f) { return __f->_IO_write_base; }
  284. inline char* _FILE_O_next(const FILE *__f) { return __f->_IO_write_ptr; }
  285. inline char* _FILE_O_end(const FILE *__f) { return __f->_IO_write_end; }
  286. inline ptrdiff_t _FILE_O_avail(const FILE *__f)
  287. { return __f->_IO_write_end - __f->_IO_write_ptr; }
  288. inline char& _FILE_O_preincr(FILE *__f) { return *++__f->_IO_write_ptr; }
  289. inline char& _FILE_O_postincr(FILE *__f) { return *__f->_IO_write_ptr++; }
  290. inline char& _FILE_O_predecr(FILE *__f) { return *--__f->_IO_write_ptr; }
  291. inline char& _FILE_O_postdecr(FILE *__f) { return *__f->_IO_write_ptr--; }
  292. inline void _FILE_O_bump(FILE *__f, int __n) { __f->_IO_write_ptr += __n; }
  293. inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end) {
  294. __f->_IO_write_base = __begin;
  295. __f->_IO_write_ptr = __next;
  296. __f->_IO_write_end = __end;
  297. }
  298. #elif defined(__hpux) /* && defined(__hppa) && defined(__HP_aCC)) */
  299. #ifndef _INCLUDE_HPUX_SOURCE
  300. extern "C" unsigned char *__bufendtab[];
  301. # undef _bufend
  302. # define _bufend(__p) \
  303. (*(((__p)->__flag & _IOEXT) ? &(((_FILEX *)(__p))->__bufendp) \
  304. : &(__bufendtab[(__p) - __iob])))
  305. # define _bufsiz(__p) (_bufend(__p) - (__p)->__base)
  306. #endif /* _INCLUDE_HPUX_SOURCE */
  307. #if defined(_STLP_HPACC_BROKEN_BUFEND)
  308. # undef _bufend
  309. # define _bufend(__p) \
  310. (*(((__p)->__flag & _IOEXT) ? &((__REINTERPRET_CAST(_FILEX*,(__p)))->__bufendp) \
  311. : &(__bufendtab[__REINTERPRET_CAST(FILE*,(__p)) - __iob])))
  312. #endif
  313. inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE *,__f)); }
  314. inline char* _FILE_I_begin(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__base)); }
  315. inline char* _FILE_I_next(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__ptr)); }
  316. inline char* _FILE_I_end(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__ptr +__f->__cnt)); }
  317. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
  318. inline char& _FILE_I_preincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, ++__f->__ptr); }
  319. inline char& _FILE_I_postincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, __f->__ptr++); }
  320. inline char& _FILE_I_predecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,--__f->__ptr); }
  321. inline char& _FILE_I_postdecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,__f->__ptr--); }
  322. inline void _FILE_I_bump(FILE *__f, int __n) { __f->__cnt -= __n; __f->__ptr += __n; }
  323. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  324. # if defined(__hpux)
  325. if( (unsigned long) (__f - &__iob[0]) > _NFILE)
  326. __f->__flag |= _IOEXT; // used by stdio's _bufend macro and goodness knows what else...
  327. # endif
  328. __f->__cnt = __end - __next;
  329. __f->__base = __REINTERPRET_CAST(unsigned char*, __begin);
  330. __f->__ptr = __REINTERPRET_CAST(unsigned char*, __next);
  331. _bufend(__f) = __REINTERPRET_CAST(unsigned char*, __end);
  332. }
  333. // For HPUX stdio, input and output FILE manipulation is identical.
  334. # define _STLP_FILE_I_O_IDENTICAL
  335. #elif defined (__BORLANDC__)
  336. typedef unsigned char* _File_ptr_type;
  337. inline int _FILE_fd(const FILE *__f) { return __f->fd; }
  338. inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->buffer;
  339. }
  340. inline char* _FILE_I_next(const FILE *__f)
  341. { return (char*)__f->curp; }
  342. inline char* _FILE_I_end(const FILE *__f)
  343. { return (char*) __f->curp + __f->level; }
  344. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->level; }
  345. inline char& _FILE_I_preincr(FILE *__f)
  346. { --__f->level; return *(char*) (++__f->curp); }
  347. inline char& _FILE_I_postincr(FILE *__f)
  348. { --__f->level; return *(char*) (__f->curp++); }
  349. inline char& _FILE_I_predecr(FILE *__f)
  350. { ++__f->level; return *(char*) (--__f->curp); }
  351. inline char& _FILE_I_postdecr(FILE *__f)
  352. { ++__f->level; return *(char*) (__f->curp--); }
  353. inline void _FILE_I_bump(FILE *__f, int __n)
  354. { __f->curp += __n; __f->level -= __n; }
  355. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  356. __f->buffer = (_File_ptr_type) __begin;
  357. __f->curp = (_File_ptr_type) __next;
  358. __f->level = __end - __next;
  359. }
  360. # define _STLP_FILE_I_O_IDENTICAL
  361. #elif defined( __MWERKS__ )
  362. // using MWERKS-specific defines here to detect other OS targets
  363. // dwa: I'm not sure they provide fileno for all OS's, but this should
  364. // work for Win32 and WinCE
  365. #ifndef N_PLAT_NLM
  366. // Hmm, at least for Novell NetWare __dest_os == __mac_os true too..
  367. // May be both __dest_os and __mac_os defined and empty? - ptr
  368. # if __dest_os == __mac_os
  369. inline int _FILE_fd(const FILE *__f) { return ::fileno(__CONST_CAST(FILE*, __f)); }
  370. # else
  371. inline int _FILE_fd(const FILE *__f) { return ::_fileno(__CONST_CAST(FILE*, __f)); }
  372. # endif // __dest_os == __mac_os
  373. // Returns a pointer to the beginning of the buffer.
  374. inline char* _FILE_I_begin(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer); }
  375. // Returns the current read/write position within the buffer.
  376. inline char* _FILE_I_next(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr); }
  377. // Returns a pointer immediately past the end of the buffer.
  378. inline char* _FILE_I_end(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr + __f->buffer_len); }
  379. // Returns the number of characters remaining in the buffer, i.e.
  380. // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
  381. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->buffer_len; }
  382. // Increments the current read/write position by 1, returning the
  383. // character at the old position.
  384. inline char& _FILE_I_preincr(FILE *__f)
  385. { --__f->buffer_len; return *(char*) (++__f->buffer_ptr); }
  386. inline char& _FILE_I_postincr(FILE *__f)
  387. { --__f->buffer_len; return *(char*) (__f->buffer_ptr++); }
  388. inline char& _FILE_I_predecr(FILE *__f)
  389. { ++__f->buffer_len; return *(char*) (--__f->buffer_ptr); }
  390. inline char& _FILE_I_postdecr(FILE *__f)
  391. { ++__f->buffer_len; return *(char*) (__f->buffer_ptr--); }
  392. inline void _FILE_I_bump(FILE *__f, int __n)
  393. { __f->buffer_ptr += __n; __f->buffer_len -= __n; }
  394. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  395. __f->buffer = __REINTERPRET_CAST(unsigned char*, __begin);
  396. __f->buffer_ptr = __REINTERPRET_CAST(unsigned char*, __next);
  397. __f->buffer_len = __end - __next;
  398. __f->buffer_size = __end - __begin;
  399. }
  400. #else // N_PLAT_NLM - ptr
  401. inline int _FILE_fd(const FILE *__f) { return __f->_file; }
  402. inline char* _FILE_I_begin(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_base); }
  403. // Returns the current read/write position within the buffer.
  404. inline char* _FILE_I_next(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr); }
  405. // Returns a pointer immediately past the end of the buffer.
  406. inline char* _FILE_I_end(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr + __f->_avail); }
  407. // Returns the number of characters remaining in the buffer, i.e.
  408. // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
  409. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_avail; }
  410. // Increments the current read/write position by 1, returning the
  411. // character at the old position.
  412. inline char& _FILE_I_preincr(FILE *__f)
  413. { --__f->_avail; return *(char*) (++__f->_ptr); }
  414. inline char& _FILE_I_postincr(FILE *__f)
  415. { --__f->_avail; return *(char*) (__f->_ptr++); }
  416. inline char& _FILE_I_predecr(FILE *__f)
  417. { ++__f->_avail; return *(char*) (--__f->_ptr); }
  418. inline char& _FILE_I_postdecr(FILE *__f)
  419. { ++__f->_avail; return *(char*) (__f->_ptr--); }
  420. inline void _FILE_I_bump(FILE *__f, int __n)
  421. { __f->_ptr += __n; __f->_avail -= __n; }
  422. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  423. __f->_base = __REINTERPRET_CAST(unsigned char*, __begin);
  424. __f->_ptr = __REINTERPRET_CAST(unsigned char*, __next);
  425. __f->_avail = __end - __next;
  426. }
  427. #endif // N_PLAT_NLM
  428. # define _STLP_FILE_I_O_IDENTICAL
  429. #elif defined(__DMC__)
  430. inline int _FILE_fd(const FILE *__f) { return __f->_file; }
  431. // Returns a pointer to the beginning of the buffer.
  432. inline char* _FILE_I_begin(const FILE *__f) { return __f->_base; }
  433. // Returns the current read/write position within the buffer.
  434. inline char* _FILE_I_next(const FILE *__f) { return __f->_ptr; }
  435. // Returns a pointer immediately past the end of the buffer.
  436. inline char* _FILE_I_end(const FILE *__f) { return __f->_ptr + __f->_cnt; }
  437. // Returns the number of characters remaining in the buffer, i.e.
  438. // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
  439. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
  440. // Increments the current read/write position by 1, returning the
  441. // character at the NEW position.
  442. inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return *(++__f->_ptr); }
  443. // Increments the current read/write position by 1, returning the
  444. // character at the old position.
  445. inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return *(__f->_ptr++); }
  446. // Decrements the current read/write position by 1, returning the
  447. // character at the NEW position.
  448. inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return *(--__f->_ptr); }
  449. // Decrements the current read/write position by 1, returning the
  450. // character at the old position.
  451. inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return *(__f->_ptr--); }
  452. // Increments the current read/write position by __n.
  453. inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
  454. // Sets the beginning of the bufer to __begin, the current read/write
  455. // position to __next, and the buffer's past-the-end pointer to __end.
  456. // If any of those pointers is null, then all of them must be null.
  457. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
  458. {
  459. __f->_base = __begin;
  460. __f->_ptr = __next;
  461. __f->_cnt = __end - __next;
  462. __f->_bufsiz = __end - __begin;
  463. }
  464. # define _STLP_FILE_I_O_IDENTICAL
  465. #elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW
  466. inline int _FILE_fd(const FILE *__f) { return __f->_file; }
  467. // Returns a pointer to the beginning of the buffer.
  468. inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
  469. // Returns the current read/write position within the buffer.
  470. inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
  471. // Returns a pointer immediately past the end of the buffer.
  472. inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->_end; }
  473. // Returns the number of characters remaining in the buffer, i.e.
  474. // _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
  475. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
  476. // Increments the current read/write position by 1, returning the
  477. // character at the NEW position.
  478. inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return*(char*) (++__f->_ptr); }
  479. // Increments the current read/write position by 1, returning the
  480. // character at the old position.
  481. inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return*(char*) (__f->_ptr++); }
  482. // Decrements the current read/write position by 1, returning the
  483. // character at the NEW position.
  484. inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return*(char*) (--__f->_ptr); }
  485. // Decrements the current read/write position by 1, returning the
  486. // character at the old position.
  487. inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return*(char*) (__f->_ptr--); }
  488. // Increments the current read/write position by __n.
  489. inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
  490. // Sets the beginning of the bufer to __begin, the current read/write
  491. // position to __next, and the buffer's past-the-end pointer to __end.
  492. // If any of those pointers is null, then all of them must be null.
  493. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
  494. {
  495. __f->_base = (unsigned char*)__begin;
  496. __f->_ptr = (unsigned char*)__next;
  497. __f->_end = (unsigned char*)__end;
  498. __f->_cnt = __end - __next;
  499. __f->_size = __end - __begin;
  500. }
  501. # define _STLP_FILE_I_O_IDENTICAL
  502. #elif defined (__MVS__)
  503. typedef unsigned char* _File_ptr_type;
  504. inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE
  505. *,__f)); }
  506. inline char* _FILE_I_begin(const FILE *__f) { return (char*)
  507. __f->__fp->__bufPtr; }
  508. inline char* _FILE_I_next(const FILE *__f) { return (char*)
  509. __f->__fp->__bufPtr; }
  510. inline char* _FILE_I_end(const FILE *__f)
  511. { return (char*) __f->__fp->__bufPtr + __f->__fp->__countIn; }
  512. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
  513. __f->__fp->__countIn; }
  514. inline char& _FILE_I_preincr(FILE *__f)
  515. { --__f->__fp->__countIn; return *(char*) (++__f->__fp->__bufPtr); }
  516. inline char& _FILE_I_postincr(FILE *__f)
  517. { --__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr++); }
  518. inline char& _FILE_I_predecr(FILE *__f)
  519. { ++__f->__fp->__countIn; return *(char*) (--__f->__fp->__bufPtr); }
  520. inline char& _FILE_I_postdecr(FILE *__f)
  521. { ++__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr--); }
  522. inline void _FILE_I_bump(FILE *__f, int __n)
  523. { __f->__fp->__bufPtr += __n; __f->__fp->__countIn -= __n; }
  524. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
  525. __end) {
  526. // __f->_base = (_File_ptr_type) __begin;
  527. if(__f->__fp) {
  528. __f->__fp->__bufPtr = (_File_ptr_type) __next;
  529. __f->__fp->__countIn = __end - __next;
  530. }
  531. }
  532. inline char* _FILE_O_begin(const FILE *__f) { return (char*)__f->__fp->__bufPtr;}
  533. inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->__fp->__bufPtr;}
  534. inline char* _FILE_O_end(const FILE *__f) { return (char*) __f->__fp->__bufPtr + __f->__fp->__countOut; }
  535. inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->__fp->__countOut; }
  536. inline char& _FILE_O_preincr(FILE *__f)
  537. { --__f->__fp->__countOut; return *(char*) (++__f->__fp->__bufPtr); }
  538. inline char& _FILE_O_postincr(FILE *__f)
  539. { --__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr++); }
  540. inline char& _FILE_O_predecr(FILE *__f)
  541. { ++__f->__fp->__countOut; return *(char*) (--__f->__fp->__bufPtr); }
  542. inline char& _FILE_O_postdecr(FILE *__f)
  543. { ++__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr--); }
  544. inline void _FILE_O_bump(FILE *__f, int __n)
  545. { __f->__fp->__bufPtr += __n; __f->__fp->__countOut -= __n; }
  546. inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char*
  547. __end) {
  548. // __f->_base = (_File_ptr_type) __begin;
  549. if(__f->__fp) {
  550. __f->__fp->__bufPtr = (_File_ptr_type) __next;
  551. __f->__fp->__countOut = __end - __next;
  552. }
  553. }
  554. #elif defined(__QNXNTO__)
  555. inline int _FILE_fd(const FILE *__f) { return __f->_handle;
  556. }
  557. inline char* _FILE_I_begin(const FILE *__f) { return
  558. (char*) __f->_base; }
  559. inline char* _FILE_I_next(const FILE *__f) { return
  560. (char*) __f->_ptr; }
  561. inline char* _FILE_I_end(const FILE *__f)
  562. { return (char*) __f->_ptr + __f->_cnt; }
  563. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
  564. __f->_cnt; }
  565. inline char& _FILE_I_preincr(FILE *__f)
  566. { --__f->_cnt; return *(char*) (++__f->_ptr); }
  567. inline char& _FILE_I_postincr(FILE *__f)
  568. { --__f->_cnt; return *(char*) (__f->_ptr++); }
  569. inline char& _FILE_I_predecr(FILE *__f)
  570. { ++__f->_cnt; return *(char*) (--__f->_ptr); }
  571. inline char& _FILE_I_postdecr(FILE *__f)
  572. { ++__f->_cnt; return *(char*) (__f->_ptr--); }
  573. inline void _FILE_I_bump(FILE *__f, int __n)
  574. { __f->_ptr += __n; __f->_cnt -= __n; }
  575. inline void _FILE_I_set(FILE *__f, char* __begin, char*
  576. __next, char*
  577. __end) {
  578. __f->_base = (unsigned char*) __begin;
  579. __f->_ptr = (unsigned char*) __next;
  580. __f->_cnt = __end - __next;
  581. }
  582. # define _STLP_FILE_I_O_IDENTICAL
  583. #elif defined(__WATCOMC__) // Nikolaev
  584. inline int _FILE_fd (const FILE *__f) { return __f->_handle;}
  585. inline char* _FILE_I_begin (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_link); }
  586. inline char* _FILE_I_next (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr); }
  587. inline char* _FILE_I_end (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr + __f->_cnt); }
  588. inline ptrdiff_t _FILE_I_avail (const FILE *__f) { return __f->_cnt; }
  589. inline char& _FILE_I_preincr(FILE *__f)
  590. {
  591. --__f->_cnt;
  592. return *__REINTERPRET_CAST(char*, ++__f->_ptr);
  593. }
  594. inline char& _FILE_I_postincr(FILE *__f)
  595. {
  596. --__f->_cnt;
  597. return *__REINTERPRET_CAST(char*, __f->_ptr++);
  598. }
  599. inline char& _FILE_I_predecr(FILE *__f)
  600. {
  601. ++__f->_cnt;
  602. return *__REINTERPRET_CAST(char*, --__f->_ptr);
  603. }
  604. inline char& _FILE_I_postdecr(FILE *__f)
  605. {
  606. ++__f->_cnt;
  607. return *__REINTERPRET_CAST(char*, __f->_ptr--);
  608. }
  609. inline void _FILE_I_bump(FILE *__f, int __n)
  610. {
  611. __f->_ptr += __n;
  612. __f->_cnt -= __n;
  613. }
  614. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
  615. {
  616. __f->_link = __REINTERPRET_CAST(__stream_link*, __begin);
  617. __f->_ptr = __REINTERPRET_CAST(unsigned char*, __next);
  618. __f->_cnt = __end - __next;
  619. }
  620. # define _STLP_FILE_I_O_IDENTICAL
  621. #elif defined (__Lynx__)
  622. // the prototypes are taken from LynxOS patch for STLport 4.0
  623. inline int _FILE_fd(const FILE *__f) { return __f->_fd; }
  624. inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
  625. inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
  626. inline char* _FILE_I_end(const FILE *__f)
  627. { return (char*) __f->_ptr + __f->_cnt; }
  628. inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
  629. inline char& _FILE_I_preincr(FILE *__f)
  630. { --__f->_cnt; return *(char*) (++__f->_ptr); }
  631. inline char& _FILE_I_postincr(FILE *__f)
  632. { --__f->_cnt; return *(char*) (__f->_ptr++); }
  633. inline char& _FILE_I_predecr(FILE *__f)
  634. { ++__f->_cnt; return *(char*) (--__f->_ptr); }
  635. inline char& _FILE_I_postdecr(FILE *__f)
  636. { ++__f->_cnt; return *(char*) (__f->_ptr--); }
  637. inline void _FILE_I_bump(FILE *__f, int __n)
  638. { __f->_ptr += __n; __f->_cnt -= __n; }
  639. inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
  640. __f->_base = __begin;
  641. __f->_ptr = __next;
  642. __f->_cnt = __end - __next;
  643. }
  644. # define _STLP_FILE_I_O_IDENTICAL
  645. #else /* A C library that we don't have an implementation for. */
  646. # error The C++ I/O library is not configured for this compiler
  647. #endif
  648. // For most stdio's , input and output FILE manipulation is identical.
  649. # ifdef _STLP_FILE_I_O_IDENTICAL
  650. inline char* _FILE_O_begin(const FILE *__f) { return _FILE_I_begin(__f); }
  651. inline char* _FILE_O_next(const FILE *__f) { return _FILE_I_next(__f); }
  652. inline char* _FILE_O_end(const FILE *__f) { return _FILE_I_end(__f); }
  653. inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return _FILE_I_avail(__f); }
  654. inline char& _FILE_O_preincr(FILE *__f) { return _FILE_I_preincr(__f); }
  655. inline char& _FILE_O_postincr(FILE *__f) { return _FILE_I_postincr(__f); }
  656. inline char& _FILE_O_predecr(FILE *__f) { return _FILE_I_predecr(__f); }
  657. inline char& _FILE_O_postdecr(FILE *__f) { return _FILE_I_postdecr(__f); }
  658. inline void _FILE_O_bump(FILE *__f, int __n) { _FILE_I_bump(__f, __n); }
  659. inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end)
  660. { _FILE_I_set(__f, __begin, __next, __end); }
  661. # endif
  662. _STLP_END_NAMESPACE
  663. #endif /* _STLP_STDIO_FILE_H */
  664. // Local Variables:
  665. // mode:C++
  666. // End: