[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