aboutsummaryrefslogtreecommitdiff
path: root/include/base/io.h
blob: 04b596fe71f45e8d61f5e812a781ec7ffe014b1a (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
#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;

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