From 68280208b739cec20299195eca7bf1fbaf01d9a8 Mon Sep 17 00:00:00 2001 From: phk Date: Sat, 31 Mar 2007 18:21:14 +0000 Subject: [PATCH] Better syntax checking of "set" statements. Remove inapplicable comment. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1294 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/lib/libvcl/vcc_parse.c | 71 ++++++++++++---------------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/varnish-cache/lib/libvcl/vcc_parse.c b/varnish-cache/lib/libvcl/vcc_parse.c index 9331475e..77e44929 100644 --- a/varnish-cache/lib/libvcl/vcc_parse.c +++ b/varnish-cache/lib/libvcl/vcc_parse.c @@ -29,37 +29,6 @@ * $Id$ */ -/* - * XXX: - * generate interface structure - * - * XXX: - * Better error messages, throughout. - * >It also accured to me that we could link the errors to the error - * >documentation. - * > - * >Unreferenced function 'request_policy', first mention is - * > Line 8 Pos 4 - * > sub request_policy { - * > ----##############-- - * >Read more about this type of error: - * >http://varnish/doc/error.html#Unreferenced%20function - * > - * > - * > Unknown variable 'obj.bandwidth' - * > At: Line 88 Pos 12 - * > if (obj.bandwidth < 1 kb/h) { - * > ------------#############------------ - * >Read more about this type of error: - * >http://varnish/doc/error.html#Unknown%20variable - * - * XXX: - * Create proper tmp filenames for .h, .c and .o - * - * XXX: - * and all the rest... - */ - #include #include #include @@ -514,7 +483,7 @@ Action(struct tokenlist *tl) { unsigned a; struct var *vp; - struct token *at; + struct token *at, *vt; at = tl->t; vcc_NextToken(tl); @@ -569,6 +538,7 @@ Action(struct tokenlist *tl) return; case T_SET: ExpectErr(tl, VAR); + vt = tl->t; vp = FindVar(tl, tl->t, vcc_vars); ERRCHK(tl); assert(vp != NULL); @@ -582,18 +552,35 @@ Action(struct tokenlist *tl) case FLOAT: if (tl->t->tok != '=') Fb(tl, 0, "%s %c ", vp->rname, *tl->t->b); - a = tl->t->tok; + at = tl->t; vcc_NextToken(tl); - if (a == T_MUL || a == T_DIV) - Fb(tl, 0, "%g", DoubleVal(tl)); - else if (vp->fmt == TIME) - TimeVal(tl); - else if (vp->fmt == SIZE) - SizeVal(tl); - else if (vp->fmt == RATE) - RateVal(tl); - else + switch (at->tok) { + case T_MUL: + case T_DIV: Fb(tl, 0, "%g", DoubleVal(tl)); + break; + case T_INCR: + case T_DECR: + case '=': + if (vp->fmt == TIME) + TimeVal(tl); + else if (vp->fmt == SIZE) + SizeVal(tl); + else if (vp->fmt == RATE) + RateVal(tl); + else if (vp->fmt == FLOAT) + Fb(tl, 0, "%g", DoubleVal(tl)); + else { + vsb_printf(tl->sb, "Cannot assign this variable type.\n"); + vcc_ErrWhere(tl, vt); + return; + } + break; + default: + vsb_printf(tl->sb, "Illegal assignment operator.\n"); + vcc_ErrWhere(tl, at); + return; + } Fb(tl, 0, ");\n"); break; #if 0 /* XXX: enable if we find a legit use */ -- 2.39.5