1 /* this is the brisby fancy buffer */
2 #ifndef __bin_h
3 #define __bin_h
4 
5 #include "mem.h"
6 #include "error.h"
7 
8 #define bin_init(s) do { s[0].buf = 0; s->len = s->used = 0; } while(0)
9 
10 struct bin_s {
11 	char *buf;
12 	int len;
13 	int used;
14 };
15 
16 typedef struct bin_s bin_t[1];
17 
18 #define caddr(x) ((x)->buf)
19 #define clen(x) ((x)->used)
20 
21 #include <stdlib.h>
22 
bin_need(bin_t p,int tot)23 static void inline bin_need(bin_t p, int tot)
24 {
25 	if (tot > p->len) {
26 		/* Clib */
27 		p->buf = realloc(p->buf, tot);
28 		if (!p->buf) {
29 			cfatal("bin_need:realloc: %s");
30 		}
31 		p->len = tot;
32 	}
33 }
bin_needplus(bin_t p,int amu)34 static void inline bin_needplus(bin_t p, int amu)
35 {
36 	bin_need(p, p->used+amu);
37 }
38 
bin_cat(bin_t p,char * s,int len)39 static void inline bin_cat(bin_t p, char *s, int len) {
40 	bin_needplus(p, len);
41 	memcpy(p->buf + p->used, s, len);
42 	p->used += len;
43 }
44 
bin_addch(bin_t p,int ch)45 static void inline bin_addch(bin_t p, int ch) {
46 	char b[2];
47 
48 	b[0] = ch;
49 	bin_cat(p, b, 1);
50 }
51 
bin_empty(bin_t p)52 static void inline bin_empty(bin_t p) {
53 	if (p) p->used = 0;
54 }
bin_0(bin_t p)55 static void inline bin_0(bin_t p) {
56 	bin_addch(p, '\0');
57 }
58 
bin_copy(bin_t p,const char * s,int len)59 static void inline bin_copy(bin_t p, const char *s, int len) {
60 	bin_need(p, len);
61 	memcpy(p->buf, s, len);
62 	p->used = len;
63 }
64 
bin_len(bin_t p)65 static int inline bin_len(bin_t p) {
66 	return p->len;
67 }
68 
69 #endif
70