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