Make json_error_t transparent again
[jansson.git] / src / strbuffer.c
index 911748d..4e866bd 100644 (file)
@@ -1,26 +1,48 @@
+/*
+ * Copyright (c) 2009, 2010 Petri Lehtinen <petri@digip.org>
+ *
+ * Jansson is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See LICENSE for details.
+ */
+
 #define _GNU_SOURCE
 #include <stdlib.h>
 #include <string.h>
+#include "jansson_private.h"
 #include "strbuffer.h"
-#include "util.h"
 
 #define STRBUFFER_MIN_SIZE  16
 #define STRBUFFER_FACTOR    2
 
-void strbuffer_init(strbuffer_t *strbuff)
+int strbuffer_init(strbuffer_t *strbuff)
 {
-    strbuff->value = NULL;
+    strbuff->size = STRBUFFER_MIN_SIZE;
     strbuff->length = 0;
-    strbuff->size = 0;
+
+    strbuff->value = malloc(strbuff->size);
+    if(!strbuff->value)
+        return -1;
+
+    /* initialize to empty */
+    strbuff->value[0] = '\0';
+    return 0;
 }
 
 void strbuffer_close(strbuffer_t *strbuff)
 {
     free(strbuff->value);
-    strbuffer_init(strbuff);
+    strbuff->size = 0;
+    strbuff->length = 0;
+    strbuff->value = NULL;
+}
+
+void strbuffer_clear(strbuffer_t *strbuff)
+{
+    strbuff->length = 0;
+    strbuff->value[0] = '\0';
 }
 
-const char *strbuffer_value(strbuffer_t *strbuff)
+const char *strbuffer_value(const strbuffer_t *strbuff)
 {
     return strbuff->value;
 }
@@ -37,26 +59,37 @@ int strbuffer_append(strbuffer_t *strbuff, const char *string)
     return strbuffer_append_bytes(strbuff, string, strlen(string));
 }
 
+int strbuffer_append_byte(strbuffer_t *strbuff, char byte)
+{
+    return strbuffer_append_bytes(strbuff, &byte, 1);
+}
+
 int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size)
 {
-    if(strbuff->length + size > strbuff->size)
+    if(strbuff->length + size >= strbuff->size)
     {
-        if(strbuff->length == 0)
-            strbuff->size = max(size + 1, STRBUFFER_MIN_SIZE);
-        else
-            strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
-                                strbuff->length + size + 1);
+        strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
+                            strbuff->length + size + 1);
 
         strbuff->value = realloc(strbuff->value, strbuff->size);
         if(!strbuff->value)
             return -1;
-
-        memset(strbuff->value + strbuff->length + size, 0,
-               strbuff->size - strbuff->length - size);
     }
 
     memcpy(strbuff->value + strbuff->length, data, size);
     strbuff->length += size;
+    strbuff->value[strbuff->length] = '\0';
 
     return 0;
 }
+
+char strbuffer_pop(strbuffer_t *strbuff)
+{
+    if(strbuff->length > 0) {
+        char c = strbuff->value[--strbuff->length];
+        strbuff->value[strbuff->length] = '\0';
+        return c;
+    }
+    else
+        return '\0';
+}