| #ifndef _STDIO_IMPL_H |
| #define _STDIO_IMPL_H |
| |
| #include <stdio.h> |
| #include "syscall.h" |
| #include "libc.h" |
| |
| #define UNGET 8 |
| |
| #define FFINALLOCK(f) ((f)->lock >= 0 ? __lockfile((f)) : 0) |
| #define FLOCK(f) int __need_unlock = ((f)->lock >= 0 ? __lockfile((f)) : 0) |
| #define FUNLOCK(f) \ |
| if (__need_unlock) \ |
| __unlockfile((f)); \ |
| else |
| |
| #define F_PERM 1 |
| #define F_NORD 4 |
| #define F_NOWR 8 |
| #define F_EOF 16 |
| #define F_ERR 32 |
| #define F_SVB 64 |
| #define F_APP 128 |
| |
| struct _IO_FILE { |
| unsigned flags; |
| unsigned char *rpos, *rend; |
| int (*close)(FILE*); |
| unsigned char *wend, *wpos; |
| unsigned char* mustbezero_1; |
| unsigned char* wbase; |
| size_t (*read)(FILE*, unsigned char*, size_t); |
| size_t (*write)(FILE*, const unsigned char*, size_t); |
| off_t (*seek)(FILE*, off_t, int); |
| unsigned char* buf; |
| size_t buf_size; |
| FILE *prev, *next; |
| int fd; |
| int pipe_pid; |
| long lockcount; |
| short dummy3; |
| signed char mode; |
| signed char lbf; |
| volatile int lock; |
| volatile int waiters; |
| void* cookie; |
| off_t off; |
| char* getln_buf; |
| void* mustbezero_2; |
| unsigned char* shend; |
| off_t shlim, shcnt; |
| FILE *prev_locked, *next_locked; |
| struct __locale_struct* locale; |
| }; |
| |
| size_t __stdio_read(FILE*, unsigned char*, size_t); |
| size_t __stdio_write(FILE*, const unsigned char*, size_t); |
| size_t __stdout_write(FILE*, const unsigned char*, size_t); |
| off_t __stdio_seek(FILE*, off_t, int); |
| int __stdio_close(FILE*); |
| |
| size_t __string_read(FILE*, unsigned char*, size_t); |
| |
| int __toread(FILE*); |
| int __towrite(FILE*); |
| |
| #if defined(__PIC__) && (100 * __GNUC__ + __GNUC_MINOR__ >= 303) |
| __attribute__((visibility("protected"))) |
| #endif |
| int __overflow(FILE *, int), __uflow(FILE *); |
| |
| int __fseeko(FILE*, off_t, int); |
| int __fseeko_unlocked(FILE*, off_t, int); |
| off_t __ftello(FILE*); |
| off_t __ftello_unlocked(FILE*); |
| size_t __fwritex(const unsigned char*, size_t, FILE*); |
| int __putc_unlocked(int, FILE*); |
| |
| FILE* __fdopen(int, const char*); |
| int __fmodeflags(const char*); |
| |
| FILE* __ofl_add(FILE* f); |
| FILE** __ofl_lock(void); |
| void __ofl_unlock(void); |
| |
| #define feof(f) ((f)->flags & F_EOF) |
| #define ferror(f) ((f)->flags & F_ERR) |
| |
| #define getc_unlocked(f) (((f)->rpos < (f)->rend) ? *(f)->rpos++ : __uflow((f))) |
| |
| #define putc_unlocked(c, f) \ |
| (((unsigned char)(c) != (f)->lbf && (f)->wpos < (f)->wend) \ |
| ? *(f)->wpos++ = (c) \ |
| : __overflow((f), (c))) |
| |
| /* Caller-allocated FILE * operations */ |
| FILE* __fopen_rb_ca(const char*, FILE*, unsigned char*, size_t); |
| int __fclose_ca(FILE*); |
| |
| #endif |