Add support for the new ENVIRON opton
[unix-history] / usr / src / include / stdio.h
index 15807ee..6a5d182 100644 (file)
@@ -1,31 +1,52 @@
 /*-
 /*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * Chris Torek.
  *
  * %sccs.include.redist.c%
  *
  *
  * This code is derived from software contributed to Berkeley by
  * Chris Torek.
  *
  * %sccs.include.redist.c%
  *
- *     @(#)stdio.h     5.10 (Berkeley) %G%
+ *     @(#)stdio.h     8.1 (Berkeley) %G%
  */
 
 #ifndef        _STDIO_H_
 #define        _STDIO_H_
 
  */
 
 #ifndef        _STDIO_H_
 #define        _STDIO_H_
 
+#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
+#include <sys/types.h>
+#endif
+
 #include <sys/cdefs.h>
 
 #include <sys/cdefs.h>
 
-#include <machine/types.h>
-#ifdef _SIZE_T_
-typedef        _SIZE_T_        size_t;
-#undef _SIZE_T_
+#include <machine/ansi.h>
+#ifdef _BSD_SIZE_T_
+typedef        _BSD_SIZE_T_    size_t;
+#undef _BSD_SIZE_T_
 #endif
 
 #ifndef NULL
 #define        NULL    0
 #endif
 
 #endif
 
 #ifndef NULL
 #define        NULL    0
 #endif
 
-typedef long fpos_t;           /* Must match off_t <sys/types.h> */
+/*
+ * This is fairly grotesque, but pure ANSI code must not inspect the
+ * innards of an fpos_t anyway.  The library internally uses off_t,
+ * which we assume is exactly as big as eight chars.  (When we switch
+ * to gcc 2.4 we will use __attribute__ here.)
+ *
+ * WARNING: the alignment constraints on an off_t and the struct below
+ * differ on (e.g.) the SPARC.  Hence, the placement of an fpos_t object
+ * in a structure will change if fpos_t's are not aligned on 8-byte
+ * boundaries.  THIS IS A CROCK, but for now there is no way around it.
+ */
+#if !defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)
+typedef off_t fpos_t;
+#else
+typedef struct __sfpos {
+       char    _pos[8];
+} fpos_t;
+#endif
 
 #define        _FSTDIO                 /* Define for new stdio with functions. */
 
 
 #define        _FSTDIO                 /* Define for new stdio with functions. */
 
@@ -64,6 +85,8 @@ struct __sbuf {
  * that does not match the previous one in _bf.  When this happens,
  * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
  * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
  * that does not match the previous one in _bf.  When this happens,
  * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
  * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
+ *
+ * NB: see WARNING above before changing the layout of this structure!
  */
 typedef        struct __sFILE {
        unsigned char *_p;      /* current position in (some) buffer */
  */
 typedef        struct __sFILE {
        unsigned char *_p;      /* current position in (some) buffer */
@@ -76,10 +99,10 @@ typedef     struct __sFILE {
 
        /* operations */
        void    *_cookie;       /* cookie passed to io functions */
 
        /* operations */
        void    *_cookie;       /* cookie passed to io functions */
-       int     (*_close) __P((void *_cookie));
-       int     (*_read)  __P((void *_cookie, char *_buf, int _n));
-       fpos_t  (*_seek)  __P((void *_cookie, fpos_t _offset, int _whence));
-       int     (*_write) __P((void *_cookie, const char *_buf, int _n));
+       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 */
@@ -95,10 +118,12 @@ typedef    struct __sFILE {
 
        /* Unix stdio files get aligned to block boundaries on fseek() */
        int     _blksize;       /* stat.st_blksize (may be != _bf._size) */
 
        /* Unix stdio files get aligned to block boundaries on fseek() */
        int     _blksize;       /* stat.st_blksize (may be != _bf._size) */
-       int     _offset;        /* current lseek offset */
+       fpos_t  _offset;        /* current lseek offset (see WARNING) */
 } FILE;
 
 } 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 */
@@ -142,7 +167,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
@@ -173,39 +198,43 @@ int        fflush __P((FILE *));
 int     fgetc __P((FILE *));
 int     fgetpos __P((FILE *, fpos_t *));
 char   *fgets __P((char *, size_t, FILE *));
 int     fgetc __P((FILE *));
 int     fgetpos __P((FILE *, fpos_t *));
 char   *fgets __P((char *, size_t, FILE *));
-FILE   *fopen __P((const char *_name, const char *_type));
+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     fprintf __P((FILE *, const char *, ...));
 int     fputc __P((int, FILE *));
 int     fputs __P((const char *, FILE *));
-int     fread __P((void *, size_t _size, size_t _n, FILE *));
-FILE   *freopen __P((const char *_name, const char *_type, FILE *_stream));
+size_t  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     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, size_t _n, FILE *));
+size_t  fwrite __P((const void *, size_t, size_t, FILE *));
 int     getc __P((FILE *));
 int     getchar __P((void));
 char   *gets __P((char *));
 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 const char *const sys_errlist[];
+#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 *));
 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 *_old, const char *_new));
+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 *, ...));
 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 *, ...));
+int     sscanf __P((const char *, const char *, ...));
 FILE   *tmpfile __P((void));
 char   *tmpnam __P((char *));
 int     ungetc __P((int, FILE *));
 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_));
+int     vfprintf __P((FILE *, const char *, _BSD_VA_LIST_));
+int     vprintf __P((const char *, _BSD_VA_LIST_));
+int     vsprintf __P((char *, const char *, _BSD_VA_LIST_));
 __END_DECLS
 
 /*
 __END_DECLS
 
 /*
@@ -220,49 +249,65 @@ char      *ctermid __P((char *));
 FILE   *fdopen __P((int, const char *));
 int     fileno __P((FILE *));
 __END_DECLS
 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 !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 *));
 __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 *_name, const char *_type));
+FILE   *popen __P((const char *, const char *));
 int     putw __P((int, FILE *));
 void    setbuffer __P((FILE *, char *, int));
 int     setlinebuf __P((FILE *));
 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     snprintf __P((char *, size_t, const char *, ...));
-int     vsnprintf __P((char *, size_t, const char *, _VA_LIST_));
+int     vsnprintf __P((char *, size_t, const char *, _BSD_VA_LIST_));
+int     vscanf __P((const char *, _BSD_VA_LIST_));
+int     vsscanf __P((const char *, const char *, _BSD_VA_LIST_));
+FILE   *zopen __P((const char *, const char *, int));
 __END_DECLS
 
 __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
+
 /*
  * Stdio function-access interface.
  */
 __BEGIN_DECLS
 /*
  * Stdio function-access interface.
  */
 __BEGIN_DECLS
-FILE   *funopen __P((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)));
+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)
 __END_DECLS
 #define        fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
 #define        fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
-#endif /* !ANSI_SOURCE */
+#endif /* !_ANSI_SOURCE && !_POSIX_SOURCE */
 
 /*
  * Functions internal to the implementation.
  */
 
 /*
  * Functions internal to the implementation.
  */
+__BEGIN_DECLS
 int    __srget __P((FILE *));
 int    __srget __P((FILE *));
+int    __svfscanf __P((FILE *, const char *, _BSD_VA_LIST_));
 int    __swbuf __P((int, FILE *));
 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__
+#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);
 static __inline int __sputc(int _c, FILE *_p) {
        if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
                return (*_p->_p++ = _c);