]> granicus.if.org Git - graphviz/commitdiff
Fix libexpr to be re-usable.
authorerg <devnull@localhost>
Tue, 23 Jun 2009 15:27:01 +0000 (15:27 +0000)
committererg <devnull@localhost>
Tue, 23 Jun 2009 15:27:01 +0000 (15:27 +0000)
lib/expr/exeval.c
lib/expr/exgram.h
lib/expr/expr.h

index 8c61786d8d3558d3e158369aaada4c33f35524bc..5badc1c8b511f15f2e682310e52f925f2980cedf 100644 (file)
@@ -873,7 +873,10 @@ static Extype_t eval(Expr_t * ex, register Exnode_t * expr, void *env)
        return v;
     case EXIT:
        v = eval(ex, x, env);
-       exit((int) v.integer);
+       if (ex->disc->exitf) 
+           (*ex->disc->exitf) (ex, env, (int)v.integer);
+       else
+           exit((int) v.integer);
         /*NOTREACHED*/ v.integer = -1;
        return v;
     case IF:
index 4e4859e19675894230d59b9db5fdcb17ed971db9..6fdf48958e1ef634fd414675146c8410430969de 100644 (file)
@@ -881,6 +881,14 @@ extern "C" {
        return 0;
     }
 
+/*
+ * clear global state of stale pointers
+ */
+
+    void
+     exinit() {
+       memset (&expr, 0, sizeof(Expr_t));
+    }
 /*
  * compile the expression in [sf]p
  */
index 43f14fc17f60678f858c5bc28643874c5606ab60..8320c7e67face24de4be8983d636297d0e2908f7 100644 (file)
@@ -126,6 +126,7 @@ extern "C" {
 
     typedef int (*Exerror_f) (Expr_t *, Exdisc_t *, int, const char *,
                              ...);
+    typedef void (*Exexit_f) (Expr_t *, Exdisc_t *, int);
 
     typedef struct {           /* user defined member type       */
        Sflong_t number;
@@ -237,6 +238,8 @@ extern "C" {
        /* set value function           */
        int (*matchf) (Expr_t *, Exnode_t *, const char *, Exnode_t *,
                       const char *, void *, Exdisc_t *);
+       /* exit function           */
+       Exexit_f exitf;
        int *types;
        void *user;
     };
@@ -310,6 +313,7 @@ extern "C" {
     extern char *extype(int);
     extern Extype_t exzero(int);
     extern char *exopname(int);
+    extern void exinit();
     extern char *extypename(Expr_t * p, int);
     extern int exisAssign(Exnode_t *);