[4.1] efc000f Allow INT and REAL to be negative.
PÃ¥l Hermunn Johansen
hermunn at varnish-software.com
Wed Feb 8 10:27:05 CET 2017
commit efc000f59027769c8b3ae41df761e7dede79a564
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Fri Jan 13 11:34:58 2017 +0000
Allow INT and REAL to be negative.
Fixes: #2167
Conflicts:
bin/varnishtest/tests/m00019.vtc
lib/libvcc/vcc_expr.c
diff --git a/bin/varnishtest/tests/m00019.vtc b/bin/varnishtest/tests/m00019.vtc
index 89ad9b0..3115cb8 100644
--- a/bin/varnishtest/tests/m00019.vtc
+++ b/bin/varnishtest/tests/m00019.vtc
@@ -10,9 +10,9 @@ varnish v1 -vcl+backend {
sub vcl_deliver {
set resp.http.foo1 = debug.argtest("1", 2.0, "3");
- set resp.http.foo2 = debug.argtest("1", two=2.0, three="3");
+ set resp.http.foo2 = debug.argtest("1", two=-2.0, three="3");
set resp.http.foo3 = debug.argtest("1", three="3", two=2.0);
- set resp.http.foo4 = debug.argtest("1", 2.0, three="3");
+ set resp.http.foo4 = debug.argtest("1", 2.0, three="-3");
set resp.http.foo5 = debug.argtest("1", 2.0);
set resp.http.foo6 = debug.argtest("1");
}
@@ -23,9 +23,9 @@ client c1 {
rxresp
expect resp.bodylen == "6"
expect resp.http.foo1 == "1 2 3 ,"
- expect resp.http.foo2 == "1 2 3 ,"
+ expect resp.http.foo2 == "1 -2 3 ,"
expect resp.http.foo3 == "1 2 3 ,"
- expect resp.http.foo4 == "1 2 3 ,"
+ expect resp.http.foo4 == "1 2 -3 ,"
expect resp.http.foo5 == "1 2 3 ,"
expect resp.http.foo6 == "1 2 3 ,"
} -run
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 65bd7a4..09d20f2 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -904,7 +904,7 @@ vcc_expr4(struct vcc *tl, struct expr **e, enum var_type fmt)
e1->constant = EXPR_CONST;
vcc_NextToken(tl);
*e = e1;
- break;
+ return;
case CNUM:
/*
* XXX: %g may not have enough decimals by default
@@ -935,14 +935,31 @@ vcc_expr4(struct vcc *tl, struct expr **e, enum var_type fmt)
}
e1->constant = EXPR_CONST;
*e = e1;
+ return;
+ case '-':
+ if (fmt == INT || fmt == REAL) {
+ vcc_NextToken(tl);
+ ExpectErr(tl, CNUM);
+ if (fmt == INT) {
+ e1 = vcc_mk_expr(INT, "-%.*s", PF(tl->t));
+ vcc_NextToken(tl);
+ } else {
+ e1 = vcc_mk_expr(REAL, "-%f",
+ vcc_DoubleVal(tl));
+ }
+ ERRCHK(tl);
+ e1->constant = EXPR_CONST;
+ *e = e1;
+ return;
+ }
break;
default:
- VSB_printf(tl->sb, "Unknown token ");
- vcc_ErrToken(tl, tl->t);
- VSB_printf(tl->sb, " when looking for %s\n\n", vcc_Type(fmt));
- vcc_ErrWhere(tl, tl->t);
break;
}
+ VSB_printf(tl->sb, "Unknown token ");
+ vcc_ErrToken(tl, tl->t);
+ VSB_printf(tl->sb, " when looking for %s\n\n", vcc_Type(fmt));
+ vcc_ErrWhere(tl, tl->t);
}
/*--------------------------------------------------------------------
More information about the varnish-commit
mailing list