*/
void buf_add(struct buf *s, const char *data);
+/**
+ * buf_add_char - add single char to C string buffer
+ * @s: buffer
+ * @data: char to be added
+ */
+void buf_add_char(struct buf *s, char data);
+
+/**
+ * buf_clear - clear the buffer, internal allocations are preserved
+ * @s: buffer
+ */
+void buf_clear(struct buf *s);
+
+/**
+ * buf_reset - reset the buffer, internal allocations are free'd
+ * @s: buffer
+ */
+void buf_reset(struct buf *s);
+
#endif /* LABWC_BUF_H */
// SPDX-License-Identifier: GPL-2.0-only
+#include <assert.h>
#include <ctype.h>
#include <stdbool.h>
#include "common/buf.h"
#include "common/mem.h"
-static void
-buf_add_one_char(struct buf *s, char ch)
-{
- if (s->alloc <= s->len + 1) {
- s->alloc = s->alloc * 3 / 2 + 16;
- s->buf = xrealloc(s->buf, s->alloc);
- }
- s->buf[s->len++] = ch;
- s->buf[s->len] = '\0';
-}
-
void
buf_expand_tilde(struct buf *s)
{
if (s->buf[i] == '~') {
buf_add(&new, getenv("HOME"));
} else {
- buf_add_one_char(&new, s->buf[i]);
+ buf_add_char(&new, s->buf[i]);
}
}
free(s->buf);
buf_add(&new, p);
}
} else {
- buf_add_one_char(&new, s->buf[i]);
+ buf_add_char(&new, s->buf[i]);
}
}
free(environment_variable.buf);
void
buf_init(struct buf *s)
{
+ /* we can't assert(!s->buf) here because struct may be uninitialized */
+
s->alloc = 256;
s->buf = xmalloc(s->alloc);
s->buf[0] = '\0';
void
buf_add(struct buf *s, const char *data)
{
+ assert(s->buf);
+
if (!data || data[0] == '\0') {
return;
}
s->len += len;
s->buf[s->len] = 0;
}
+
+void
+buf_add_char(struct buf *s, char ch)
+{
+ assert(s->buf);
+
+ if (s->alloc <= s->len + 1) {
+ s->alloc = s->alloc * 3 / 2 + 16;
+ s->buf = xrealloc(s->buf, s->alloc);
+ }
+ s->buf[s->len++] = ch;
+ s->buf[s->len] = '\0';
+}
+
+void
+buf_clear(struct buf *s)
+{
+ assert(s->buf);
+
+ s->len = 0;
+ s->buf[0] = '\0';
+}
+
+void
+buf_reset(struct buf *s)
+{
+ zfree(s->buf);
+ buf_init(s);
+}