#ifndef __STDIO_H__ #define __STDIO_H__ #ifdef __cplusplus extern "C" { #endif #ident "$Revision: 1.75 $" /* * * Copyright 1992-1996 Silicon Graphics, Inc. * All Rights Reserved. * * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; * the contents of this file may not be disclosed to third parties, copied or * duplicated in any form, in whole or in part, without the prior written * permission of Silicon Graphics, Inc. * * RESTRICTED RIGHTS LEGEND: * Use, duplication or disclosure by the Government is subject to restrictions * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data * and Computer Software clause at DFARS 252.227-7013, and/or in similar or * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - * rights reserved under the Copyright Laws of the United States. */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */ /* * User-visible pieces of the ANSI C standard I/O package. * WARNING: this is an ANSI/POSIX/XPG4 header. Watch out for name space * pollution */ #include #include #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) #if !defined(_SIZE_T) && !defined(_SIZE_T_) #define _SIZE_T #if (_MIPS_SZLONG == 32) typedef unsigned int size_t; #endif #if (_MIPS_SZLONG == 64) typedef unsigned long size_t; #endif #endif #if !defined(_SSIZE_T) && !defined(_SSIZE_T_) #define _SSIZE_T #if (_MIPS_SZLONG == 32) typedef int ssize_t; #endif #if (_MIPS_SZLONG == 64) typedef long ssize_t; #endif #endif #if _MIPS_SIM == _ABIN32 typedef __int64_t fpos_t; #else typedef long fpos_t; #endif #if _NO_ANSIMODE /* this is permitted except in strict ANSI */ #ifndef _OFF64_T #define _OFF64_T /* LINTED long long */ typedef __int64_t off64_t; /* big byte offset type */ #endif /* !_OFF64_T */ #ifndef _OFF_T #define _OFF_T #if defined(_KERNEL) && !defined(_STANDALONE) typedef __int64_t off_t; /* byte offset type */ #elif defined(_STANDALONE) typedef long off_t; /* byte offset type */ #elif _MIPS_SIM == _ABIN32 typedef __int64_t off_t; /* byte offset type */ #else typedef long off_t; /* byte offset type */ #endif #endif /* OFF_T */ #endif /* _NO_ANSIMODE */ #if (_ABIAPI || _LFAPI) && _NO_ANSIMODE #if _MIPS_SIM == _ABI64 typedef long fpos64_t; #else /* LINTED long long - use __int64_t cause of ANSI */ typedef __int64_t fpos64_t; #endif #endif /* _ABIAPI || _LFAPI */ #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ /* Define the va_list type: */ #ifndef _VA_LIST_ #define _VA_LIST_ typedef char *va_list; #endif /* !_VA_LIST_ */ #ifndef NULL #define NULL 0L #endif #define BUFSIZ 4096 #ifndef _NFILE #define _NFILE 100 /* initial number of streams */ #endif /* !_NFILE */ #define _SBFSIZ 8 /* compatibility with shared libs */ #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) #define _IOFBF 0000 /* full buffered */ #define _IOLBF 0100 /* line buffered */ #define _IONBF 0004 /* not buffered */ #define _IOEOF 0020 /* EOF reached on read */ #define _IOERR 0040 /* I/O error from system */ #define _IOREAD 0001 /* currently reading */ #define _IOWRT 0002 /* currently writing */ #define _IORW 0200 /* opened for reading and writing */ #define _IOMYBUF 0010 /* stdio malloc()'d buffer */ #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ #if defined(_LANGUAGE_FORTRAN) #define _IOFBF '0000'x /* full buffered */ #define _IOLBF '0040'x /* line buffered */ #define _IONBF '0004'x /* not buffered */ #define _IOEOF '0010'x /* EOF reached on read */ #define _IOERR '0020'x /* I/O error from system */ #define _IOREAD '0001'x /* currently reading */ #define _IOWRT '0002'x /* currently writing */ #define _IORW '0080'x /* opened for reading and writing */ #define _IOMYBUF '0008'x /* stdio malloc()'d buffer */ #endif /* defined(_LANGUAGE_FORTRAN) */ #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) #ifndef EOF # define EOF (-1) #endif #define FOPEN_MAX _NFILE #define FILENAME_MAX 1024 /* max # of characters in a path name */ #ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif /* SEEK_SET */ #define TMP_MAX 17576 /* 26 * 26 * 26 */ #if _POSIX90 && _NO_ANSIMODE #define L_ctermid 9 #define L_cuserid 9 #endif #if _XOPEN4 && _NO_ANSIMODE #define P_tmpdir "/var/tmp/" #endif #define L_tmpnam 25 /* (sizeof(P_tmpdir) + 15) */ #define stdin (&__iob[0]) #define stdout (&__iob[1]) #define stderr (&__iob[2]) typedef struct /* needs to be binary-compatible with old versions */ #if (_SGIAPI && _NO_ANSIMODE) || defined(_LANGUAGE_C_PLUS_PLUS) /* * The __file_s struct tag is for backwards compat ONLY - it shouldn't be * used in any new headers. We would have liked to not use it in C++ since * it will change the name mangling of FILE *, but since it has already * gone out that way, we must stick to it. The safest thing is to *always* * define it for C++ (since a function that takes a FILE * as an argument * will have this tag in its mangled name). */ __file_s #endif { #if (_MIPS_SZLONG == 32) int _cnt; /* number of available characters in buffer */ #endif #if (_MIPS_SZLONG == 64) long _cnt; /* number of available characters in buffer */ #endif unsigned char *_ptr; /* next character from/to here in buffer */ unsigned char *_base; /* the buffer */ #if _MIPS_SIM == _ABI64 unsigned char _reserved[2]; /* MIPS ABI */ unsigned short _flag; /* the state of the stream */ unsigned int _file; /* UNIX System file descriptor */ #elif _MIPS_SIM == _ABIN32 unsigned char _flag; /* the state of the stream */ unsigned char _o_file; /* not used */ unsigned short _file; /* UNIX System file descriptor */ #else /* _MIPS_SIM == _ABIO32 */ unsigned char _flag; /* the state of the stream */ unsigned char _file; /* UNIX System file descriptor */ #endif } FILE; extern FILE __iob[_NFILE]; #if _SGIAPI && _NO_ANSIMODE extern FILE *_lastbuf; extern unsigned char *_bufendtab[]; extern unsigned char _sibuf[], _sobuf[]; #endif extern int remove(const char *); extern int rename(const char *, const char *); extern FILE *tmpfile(void); extern char *tmpnam(char *); extern int fclose(FILE *); extern int fflush(FILE *); extern FILE *fopen(const char *, const char *); extern FILE *freopen(const char *, const char *, FILE *); extern void setbuf(FILE *, char *); extern int setvbuf(FILE *, char *, int, size_t); /* PRINTFLIKE2 */ extern int fprintf(FILE *, const char *, ...); /* SCANFLIKE2 */ extern int fscanf(FILE *, const char *, ...); /* PRINTFLIKE1 */ extern int printf(const char *, ...); /* SCANFLIKE1 */ extern int scanf(const char *, ...); #if _SGIAPI && _NO_ANSIMODE /* PRINTFLIKE3 */ extern int snprintf(char *, ssize_t, const char *, ...); #endif /* PRINTFLIKE2 */ extern int sprintf(char *, const char *, ...); /* SCANFLIKE2 */ extern int sscanf(const char *, const char *, ...); extern int vfprintf(FILE *, const char *, /* va_list */ char *); extern int vprintf(const char *, /* va_list */ char *); #if _SGIAPI && _NO_ANSIMODE extern int vsnprintf(char *, ssize_t, const char *, /* va_list */ char *); #endif extern int vsprintf(char *, const char *, /* va_list */ char *); #if defined(__INLINE_INTRINSICS) && _NO_XOPEN4 #if (defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 400)) #pragma intrinsic (printf) #pragma intrinsic (fprintf) #pragma intrinsic (sprintf) #pragma intrinsic (scanf) #pragma intrinsic (fscanf) #pragma intrinsic (sscanf) #endif /* COMPILER_VERSION >= 400 */ #endif /* defined(__INLINE_INTRINSICS) && _NO_XOPEN4 */ extern int fgetc(FILE *); extern char *fgets(char *, int, FILE *); extern int fputc(int, FILE *); extern int fputs(const char *, FILE *); extern int getc(FILE *); extern int getchar(void); extern char *gets(char *); extern int putc(int, FILE *); extern int putchar(int); extern int puts(const char *); extern int ungetc(int, FILE *); extern size_t fread(void *, size_t, size_t, FILE *); #pragma int_to_unsigned fread extern size_t fwrite(const void *, size_t, size_t, FILE *); #pragma int_to_unsigned fwrite extern int fgetpos(FILE *, fpos_t *); extern int fseek(FILE *, long, int); extern int fsetpos(FILE *, const fpos_t *); extern long ftell(FILE *); extern void rewind(FILE *); extern void clearerr(FILE *); extern int feof(FILE *); extern int ferror(FILE *); extern void perror(const char *); extern int __filbuf(FILE *); extern int __flsbuf(int, FILE *); #if _POSIX90 && _NO_ANSIMODE /* POSIX additions */ extern FILE *fdopen(int, const char *); extern int fileno(FILE *); #endif #if _POSIX1C && _NO_ANSIMODE /* POSIX 1003.1c additions */ extern void flockfile(FILE *); extern int ftrylockfile(FILE *); extern void funlockfile(FILE *); extern int getc_unlocked(FILE *); extern int putc_unlocked(int, FILE *); extern int getchar_unlocked(void); extern int putchar_unlocked(int); #endif /* _POSIX1C */ #if _POSIX2 && _NO_ANSIMODE extern FILE *popen(const char *, const char *); extern int pclose(FILE *); #endif /* _POSIX2 */ #if _XOPEN4 && _NO_ANSIMODE /* XPG4 additions */ #include extern char *ctermid(char *); extern char *cuserid(char *); extern char *tempnam(const char *, const char *); extern int getw(FILE *); extern int putw(int, FILE *); #endif /* _XOPEN4 */ #if (_SGIAPI || _ABIAPI) && _NO_ANSIMODE /* non-POSIX/XOPEN/ANSI, but 'standard' unix */ extern char *mktemp(char *); extern int mkstemp(char *); extern int setbuffer(FILE *, char *, int); extern int setlinebuf(FILE *); extern int system(const char *); #endif /* _SGIAPI || _ABIAPI */ #if (_LFAPI || _XOPEN5) && _NO_ANSIMODE /* large file / xopen5 additions */ extern off_t ftello(FILE *); extern int fseeko(FILE *, off_t, int); #endif #if _LFAPI && _NO_ANSIMODE /* SGI additions and large file additions */ extern int fgetpos64(FILE *, fpos64_t *); extern FILE *fopen64(const char *, const char *); extern FILE *freopen64(const char *, const char *, FILE *); extern int fseek64(FILE *, __int64_t, int); extern int fseeko64(FILE *, off64_t, int); extern int fsetpos64(FILE *, const fpos64_t *); extern __int64_t ftell64(FILE *); extern off64_t ftello64(FILE *); extern FILE *tmpfile64(void); #endif /* _LFAPI */ #if (_SGIAPI || defined(_SGI_MP_SOURCE) || _POSIX1C) && _NO_ANSIMODE extern int __semputc(int, FILE *); extern int __semgetc(FILE *); extern int __us_rsthread_stdio; #endif #if (_SGIAPI || _REENTRANT_FUNCTIONS) && _NO_ANSIMODE extern char *ctermid_r(char *); #endif #ifndef _LINT #if ((_SGIAPI && _NO_ABIAPI) || defined(_SGI_MP_SOURCE)) && _NO_ANSIMODE /* NOTE: * The stdio macros have been modified so that they are by default * multi-thread safe. * For speed we have a single global that determines whether * threading is required. * There are 2 other versions of the macros: * macro_locked - always use locked version * macro_unlocked - use unlocked version - these should be used * with the flock/funlock-file functions */ /* Default versions of the macros */ #define getc(p) getc_locked(p) #define putc(x, p) putc_locked((x), p) #define getchar() getc_locked(stdin) #define putchar(x) putc_locked((x), stdout) #undef clearerr /* the following 3 are atomic and require no locking */ #define feof(p) feof_unlocked(p) #define ferror(p) ferror_unlocked(p) #define fileno(p) fileno_unlocked(p) /* Explicit locked (thread-safe) versions */ #define getc_locked(p) (__us_rsthread_stdio ? __semgetc(p) : \ (--(p)->_cnt < 0 ? __filbuf(p) : (int)*(p)->_ptr++)) #define putc_locked(x, p) (__us_rsthread_stdio ? __semputc(x,p) : \ (--(p)->_cnt < 0 ? __flsbuf((x), (p)) \ : (int)(*(p)->_ptr++ = (unsigned char)(x)))) #define getchar_locked() getc_locked(stdin) #define putchar_locked(x) putc_locked((x), stdout) #define clearerr_locked(p) clearerr(p) #define feof_locked(p) feof_unlocked(p) #define ferror_locked(p) ferror_unlocked(p) #define fileno_locked(p) fileno_unlocked(p) /* Explicit unlocked (thread-unsafe) versions */ #define getc_unlocked(p) (--(p)->_cnt < 0 ? __filbuf(p) : (int)*(p)->_ptr++) #define putc_unlocked(x, p) (--(p)->_cnt < 0 ? __flsbuf((x), (p)) \ : (int)(*(p)->_ptr++ = (unsigned char)(x))) #define getchar_unlocked() getc_unlocked(stdin) #define putchar_unlocked(x) putc_unlocked((x), stdout) #define clearerr_unlocked(p) ((void)((p)->_flag &= ~(_IOERR | _IOEOF))) #define feof_unlocked(p) (((int)(p)->_flag) & _IOEOF) #define ferror_unlocked(p) (((int)(p)->_flag) & _IOERR) #define fileno_unlocked(p) ((p)->_file) #elif _POSIX1C && _NO_ANSIMODE /* * POSIX1C - thread-safe by default, and no explicit 'locked' calls */ #define getc(p) (__us_rsthread_stdio ? __semgetc(p) : \ (--(p)->_cnt < 0 ? __filbuf(p) : (int)*(p)->_ptr++)) #define putc(x, p) (__us_rsthread_stdio ? __semputc(x,p) : \ (--(p)->_cnt < 0 ? __flsbuf((x), (p)) \ : (int)(*(p)->_ptr++ = (unsigned char)(x)))) #define getchar() getc(stdin) #define putchar(x) putc((x), stdout) /* explicit unlocked versions */ #define getc_unlocked(p) (--(p)->_cnt < 0 ? __filbuf(p) : (int)*(p)->_ptr++) #define putc_unlocked(x, p) (--(p)->_cnt < 0 ? __flsbuf((x), (p)) \ : (int)(*(p)->_ptr++ = (unsigned char)(x))) #define getchar_unlocked() getc_unlocked(stdin) #define putchar_unlocked(x) putc_unlocked((x), stdout) #define clearerr(p) ((void)((p)->_flag &= ~(_IOERR | _IOEOF))) #define feof(p) (((int)(p)->_flag) & _IOEOF) #define ferror(p) (((int)(p)->_flag) & _IOERR) #define fileno(p) ((p)->_file) #else /* * Std ANSI - thread-unsafe */ #define getc(p) (--(p)->_cnt < 0 ? __filbuf(p) : (int)*(p)->_ptr++) #define putc(x, p) (--(p)->_cnt < 0 ? __flsbuf((x), (p)) \ : (int)(*(p)->_ptr++ = (unsigned char)(x))) #define getchar() getc(stdin) #define putchar(x) putc((x), stdout) #define clearerr(p) ((void)((p)->_flag &= ~(_IOERR | _IOEOF))) #define feof(p) (((int)(p)->_flag) & _IOEOF) #define ferror(p) (((int)(p)->_flag) & _IOERR) #if _POSIX90 && _NO_ANSIMODE #define fileno(p) ((p)->_file) #endif #endif /* _SGI_MP_SOURCE */ #endif /* !_LINT */ #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ #ifdef __cplusplus } #endif #endif /* !__STDIO_H__ */