|
1 #include "substdio.h" |
|
2 #include "str.h" |
|
3 #include "byte.h" |
|
4 #include "error.h" |
|
5 |
|
6 static int allwrite(op,fd,buf,len) |
|
7 register int (*op)(); |
|
8 register int fd; |
|
9 register char *buf; |
|
10 register int len; |
|
11 { |
|
12 register int w; |
|
13 |
|
14 while (len) { |
|
15 w = op(fd,buf,len); |
|
16 if (w == -1) { |
|
17 if (errno == error_intr) continue; |
|
18 return -1; /* note that some data may have been written */ |
|
19 } |
|
20 if (w == 0) ; /* luser's fault */ |
|
21 buf += w; |
|
22 len -= w; |
|
23 } |
|
24 return 0; |
|
25 } |
|
26 |
|
27 int substdio_flush(s) |
|
28 register substdio *s; |
|
29 { |
|
30 register int p; |
|
31 |
|
32 p = s->p; |
|
33 if (!p) return 0; |
|
34 s->p = 0; |
|
35 return allwrite(s->op,s->fd,s->x,p); |
|
36 } |
|
37 |
|
38 int substdio_bput(s,buf,len) |
|
39 register substdio *s; |
|
40 register char *buf; |
|
41 register int len; |
|
42 { |
|
43 register int n; |
|
44 |
|
45 while (len > (n = s->n - s->p)) { |
|
46 byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n; |
|
47 if (substdio_flush(s) == -1) return -1; |
|
48 } |
|
49 /* now len <= s->n - s->p */ |
|
50 byte_copy(s->x + s->p,len,buf); |
|
51 s->p += len; |
|
52 return 0; |
|
53 } |
|
54 |
|
55 int substdio_put(s,buf,len) |
|
56 register substdio *s; |
|
57 register char *buf; |
|
58 register int len; |
|
59 { |
|
60 register int n; |
|
61 |
|
62 n = s->n; |
|
63 if (len > n - s->p) { |
|
64 if (substdio_flush(s) == -1) return -1; |
|
65 /* now s->p == 0 */ |
|
66 if (n < SUBSTDIO_OUTSIZE) n = SUBSTDIO_OUTSIZE; |
|
67 while (len > s->n) { |
|
68 if (n > len) n = len; |
|
69 if (allwrite(s->op,s->fd,buf,n) == -1) return -1; |
|
70 buf += n; |
|
71 len -= n; |
|
72 } |
|
73 } |
|
74 /* now len <= s->n - s->p */ |
|
75 byte_copy(s->x + s->p,len,buf); |
|
76 s->p += len; |
|
77 return 0; |
|
78 } |
|
79 |
|
80 int substdio_putflush(s,buf,len) |
|
81 register substdio *s; |
|
82 register char *buf; |
|
83 register int len; |
|
84 { |
|
85 if (substdio_flush(s) == -1) return -1; |
|
86 return allwrite(s->op,s->fd,buf,len); |
|
87 } |
|
88 |
|
89 int substdio_bputs(s,buf) |
|
90 register substdio *s; |
|
91 register char *buf; |
|
92 { |
|
93 return substdio_bput(s,buf,str_len(buf)); |
|
94 } |
|
95 |
|
96 int substdio_puts(s,buf) |
|
97 register substdio *s; |
|
98 register char *buf; |
|
99 { |
|
100 return substdio_put(s,buf,str_len(buf)); |
|
101 } |
|
102 |
|
103 int substdio_putsflush(s,buf) |
|
104 register substdio *s; |
|
105 register char *buf; |
|
106 { |
|
107 return substdio_putflush(s,buf,str_len(buf)); |
|
108 } |