]> granicus.if.org Git - graphviz/commitdiff
Change code using old expr tokens VOID, CHAR;
authorerg <devnull@localhost>
Mon, 29 Jun 2009 16:43:10 +0000 (16:43 +0000)
committererg <devnull@localhost>
Mon, 29 Jun 2009 16:43:10 +0000 (16:43 +0000)
add toupper/tolower;
remove calls to sfstropen() in most functions call during execution to avoid
memory leak if longjmp is used - use tmp stream in Gpr_t*.

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

index 2662a1dd3b472b2a5a36c9696ce2a4822cab64d0..879e9cfc1fb39e2baa76cf2cd3977f1cfcccefa1 100644 (file)
@@ -26,6 +26,7 @@
 #include "sfstr.h"
 #include <string.h>
 #include <stdio.h>
+#include <ctype.h>
 
 #define KINDS(p) ((AGTYPE(p) == AGRAPH) ? "graph" : (AGTYPE(p) == AGNODE) ? "node" : "edge")
 
@@ -706,6 +707,32 @@ int compare(Agobj_t * l, Agobj_t * r)
        return 1;
 }
 
+/* toLower:
+ * Convert characters to lowercase
+ */
+char *toLower(Expr_t * pgm, char *s, Sfio_t* tmps)
+{
+    int c;
+
+    while ((c = *s++))
+       sfputc (tmps, tolower (c));
+
+    return exstring(pgm, sfstruse(tmps));
+}
+
+/* toUpper:
+ * Convert characters to uppercase
+ */
+char *toUpper(Expr_t * pgm, char *s, Sfio_t* tmps)
+{
+    int c;
+
+    while ((c = *s++))
+       sfputc (tmps, toupper (c));
+
+    return exstring(pgm, sfstruse(tmps));
+}
+
 /* canon:
  * Canonicalize a string for printing.
  */
index 388b36f1bb1a4af7062d683fce743441d3d44813..2ac1d7bbcb4da99d6f2e5d45d9e82eca388143b3 100644 (file)
@@ -46,6 +46,8 @@ extern "C" {
     extern int closeFile(Expr_t *, int);
     extern char *readLine(Expr_t *, int);
     extern char *canon(Expr_t * pgm, char *);
+    extern char *toLower(Expr_t * pgm, char *, Sfio_t*);
+    extern char *toUpper(Expr_t * pgm, char *, Sfio_t*);
     extern int deleteObj(Agraph_t * g, Agobj_t * obj);
 
 #endif
index 306d8b9ec90f307291e308acd691823f47a62d1c..1a8c6a7b5c08d6b4849fbbe98562fc31438ca105 100644 (file)
@@ -64,9 +64,8 @@
  * Return name of object. 
  * Assumes obj !=  NULL
  */
-static char *nameOf(Expr_t * ex, Agobj_t * obj)
+static char *nameOf(Expr_t * ex, Agobj_t * obj, Sfio_t* tmps)
 {
-    Sfio_t *tmps;
     char *s;
     char *key;
     Agedge_t *e;
@@ -77,7 +76,6 @@ static char *nameOf(Expr_t * ex, Agobj_t * obj)
        s = agnameof(obj);
        break;
     default:                   /* edge */
-       tmps = sfstropen();
        e = (Agedge_t *) obj;
        key = agnameof(obj);
        sfputr(tmps, agnameof(AGTAIL(e)), -1);
@@ -92,7 +90,6 @@ static char *nameOf(Expr_t * ex, Agobj_t * obj)
            sfputc(tmps, ']');
        }
        s = exstring(ex, sfstruse(tmps));
-       sfclose(tmps);
        break;
     }
     return s;
@@ -397,7 +394,7 @@ static int lookup(Expr_t * pgm, Agobj_t * objp, Exid_t * sym, Extype_t * v,
            }
            break;
        case M_name:
-           v->string = nameOf(pgm, objp);
+           v->string = nameOf(pgm, objp, state->tmp);
            break;
        case M_indegree:
            if (AGTYPE(objp) == AGNODE)
@@ -475,7 +472,7 @@ static int lookup(Expr_t * pgm, Agobj_t * objp, Exid_t * sym, Extype_t * v,
        Agsym_t *gsym = agattrsym(objp, sym->name);
        if (!gsym) {
            gsym = agattr(agroot(agraphof(objp)), AGTYPE(objp), sym->name, "");
-           error(ERROR_WARNING, "Using value of uninitialized %s attribute \"%s\" of \"%s\"", kindOf (objp), sym->name, nameOf(pgm, objp));
+           error(ERROR_WARNING, "Using value of uninitialized %s attribute \"%s\" of \"%s\"", kindOf (objp), sym->name, nameOf(pgm, objp, state->tmp));
        }
        v->string = agxget(objp, gsym);
     }
