Commit | Line | Data |
---|---|---|
dc0d77d7 CE |
1 | #include "buffer.h" |
2 | #include "byte.h" | |
3 | #include "error.h" | |
4 | ||
5 | static int oneread(int (*op)(),int fd,char *buf,unsigned int len) | |
6 | { | |
7 | int r; | |
8 | ||
9 | for (;;) { | |
10 | r = op(fd,buf,len); | |
11 | if (r == -1) if (errno == error_intr) continue; | |
12 | return r; | |
13 | } | |
14 | } | |
15 | ||
16 | static int getthis(buffer *s,char *buf,unsigned int len) | |
17 | { | |
18 | if (len > s->p) len = s->p; | |
19 | s->p -= len; | |
20 | byte_copy(buf,len,s->x + s->n); | |
21 | s->n += len; | |
22 | return len; | |
23 | } | |
24 | ||
25 | int buffer_feed(buffer *s) | |
26 | { | |
27 | int r; | |
28 | ||
29 | if (s->p) return s->p; | |
30 | r = oneread(s->op,s->fd,s->x,s->n); | |
31 | if (r <= 0) return r; | |
32 | s->p = r; | |
33 | s->n -= r; | |
34 | if (s->n > 0) byte_copyr(s->x + s->n,r,s->x); | |
35 | return r; | |
36 | } | |
37 | ||
38 | int buffer_bget(buffer *s,char *buf,unsigned int len) | |
39 | { | |
40 | int r; | |
41 | ||
42 | if (s->p > 0) return getthis(s,buf,len); | |
43 | if (s->n <= len) return oneread(s->op,s->fd,buf,s->n); | |
44 | r = buffer_feed(s); if (r <= 0) return r; | |
45 | return getthis(s,buf,len); | |
46 | } | |
47 | ||
48 | int buffer_get(buffer *s,char *buf,unsigned int len) | |
49 | { | |
50 | int r; | |
51 | ||
52 | if (s->p > 0) return getthis(s,buf,len); | |
53 | if (s->n <= len) return oneread(s->op,s->fd,buf,len); | |
54 | r = buffer_feed(s); if (r <= 0) return r; | |
55 | return getthis(s,buf,len); | |
56 | } | |
57 | ||
58 | char *buffer_peek(buffer *s) | |
59 | { | |
60 | return s->x + s->n; | |
61 | } | |
62 | ||
63 | void buffer_seek(buffer *s,unsigned int len) | |
64 | { | |
65 | s->n += len; | |
66 | s->p -= len; | |
67 | } |