[master] 619eb8519 Simplify frag_fields() and add usage asserts.

Poul-Henning Kamp phk at FreeBSD.org
Mon Nov 5 09:15:13 UTC 2018


commit 619eb85194e86bc884a66eaf4e7bc189e4d13def
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Nov 5 09:06:51 2018 +0000

    Simplify frag_fields() and add usage asserts.

diff --git a/bin/varnishncsa/varnishncsa.c b/bin/varnishncsa/varnishncsa.c
index 586f7cec1..6c859358e 100644
--- a/bin/varnishncsa/varnishncsa.c
+++ b/bin/varnishncsa/varnishncsa.c
@@ -776,33 +776,31 @@ frag_fields(int force, const char *b, const char *e, ...)
 	AN(e);
 	va_start(ap, e);
 
-	field = va_arg(ap, int);
-	frag = va_arg(ap, struct fragment *);
-	for (n = 1, q = b; q < e; n++) {
-		/* caller must sort the fields, or this loop will not work: */
-		assert(field >= n);
-		AN(frag);
-
-		p = q;
-		/* Skip WS */
-		while (p < e && isspace(*p))
-			p++;
-		q = p;
-		/* Skip non-WS */
-		while (q < e && !isspace(*q))
-			q++;
-
-		if (field == n) {
-			if (frag->gen != CTX.gen || force) {
-				/* We only grab the same matching field once */
-				frag->gen = CTX.gen;
-				frag->b = p;
-				frag->e = q;
-			}
-			field = va_arg(ap, int);
-			if (field == 0)
-				break;
-			frag = va_arg(ap, struct fragment *);
+	n = 0;
+	while (1) {
+		field = va_arg(ap, int);
+		frag = va_arg(ap, struct fragment *);
+		if (field == 0) {
+			AZ(frag);
+			break;
+		}
+		p = q = NULL;
+		while (n < field) {
+			while (b < e && isspace(*b))
+				b++;
+			p = b;
+			while (b < e && !isspace(*b))
+				b++;
+			q = b;
+			n++;
+		}
+		assert(p != NULL && q != NULL);
+		assert(p < e && q > p);
+		if (frag->gen != CTX.gen || force) {
+			/* We only grab the same matching field once */
+			frag->gen = CTX.gen;
+			frag->b = p;
+			frag->e = q;
 		}
 	}
 	va_end(ap);


More information about the varnish-commit mailing list