summaryrefslogtreecommitdiffstats
path: root/lib/buffer.c
diff options
context:
space:
mode:
authorGergely Nagy <algernon@balabit.hu>2012-05-02 16:25:04 +0200
committerGergely Nagy <algernon@balabit.hu>2012-05-02 16:25:04 +0200
commitac2a1fdb38057e032b22c4e2ea43d5ab741222b8 (patch)
tree52f91b7c65314760932543b8825303e1122954fe /lib/buffer.c
parentb9751e1ca5f96ffdf49e38646709a3de9e25a208 (diff)
parente5faea1d639252017cc8321e9c2cb5d17b061e97 (diff)
Merge tag 'libumberlog-0.2.1' into debian
libumberlog 0.2.1 release
Diffstat (limited to 'lib/buffer.c')
-rw-r--r--lib/buffer.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/lib/buffer.c b/lib/buffer.c
index 8bdb3ef..ef448bf 100644
--- a/lib/buffer.c
+++ b/lib/buffer.c
@@ -54,11 +54,20 @@ static const unsigned char json_exceptions[] =
0xff, '\0'
};
+static __thread ul_buffer_t escape_buffer;
+
+static void ul_buffer_finish (void) __attribute__((destructor));
+
+static void
+ul_buffer_finish (void)
+{
+ free (escape_buffer.msg);
+}
+
static inline char *
-_ul_str_escape (const char *str)
+_ul_str_escape (const char *str, char *dest, size_t *length)
{
const unsigned char *p;
- char *dest;
char *q;
static unsigned char exmap[256];
static int exmap_inited;
@@ -67,7 +76,7 @@ _ul_str_escape (const char *str)
return NULL;
p = (unsigned char *)str;
- q = dest = malloc (strlen (str) * 6 + 1);
+ q = dest;
if (!exmap_inited)
{
@@ -139,6 +148,8 @@ _ul_str_escape (const char *str)
}
*q = 0;
+ if (length)
+ *length = q - dest;
return dest;
}
@@ -169,38 +180,44 @@ ul_buffer_append (ul_buffer_t *buffer, const char *key, const char *value)
{
char *k, *v;
size_t lk, lv;
+ size_t orig_len = buffer->len;
- k = _ul_str_escape (key);
+ /* Append the key to the buffer */
+ escape_buffer.len = 0;
+ _ul_buffer_ensure_size (&escape_buffer, strlen (key) * 6 + 1);
+ k = _ul_str_escape (key, escape_buffer.msg, &lk);
if (!k)
return NULL;
- v = _ul_str_escape (value);
+
+ buffer = _ul_buffer_ensure_size (buffer, buffer->len + lk + 4);
+ if (!buffer)
+ return NULL;
+
+ memcpy (buffer->msg + buffer->len, "\"", 1);
+ memcpy (buffer->msg + buffer->len + 1, k, lk);
+ memcpy (buffer->msg + buffer->len + 1 + lk, "\":\"", 3);
+
+ /* Append the value to the buffer */
+ escape_buffer.len = 0;
+ _ul_buffer_ensure_size (&escape_buffer, strlen (value) * 6 + 1);
+ v = _ul_str_escape (value, escape_buffer.msg, &lv);
if (!v)
{
- free (k);
+ buffer->len = orig_len;
return NULL;
}
- lk = strlen (k);
- lv = strlen (v);
-
buffer = _ul_buffer_ensure_size (buffer, buffer->len + lk + lv + 6);
if (!buffer)
{
- free (k);
- free (v);
+ buffer->len = orig_len;
return NULL;
}
- memcpy (buffer->msg + buffer->len, "\"", 1);
- memcpy (buffer->msg + buffer->len + 1, k, lk);
- memcpy (buffer->msg + buffer->len + 1 + lk, "\":\"", 3);
memcpy (buffer->msg + buffer->len + 1 + lk + 3, v, lv);
memcpy (buffer->msg + buffer->len + 1 + lk + 3 + lv, "\",", 2);
buffer->len += lk + lv + 6;
- free (k);
- free (v);
-
return buffer;
}