1 /* Public domain. */
2
3 #include "buffer.h"
4 #include "str.h"
5 #include "byte.h"
6 #include "error.h"
7
allwrite(int (* op)(),int fd,const char * buf,unsigned int len)8 static int allwrite(int (*op)(),int fd,const char *buf,unsigned int len)
9 {
10 int w;
11
12 while (len) {
13 w = op(fd,buf,len);
14 if (w == -1) {
15 if (errno == error_intr) continue;
16 return -1; /* note that some data may have been written */
17 }
18 if (w == 0) ; /* luser's fault */
19 buf += w;
20 len -= w;
21 }
22 return 0;
23 }
24
buffer_flush(buffer * s)25 int buffer_flush(buffer *s)
26 {
27 int p;
28
29 p = s->p;
30 if (!p) return 0;
31 s->p = 0;
32 return allwrite(s->op,s->fd,s->x,p);
33 }
34
buffer_putalign(buffer * s,const char * buf,unsigned int len)35 int buffer_putalign(buffer *s,const char *buf,unsigned int len)
36 {
37 unsigned int n;
38
39 while (len > (n = s->n - s->p)) {
40 byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
41 if (buffer_flush(s) == -1) return -1;
42 }
43 /* now len <= s->n - s->p */
44 byte_copy(s->x + s->p,len,buf);
45 s->p += len;
46 return 0;
47 }
48
buffer_put(buffer * s,const char * buf,unsigned int len)49 int buffer_put(buffer *s,const char *buf,unsigned int len)
50 {
51 unsigned int n;
52
53 n = s->n;
54 if (len > n - s->p) {
55 if (buffer_flush(s) == -1) return -1;
56 /* now s->p == 0 */
57 if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
58 while (len > s->n) {
59 if (n > len) n = len;
60 if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
61 buf += n;
62 len -= n;
63 }
64 }
65 /* now len <= s->n - s->p */
66 byte_copy(s->x + s->p,len,buf);
67 s->p += len;
68 return 0;
69 }
70
buffer_putflush(buffer * s,const char * buf,unsigned int len)71 int buffer_putflush(buffer *s,const char *buf,unsigned int len)
72 {
73 if (buffer_flush(s) == -1) return -1;
74 return allwrite(s->op,s->fd,buf,len);
75 }
76
buffer_putsalign(buffer * s,const char * buf)77 int buffer_putsalign(buffer *s,const char *buf)
78 {
79 return buffer_putalign(s,buf,str_len(buf));
80 }
81
buffer_puts(buffer * s,const char * buf)82 int buffer_puts(buffer *s,const char *buf)
83 {
84 return buffer_put(s,buf,str_len(buf));
85 }
86
buffer_putsflush(buffer * s,const char * buf)87 int buffer_putsflush(buffer *s,const char *buf)
88 {
89 return buffer_putflush(s,buf,str_len(buf));
90 }
91