Wmem string-buffer improvements:

- better tests
- fix a bug caught by the better tests
- implement append_c and append_unichar, with tests

Wmem string-buffers now have feature parity with their emem equivalents, so
remove them from the TODO list.

svn path=/trunk/; revision=49060
This commit is contained in:
Evan Huus 2013-04-26 21:30:24 +00:00
parent 32352fb1a2
commit 5deac1e6e1
4 changed files with 71 additions and 6 deletions

View File

@ -322,7 +322,6 @@ intimately familiar with Glib's testing framework, but it does the job.
The following is a list of things that wmem provides but are incomplete The following is a list of things that wmem provides but are incomplete
(i.e. missing common operations): (i.e. missing common operations):
- string buffers
- singly-linked list - singly-linked list
The following is an incomplete list of things that emem provides but wmem has The following is an incomplete list of things that emem provides but wmem has

View File

@ -53,6 +53,11 @@ struct _wmem_strbuf_t {
gsize max_len; 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_t *
wmem_strbuf_sized_new(wmem_allocator_t *allocator, wmem_strbuf_sized_new(wmem_allocator_t *allocator,
gsize alloc_len, gsize max_len) gsize alloc_len, gsize max_len)
@ -138,7 +143,7 @@ wmem_strbuf_append(wmem_strbuf_t *strbuf, const gchar *str)
wmem_strbuf_grow(strbuf, append_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); strbuf->len = MIN(strbuf->len + append_len, strbuf->alloc_len - 1);
} }
@ -158,7 +163,7 @@ wmem_strbuf_append_vprintf(wmem_strbuf_t *strbuf, const gchar *fmt, va_list ap)
wmem_strbuf_grow(strbuf, append_len - 1); wmem_strbuf_grow(strbuf, append_len - 1);
append_len = g_vsnprintf(&strbuf->str[strbuf->len], append_len = g_vsnprintf(&strbuf->str[strbuf->len],
(gulong) (strbuf->alloc_len - strbuf->len), (gulong) WMEM_STRBUF_RAW_ROOM(strbuf),
fmt, ap2); fmt, ap2);
va_end(ap2); va_end(ap2);
@ -176,6 +181,36 @@ wmem_strbuf_append_printf(wmem_strbuf_t *strbuf, const gchar *format, ...)
va_end(ap); 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 void
wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const gsize len) wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const gsize len)
{ {

View File

@ -59,6 +59,14 @@ void
wmem_strbuf_append_printf(wmem_strbuf_t *strbuf, const gchar *format, ...) wmem_strbuf_append_printf(wmem_strbuf_t *strbuf, const gchar *format, ...)
G_GNUC_PRINTF(2, 3); G_GNUC_PRINTF(2, 3);
WS_DLL_PUBLIC
void
wmem_strbuf_append_c(wmem_strbuf_t *strbuf, const gchar c);
WS_DLL_PUBLIC
void
wmem_strbuf_append_unichar(wmem_strbuf_t *strbuf, const gunichar c);
WS_DLL_PUBLIC WS_DLL_PUBLIC
void void
wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const gsize len); wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const gsize len);

View File

@ -368,9 +368,20 @@ wmem_test_strbuf(void)
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3a"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3a");
g_assert(wmem_strbuf_get_len(strbuf) == 10); g_assert(wmem_strbuf_get_len(strbuf) == 10);
wmem_strbuf_truncate(strbuf, 10); wmem_strbuf_append_c(strbuf, 'q');
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3a"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq");
g_assert(wmem_strbuf_get_len(strbuf) == 10); 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); wmem_strbuf_truncate(strbuf, 3);
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TES"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TES");
@ -389,6 +400,18 @@ wmem_test_strbuf(void)
g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd");
g_assert(wmem_strbuf_get_len(strbuf) == 9); 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); wmem_free_all(allocator);
strbuf = wmem_strbuf_new(allocator, "TEST"); strbuf = wmem_strbuf_new(allocator, "TEST");