gsize max_len;
};
+/* _ROOM accounts for the null-terminator, _RAW_ROOM does not.
+ * Some functions need one, some functions need the other. */
+#define WMEM_STRBUF_ROOM(S) ((S)->alloc_len - (S)->len - 1)
+#define WMEM_STRBUF_RAW_ROOM(S) ((S)->alloc_len - (S)->len)
+
wmem_strbuf_t *
wmem_strbuf_sized_new(wmem_allocator_t *allocator,
gsize alloc_len, gsize max_len)
wmem_strbuf_grow(strbuf, append_len);
- g_strlcpy(&strbuf->str[strbuf->len], str, strbuf->alloc_len);
+ g_strlcpy(&strbuf->str[strbuf->len], str, WMEM_STRBUF_RAW_ROOM(strbuf));
strbuf->len = MIN(strbuf->len + append_len, strbuf->alloc_len - 1);
}
wmem_strbuf_grow(strbuf, append_len - 1);
append_len = g_vsnprintf(&strbuf->str[strbuf->len],
- (gulong) (strbuf->alloc_len - strbuf->len),
+ (gulong) WMEM_STRBUF_RAW_ROOM(strbuf),
fmt, ap2);
va_end(ap2);
va_end(ap);
}
+void
+wmem_strbuf_append_c(wmem_strbuf_t *strbuf, const gchar c)
+{
+ wmem_strbuf_grow(strbuf, 1);
+
+ /* one for the char, one for the null-terminator */
+ if (WMEM_STRBUF_ROOM(strbuf) >= 1) {
+ strbuf->str[strbuf->len] = c;
+ strbuf->len++;
+ strbuf->str[strbuf->len] = '\0';
+ }
+}
+
+void
+wmem_strbuf_append_unichar(wmem_strbuf_t *strbuf, const gunichar c)
+{
+ gchar buf[6];
+ gsize charlen;
+
+ charlen = g_unichar_to_utf8(c, buf);
+
+ wmem_strbuf_grow(strbuf, charlen);
+
+ if (WMEM_STRBUF_ROOM(strbuf) >= charlen) {
+ memcpy(&strbuf->str[strbuf->len], buf, charlen);
+ strbuf->len += charlen;
+ strbuf->str[strbuf->len] = '\0';
+ }
+}
+
void
wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const gsize len)
{
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3a");
g_assert(wmem_strbuf_get_len(strbuf) == 10);
- wmem_strbuf_truncate(strbuf, 10);
- g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3a");
- g_assert(wmem_strbuf_get_len(strbuf) == 10);
+ wmem_strbuf_append_c(strbuf, 'q');
+ g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq");
+ g_assert(wmem_strbuf_get_len(strbuf) == 11);
+
+ wmem_strbuf_append_unichar(strbuf, g_utf8_get_char("\xC2\xA9"));
+ g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq\xC2\xA9");
+ g_assert(wmem_strbuf_get_len(strbuf) == 13);
+
+ wmem_strbuf_truncate(strbuf, 32);
+ wmem_strbuf_truncate(strbuf, 24);
+ wmem_strbuf_truncate(strbuf, 16);
+ wmem_strbuf_truncate(strbuf, 13);
+ g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq\xC2\xA9");
+ g_assert(wmem_strbuf_get_len(strbuf) == 13);
wmem_strbuf_truncate(strbuf, 3);
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TES");
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd");
g_assert(wmem_strbuf_get_len(strbuf) == 9);
+ wmem_strbuf_append(strbuf, "abcdefghijklmnopqrstuvwxyz");
+ g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd");
+ g_assert(wmem_strbuf_get_len(strbuf) == 9);
+
+ wmem_strbuf_append_c(strbuf, 'q');
+ g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd");
+ g_assert(wmem_strbuf_get_len(strbuf) == 9);
+
+ wmem_strbuf_append_unichar(strbuf, g_utf8_get_char("\xC2\xA9"));
+ g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd");
+ g_assert(wmem_strbuf_get_len(strbuf) == 9);
+
wmem_free_all(allocator);
strbuf = wmem_strbuf_new(allocator, "TEST");