Add the source code for /usr/src/usr.bin from the Net/2 tape
[unix-history] / usr / src / include / stdio.h
index def24b0..5489652 100644 (file)
@@ -5,22 +5,43 @@
  * This code is derived from software contributed to Berkeley by
  * Chris Torek.
  *
  * This code is derived from software contributed to Berkeley by
  * Chris Torek.
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
  *
  *
- *     @(#)stdio.h     5.8 (Berkeley) %G%
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)stdio.h     5.17 (Berkeley) 6/3/91
  */
 
 #ifndef        _STDIO_H_
 #define        _STDIO_H_
 
  */
 
 #ifndef        _STDIO_H_
 #define        _STDIO_H_
 
-/*
- * NB: to fit things in six character monocase externals, the stdio
- * code uses the prefix `__s' for stdio objects, typically followed
- * by a three-character attempt at a mnemonic.
- */
-
-#include <machine/types.h>
+#include <sys/cdefs.h>
 
 
+#include <machine/ansi.h>
 #ifdef _SIZE_T_
 typedef        _SIZE_T_        size_t;
 #undef _SIZE_T_
 #ifdef _SIZE_T_
 typedef        _SIZE_T_        size_t;
 #undef _SIZE_T_
@@ -34,6 +55,12 @@ typedef long fpos_t;         /* Must match off_t <sys/types.h> */
 
 #define        _FSTDIO                 /* Define for new stdio with functions. */
 
 
 #define        _FSTDIO                 /* Define for new stdio with functions. */
 
