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