aboutsummaryrefslogtreecommitdiff
path: root/include/base/io.h
blob: 5c8fdd95eabdd6ad16d1028767be11d3d425d6d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#pragma once

typedef struct io·Reader
{
    int (*read)(void*, int sz, int n, void *buf);
} io·Reader;
extern io·Reader sys·Reader;

typedef struct io·Peeker
{
    byte  (*get)(void*);
    int   (*unget)(void*, byte);
} io·Peeker;
extern io·Peeker sys·Peeker;

typedef struct io·Seeker
{
    int        (*seek)(void *skr, long off, int whence);
    long       (*tell)(void *skr);
} io·Seeker;
extern io·Seeker sys·Seeker;

typedef struct io·SeekReader
{
    io·Seeker;
    io·Reader;
} io·SeekReader;
extern io·SeekReader sys·SeekReader;

typedef struct io·PeekReader
{
    io·Reader;
    io·Peeker;
} io·PeekReader;
extern io·PeekReader sys·PeekReader;

typedef struct io·Writer
{
    int (*write)(void*, int sz, int n, void *buf);
} io·Writer;
extern io·Writer sys·Writer;

typedef struct io·Putter
{
    int (*put) (void*, byte);
    int (*puts)(void*, string);
} io·Putter;
extern io·Putter sys·Putter;

typedef struct io·PutWriter
{
    io·Writer;
    io·Putter;
} io·PutWriter;
extern io·PutWriter sys·PutWriter;

typedef struct io·ReadWriter
{
    io·Reader;
    io·Writer;
} io·ReadWriter;
extern io·ReadWriter sys·ReadWriter;

/* XXX: change casing */
enum
{
    ReadOK  = R_OK,
    WriteOK = W_OK,
    ExecOK  = X_OK,
};

/* XXX(deprecated): file handling */

typedef FILE io·Stream;
typedef struct stat io·Stat;

io·Stream *io·open(byte *name, byte *mode);
int        io·fd(io·Stream *s);
int        io·stat(io·Stream *s, io·Stat *buf);
int        io·close(io·Stream *s);
byte       io·getbyte(io·Stream *s);
int        io·ungetbyte(io·Stream *s, byte c);
int        io·read(io·Stream *s, int sz, int n, void *buf);
int        io·readln(io·Stream *s, int n, byte *buf);
int        io·putbyte(io·Stream *s, byte c);
int        io·putstring(io·Stream *s, string str);
int        io·write(io·Stream *s, int sz, int n, void *buf);
int        io·flush(io·Stream *s);
int        io·seek(io·Stream *s, long off, int whence);
long       io·tell(io·Stream *s);

/* buffered i/o */
typedef struct io·Header io·Header;
typedef struct io·Buffer io·Buffer;

#define iota(x) (1 << (x))
enum
{
    io·BufEof    = -1,
    io·BufErr    = -2,
    io·BufUngets = 8,
    io·BufMagic  = 0x314159,
    io·BufLen    = 2*4096,

    /* state */
    io·BufNil = iota(0),
    io·BufRdr = iota(1),
    io·BufWtr = iota(2),
    io·BufEnd = iota(3)
};
#undef iota

struct io·Header
{
    int state, fd, flag;
    int ilen;        /* negative number of bytes at end of buffer */
    int olen;        /* number of bytes at start of buffer */
    int nread;        /* number of bytes after last readline */
    int runesz;      /* number of bytes of last getrune */
    int cap;         /* size of buffer */
    intptr pos;      /* position in file */
    uchar *b,*g,*e;  /* start, good bytes, end of byte pointers */
};

struct io·Buffer
{
    io·Header;
    uchar bytes[io·BufLen+io·BufUngets];
};

int    bio·open(char *path, int flag, io·Buffer *io);
int    bio·openfd(int fd, int flag, io·Buffer *io);
int    bio·close(io·Header *io);

int    bio·init(io·Buffer *io, int fd, int mode);
int    bio·initcap(io·Header *io, int fd, int mode, int cap, uchar *buf);

int    bio·flush(io·Header *io);
intptr bio·read(io·Header *io, intptr len, void *buf);
void  *bio·readuntil(io·Header *io, int delim);
void  *bio·readline(io·Header *io, int null);
intptr bio·write(io·Header *io, intptr len, void *buf);

int    bio·getc(io·Header *io);
rune   bio·getr(io·Header *io);

int    bio·ungetc(io·Header *io);
rune   bio·ungetr(io·Header *io);

int    bio·seek(io·Header *io, intptr offset, int whence, intptr *pos);
intptr bio·offset(io·Header *io);

int    bio·print(io·Header *io, char *fmt, ...);
int    bio·vprint(io·Header *io, char *fmt, va_list args);

/* basic os helpers */
/* XXX: find a better location for this */
int     os·exists(byte *path, int flag);
byte   *os·dirname(byte *path);
byte   *os·basename(byte *path);
int     os·sep(void);