[master] ca438c8 Allow INT and REAL to be negative.
Poul-Henning Kamp
phk at FreeBSD.org
Fri Jan 13 12:36:05 CET 2017
commit ca438c8ab5ffc4839f59ce586030de8b644aee27
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
diff --git a/bin/varnishtest/tests/m00019.vtc b/bin/varnishtest/tests/m00019.vtc
index 825799c..c8251c9 100644
--- a/bin/varnishtest/tests/m00019.vtc
+++ b/bin/varnishtest/tests/m00019.vtc
@@ -19,9 +19,9 @@ varnish v1 -vcl+backend {
sub vcl_deliver {
set resp.http.foo1 = debug.argtest("1", 2.1, "3a");
- set resp.http.foo2 = debug.argtest("1", two=2.2, three="3b");
+ set resp.http.foo2 = debug.argtest("1", two=-2.2, three="3b");
set resp.http.foo3 = debug.argtest("1", three="3c", two=2.3);
- set resp.http.foo4 = debug.argtest("1", 2.4, three="3d");
+ set resp.http.foo4 = debug.argtest("1", 2.4, three="3d", four=-1);
set resp.http.foo5 = debug.argtest("1", 2.5);
set resp.http.foo6 = debug.argtest("1", four=6);
@@ -39,9 +39,9 @@ client c1 {
rxresp
expect resp.bodylen == "6"
expect resp.http.foo1 == "1 2.1 3a , 4"
- expect resp.http.foo2 == "1 2.2 3b , 4"
+ expect resp.http.foo2 == "1 -2.2 3b , 4"
expect resp.http.foo3 == "1 2.3 3c , 4"
- expect resp.http.foo4 == "1 2.4 3d , 4"
+ expect resp.http.foo4 == "1 2.4 3d , -1"
expect resp.http.foo5 == "1 2.5 3 , 4"
expect resp.http.foo6 == "1 2 3 , 6"
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 7e92471..ce7ab89 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -840,7 +840,7 @@ vcc_expr4(struct vcc *tl, struct expr **e, vcc_type_t fmt)
e1->constant = EXPR_CONST;
vcc_NextToken(tl);
*e = e1;
- break;
+ return;
case CNUM:
/*
* XXX: %g may not have enough decimals by default
@@ -871,14 +871,31 @@ vcc_expr4(struct vcc *tl, struct expr **e, vcc_type_t 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", fmt->name);
- 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", fmt->name);
+ vcc_ErrWhere(tl, tl->t);
}
/*--------------------------------------------------------------------
More information about the varnish-commit
mailing list