aboutsummaryrefslogtreecommitdiff
path: root/include/base/io.h
blob: 541159f6284bfd4f3e4c0bad6a7bc0de278f93ad (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
#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,
};

/* 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    io·open(char *path, int flag, io·Buffer *io);
int    io·openfd(int fd, int flag, io·Buffer *io);
int    io·close(io·Header *io);

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

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

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

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

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

int    io·print(io·Header *io, char *fmt, ...);
int    io·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);