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