|
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 } |