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