[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