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