1#pragma once
2
3#include "libc.h"
4#include <stdatomic.h>
5#include <stdio.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)     \
12    if (__need_unlock) \
13    __unlockfile((f))
14
15#define F_PERM 1
16#define F_NORD 4
17#define F_NOWR 8
18#define F_EOF 16
19#define F_ERR 32
20#define F_SVB 64
21#define F_APP 128
22
23struct _IO_FILE {
24    unsigned flags;
25    unsigned char *rpos, *rend;
26    int (*close)(FILE*);
27    unsigned char *wend, *wpos;
28    unsigned char* mustbezero_1;
29    unsigned char* wbase;
30    size_t (*read)(FILE*, unsigned char*, size_t);
31    size_t (*write)(FILE*, const unsigned char*, size_t);
32    off_t (*seek)(FILE*, off_t, int);
33    unsigned char* buf;
34    size_t buf_size;
35    FILE *prev, *next;
36    int fd;
37    int pipe_pid;
38    long lockcount;
39    short dummy3;
40    signed char mode;
41    signed char lbf;
42    atomic_int lock;
43    atomic_int waiters;
44    void* cookie;
45    off_t off;
46    char* getln_buf;
47    void* mustbezero_2;
48    unsigned char* shend;
49    off_t shlim, shcnt;
50    struct __locale_struct* locale;
51};
52
53size_t __stdio_read(FILE*, unsigned char*, size_t) ATTR_LIBC_VISIBILITY;
54size_t __stdio_write(FILE*, const unsigned char*, size_t) ATTR_LIBC_VISIBILITY;
55size_t __stdout_write(FILE*, const unsigned char*, size_t) ATTR_LIBC_VISIBILITY;
56off_t __stdio_seek(FILE*, off_t, int) ATTR_LIBC_VISIBILITY;
57int __stdio_close(FILE*) ATTR_LIBC_VISIBILITY;
58
59size_t __string_read(FILE*, unsigned char*, size_t) ATTR_LIBC_VISIBILITY;
60
61int __toread(FILE*) ATTR_LIBC_VISIBILITY;
62int __towrite(FILE*) ATTR_LIBC_VISIBILITY;
63
64zx_status_t _mmap_file(size_t offset, size_t len, uint32_t zx_flags, int flags, int fd,
65                       off_t fd_off, uintptr_t* out);
66
67#if defined(__PIC__) && (100 * __GNUC__ + __GNUC_MINOR__ >= 303)
68__attribute__((visibility("protected")))
69#endif
70int
71__overflow(FILE *, int),
72    __uflow(FILE *);
73
74int __fseeko(FILE*, off_t, int) ATTR_LIBC_VISIBILITY;
75int __fseeko_unlocked(FILE*, off_t, int) ATTR_LIBC_VISIBILITY;
76off_t __ftello(FILE*) ATTR_LIBC_VISIBILITY;
77off_t __ftello_unlocked(FILE*) ATTR_LIBC_VISIBILITY;
78size_t __fwritex(const unsigned char*, size_t, FILE*) ATTR_LIBC_VISIBILITY;
79int __putc_unlocked(int, FILE*) ATTR_LIBC_VISIBILITY;
80
81FILE* __fdopen(int, const char*) ATTR_LIBC_VISIBILITY;
82int __fmodeflags(const char*) ATTR_LIBC_VISIBILITY;
83
84FILE* __ofl_add(FILE* f) ATTR_LIBC_VISIBILITY;
85FILE** __ofl_lock(void) ATTR_LIBC_VISIBILITY;
86void __ofl_unlock(void) ATTR_LIBC_VISIBILITY;
87
88void __stdio_exit(void) ATTR_LIBC_VISIBILITY;
89
90#define feof(f) ((f)->flags & F_EOF)
91#define ferror(f) ((f)->flags & F_ERR)
92
93#define getc_unlocked(f) (((f)->rpos < (f)->rend) ? *(f)->rpos++ : __uflow((f)))
94
95#define putc_unlocked(c, f)                                                         \
96    (((unsigned char)(c) != (f)->lbf && (f)->wpos < (f)->wend) ? *(f)->wpos++ = (c) \
97                                                               : __overflow((f), (c)))
98
99/* Caller-allocated FILE * operations */
100FILE* __fopen_rb_ca(const char*, FILE*, unsigned char*, size_t)
101    ATTR_LIBC_VISIBILITY;
102int __fclose_ca(FILE*) ATTR_LIBC_VISIBILITY;
103