* Usage:
* sb_t sb = sb_init();
* sb_printf(&sb, "hello %s", "world");
- * sb_append(&sb, "!");
+ * sb_cat(&sb, "!");
* char *s = sb_get(&sb); // transfers ownership
* free(s);
*
* sb_t sb2 = sb_init();
* sb_printf(&sb2, "answer = %d", 42);
* puts(sb2.d); // direct access
- * sb_free(&sb2); // frees buffer
+ * sb_fini(&sb2); // frees buffer
*/
#ifndef SB_H
/* Larger functions defined in sb.c (non-inline to save space). */
void sb_grow(sb_t *sb, size_t needed);
-void sb_append(sb_t *sb, const char *s);
-void sb_append_n(sb_t *sb, const char *s, size_t n);
-void sb_append_c(sb_t *sb, char c);
+void sb_cat(sb_t *sb, const char *s);
+void sb_cat_n(sb_t *sb, const char *s, size_t n);
+void sb_cat_c(sb_t *sb, char c);
void sb_printf(sb_t *sb, const char *fmt, ...) SB_PRINTF_ATTR(2, 3);
-void sb_free(sb_t *sb);
+void sb_fini(sb_t *sb);
void sb_reset(sb_t *sb);
char *sb_get(sb_t *sb);
char *sb_str(sb_t *sb);
}
if (unfolded != NULL)
- sb_append(&raw, line);
+ sb_cat(&raw, line);
chomp(line);
/* end-of-headers */
if (*line == '\0') {
- sb_free(&raw);
+ sb_fini(&raw);
if (unfolded != NULL)
*unfolded = NULL;
free(line);
return NULL;
}
- sb_append(&folded, line);
+ sb_cat(&folded, line);
for(;;) {
/* look ahead one char to determine if we need to fold */
break;
if (raw.len != 0)
- sb_append(&raw, line);
+ sb_cat(&raw, line);
chomp(line);
- sb_append(&folded, line);
+ sb_cat(&folded, line);
}
free(line);
if (unfolded != NULL)
goto out;
}
if (moderators)
- sb_append(&str, line);
+ sb_cat(&str, line);
}
if (moderators)
key = line;
endpos = strchr(key, '$');
if (endpos == NULL) {
- sb_append_c(str, '$');
+ sb_cat_c(str, '$');
return (0);
}
len = endpos - key;
subst = txt->substs.d[_i];
if (strlen (subst->token) == len &&
strncmp(key, subst->token, len) == 0) {
- sb_append(str, subst->subst);
+ sb_cat(str, subst->subst);
found = true;
break;
}
while (*pos != '\0') {
if (*pos != '$')
- sb_append_c(&str, *pos);
+ sb_cat_c(&str, *pos);
else
pos += do_substitute(&str, pos, listfd, ctrlfd, txt);
pos++;
{
if (needed <= sb->cap)
return;
- size_t newcap = sb->cap ? sb->cap : 64;
+ size_t newcap = sb->cap ? sb->cap * 2 : 512;
while (newcap < needed)
newcap *= 2;
char *nd = realloc(sb->d, newcap);
}
void
-sb_append(sb_t *sb, const char *s)
+sb_cat(sb_t *sb, const char *s)
{
size_t slen = strlen(s);
sb_grow(sb, sb->len + slen + 1);
}
void
-sb_append_n(sb_t *sb, const char *s, size_t n)
+sb_cat_n(sb_t *sb, const char *s, size_t n)
{
if (n == 0)
return;
}
void
-sb_append_c(sb_t *sb, char c)
+sb_cat_c(sb_t *sb, char c)
{
sb_grow(sb, sb->len + 2);
sb->d[sb->len++] = c;
int n;
if (sb->cap == 0)
- sb_grow(sb, 64);
+ sb_grow(sb, 512);
for (;;) {
size_t remain = sb->cap - sb->len;
}
void
-sb_free(sb_t *sb)
+sb_fini(sb_t *sb)
{
+ if (sb == NULL)
+ return;
free(sb->d);
sb->d = NULL;
sb->len = 0;
void
sb_reset(sb_t *sb)
{
+ if (sb == NULL)
+ return;
sb->len = 0;
if (sb->d)
sb->d[0] = '\0';
char *
sb_get(sb_t *sb)
{
+ if (sb == NULL)
+ return (NULL);
if (sb->d == NULL) {
sb_grow(sb, 1);
sb->d[0] = '\0';
switch (*qpstr) {
case '=':
if (strlen(qpstr) < 2) {
- sb_append_c(&str, *qpstr);
+ sb_cat_c(&str, *qpstr);
break;
}
if (qpstr[1] == '\r' && qpstr[2] == '\n') {
break;
}
if (strchr("0123456789ABCDEFabcdef", qpstr[1]) == NULL) {
- sb_append_c(&str, *qpstr);
+ sb_cat_c(&str, *qpstr);
break;
}
if (strchr("0123456789ABCDEFabcdef", qpstr[2]) == NULL) {
- sb_append_c(&str, *qpstr);
+ sb_cat_c(&str, *qpstr);
break;
}
- sb_append_c(&str, decode_char(qpstr));
+ sb_cat_c(&str, decode_char(qpstr));
qpstr += 2;
break;
case '_':
if (qformat) {
- sb_append_c(&str, 0x20);
+ sb_cat_c(&str, 0x20);
break;
}
/* FALLTHROUGH */
default:
- sb_append_c(&str, *qpstr);
+ sb_cat_c(&str, *qpstr);
break;
}
qpstr++;