1 /* variable length string buffer */
8 #define ALIGN(n, a) (((n) + (a) - 1) & ~((a) - 1))
11 static void sbuf_extend(struct sbuf
*sbuf
, int amount
)
13 sbuf
->sz
= ALIGN(amount
, SBUFSZ
);
14 sbuf
->s
= mextend(sbuf
->s
, sbuf
->n
, sbuf
->sz
, sizeof(sbuf
->s
[0]));
17 void sbuf_init(struct sbuf
*sbuf
)
19 memset(sbuf
, 0, sizeof(*sbuf
));
20 sbuf_extend(sbuf
, SBUFSZ
);
23 void sbuf_add(struct sbuf
*sbuf
, int c
)
25 if (sbuf
->n
+ 2 >= sbuf
->sz
)
26 sbuf_extend(sbuf
, sbuf
->sz
* 2);
27 sbuf
->s
[sbuf
->n
++] = c
;
30 void sbuf_append(struct sbuf
*sbuf
, char *s
)
33 if (sbuf
->n
+ len
+ 1 >= sbuf
->sz
)
34 sbuf_extend(sbuf
, sbuf
->n
+ len
+ 1);
35 memcpy(sbuf
->s
+ sbuf
->n
, s
, len
);
39 void sbuf_printf(struct sbuf
*sbuf
, char *s
, ...)
44 vsnprintf(buf
, sizeof(buf
), s
, ap
);
46 sbuf_append(sbuf
, buf
);
49 int sbuf_empty(struct sbuf
*sbuf
)
54 char *sbuf_buf(struct sbuf
*sbuf
)
56 sbuf
->s
[sbuf
->n
] = '\0';
60 int sbuf_len(struct sbuf
*sbuf
)
65 /* shorten the sbuf */
66 void sbuf_cut(struct sbuf
*sbuf
, int n
)
72 void sbuf_done(struct sbuf
*sbuf
)
77 char *sbuf_out(struct sbuf
*sbuf
)
80 memset(sbuf
, 0, sizeof(*sbuf
));