+/*
+ * NB: to fit things in six character monocase externals, the stdio
+ * code uses the prefix `__s' for stdio objects, typically followed
+ * by a three-character attempt at a mnemonic.
+ */
+
 /* stdio buffers */
 struct __sbuf {
        unsigned char *_base;
 /* stdio buffers */
 struct __sbuf {
        unsigned char *_base;
@@ -75,17 +102,10 @@ typedef    struct __sFILE {
 
        /* operations */
        void    *_cookie;       /* cookie passed to io functions */
 
        /* operations */
        void    *_cookie;       /* cookie passed to io functions */
-#if __STDC__ || c_plusplus
-       int     (*_read)(void *_cookie, char *_buf, int _n);
-       int     (*_write)(void *_cookie, const char *_buf, int _n);
-       fpos_t  (*_seek)(void *_cookie, fpos_t _offset, int _whence);
-       int     (*_close)(void *_cookie);
-#else
-       int     (*_read)();
-       int     (*_write)();
-       fpos_t  (*_seek)();
-       int     (*_close)();
-#endif
+       int     (*_close) __P((void *));
+       int     (*_read)  __P((void *, char *, int));
+       fpos_t  (*_seek)  __P((void *, fpos_t, int));
+       int     (*_write) __P((void *, const char *, int));
 
        /* separate buffer for long sequences of ungetc() */
        struct  __sbuf _ub;     /* ungetc buffer */
 
        /* separate buffer for long sequences of ungetc() */
        struct  __sbuf _ub;     /* ungetc buffer */
@@ -104,7 +124,9 @@ typedef     struct __sFILE {
        int     _offset;        /* current lseek offset */
 } FILE;
 
        int     _offset;        /* current lseek offset */
 } FILE;
 
+__BEGIN_DECLS
 extern FILE __sF[];
 extern FILE __sF[];
+__END_DECLS
 
 #define        __SLBF  0x0001          /* line buffered */
 #define        __SNBF  0x0002          /* unbuffered */
 
 #define        __SLBF  0x0001          /* line buffered */
 #define        __SNBF  0x0002          /* unbuffered */
@@ -148,7 +170,7 @@ extern FILE __sF[];
 
 /* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
 #ifndef _ANSI_SOURCE
 
 /* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
 #ifndef _ANSI_SOURCE
-#define        P_tmpdir        "/usr/tmp/"
+#define        P_tmpdir        "/var/tmp/"
 #endif
 #define        L_tmpnam        1024    /* XXX must be == PATH_MAX */
 #define        TMP_MAX         308915776
 #endif
 #define        L_tmpnam        1024    /* XXX must be == PATH_MAX */
 #define        TMP_MAX         308915776
@@ -170,91 +192,53 @@ extern FILE __sF[];
 /*
  * Functions defined in ANSI C standard.
  */
 /*
  * Functions defined in ANSI C standard.
  */
-#if __STDC__ || c_plusplus
-int    remove(const char *);
-int    rename(const char *_old, const char *_new);
-FILE   *tmpfile(void);
-char   *tmpnam(char *);
-int    fclose(FILE *);
-int    fflush(FILE *);
-FILE   *fopen(const char *_name, const char *_type);
-FILE   *freopen(const char *_name, const char *_type, FILE *_stream);
-void   setbuf(FILE *, char *);
-int    setvbuf(FILE *, char *, int, size_t);
-int    fprintf(FILE *, const char *, ...);
-int    fscanf(FILE *, const char *, ...);
-int    printf(const char *, ...);
-int    scanf(const char *, ...);
-int    sprintf(char *, const char *, ...);
-int    sscanf(char *, const char *, ...);
-int    vfprintf(FILE *, const char *, _VA_LIST_);
-int    vprintf(const char *, _VA_LIST_);
-int    vsprintf(char *, const char *, _VA_LIST_);
-int    fgetc(FILE *);
-char   *fgets(char *, size_t, FILE *);
-int    fputc(int, FILE *);
-int    fputs(const char *, FILE *);
-int    getc(FILE *);
-int    getchar(void);
-char   *gets(char *);
-int    putc(int, FILE *);
-int    putchar(int);
-int    puts(const char *);
-int    ungetc(int, FILE *);
-int    fread(void *, size_t _size, size_t _n, FILE *);
-int    fwrite(const void *, size_t _size, size_t _n, FILE *);
-int    fgetpos(FILE *, fpos_t *);
-int    fseek(FILE *, long, int);
-int    fsetpos(FILE *, const fpos_t *);
-long   ftell(const FILE *);
-void   rewind(FILE *);
-void   clearerr(FILE *);
-int    feof(FILE *);
-int    ferror(FILE *);
-void   perror(const char *);
-#else
-int    remove();
-int    rename();
-FILE   *tmpfile();
-char   *tmpnam();
-int    fclose();
-int    fflush();
-FILE   *fopen();
-FILE   *freopen();
-void   setbuf();
-int    setvbuf();
-int    fprintf();
-int    fscanf();
-int    printf();
-int    scanf();
-int    sprintf();
-int    sscanf();
-int    vfprintf();
-int    vprintf();
-int    vsprintf();
-int    fgetc();
-char   *fgets();
-int    fputc();
-int    fputs();
-int    getc();
-int    getchar();
-char   *gets();
-int    putc();
-int    putchar();
-int    puts();
-int    ungetc();
-int    fread();
-int    fwrite();
-int    fgetpos();
-int    fseek();
-int    fsetpos();
-long   ftell();
-void   rewind();
-void   clearerr();
-int    feof();
-int    ferror();
-void   perror();
+__BEGIN_DECLS
+void    clearerr __P((FILE *));
+int     fclose __P((FILE *));
+int     feof __P((FILE *));
+int     ferror __P((FILE *));
+int     fflush __P((FILE *));
+int     fgetc __P((FILE *));
+int     fgetpos __P((FILE *, fpos_t *));
+char   *fgets __P((char *, size_t, FILE *));
+FILE   *fopen __P((const char *, const char *));
+int     fprintf __P((FILE *, const char *, ...));
+int     fputc __P((int, FILE *));
+int     fputs __P((const char *, FILE *));
+int     fread __P((void *, size_t, size_t, FILE *));
+FILE   *freopen __P((const char *, const char *, FILE *));
+int     fscanf __P((FILE *, const char *, ...));
+int     fseek __P((FILE *, long, int));
+int     fsetpos __P((FILE *, const fpos_t *));
+long    ftell __P((const FILE *));
+int     fwrite __P((const void *, size_t, size_t, FILE *));
+int     getc __P((FILE *));
+int     getchar __P((void));
+char   *gets __P((char *));
+#if !defined(_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
+extern int sys_nerr;                   /* perror(3) external variables */
+extern char *sys_errlist[];
 #endif
 #endif
+void    perror __P((const char *));
+int     printf __P((const char *, ...));
+int     putc __P((int, FILE *));
+int     putchar __P((int));
+int     puts __P((const char *));
+int     remove __P((const char *));
+int     rename  __P((const char *, const char *));
+void    rewind __P((FILE *));
+int     scanf __P((const char *, ...));
+void    setbuf __P((FILE *, char *));
+int     setvbuf __P((FILE *, char *, int, size_t));
+int     sprintf __P((char *, const char *, ...));
+int     sscanf __P((char *, const char *, ...));
+FILE   *tmpfile __P((void));
+char   *tmpnam __P((char *));
+int     ungetc __P((int, FILE *));
+int     vfprintf __P((FILE *, const char *, _VA_LIST_));
+int     vprintf __P((const char *, _VA_LIST_));
+int     vsprintf __P((char *, const char *, _VA_LIST_));
+__END_DECLS
 
 /*
  * Functions defined in POSIX 1003.1.
 
 /*
  * Functions defined in POSIX 1003.1.
@@ -263,81 +247,70 @@ void      perror();
 #define        L_cuserid       9       /* size for cuserid(); UT_NAMESIZE + 1 */
 #define        L_ctermid       1024    /* size for ctermid(); PATH_MAX */
 
 #define        L_cuserid       9       /* size for cuserid(); UT_NAMESIZE + 1 */
 #define        L_ctermid       1024    /* size for ctermid(); PATH_MAX */
 
-#if __STDC__ || c_plusplus
-FILE   *fdopen(int, const char *);
-int    fileno(FILE *);
-#else
-FILE   *fdopen();
-int    fileno();
-#endif
-#endif
+__BEGIN_DECLS
+char   *ctermid __P((char *));
+FILE   *fdopen __P((int, const char *));
+int     fileno __P((FILE *));
+__END_DECLS
+#endif /* not ANSI */
 
 /*
  * Routines that are purely local.
  */
 
 /*
  * Routines that are purely local.
  */
-#if __STDC__ || c_plusplus
-char   *fgetline(FILE *, size_t *);
-int    fpurge(FILE *);
-int    getw(FILE *);
-int    pclose(FILE *);
-FILE   *popen(const char *_name, const char *_type);
-int    putw(int, FILE *);
-void   setbuffer(FILE *, char *, int);
-int    setlinebuf(FILE *);
-int    snprintf(char *, size_t, const char *, ...);
-int    vsnprintf(char *, size_t, const char *, _VA_LIST_);
-#else
-char   *fgetline();
-int    fpurge();
-int    getw();
-int    pclose();
-FILE   *popen();
-int    putw();
-void   setbuffer();
-int    setlinebuf();
-int    snprintf();
-int    vsnprintf();
-#endif
-#endif /* _ANSI_SOURCE */
+#if !defined (_ANSI_SOURCE) && !defined(_POSIX_SOURCE)
+__BEGIN_DECLS
+char   *fgetline __P((FILE *, size_t *));
+int     fpurge __P((FILE *));
+int     getw __P((FILE *));
+int     pclose __P((FILE *));
+FILE   *popen __P((const char *, const char *));
+int     putw __P((int, FILE *));
+void    setbuffer __P((FILE *, char *, int));
+int     setlinebuf __P((FILE *));
+char   *tempnam __P((const char *, const char *));
+int     snprintf __P((char *, size_t, const char *, ...));
+int     vsnprintf __P((char *, size_t, const char *, _VA_LIST_));
+int     vscanf __P((const char *, _VA_LIST_));
+int     vsscanf __P((const char *, const char *, _VA_LIST_));
+__END_DECLS
+
+/*
+ * This is a #define because the function is used internally and
+ * (unlike vfscanf) the name __svfscanf is guaranteed not to collide
+ * with a user function when _ANSI_SOURCE or _POSIX_SOURCE is defined.
+ */
+#define         vfscanf        __svfscanf
 
 
-#ifndef _ANSI_SOURCE
 /*
  * Stdio function-access interface.
  */
 /*
  * Stdio function-access interface.
  */
-#if __STDC__ || c_plusplus
-FILE   *funopen(const void *_cookie,
-               int (*readfn)(void *_cookie, char *_buf, int _n),
-               int (*writefn)(void *_cookie, const char *_buf, int _n),
-               fpos_t (*seekfn)(void *_cookie, fpos_t _off, int _whence),
-               int (*closefn)(void *_cookie));
+__BEGIN_DECLS
+FILE   *funopen __P((const void *,
+               int (*)(void *, char *, int),
+               int (*)(void *, const char *, int),
+               fpos_t (*)(void *, fpos_t, int),
+               int (*)(void *)));
+__END_DECLS
 #define        fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
 #define        fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
 #define        fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
 #define        fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
-#else
-FILE   *funopen();
-#define        fropen(cookie, fn) \
-       funopen(cookie, fn, (int (*)())0, (fpos_t (*)())0, (int (*)())0)
-#define        fwopen(cookie, fn) \
-       funopen(cookie, (int (*)())0, fn, (fpos_t (*)())0, (int (*)())0)
-#endif
+#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
 
 /*
  * Functions internal to the implementation.
  */
 
 /*
  * Functions internal to the implementation.
  */
-#if __STDC__ || c_plusplus
-int    __srget(FILE *);
-int    __swbuf(int, FILE *);
-#else
-int    __srget();
-int    __swbuf();
-#endif
+__BEGIN_DECLS
+int    __srget __P((FILE *));
+int    __svfscanf __P((FILE *, const char *, _VA_LIST_));
+int    __swbuf __P((int, FILE *));
+__END_DECLS
 
 /*
  * The __sfoo macros are here so that we can 
  * define function versions in the C library.
  */
 #define        __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
 
 /*
  * The __sfoo macros are here so that we can 
  * define function versions in the C library.
  */
 #define        __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
-#ifdef __GNUC__
-static __inline int __sputc(int _c, FILE *_p) {
+#if defined(__GNUC__) && defined(__STDC__)
+static inline int __sputc(int _c, FILE *_p) {
        if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
                return (*_p->_p++ = _c);
        else
        if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
                return (*_p->_p++ = _c);
        else