dump: Optimize indenting
authorPetri Lehtinen <petri@digip.org>
Thu, 3 Sep 2009 19:00:33 +0000 (22:00 +0300)
committerPetri Lehtinen <petri@digip.org>
Fri, 4 Sep 2009 06:52:40 +0000 (09:52 +0300)
Don't alloca() a whitespace buffer and fill it with spaces in each
call to dump_indent. Instead, use a static whitespace buffer.

As a bonus, this saves the use of poorly portable alloca().

src/dump.c

index 4831873..24e206f 100644 (file)
@@ -36,22 +36,23 @@ static int dump_to_file(const char *buffer, int size, void *data)
     return 0;
 }
 
+/* 256 spaces (the maximum indentation size) */
+static char whitespace[] = "                                                                                                                                                                                                                                                                ";
+
 static int dump_indent(uint32_t flags, int depth, dump_func dump, void *data)
 {
     if(JSON_INDENT(flags) > 0)
     {
-        char *ws_buffer;
-        int ws_count = JSON_INDENT(flags) * depth;
+        int i, ws_count = JSON_INDENT(flags);
 
         if(dump("\n", 1, data))
             return -1;
 
-        if(ws_count == 0)
-            return 0;
-
-        ws_buffer = alloca(ws_count);
-        memset(ws_buffer, ' ', ws_count);
-        return dump(ws_buffer, ws_count, data);
+        for(i = 0; i < depth; i++)
+        {
+            if(dump(whitespace, ws_count, data))
+                return -1;
+        }
     }
     return 0;
 }