diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /unix/hlib/libc/stdio.h | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'unix/hlib/libc/stdio.h')
-rw-r--r-- | unix/hlib/libc/stdio.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/unix/hlib/libc/stdio.h b/unix/hlib/libc/stdio.h new file mode 100644 index 00000000..c3cc0bd6 --- /dev/null +++ b/unix/hlib/libc/stdio.h @@ -0,0 +1,99 @@ +/* + * U_STDIO.H -- C defines used to emulate the UNIX standard i/o package upon + * IRAF file i/o. These definitions are portable, but highly dependent on + * the guts of IRAF FIO. + */ + +#ifndef D_libc +#ifndef import_libc +#include "libc.h" +#endif +#endif + +#define BUFSIZ SZ_DEFIOBUF +#define _NFILE FIO_MAXFD +#define FILE struct _iobuf + +# ifndef NULL +#define NULL 0 +# endif +# ifndef EOF +#define EOF (-1) +# endif + +/* Filler space is defined here to reduce clutter in the struct def below. + */ +#define _F1 _filler1[_NFILE-1] +#define _F2 _filler2[_NFILE-1] +#define _F3 _filler3[_NFILE-1] +#define _F4 _filler4[_NFILE-1] +#define _F5 _filler5[_NFILE-1] +#define _F6 _filler6[_NFILE-1] +#define _F7 _filler7[_NFILE-1] + +/* The _iobuf structure is the C version of the FIO common /fiocom/, which + * contains all the FIO buffer and i/o pointers. Each structure field is + * maintained in the common as an array of length _NFILE, hence in terms of + * C the structures are interleaved. The file pointers are indices into + * the array Memc, an array of XCHAR. + */ +struct _iobuf { + XLONG _boffset, _F1; /* XCHAR file offset of buffer */ + XINT _bufptr, _F2; /* buffer pointer */ + XINT _buftop, _F3; /* pointer to top of buffer + 1 */ + XINT _iop, _F4; /* pointer to next XCHAR */ + XINT _itop, _F5; /* call filbuf when _iop >= */ + XINT _otop, _F6; /* call flsbuf when _iop >= */ + XINT _fiodes, _F7; /* FIO file descriptor */ + XINT _fflags; /* bit flags */ +}; + +extern XINT FIOCOM[]; /* the FIO common */ + +#define _FFLUSHNL 01 /* flush buffer on newline */ +#define _FREAD 02 /* read perm on file */ +#define _FWRITE 04 /* read perm on file */ +#define _FEOF 010 /* file positioned to EOF */ +#define _FERR 020 /* i/o error on file */ +#define _FKEEP 040 /* keep file open at exit */ +#define _FFLUSH 0100 /* write to device on newline */ +#define _FRAW 0200 /* raw input mode */ +#define _FNDELAY 0400 /* nonblocking i/o */ +#define _FPUSH 01000 /* data is pushed back */ +#define _FIPC 02000 /* file is an IPC channel */ + +/* Convert FILE pointers to and from FIO integer file descriptors. + */ +#define FDTOFP(fd) ((FILE *)(&FIOCOM[(fd)-1])) +#define FPTOFD(fp) ((XINT)((XINT *)(fp) - FIOCOM + 1)) + +#define stdin (FDTOFP(3)) +#define stdout (FDTOFP(4)) +#define stderr (FDTOFP(5)) + + +/* I/O macro defines. I/O is assumed to be sequential, i.e., we do not check + * for _iop < _bufptr. This is consistent with UNIX usage. The getc and putc + * macros are quite efficient despite their complex appearance. + */ +#define getchar() fgetc(stdin) +#define getc(fp) \ +(((fp)->_iop >= (fp)->_itop) ? c_filbuf((fp)) : Memc[(fp)->_iop++] & 0377) + +#define putchar(ch) fputc((ch),stdout) +#define putc(ch,fp) \ +(((fp)->_iop >= (fp)->_otop || ((ch) == '\n' && (fp)->_fflags&_FFLUSH)) ? \ +c_flsbuf((unsigned)(ch),(fp)) : ((int)(Memc[(fp)->_iop++] = (unsigned)(ch)))) + +#define fileno(fp) (FPTOFD((fp))) +#define feof(fp) ((fp)->_fflags & _FEOF) +#define ferror(fp) ((fp)->_fflags & _FERR) +#define clearerr(fp) ((fp)->_fflags &= ~_FERR) + + +FILE *fopen(); +FILE *fdopen(); +char *fgets(); +char *gets(); + +#define D_stdio |