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