stdio_impl.h raw

   1  #ifndef _STDIO_IMPL_H
   2  #define _STDIO_IMPL_H
   3  
   4  #include <stdio.h>
   5  #include "syscall.h"
   6  
   7  #define UNGET 8
   8  
   9  #define FFINALLOCK(f) ((f)->lock>=0 ? __lockfile((f)) : 0)
  10  #define FLOCK(f) int __need_unlock = ((f)->lock>=0 ? __lockfile((f)) : 0)
  11  #define FUNLOCK(f) do { if (__need_unlock) __unlockfile((f)); } while (0)
  12  
  13  #define F_PERM 1
  14  #define F_NORD 4
  15  #define F_NOWR 8
  16  #define F_EOF 16
  17  #define F_ERR 32
  18  #define F_SVB 64
  19  #define F_APP 128
  20  
  21  struct _IO_FILE {
  22  	unsigned flags;
  23  	unsigned char *rpos, *rend;
  24  	int (*close)(FILE *);
  25  	unsigned char *wend, *wpos;
  26  	unsigned char *mustbezero_1;
  27  	unsigned char *wbase;
  28  	size_t (*read)(FILE *, unsigned char *, size_t);
  29  	size_t (*write)(FILE *, const unsigned char *, size_t);
  30  	off_t (*seek)(FILE *, off_t, int);
  31  	unsigned char *buf;
  32  	size_t buf_size;
  33  	FILE *prev, *next;
  34  	int fd;
  35  	int pipe_pid;
  36  	long lockcount;
  37  	int mode;
  38  	volatile int lock;
  39  	int lbf;
  40  	void *cookie;
  41  	off_t off;
  42  	char *getln_buf;
  43  	void *mustbezero_2;
  44  	unsigned char *shend;
  45  	off_t shlim, shcnt;
  46  	FILE *prev_locked, *next_locked;
  47  	struct __locale_struct *locale;
  48  };
  49  
  50  extern hidden FILE *volatile __stdin_used;
  51  extern hidden FILE *volatile __stdout_used;
  52  extern hidden FILE *volatile __stderr_used;
  53  
  54  hidden int __lockfile(FILE *);
  55  hidden void __unlockfile(FILE *);
  56  
  57  hidden size_t __stdio_read(FILE *, unsigned char *, size_t);
  58  hidden size_t __stdio_write(FILE *, const unsigned char *, size_t);
  59  hidden size_t __stdout_write(FILE *, const unsigned char *, size_t);
  60  hidden off_t __stdio_seek(FILE *, off_t, int);
  61  hidden int __stdio_close(FILE *);
  62  
  63  hidden int __toread(FILE *);
  64  hidden int __towrite(FILE *);
  65  
  66  hidden void __stdio_exit(void);
  67  hidden void __stdio_exit_needed(void);
  68  
  69  #if defined(__PIC__) && (100*__GNUC__+__GNUC_MINOR__ >= 303)
  70  __attribute__((visibility("protected")))
  71  #endif
  72  int __overflow(FILE *, int), __uflow(FILE *);
  73  
  74  hidden int __fseeko(FILE *, off_t, int);
  75  hidden int __fseeko_unlocked(FILE *, off_t, int);
  76  hidden off_t __ftello(FILE *);
  77  hidden off_t __ftello_unlocked(FILE *);
  78  hidden size_t __fwritex(const unsigned char *, size_t, FILE *);
  79  hidden int __putc_unlocked(int, FILE *);
  80  
  81  hidden FILE *__fdopen(int, const char *);
  82  hidden int __fmodeflags(const char *);
  83  
  84  hidden FILE *__ofl_add(FILE *f);
  85  hidden FILE **__ofl_lock(void);
  86  hidden void __ofl_unlock(void);
  87  
  88  struct __pthread;
  89  hidden void __register_locked_file(FILE *, struct __pthread *);
  90  hidden void __unlist_locked_file(FILE *);
  91  hidden void __do_orphaned_stdio_locks(void);
  92  
  93  #define MAYBE_WAITERS 0x40000000
  94  
  95  hidden void __getopt_msg(const char *, const char *, const char *, size_t);
  96  
  97  #define feof(f) ((f)->flags & F_EOF)
  98  #define ferror(f) ((f)->flags & F_ERR)
  99  
 100  #define getc_unlocked(f) \
 101  	( ((f)->rpos != (f)->rend) ? *(f)->rpos++ : __uflow((f)) )
 102  
 103  #define putc_unlocked(c, f) \
 104  	( (((unsigned char)(c)!=(f)->lbf && (f)->wpos!=(f)->wend)) \
 105  	? *(f)->wpos++ = (unsigned char)(c) \
 106  	: __overflow((f),(unsigned char)(c)) )
 107  
 108  /* Caller-allocated FILE * operations */
 109  hidden FILE *__fopen_rb_ca(const char *, FILE *, unsigned char *, size_t);
 110  hidden int __fclose_ca(FILE *);
 111  
 112  #endif
 113