]> git.wincent.com - wikitext.git/blobdiff - ext/str.c
Add options for "output_style" (no backend yet)
[wikitext.git] / ext / str.c
index d201cb7f763e89b61485eee5c83a9c36690a94f8..322a9f3aefcf49eee3f6ce9619963cca91ff42b0 100644 (file)
--- a/ext/str.c
+++ b/ext/str.c
 
 #include "str.h"
 
+// when allocating memory, reserve a little more than was asked for,
+// which can help to avoid subsequent allocations
+#define STR_OVERALLOC 256
+
 str_t *str_new(void)
 {
     str_t *str      = ALLOC_N(str_t, 1);
@@ -32,31 +36,13 @@ str_t *str_new(void)
     return str;
 }
 
-str_t *str_new_size(long len)
-{
-    str_t *str      = ALLOC_N(str_t, 1);
-    str->ptr        = ALLOC_N(char, len);
-    str->len        = 0;
-    str->capacity   = len;
-    return str;
-}
-
-str_t *str_new_copy(char *src, long len)
+str_t *str_new_copy(const char *src, long len)
 {
     str_t *str      = ALLOC_N(str_t, 1);
-    str->ptr        = ALLOC_N(char, len);
+    str->ptr        = ALLOC_N(char, len + STR_OVERALLOC);
     memcpy(str->ptr, src, len);
     str->len        = len;
-    str->capacity   = len;
-    return str;
-}
-
-str_t *str_new_no_copy(char *src, long len)
-{
-    str_t *str      = ALLOC_N(str_t, 1);
-    str->ptr        = src;
-    str->len        = len;
-    str->capacity   = len;
+    str->capacity   = len + STR_OVERALLOC;
     return str;
 }
 
@@ -76,23 +62,23 @@ void str_grow(str_t *str, long len)
     if (str->capacity < len)
     {
         if (str->ptr)
-            REALLOC_N(str->ptr, char, len);
+            REALLOC_N(str->ptr, char, len + STR_OVERALLOC);
         else
-            str->ptr = ALLOC_N(char, len);
-        str->capacity = len;
+            str->ptr = ALLOC_N(char, len + STR_OVERALLOC);
+        str->capacity = len + STR_OVERALLOC;
     }
 }
 
-void str_append(str_t *str, char *src, long len)
+void str_append(str_t *str, const char *src, long len)
 {
     long new_len = str->len + len;
     if (str->capacity < new_len)
     {
         if (str->ptr)
-            REALLOC_N(str->ptr, char, new_len);
+            REALLOC_N(str->ptr, char, new_len + STR_OVERALLOC);
         else
-            str->ptr = ALLOC_N(char, new_len);
-        str->capacity = new_len;
+            str->ptr = ALLOC_N(char, new_len + STR_OVERALLOC);
+        str->capacity = new_len + STR_OVERALLOC;
     }
     memcpy(str->ptr + str->len, src, len);
     str->len = new_len;
@@ -103,12 +89,9 @@ void str_append_str(str_t *str, str_t *other)
     str_append(str, other->ptr, other->len);
 }
 
-void str_swap(str_t **a, str_t **b)
+void str_append_string(str_t *str, VALUE other)
 {
-    str_t *c;
-    c = *a;
-    *a = *b;
-    *b = c;
+    str_append(str, RSTRING_PTR(other), RSTRING_LEN(other));
 }
 
 void str_clear(str_t *str)