1 /* Public Domain */
2
3 #include "buffer.h"
4
buffer_init(buffer * s,BufferOp op,int fd,char * buf,ut32 len)5 void buffer_init(buffer *s, BufferOp op, int fd, char *buf, ut32 len) {
6 s->x = buf;
7 s->fd = fd;
8 s->op = op;
9 s->p = 0;
10 s->n = len;
11 }
12
allwrite(BufferOp op,int fd,const char * buf,ut32 len)13 static int allwrite(BufferOp op, int fd, const char *buf, ut32 len) {
14 ut32 w;
15 while (len > 0) {
16 w = op (fd, buf, len);
17 if (w != len) {
18 return 0;
19 }
20 buf += w;
21 len -= w;
22 }
23 return 1;
24 }
25
buffer_flush(buffer * s)26 int buffer_flush(buffer *s) {
27 int p = s->p;
28 if (!p) {
29 return 1;
30 }
31 s->p = 0;
32 return allwrite (s->op, s->fd, s->x, p);
33 }
34
buffer_putalign(buffer * s,const char * buf,ut32 len)35 int buffer_putalign(buffer *s, const char *buf, ut32 len) {
36 ut32 n;
37 if (!s || !s->x || !buf) {
38 return 0;
39 }
40 while (len > (n = s->n - s->p)) {
41 memcpy (s->x + s->p, buf, n);
42 s->p += n; buf += n; len -= n;
43 if (!buffer_flush (s)) {
44 return 0;
45 }
46 }
47 /* now len <= s->n - s->p */
48 memcpy (s->x + s->p, buf, len);
49 s->p += len;
50 return 1;
51 }
52
buffer_putflush(buffer * s,const char * buf,ut32 len)53 int buffer_putflush(buffer *s, const char *buf, ut32 len) {
54 if (!buffer_flush (s)) {
55 return 0;
56 }
57 return allwrite (s->op, s->fd, buf, len);
58 }
59