#ifndef _PDCLIB_IO_H #define _PDCLIB_IO_H #include "_PDCLIB_int.h" #include "_PDCLIB_threadconfig.h" /* PDCLib internal I/O logic <_PDCLIB_int.h> This file is part of the Public Domain C Library (PDCLib). Permission is granted to use, modify, and / or redistribute at will. */ /* Flags for representing mode (see fopen()). Note these must fit the same status field as the _IO?BF flags in and the internal flags below. */ #define _PDCLIB_FREAD 8u #define _PDCLIB_FWRITE 16u #define _PDCLIB_FAPPEND 32u #define _PDCLIB_FRW 64u #define _PDCLIB_FBIN 128u /* Internal flags, made to fit the same status field as the flags above. */ /* -------------------------------------------------------------------------- */ /* free() the buffer memory on closing (false for user-supplied buffer) */ #define _PDCLIB_FREEBUFFER 512u /* stream has encountered error / EOF */ #define _PDCLIB_ERRORFLAG 1024u #define _PDCLIB_EOFFLAG 2048u /* stream is wide-oriented */ #define _PDCLIB_WIDESTREAM 4096u /* stream is byte-oriented */ #define _PDCLIB_BYTESTREAM 8192u /* file associated with stream should be remove()d on closing (tmpfile()) */ #define _PDCLIB_DELONCLOSE 16384u /* stream handle should not be free()d on close (stdin, stdout, stderr) */ #define _PDCLIB_STATIC 32768u /* Position / status structure for getpos() / fsetpos(). */ struct _PDCLIB_fpos_t { _PDCLIB_uint64_t offset; /* File position offset */ int status; /* Multibyte parsing state (unused, reserved) */ }; /* FILE structure */ struct _PDCLIB_file_t { _PDCLIB_fd_t handle; /* OS file handle */ _PDCLIB_MTX_T lock; /* file lock */ char * buffer; /* Pointer to buffer memory */ _PDCLIB_size_t bufsize; /* Size of buffer */ _PDCLIB_size_t bufidx; /* Index of current position in buffer */ _PDCLIB_size_t bufend; /* Index of last pre-read character in buffer */ struct _PDCLIB_fpos_t pos; /* Offset and multibyte parsing state */ _PDCLIB_size_t ungetidx; /* Number of ungetc()'ed characters */ unsigned char * ungetbuf; /* ungetc() buffer */ unsigned int status; /* Status flags; see above */ /* multibyte parsing status to be added later */ char * filename; /* Name the current stream has been opened with */ struct _PDCLIB_file_t * next; /* Pointer to next struct (internal) */ }; #endif