aboutsummaryrefslogtreecommitdiff
path: root/include/base/io.h
blob: 5d3128293f65bf16114f1e47fb5d0c344c710300 (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
#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;
    struct{
        int in;    /* negative number of bytes at end */
        int out;   /* number of bytes at start */
        int ln;    /* number of bytes after last readline */
    } off;
    intptr pos, cap; /* position in file, capacity of buffer */
    uchar *b,*g,*e;  /* start, good bytes, end of byte pointers */
};

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

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

/* 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);