|
1 #include "substdio.h" |
|
2 #include "byte.h" |
|
3 #include "error.h" |
|
4 |
|
5 static int oneread(op,fd,buf,len) |
|
6 register int (*op)(); |
|
7 register int fd; |
|
8 register char *buf; |
|
9 register int len; |
|
10 { |
|
11 register int r; |
|
12 |
|
13 for (;;) { |
|
14 r = op(fd,buf,len); |
|
15 if (r == -1) if (errno == error_intr) continue; |
|
16 return r; |
|
17 } |
|
18 } |
|
19 |
|
20 static int getthis(s,buf,len) |
|
21 register substdio *s; |
|
22 register char *buf; |
|
23 register int len; |
|
24 { |
|
25 register int r; |
|
26 register int q; |
|
27 |
|
28 r = s->p; |
|
29 q = r - len; |
|
30 if (q > 0) { r = len; s->p = q; } else s->p = 0; |
|
31 byte_copy(buf,r,s->x + s->n); |
|
32 s->n += r; |
|
33 return r; |
|
34 } |
|
35 |
|
36 int substdio_feed(s) |
|
37 register substdio *s; |
|
38 { |
|
39 register int r; |
|
40 register int q; |
|
41 |
|
42 if (s->p) return s->p; |
|
43 q = s->n; |
|
44 r = oneread(s->op,s->fd,s->x,q); |
|
45 if (r <= 0) return r; |
|
46 s->p = r; |
|
47 q -= r; |
|
48 s->n = q; |
|
49 if (q > 0) /* damn, gotta shift */ byte_copyr(s->x + q,r,s->x); |
|
50 return r; |
|
51 } |
|
52 |
|
53 int substdio_bget(s,buf,len) |
|
54 register substdio *s; |
|
55 register char *buf; |
|
56 register int len; |
|
57 { |
|
58 register int r; |
|
59 |
|
60 if (s->p > 0) return getthis(s,buf,len); |
|
61 r = s->n; if (r <= len) return oneread(s->op,s->fd,buf,r); |
|
62 r = substdio_feed(s); if (r <= 0) return r; |
|
63 return getthis(s,buf,len); |
|
64 } |
|
65 |
|
66 int substdio_get(s,buf,len) |
|
67 register substdio *s; |
|
68 register char *buf; |
|
69 register int len; |
|
70 { |
|
71 register int r; |
|
72 |
|
73 if (s->p > 0) return getthis(s,buf,len); |
|
74 if (s->n <= len) return oneread(s->op,s->fd,buf,len); |
|
75 r = substdio_feed(s); if (r <= 0) return r; |
|
76 return getthis(s,buf,len); |
|
77 } |
|
78 |
|
79 char *substdio_peek(s) |
|
80 register substdio *s; |
|
81 { |
|
82 return s->x + s->n; |
|
83 } |
|
84 |
|
85 void substdio_seek(s,len) |
|
86 register substdio *s; |
|
87 register int len; |
|
88 { |
|
89 s->n += len; |
|
90 s->p -= len; |
|
91 } |