]> granicus.if.org Git - graphviz/commitdiff
gvpr colorx: use a local agxbuf instead of GVPR state’s 'tmp'
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 7 Aug 2022 17:25:32 +0000 (10:25 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 13 Aug 2022 16:18:53 +0000 (09:18 -0700)
This makes it clearer to both humans and the compiler that the data written to
this buffer is not required beyond this function. This also gets us closer to
removing an SFIO dependency.

Gitlab: #1873

lib/gvpr/actions.c
lib/gvpr/actions.h
lib/gvpr/compile.c

index c878c5e9e578d21e0fea8ec02d9cff00eba74c85..484dac0e93b47868f9a8721763621ad812a3cc32 100644 (file)
@@ -1276,8 +1276,7 @@ int colorxlate(char *str, gvcolor_t * color, color_type_t target_type)
 /* colorx:
  * RGB, RGBA, HSV, HSVA, CMYK
  */
-char *colorx (Expr_t* ex, char* incolor, char* fmt, Sfio_t* fp)
-{
+char *colorx(Expr_t *ex, char *incolor, char *fmt) {
     gvcolor_t color = {{{0}},0};
     color_type_t type;
     int rc;
@@ -1310,28 +1309,33 @@ char *colorx (Expr_t* ex, char* incolor, char* fmt, Sfio_t* fp)
     if (rc != COLOR_OK)
        return "";
 
+    agxbuf fp = {0};
+    agxbinit(&fp, 0, NULL);
+
     switch (type) {
     case HSVA_DOUBLE :
-       sfprintf (fp, "%.03f %.03f %.03f", 
+       agxbprint(&fp, "%.03f %.03f %.03f",
            color.u.HSVA[0], color.u.HSVA[1], color.u.HSVA[2]);
        if (alpha)
-           sfprintf (fp, " %.03f", color.u.HSVA[3]);
+           agxbprint(&fp, " %.03f", color.u.HSVA[3]);
        break;
     case RGBA_BYTE :
-       sfprintf (fp, "#%02x%02x%02x", 
+       agxbprint(&fp, "#%02x%02x%02x",
            color.u.rgba[0], color.u.rgba[1], color.u.rgba[2]);
        if (alpha)
-           sfprintf (fp, "%02x", color.u.rgba[3]);
+           agxbprint(&fp, "%02x", color.u.rgba[3]);
        break;
     case CMYK_BYTE :
-       sfprintf (fp, "#%02x%02x%02x%02x", 
+       agxbprint(&fp, "#%02x%02x%02x%02x",
            color.u.cmyk[0], color.u.cmyk[1], color.u.cmyk[2], color.u.cmyk[3]);
        break;
     default :
        break;
     }
 
-    return exstring(ex, sfstruse(fp));
+    char *result = exstring(ex, agxbuse(&fp));
+    agxbfree(&fp);
+    return result;
 }
 
 #ifndef _WIN32
index ed12d2a0f0b4a864d215d5f3cc4b5fb9f7356d9e..e9f256564d3fbaceb90b8445e471f5bc905a79aa 100644 (file)
@@ -45,7 +45,7 @@ extern "C" {
     extern char *toLower(Expr_t *pgm, char *src);
     extern char *toUpper(Expr_t *pgm, char *src);
     extern int deleteObj(Agraph_t * g, Agobj_t * obj);
-    extern char *colorx (Expr_t* ex, char* incolor, char* fmt, Sfio_t* fp);
+    extern char *colorx (Expr_t* ex, char* incolor, char* fmt);
     extern void gvstart_timer(void);
     extern double gvelapsed_sec(void);
 
index a080bdeec2d92c50640ce24030c4d9c10337bb5f..cc11418b3d8d98c15f8b8e73c1ad0c3881ed3167 100644 (file)
@@ -1460,7 +1460,7 @@ getval(Expr_t * pgm, Exnode_t * node, Exid_t * sym, Exref_t * ref,
            v.string = toLower(pgm, args[0].string);
            break;
        case F_colorx:
-           v.string = colorx(pgm, args[0].string, args[1].string, state->tmp);
+           v.string = colorx(pgm, args[0].string, args[1].string);
            break;
        case F_strcmp:
            if (args[0].string) {