Source code pulled from OpenBSD for OpenNTPD. The place to contribute to this code is via the OpenBSD CVS tree.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

422 lines
14 KiB

  1. /* $OpenBSD: stdio.h,v 1.14 2000/03/04 17:16:02 millert Exp $ */
  2. /* $NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $ */
  3. /*-
  4. * Copyright (c) 1990 The Regents of the University of California.
  5. * All rights reserved.
  6. *
  7. * This code is derived from software contributed to Berkeley by
  8. * Chris Torek.
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions
  12. * are met:
  13. * 1. Redistributions of source code must retain the above copyright
  14. * notice, this list of conditions and the following disclaimer.
  15. * 2. Redistributions in binary form must reproduce the above copyright
  16. * notice, this list of conditions and the following disclaimer in the
  17. * documentation and/or other materials provided with the distribution.
  18. * 3. All advertising materials mentioning features or use of this software
  19. * must display the following acknowledgement:
  20. * This product includes software developed by the University of
  21. * California, Berkeley and its contributors.
  22. * 4. Neither the name of the University nor the names of its contributors
  23. * may be used to endorse or promote products derived from this software
  24. * without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36. * SUCH DAMAGE.
  37. *
  38. * @(#)stdio.h 5.17 (Berkeley) 6/3/91
  39. */
  40. #ifndef _STDIO_H_
  41. #define _STDIO_H_
  42. #if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
  43. #include <sys/types.h>
  44. #endif
  45. #include <sys/cdefs.h>
  46. #include <machine/ansi.h>
  47. #ifdef _BSD_SIZE_T_
  48. typedef _BSD_SIZE_T_ size_t;
  49. #undef _BSD_SIZE_T_
  50. #endif
  51. #ifdef _BSD_OFF_T_
  52. typedef _BSD_OFF_T_ off_t;
  53. #undef _BSD_OFF_T_
  54. #endif
  55. #ifndef NULL
  56. #ifdef __GNUG__
  57. #define NULL __null
  58. #else
  59. #define NULL 0
  60. #endif
  61. #endif
  62. #define _FSTDIO /* Define for new stdio with functions. */
  63. typedef off_t fpos_t; /* stdio file position type */
  64. /*
  65. * NB: to fit things in six character monocase externals, the stdio
  66. * code uses the prefix `__s' for stdio objects, typically followed
  67. * by a three-character attempt at a mnemonic.
  68. */
  69. /* stdio buffers */
  70. struct __sbuf {
  71. unsigned char *_base;
  72. int _size;
  73. };
  74. /*
  75. * stdio state variables.
  76. *
  77. * The following always hold:
  78. *
  79. * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
  80. * _lbfsize is -_bf._size, else _lbfsize is 0
  81. * if _flags&__SRD, _w is 0
  82. * if _flags&__SWR, _r is 0
  83. *
  84. * This ensures that the getc and putc macros (or inline functions) never
  85. * try to write or read from a file that is in `read' or `write' mode.
  86. * (Moreover, they can, and do, automatically switch from read mode to
  87. * write mode, and back, on "r+" and "w+" files.)
  88. *
  89. * _lbfsize is used only to make the inline line-buffered output stream
  90. * code as compact as possible.
  91. *
  92. * _ub, _up, and _ur are used when ungetc() pushes back more characters
  93. * than fit in the current _bf, or when ungetc() pushes back a character
  94. * that does not match the previous one in _bf. When this happens,
  95. * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
  96. * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
  97. */
  98. typedef struct __sFILE {
  99. unsigned char *_p; /* current position in (some) buffer */
  100. int _r; /* read space left for getc() */
  101. int _w; /* write space left for putc() */
  102. short _flags; /* flags, below; this FILE is free if 0 */
  103. short _file; /* fileno, if Unix descriptor, else -1 */
  104. struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
  105. int _lbfsize; /* 0 or -_bf._size, for inline putc */
  106. /* operations */
  107. void *_cookie; /* cookie passed to io functions */
  108. int (*_close) __P((void *));
  109. int (*_read) __P((void *, char *, int));
  110. fpos_t (*_seek) __P((void *, fpos_t, int));
  111. int (*_write) __P((void *, const char *, int));
  112. /* separate buffer for long sequences of ungetc() */
  113. struct __sbuf _ub; /* ungetc buffer */
  114. unsigned char *_up; /* saved _p when _p is doing ungetc data */
  115. int _ur; /* saved _r when _r is counting ungetc data */
  116. /* tricks to meet minimum requirements even when malloc() fails */
  117. unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */
  118. unsigned char _nbuf[1]; /* guarantee a getc() buffer */
  119. /* separate buffer for fgetln() when line crosses buffer boundary */
  120. struct __sbuf _lb; /* buffer for fgetln() */
  121. /* Unix stdio files get aligned to block boundaries on fseek() */
  122. int _blksize; /* stat.st_blksize (may be != _bf._size) */
  123. fpos_t _offset; /* current lseek offset */
  124. } FILE;
  125. __BEGIN_DECLS
  126. extern FILE __sF[];
  127. __END_DECLS
  128. #define __SLBF 0x0001 /* line buffered */
  129. #define __SNBF 0x0002 /* unbuffered */
  130. #define __SRD 0x0004 /* OK to read */
  131. #define __SWR 0x0008 /* OK to write */
  132. /* RD and WR are never simultaneously asserted */
  133. #define __SRW 0x0010 /* open for reading & writing */
  134. #define __SEOF 0x0020 /* found EOF */
  135. #define __SERR 0x0040 /* found error */
  136. #define __SMBF 0x0080 /* _buf is from malloc */
  137. #define __SAPP 0x0100 /* fdopen()ed in append mode */
  138. #define __SSTR 0x0200 /* this is an sprintf/snprintf string */
  139. #define __SOPT 0x0400 /* do fseek() optimisation */
  140. #define __SNPT 0x0800 /* do not do fseek() optimisation */
  141. #define __SOFF 0x1000 /* set iff _offset is in fact correct */
  142. #define __SMOD 0x2000 /* true => fgetln modified _p text */
  143. #define __SALC 0x4000 /* allocate string space dynamically */
  144. /*
  145. * The following three definitions are for ANSI C, which took them
  146. * from System V, which brilliantly took internal interface macros and
  147. * made them official arguments to setvbuf(), without renaming them.
  148. * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
  149. *
  150. * Although numbered as their counterparts above, the implementation
  151. * does not rely on this.
  152. */
  153. #define _IOFBF 0 /* setvbuf should set fully buffered */
  154. #define _IOLBF 1 /* setvbuf should set line buffered */
  155. #define _IONBF 2 /* setvbuf should set unbuffered */
  156. #define BUFSIZ 1024 /* size of buffer used by setbuf */
  157. #define EOF (-1)
  158. /*
  159. * FOPEN_MAX is a minimum maximum, and should be the number of descriptors
  160. * that the kernel can provide without allocation of a resource that can
  161. * fail without the process sleeping. Do not use this for anything.
  162. */
  163. #define FOPEN_MAX 20 /* must be <= OPEN_MAX <sys/syslimits.h> */
  164. #define FILENAME_MAX 1024 /* must be <= PATH_MAX <sys/syslimits.h> */
  165. /* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
  166. #ifndef _ANSI_SOURCE
  167. #define P_tmpdir "/tmp/"
  168. #endif
  169. #define L_tmpnam 1024 /* XXX must be == PATH_MAX */
  170. #define TMP_MAX 308915776
  171. #ifndef SEEK_SET
  172. #define SEEK_SET 0 /* set file offset to offset */
  173. #endif
  174. #ifndef SEEK_CUR
  175. #define SEEK_CUR 1 /* set file offset to current plus offset */
  176. #endif
  177. #ifndef SEEK_END
  178. #define SEEK_END 2 /* set file offset to EOF plus offset */
  179. #endif
  180. #define stdin (&__sF[0])
  181. #define stdout (&__sF[1])
  182. #define stderr (&__sF[2])
  183. /*
  184. * Functions defined in ANSI C standard.
  185. */
  186. __BEGIN_DECLS
  187. void clearerr __P((FILE *));
  188. int fclose __P((FILE *));
  189. int feof __P((FILE *));
  190. int ferror __P((FILE *));
  191. int fflush __P((FILE *));
  192. int fgetc __P((FILE *));
  193. int fgetpos __P((FILE *, fpos_t *));
  194. char *fgets __P((char *, int, FILE *));
  195. FILE *fopen __P((const char *, const char *));
  196. int fprintf __P((FILE *, const char *, ...));
  197. int fputc __P((int, FILE *));
  198. int fputs __P((const char *, FILE *));
  199. size_t fread __P((void *, size_t, size_t, FILE *));
  200. FILE *freopen __P((const char *, const char *, FILE *));
  201. int fscanf __P((FILE *, const char *, ...));
  202. int fseek __P((FILE *, long, int));
  203. int fseeko __P((FILE *, off_t, int));
  204. int fsetpos __P((FILE *, const fpos_t *));
  205. long ftell __P((FILE *));
  206. off_t ftello __P((FILE *));
  207. size_t fwrite __P((const void *, size_t, size_t, FILE *));
  208. int getc __P((FILE *));
  209. int getchar __P((void));
  210. char *gets __P((char *));
  211. #if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE) && !defined(__SYS_ERRLIST)
  212. #define __SYS_ERRLIST
  213. extern int sys_nerr; /* perror(3) external variables */
  214. extern char *sys_errlist[];
  215. #endif
  216. void perror __P((const char *));
  217. int printf __P((const char *, ...));
  218. int putc __P((int, FILE *));
  219. int putchar __P((int));
  220. int puts __P((const char *));
  221. int remove __P((const char *));
  222. int rename __P((const char *, const char *));
  223. void rewind __P((FILE *));
  224. int scanf __P((const char *, ...));
  225. void setbuf __P((FILE *, char *));
  226. int setvbuf __P((FILE *, char *, int, size_t));
  227. int sprintf __P((char *, const char *, ...));
  228. int sscanf __P((const char *, const char *, ...));
  229. FILE *tmpfile __P((void));
  230. char *tmpnam __P((char *));
  231. int ungetc __P((int, FILE *));
  232. int vfprintf __P((FILE *, const char *, _BSD_VA_LIST_));
  233. int vprintf __P((const char *, _BSD_VA_LIST_));
  234. int vsprintf __P((char *, const char *, _BSD_VA_LIST_));
  235. __END_DECLS
  236. /*
  237. * Functions defined in POSIX 1003.1.
  238. */
  239. #ifndef _ANSI_SOURCE
  240. #define L_ctermid 1024 /* size for ctermid(); PATH_MAX */
  241. #define L_cuserid 9 /* size for cuserid(); UT_NAMESIZE + 1 */
  242. __BEGIN_DECLS
  243. char *ctermid __P((char *));
  244. char *ctermid_r __P((char *));
  245. char *cuserid __P((char *));
  246. FILE *fdopen __P((int, const char *));
  247. int fileno __P((FILE *));
  248. void flockfile __P((FILE *));
  249. int ftrylockfile __P((FILE *));
  250. void funlockfile __P((FILE *));
  251. void _flockfile_debug __P((FILE *, const char *, int));
  252. int getc_unlocked __P((FILE *));
  253. int putc_unlocked __P((int, FILE *));
  254. int getchar_unlocked __P((void));
  255. int putchar_unlocked __P((int));
  256. __END_DECLS
  257. #ifndef _POSIX_THREADS
  258. # define flockfile(fp) /* nothing */
  259. # define ftrylockfile(fp) (0)
  260. # define funlockfile(fp) /* nothing */
  261. # define _flockfile_debug(fp,f,l) /* nothing */
  262. #endif
  263. #if 0 /* defined(DEBUG_FLOCKFILE) && defined(_POSIX_THREADS) */
  264. # define flockfile(fp) _flockfile_debug(fp, __FILE__, __LINE__)
  265. #endif
  266. #endif /* not ANSI */
  267. /*
  268. * Routines that are purely local.
  269. */
  270. #if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
  271. __BEGIN_DECLS
  272. int asprintf __P((char **, const char *, ...))
  273. __attribute__((format (printf, 2, 3)));
  274. char *fgetln __P((FILE *, size_t *));
  275. int fpurge __P((FILE *));
  276. int getw __P((FILE *));
  277. int pclose __P((FILE *));
  278. FILE *popen __P((const char *, const char *));
  279. int putw __P((int, FILE *));
  280. void setbuffer __P((FILE *, char *, int));
  281. int setlinebuf __P((FILE *));
  282. char *tempnam __P((const char *, const char *));
  283. int snprintf __P((char *, size_t, const char *, ...))
  284. __attribute__((format (printf, 3, 4)));
  285. int vasprintf __P((char **, const char *, _BSD_VA_LIST_))
  286. __attribute__((format (printf, 2, 0)));
  287. int vsnprintf __P((char *, size_t, const char *, _BSD_VA_LIST_))
  288. __attribute__((format (printf, 3, 0)));
  289. int vscanf __P((const char *, _BSD_VA_LIST_))
  290. __attribute__((format (scanf, 1, 0)));
  291. int vsscanf __P((const char *, const char *, _BSD_VA_LIST_))
  292. __attribute__((format (scanf, 2, 0)));
  293. __END_DECLS
  294. /*
  295. * This is a #define because the function is used internally and
  296. * (unlike vfscanf) the name __svfscanf is guaranteed not to collide
  297. * with a user function when _ANSI_SOURCE or _POSIX_SOURCE is defined.
  298. */
  299. #define vfscanf __svfscanf
  300. /*
  301. * Stdio function-access interface.
  302. */
  303. __BEGIN_DECLS
  304. FILE *funopen __P((const void *,
  305. int (*)(void *, char *, int),
  306. int (*)(void *, const char *, int),
  307. fpos_t (*)(void *, fpos_t, int),
  308. int (*)(void *)));
  309. __END_DECLS
  310. #define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
  311. #define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
  312. #endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
  313. /*
  314. * Functions internal to the implementation.
  315. */
  316. __BEGIN_DECLS
  317. int __srget __P((FILE *));
  318. int __svfscanf __P((FILE *, const char *, _BSD_VA_LIST_));
  319. int __swbuf __P((int, FILE *));
  320. __END_DECLS
  321. /*
  322. * The __sfoo macros are here so that we can
  323. * define function versions in the C library.
  324. */
  325. #define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
  326. #if defined(__GNUC__) && defined(__STDC__)
  327. static __inline int __sputc(int _c, FILE *_p) {
  328. if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
  329. return (*_p->_p++ = _c);
  330. else
  331. return (__swbuf(_c, _p));
  332. }
  333. #else
  334. /*
  335. * This has been tuned to generate reasonable code on the vax using pcc.
  336. */
  337. #define __sputc(c, p) \
  338. (--(p)->_w < 0 ? \
  339. (p)->_w >= (p)->_lbfsize ? \
  340. (*(p)->_p = (c)), *(p)->_p != '\n' ? \
  341. (int)*(p)->_p++ : \
  342. __swbuf('\n', p) : \
  343. __swbuf((int)(c), p) : \
  344. (*(p)->_p = (c), (int)*(p)->_p++))
  345. #endif
  346. #define __sfeof(p) (((p)->_flags & __SEOF) != 0)
  347. #define __sferror(p) (((p)->_flags & __SERR) != 0)
  348. #define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
  349. #define __sfileno(p) ((p)->_file)
  350. #define feof(p) __sfeof(p)
  351. #define ferror(p) __sferror(p)
  352. #ifndef _POSIX_THREADS
  353. #define clearerr(p) __sclearerr(p)
  354. #endif
  355. #ifndef _ANSI_SOURCE
  356. #define fileno(p) __sfileno(p)
  357. #endif
  358. #ifndef lint
  359. #ifndef _POSIX_THREADS
  360. #define getc(fp) __sgetc(fp)
  361. #endif /* _POSIX_THREADS */
  362. #define getc_unlocked(fp) __sgetc(fp)
  363. /*
  364. * The macro implementations of putc and putc_unlocked are not
  365. * fully POSIX compliant; they do not set errno on failure
  366. */
  367. #ifndef _POSIX_SOURCE
  368. #ifndef _POSIX_THREADS
  369. #define putc(x, fp) __sputc(x, fp)
  370. #endif /* _POSIX_THREADS */
  371. #define putc_unlocked(x, fp) __sputc(x, fp)
  372. #endif /* _POSIX_SOURCE */
  373. #endif /* lint */
  374. #define getchar() getc(stdin)
  375. #define putchar(x) putc(x, stdout)
  376. #define getchar_unlocked() getc_unlocked(stdin)
  377. #define putchar_unlocked(c) putc_unlocked(c, stdout)
  378. #endif /* _STDIO_H_ */