@@ -1227,7 +1224,7 @@ getval(Expr_t * pgm, Exnode_t * node, Exid_t * sym, Exref_t * ref,
                else {
                    if (!gsym) {
                        gsym = agattr(agroot(agraphof(objp)), AGTYPE(objp), name, "");
-                       error(ERROR_WARNING, "Using value of %s uninitialized attribute \"%s\" of \"%s\" in aget()", kindOf (objp), name, nameOf(pgm, objp));
+                       error(ERROR_WARNING, "Using value of %s uninitialized attribute \"%s\" of \"%s\" in aget()", kindOf (objp), name, nameOf(pgm, objp, state->tmp));
                    }
                    v.string = agxget(objp, gsym);
                }
@@ -1328,6 +1325,12 @@ getval(Expr_t * pgm, Exnode_t * node, Exid_t * sym, Exref_t * ref,
        case F_canon:
            v.string = canon(pgm, args[0].string);
            break;
+       case F_tolower:
+           v.string = toLower(pgm, args[0].string, state->tmp);
+           break;
+       case F_toupper:
+           v.string = toUpper(pgm, args[0].string, state->tmp);
+           break;
        case F_xof:
            v.string = xyOf(pgm, args[0].string, 1);
            break;
@@ -1916,7 +1919,7 @@ tvtypeToStr (int v)
  * Return -1 if conversion cannot be done, 0 otherwise.
  * If arg is > 0, conversion unnecessary; just report possibility.
  */
-static int stringOf(Expr_t * prog, register Exnode_t * x, int arg)
+static int stringOf(Expr_t * prog, register Exnode_t * x, int arg, Exdisc_t* disc)
 {
     Agobj_t *objp;
     int rv = 0;
@@ -1935,8 +1938,10 @@ static int stringOf(Expr_t * prog, register Exnode_t * x, int arg)
                    typeName(prog, x->type));
            rv = -1;
        }
-       else
-           x->data.constant.value.string = nameOf(prog, objp);
+       else {
+           Gpr_t* state = (Gpr_t *) (disc->user);
+           x->data.constant.value.string = nameOf(prog, objp, state->tmp);
+       }
     }
     x->type = STRING;
     return 0;
@@ -2171,11 +2176,10 @@ static void checkGuard(Exnode_t * gp, char *src, int line)
 /* mkStmts:
  */
 static case_stmt *mkStmts(Expr_t * prog, char *src, case_info * sp,
-                         int cnt, char *lbl)
+                         int cnt, char *lbl, Sfio_t *tmps)
 {
     case_stmt *cs;
     int i;
-    Sfio_t *tmps = sfstropen();
 
     cs = newof(0, case_stmt, cnt, 0);
 
@@ -2196,7 +2200,6 @@ static case_stmt *mkStmts(Expr_t * prog, char *src, case_info * sp,
        sp = sp->next;
     }
 
-    sfclose(tmps);
     return cs;
 }
 
@@ -2219,7 +2222,7 @@ static char *doFlags(int flags, Sfio_t * s)
 comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
 {
     comp_prog *p;
-    Sfio_t *tmps = sfstropen();
+    Sfio_t *tmps = state->tmp;
     char *endg_sfx = 0;
 
     /* Make sure we have enough bits for types */
@@ -2248,7 +2251,7 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
     codePhase = 0;
     if (inp->begin_stmt) {
        p->begin_stmt = compile(p->prog, inp->source, inp->begin_stmt,
-                               inp->l_begin, 0, 0, VOID);
+                               inp->l_begin, 0, 0, VOIDTYPE);
        if (getErrorErrors())
            goto finish;
     }
@@ -2258,7 +2261,7 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
        symbols[0].type = T_graph;
        tchk[V_this][1] = Y(G);
        p->begg_stmt = compile(p->prog, inp->source, inp->begg_stmt,
-                              inp->l_beging, "_begin_g", 0, VOID);
+                              inp->l_beging, "_begin_g", 0, VOIDTYPE);
        if (getErrorErrors())
            goto finish;
     }
@@ -2269,7 +2272,7 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
        tchk[V_this][1] = Y(V);
        p->n_nstmts = inp->n_nstmts;
        p->node_stmts = mkStmts(p->prog, inp->source, inp->node_stmts,
-                               inp->n_nstmts, "_nd");
+                               inp->n_nstmts, "_nd", tmps);
        if (getErrorErrors())
            goto finish;
     }
@@ -2280,7 +2283,7 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
        tchk[V_this][1] = Y(E);
        p->n_estmts = inp->n_estmts;
        p->edge_stmts = mkStmts(p->prog, inp->source, inp->edge_stmts,
-                               inp->n_estmts, "_eg");
+                               inp->n_estmts, "_eg", tmps);
        if (getErrorErrors())
            goto finish;
     }
@@ -2290,7 +2293,7 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
        symbols[0].type = T_graph;
        tchk[V_this][1] = Y(G);
        p->endg_stmt = compile(p->prog, inp->source, inp->endg_stmt,
-                              inp->l_endg, "_end_g", endg_sfx, VOID);
+                              inp->l_endg, "_end_g", endg_sfx, VOIDTYPE);
        if (getErrorErrors())
            goto finish;
     }
@@ -2299,7 +2302,7 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
     if (inp->end_stmt) {
        symbols[0].type = T_obj;
        p->end_stmt = compile(p->prog, inp->source, inp->end_stmt,
-                             inp->l_end, "_end_", 0, VOID);
+                             inp->l_end, "_end_", 0, VOIDTYPE);
        if (getErrorErrors())
            goto finish;
     }
@@ -2311,7 +2314,6 @@ comp_prog *compileProg(parse_prog * inp, Gpr_t * state, int flags)
        p = 0;
     }
 
-    sfclose(tmps);
     return p;
 }
 
index e67572d87fc678fabca9b077669075800cac9d99..0c96f4afe588ad22d86eb9cf9e9661ed833753e5 100644 (file)
@@ -106,6 +106,8 @@ F_hasattr   "hasAttr"      FUNCTION I|A(1,O)|A(2,S)
 F_isattr    "isAttr"       FUNCTION I|A(1,G)|A(2,S)|A(3,S)
 F_fstattr   "fstAttr"      FUNCTION S|A(1,G)|A(2,S)
 F_nxtattr   "nxtAttr"      FUNCTION S|A(1,G)|A(2,S)|A(3,S)
+F_tolower   "tolower"      FUNCTION S|A(1,S)
+F_toupper   "toupper"      FUNCTION S|A(1,S)
 C_flat      "TV_flat"      CONSTANT T_tvtyp
 C_ne        "TV_ne"        CONSTANT T_tvtyp
 C_en        "TV_en"        CONSTANT T_tvtyp