1*3e12c5d1SDavid du Colombier #ifndef _STDIO_H_ 2*3e12c5d1SDavid du Colombier #define _STDIO_H_ 3*3e12c5d1SDavid du Colombier #pragma lib "/$M/lib/ape/libap.a" 4*3e12c5d1SDavid du Colombier 5*3e12c5d1SDavid du Colombier /* 6*3e12c5d1SDavid du Colombier * pANS stdio.h 7*3e12c5d1SDavid du Colombier */ 8*3e12c5d1SDavid du Colombier #include <stdarg.h> 9*3e12c5d1SDavid du Colombier #include <stddef.h> 10*3e12c5d1SDavid du Colombier /* 11*3e12c5d1SDavid du Colombier * According to X3J11, there is only one i/o buffer 12*3e12c5d1SDavid du Colombier * and it must not be occupied by both input and output data. 13*3e12c5d1SDavid du Colombier * If rp<wp, we must have state==RD and 14*3e12c5d1SDavid du Colombier * if wp<rp, we must have state==WR, so that getc and putc work correctly. 15*3e12c5d1SDavid du Colombier * On open, rp, wp and buf are set to 0, so first getc or putc will call _IO_getc 16*3e12c5d1SDavid du Colombier * or _IO_putc, which will allocate the buffer. 17*3e12c5d1SDavid du Colombier * If setvbuf(., ., _IONBF, .) is called, bufl is set to 0 and 18*3e12c5d1SDavid du Colombier * buf, rp and wp are pointed at unbuf. 19*3e12c5d1SDavid du Colombier * If setvbuf(., ., _IOLBF, .) is called, _IO_putc leaves wp and rp pointed at the 20*3e12c5d1SDavid du Colombier * end of the buffer so that it can be called on each putc to check whether it's got 21*3e12c5d1SDavid du Colombier * a newline. This nonsense is in order to avoid impacting performance of the other 22*3e12c5d1SDavid du Colombier * buffering modes more than necessary -- putting the test in putc adds many 23*3e12c5d1SDavid du Colombier * instructions that are wasted in non-_IOLBF mode: 24*3e12c5d1SDavid du Colombier * #define putc(c, f) (_IO_ctmp=(c),\ 25*3e12c5d1SDavid du Colombier * (f)->wp>=(f)->rp || (f)->flags&LINEBUF && _IO_ctmp=='\n'\ 26*3e12c5d1SDavid du Colombier * ?_IO_putc(_IO_ctmp, f)\ 27*3e12c5d1SDavid du Colombier * :*(f)->wp++=_IO_ctmp) 28*3e12c5d1SDavid du Colombier * 29*3e12c5d1SDavid du Colombier */ 30*3e12c5d1SDavid du Colombier typedef struct{ 31*3e12c5d1SDavid du Colombier int fd; /* UNIX file pointer */ 32*3e12c5d1SDavid du Colombier char flags; /* bits for must free buffer on close, line-buffered */ 33*3e12c5d1SDavid du Colombier char state; /* last operation was read, write, position, error, eof */ 34*3e12c5d1SDavid du Colombier char *buf; /* pointer to i/o buffer */ 35*3e12c5d1SDavid du Colombier char *rp; /* read pointer (or write end-of-buffer) */ 36*3e12c5d1SDavid du Colombier char *wp; /* write pointer (or read end-of-buffer) */ 37*3e12c5d1SDavid du Colombier char *lp; /* actual write pointer used when line-buffering */ 38*3e12c5d1SDavid du Colombier size_t bufl; /* actual length of buffer */ 39*3e12c5d1SDavid du Colombier char unbuf[1]; /* tiny buffer for unbuffered io (used for ungetc?) */ 40*3e12c5d1SDavid du Colombier }FILE; 41*3e12c5d1SDavid du Colombier typedef long fpos_t; 42*3e12c5d1SDavid du Colombier #ifndef NULL 43*3e12c5d1SDavid du Colombier #define NULL 0 44*3e12c5d1SDavid du Colombier #endif 45*3e12c5d1SDavid du Colombier /* 46*3e12c5d1SDavid du Colombier * Third arg of setvbuf 47*3e12c5d1SDavid du Colombier */ 48*3e12c5d1SDavid du Colombier #define _IOFBF 1 /* block-buffered */ 49*3e12c5d1SDavid du Colombier #define _IOLBF 2 /* line-buffered */ 50*3e12c5d1SDavid du Colombier #define _IONBF 3 /* unbuffered */ 51*3e12c5d1SDavid du Colombier #define BUFSIZ 4096 /* size of setbuf buffer */ 52*3e12c5d1SDavid du Colombier #define EOF (-1) /* returned on end of file */ 53*3e12c5d1SDavid du Colombier #define FOPEN_MAX 90 /* max files open */ 54*3e12c5d1SDavid du Colombier #define FILENAME_MAX BUFSIZ /* silly filename length */ 55*3e12c5d1SDavid du Colombier #define L_tmpnam 20 /* sizeof "/tmp/abcdefghij9999 */ 56*3e12c5d1SDavid du Colombier #define L_cuserid 32 /* maximum size user name */ 57*3e12c5d1SDavid du Colombier #define L_ctermid 32 /* size of name of controlling tty */ 58*3e12c5d1SDavid du Colombier #define SEEK_CUR 1 59*3e12c5d1SDavid du Colombier #define SEEK_END 2 60*3e12c5d1SDavid du Colombier #define SEEK_SET 0 61*3e12c5d1SDavid du Colombier #define TMP_MAX 64 /* very hard to set correctly */ 62*3e12c5d1SDavid du Colombier #define stderr (&_IO_stream[2]) 63*3e12c5d1SDavid du Colombier #define stdin (&_IO_stream[0]) 64*3e12c5d1SDavid du Colombier #define stdout (&_IO_stream[1]) 65*3e12c5d1SDavid du Colombier #define _IO_CHMASK 0377 /* mask for 8 bit characters */ 66*3e12c5d1SDavid du Colombier 67*3e12c5d1SDavid du Colombier #ifdef __cplusplus 68*3e12c5d1SDavid du Colombier extern "C" { 69*3e12c5d1SDavid du Colombier #endif 70*3e12c5d1SDavid du Colombier 71*3e12c5d1SDavid du Colombier extern int remove(const char *); 72*3e12c5d1SDavid du Colombier extern int rename(const char *, const char *); 73*3e12c5d1SDavid du Colombier extern FILE *tmpfile(void); 74*3e12c5d1SDavid du Colombier extern char *tmpnam(char *); 75*3e12c5d1SDavid du Colombier extern int fclose(FILE *); 76*3e12c5d1SDavid du Colombier extern int fflush(FILE *); 77*3e12c5d1SDavid du Colombier extern FILE *fopen(const char *, const char *); 78*3e12c5d1SDavid du Colombier extern FILE *freopen(const char *, const char *, FILE *); 79*3e12c5d1SDavid du Colombier extern void setbuf(FILE *, char *); 80*3e12c5d1SDavid du Colombier extern int setvbuf(FILE *, char *, int, size_t); 81*3e12c5d1SDavid du Colombier extern int fprintf(FILE *, const char *, ...); 82*3e12c5d1SDavid du Colombier extern int fscanf(FILE *, const char *, ...); 83*3e12c5d1SDavid du Colombier extern int printf(const char *, ...); 84*3e12c5d1SDavid du Colombier extern int scanf(const char *, ...); 85*3e12c5d1SDavid du Colombier extern int sprintf(char *, const char *, ...); 86*3e12c5d1SDavid du Colombier extern int sscanf(const char *, const char *, ...); 87*3e12c5d1SDavid du Colombier extern int vfprintf(FILE *, const char *, va_list); 88*3e12c5d1SDavid du Colombier extern int vprintf(const char *, va_list); 89*3e12c5d1SDavid du Colombier extern int vsprintf(char *, const char *, va_list); 90*3e12c5d1SDavid du Colombier extern int vfscanf(FILE *, const char *, va_list); 91*3e12c5d1SDavid du Colombier extern int fgetc(FILE *); 92*3e12c5d1SDavid du Colombier extern char *fgets(char *, int, FILE *); 93*3e12c5d1SDavid du Colombier extern int fputc(int, FILE *); 94*3e12c5d1SDavid du Colombier extern int fputs(const char *, FILE *); 95*3e12c5d1SDavid du Colombier extern int getc(FILE *); 96*3e12c5d1SDavid du Colombier #define getc(f) ((f)->rp>=(f)->wp?_IO_getc(f):*(f)->rp++&_IO_CHMASK) 97*3e12c5d1SDavid du Colombier extern int _IO_getc(FILE *f); 98*3e12c5d1SDavid du Colombier extern int getchar(void); 99*3e12c5d1SDavid du Colombier #define getchar() getc(stdin) 100*3e12c5d1SDavid du Colombier extern char *gets(char *); 101*3e12c5d1SDavid du Colombier extern int putc(int, FILE *); 102*3e12c5d1SDavid du Colombier #define putc(c, f) ((f)->wp>=(f)->rp?_IO_putc(c, f):(*(f)->wp++=c)&_IO_CHMASK) 103*3e12c5d1SDavid du Colombier extern int _IO_putc(int, FILE *); 104*3e12c5d1SDavid du Colombier extern int putchar(int); 105*3e12c5d1SDavid du Colombier #define putchar(c) putc(c, stdout) 106*3e12c5d1SDavid du Colombier extern int puts(const char *); 107*3e12c5d1SDavid du Colombier extern int ungetc(int, FILE *); 108*3e12c5d1SDavid du Colombier extern size_t fread(void *, size_t, size_t, FILE *); 109*3e12c5d1SDavid du Colombier extern size_t fwrite(const void *, size_t, size_t, FILE *); 110*3e12c5d1SDavid du Colombier extern int fgetpos(FILE *, fpos_t *); 111*3e12c5d1SDavid du Colombier extern int fseek(FILE *, long int, int); 112*3e12c5d1SDavid du Colombier extern int fsetpos(FILE *, const fpos_t *); 113*3e12c5d1SDavid du Colombier extern long int ftell(FILE *); 114*3e12c5d1SDavid du Colombier extern void rewind(FILE *); 115*3e12c5d1SDavid du Colombier extern void clearerr(FILE *); 116*3e12c5d1SDavid du Colombier extern int feof(FILE *); 117*3e12c5d1SDavid du Colombier extern int ferror(FILE *); 118*3e12c5d1SDavid du Colombier extern void perror(const char *); 119*3e12c5d1SDavid du Colombier extern FILE _IO_stream[FOPEN_MAX]; 120*3e12c5d1SDavid du Colombier extern FILE *sopenr(const char *); 121*3e12c5d1SDavid du Colombier extern FILE *sopenw(void); 122*3e12c5d1SDavid du Colombier extern char *sclose(FILE *); 123*3e12c5d1SDavid du Colombier extern char *rdline(FILE *, char **); 124*3e12c5d1SDavid du Colombier 125*3e12c5d1SDavid du Colombier #ifdef _POSIX_SOURCE 126*3e12c5d1SDavid du Colombier extern int fileno(FILE *); 127*3e12c5d1SDavid du Colombier extern FILE* fdopen(int, const char*); 128*3e12c5d1SDavid du Colombier extern char *ctermid(char *); 129*3e12c5d1SDavid du Colombier #endif 130*3e12c5d1SDavid du Colombier 131*3e12c5d1SDavid du Colombier #ifdef __cplusplus 132*3e12c5d1SDavid du Colombier } 133*3e12c5d1SDavid du Colombier #endif 134*3e12c5d1SDavid du Colombier 135*3e12c5d1SDavid du Colombier #endif 136