summaryrefslogtreecommitdiffstats
path: root/lib/buffer.c
diff options
context:
space:
mode:
authorGergely Nagy <algernon@balabit.hu>2012-06-22 15:16:38 +0200
committerGergely Nagy <algernon@balabit.hu>2012-06-22 15:16:38 +0200
commit64577eeed64b0c7a188e3d9d1d9b9fa8d0f7bbf5 (patch)
tree494eb517c04dd444e136e4a6b0a4fa4c18716381 /lib/buffer.c
parentbae889300263bd5c1a7b8c5953d3545603e360fc (diff)
downloadlibumberlog-64577eeed64b0c7a188e3d9d1d9b9fa8d0f7bbf5.tar.gz
libumberlog-64577eeed64b0c7a188e3d9d1d9b9fa8d0f7bbf5.tar.xz
libumberlog-64577eeed64b0c7a188e3d9d1d9b9fa8d0f7bbf5.zip
Simplify extending the buffer
Most of the callers know how much the buffer needs extending, so don't ask them for the total size: new _ul_buffer_reserve_size replaces _ul_buffer_ensure_size, and the fast path is now inlined. Signed-off-by: Miloslav Trmač <mitr@redhat.com> Signed-off-by: Gergely Nagy <algernon@balabit.hu>
Diffstat (limited to 'lib/buffer.c')
-rw-r--r--lib/buffer.c61
1 files changed, 35 insertions, 26 deletions
diff --git a/lib/buffer.c b/lib/buffer.c
index 779d6bf..e6f064c 100644
--- a/lib/buffer.c
+++ b/lib/buffer.c
@@ -44,6 +44,32 @@ ul_buffer_finish (void)
free (escape_buffer.msg);
}
+static int
+_ul_buffer_realloc_for_min (ul_buffer_t *buffer, size_t min)
+{
+ size_t new_alloc;
+ void *new_msg;
+
+ new_alloc = buffer->alloc + min * 2;
+ new_msg = realloc (buffer->msg, new_alloc);
+ if (new_msg == NULL)
+ return -1;
+ buffer->alloc = new_alloc;
+ buffer->msg = new_msg;
+ return 0;
+}
+
+static inline int
+_ul_buffer_reserve_size (ul_buffer_t *buffer, size_t size)
+{
+ size_t min;
+
+ min = buffer->len + size;
+ if (buffer->alloc < min)
+ return _ul_buffer_realloc_for_min (buffer, min);
+ return 0;
+}
+
static inline int
_ul_str_escape (const char *str, char *dest, size_t *length)
{
@@ -123,31 +149,14 @@ _ul_str_escape (const char *str, char *dest, size_t *length)
return 0;
}
-static inline int
-_ul_buffer_ensure_size (ul_buffer_t *buffer, size_t size)
-{
- if (buffer->alloc < size)
- {
- size_t new_alloc;
- void *new_msg;
-
- new_alloc = buffer->alloc + size * 2;
- new_msg = realloc (buffer->msg, new_alloc);
- if (new_msg == NULL)
- return -1;
- buffer->alloc = new_alloc;
- buffer->msg = new_msg;
- }
- return 0;
-}
-
int
ul_buffer_reset (ul_buffer_t *buffer)
{
- if (_ul_buffer_ensure_size (buffer, 512) != 0)
+ buffer->len = 0;
+ if (_ul_buffer_reserve_size (buffer, 512) != 0)
return -1;
- buffer->len = 1;
buffer->msg[0] = '{';
+ buffer->len = 1;
return 0;
}
@@ -159,12 +168,12 @@ ul_buffer_append (ul_buffer_t *buffer, const char *key, const char *value)
/* Append the key to the buffer */
escape_buffer.len = 0;
- if (_ul_buffer_ensure_size (&escape_buffer, strlen (key) * 6 + 1) != 0)
+ if (_ul_buffer_reserve_size (&escape_buffer, strlen (key) * 6 + 1) != 0)
goto err;
if (_ul_str_escape (key, escape_buffer.msg, &lk) != 0)
goto err;
- if (_ul_buffer_ensure_size (buffer, buffer->len + lk + 4) != 0)
+ if (_ul_buffer_reserve_size (buffer, lk + 4) != 0)
goto err;
memcpy (buffer->msg + buffer->len, "\"", 1);
@@ -173,12 +182,12 @@ ul_buffer_append (ul_buffer_t *buffer, const char *key, const char *value)
/* Append the value to the buffer */
escape_buffer.len = 0;
- if (_ul_buffer_ensure_size (&escape_buffer, strlen (value) * 6 + 1) != 0)
+ if (_ul_buffer_reserve_size (&escape_buffer, strlen (value) * 6 + 1) != 0)
goto err;
if (_ul_str_escape (value, escape_buffer.msg, &lv) != 0)
goto err;
- if (_ul_buffer_ensure_size (buffer, buffer->len + lk + lv + 6) != 0)
+ if (_ul_buffer_reserve_size (buffer, lk + lv + 6) != 0)
goto err;
memcpy (buffer->msg + buffer->len + 1 + lk + 3, escape_buffer.msg, lv);
@@ -197,13 +206,13 @@ ul_buffer_finalize (ul_buffer_t *buffer)
{
if (buffer->msg[buffer->len - 1] == ',')
{
- if (_ul_buffer_ensure_size (buffer, buffer->len + 1) != 0)
+ if (_ul_buffer_reserve_size (buffer, 1) != 0)
return NULL;
buffer->msg[buffer->len - 1] = '}';
}
else
{
- if (_ul_buffer_ensure_size (buffer, buffer->len + 2) != 0)
+ if (_ul_buffer_reserve_size (buffer, 2) != 0)
return NULL;
buffer->msg[buffer->len++] = '}';
}