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