[master] 75cc8f6f6 vte: Only print at field boundaries

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Mon Aug 21 20:52:08 UTC 2023


commit 75cc8f6f60a4623296db1a5db807562d98309af4
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Thu Aug 17 17:31:07 2023 +0200

    vte: Only print at field boundaries
    
    This drastically reduces the number of printf-like operations.

diff --git a/lib/libvarnish/vte.c b/lib/libvarnish/vte.c
index 6216cbab6..b479b37ed 100644
--- a/lib/libvarnish/vte.c
+++ b/lib/libvarnish/vte.c
@@ -241,7 +241,7 @@ int
 VTE_format(struct vte *vte, VTE_format_f *func, void *priv)
 {
 	int fno, fsz, nsp;
-	const char *p;
+	const char *p, *q;
 
 	CHECK_OBJ_NOTNULL(vte, VTE_MAGIC);
 	AN(func);
@@ -252,31 +252,33 @@ VTE_format(struct vte *vte, VTE_format_f *func, void *priv)
 	nsp = vte->o_sep;
 	p = VSB_data(vte->vsb);
 	AN(p);
+	q = p;
 
 	for (fno = fsz = 0; *p != '\0'; p++) {
 		if (fsz == 0 && fno == 0 && *p == ' ') {
-			while (p[1] != '\0') {
-				VTE_FORMAT(func, priv, "%c", *p);
-				if (*p == '\n')
-					break;
-				p++;
+			p = strchr(p, '\n');
+			if (p == NULL) {
+				p = q + 1; // trigger final flush
+				break;
 			}
 			continue;
 		}
 		if (*p == '\t') {
-			while (fsz++ < vte->f_maxsz[fno] + nsp)
-				VTE_FORMAT(func, priv, " ");
+			assert(vte->f_maxsz[fno] + nsp > fsz);
+			VTE_FORMAT(func, priv, "%.*s%*s",
+			    (int)(p - q), q,
+			    vte->f_maxsz[fno] + nsp - fsz, "");
 			fno++;
 			fsz = 0;
+			q = p + 1;
 		} else if (*p == '\n') {
-			VTE_FORMAT(func, priv, "\n");
 			fno = 0;
 			fsz = 0;
-		} else {
-			VTE_FORMAT(func, priv, "%c", *p);
+		} else
 			fsz++;
-		}
 	}
 
+	if (q < p)
+		VTE_FORMAT(func, priv, "%s", q);
 	return (0);
 }


More information about the varnish-commit mailing list