]> granicus.if.org Git - graphviz/commitdiff
JSON plugin stoj: remove static buffer
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Fri, 14 Oct 2022 03:48:17 +0000 (20:48 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 5 Nov 2022 23:25:05 +0000 (16:25 -0700)
This removes some dynamic allocation, as well as making this function now thread
safe. Note that the contained call to `latin1ToUTF8` still allocates.

plugin/core/gvrender_core_json.c

index 53d7b5dff8f74f2b7deffca8527708ee5f368c7e..80a87d07fd1c0527e448af6482ef14952af28cbc 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <gvc/gvplugin_render.h>
 #include <gvc/gvplugin_device.h>
-#include <cgraph/agxbuf.h>
 #include <cgraph/alloc.h>
 #include <cgraph/startswith.h>
 #include <cgraph/unreachable.h>
@@ -87,7 +86,6 @@ static void json_begin_graph(GVJ_t *job)
 static void stoj(char *ins, state_t *sp, GVJ_t *job) {
     char* s;
     char* input;
-    static agxbuf xb;
     char c;
 
     if (sp->isLatin)
@@ -95,44 +93,42 @@ static void stoj(char *ins, state_t *sp, GVJ_t *job) {
     else
        input = ins;
 
-    if (xb.buf == NULL)
-       agxbinit(&xb, BUFSIZ, NULL);
+    gvputc(job, '"');
     for (s = input; (c = *s); s++) {
        switch (c) {
        case '"' :
-           agxbput(&xb, "\\\"");
+           gvputs(job, "\\\"");
            break;
        case '\\' :
-           agxbput(&xb, "\\\\");
+           gvputs(job, "\\\\");
            break;
        case '/' :
-           agxbput(&xb, "\\/");
+           gvputs(job, "\\/");
            break;
        case '\b' :
-           agxbput(&xb, "\\b");
+           gvputs(job, "\\b");
            break;
        case '\f' :
-           agxbput(&xb, "\\f");
+           gvputs(job, "\\f");
            break;
        case '\n' :
-           agxbput(&xb, "\\n");
+           gvputs(job, "\\n");
            break;
        case '\r' :
-           agxbput(&xb, "\\r");
+           gvputs(job, "\\r");
            break;
        case '\t' :
-           agxbput(&xb, "\\t");
+           gvputs(job, "\\t");
            break;
        default :
-           agxbputc(&xb, c);
+           gvputc(job, c);
            break;
        }
     }
-    s = agxbuse(&xb);
+    gvputc(job, '"');
 
     if (sp->isLatin)
        free (input);
-    gvprintf(job, "\"%s\"", s);
 }
 
 static void indent(GVJ_t * job, int level)