[master] 4c36d7c Replace EncString() with VSB_quote()

Poul-Henning Kamp phk at FreeBSD.org
Thu May 19 12:14:06 CEST 2016


commit 4c36d7ca34444ffe304c2fb9f6cf5b27505213d1
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu May 19 10:13:08 2016 +0000

    Replace EncString() with VSB_quote()

diff --git a/include/vsb.h b/include/vsb.h
index 4c2c9b7..35e752b 100644
--- a/include/vsb.h
+++ b/include/vsb.h
@@ -79,6 +79,7 @@ void		 VSB_destroy(struct vsb **);
 #define VSB_QUOTE_NONL	1
 #define VSB_QUOTE_JSON	2
 #define VSB_QUOTE_HEX	4
+#define VSB_QUOTE_CSTR	8
 void		 VSB_quote(struct vsb *, const void *, int len, int how);
 void		 VSB_indent(struct vsb *, int);
 #ifdef __cplusplus
diff --git a/lib/libvarnish/vsb.c b/lib/libvarnish/vsb.c
index 7a15f56..6a6f169 100644
--- a/lib/libvarnish/vsb.c
+++ b/lib/libvarnish/vsb.c
@@ -533,13 +533,18 @@ VSB_quote(struct vsb *s, const void *v, int len, int how)
 			break;
 		}
 	}
-	if (!quote && !(how & VSB_QUOTE_JSON)) {
+	if (!quote && !(how & (VSB_QUOTE_JSON|VSB_QUOTE_CSTR))) {
 		(void)VSB_bcat(s, p, len);
 		return;
 	}
 	(void)VSB_putc(s, '"');
 	for (q = p; q < p + len; q++) {
 		switch (*q) {
+		case '?':
+			if (how & VSB_QUOTE_CSTR)
+				(void)VSB_putc(s, '\\');
+			(void)VSB_putc(s, *q);
+			break;
 		case ' ':
 			(void)VSB_putc(s, *q);
 			break;
@@ -549,7 +554,9 @@ VSB_quote(struct vsb *s, const void *v, int len, int how)
 			(void)VSB_putc(s, *q);
 			break;
 		case '\n':
-			if (how & VSB_QUOTE_NONL)
+			if (how & VSB_QUOTE_CSTR)
+				(void)VSB_cat(s, "\"\n\t\"");
+			else if (how & VSB_QUOTE_NONL)
 				(void)VSB_cat(s, "\n");
 			else
 				(void)VSB_cat(s, "\\n");
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index bc22cad..4a182cf 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -203,45 +203,11 @@ Fc(const struct vcc *tl, int indent, const char *fmt, ...)
 /*--------------------------------------------------------------------*/
 
 void
-EncString(struct vsb *sb, const char *b, const char *e, int mode)
-{
-
-	if (e == NULL)
-		e = strchr(b, '\0');
-
-	VSB_cat(sb, "\"");
-	for (; b < e; b++) {
-		switch (*b) {
-		case '?':	// Trigraphs
-		case '\\':
-		case '"':
-			VSB_printf(sb, "\\%c", *b);
-			break;
-		case '\n':
-			VSB_printf(sb, "\\n");
-			if (mode)
-				VSB_printf(sb, "\"\n\t\"");
-			break;
-		case '\t': VSB_printf(sb, "\\t"); break;
-		case '\r': VSB_printf(sb, "\\r"); break;
-		case ' ': VSB_printf(sb, " "); break;
-		default:
-			if (isgraph(*b))
-				VSB_printf(sb, "%c", *b);
-			else
-				VSB_printf(sb, "\\%03o", (uint8_t)*b);
-			break;
-		}
-	}
-	VSB_cat(sb, "\"");
-}
-
-void
 EncToken(struct vsb *sb, const struct token *t)
 {
 
 	assert(t->tok == CSTR);
-	EncString(sb, t->dec, NULL, 1);
+	VSB_quote(sb, t->dec, -1, VSB_QUOTE_CSTR);
 }
 
 /*--------------------------------------------------------------------
@@ -264,7 +230,7 @@ EmitCoordinates(const struct vcc *tl, struct vsb *vsb)
 	VSB_printf(vsb, "\nstatic const char *srcname[VGC_NSRCS] = {\n");
 	VTAILQ_FOREACH(sp, &tl->sources, list) {
 		VSB_printf(vsb, "\t");
-		EncString(vsb, sp->name, NULL, 0);
+		VSB_quote(vsb, sp->name, -1, VSB_QUOTE_CSTR);
 		VSB_printf(vsb, ",\n");
 	}
 	VSB_printf(vsb, "};\n");
@@ -272,10 +238,10 @@ EmitCoordinates(const struct vcc *tl, struct vsb *vsb)
 	VSB_printf(vsb, "\nstatic const char *srcbody[%u] = {\n", tl->nsources);
 	VTAILQ_FOREACH(sp, &tl->sources, list) {
 		VSB_printf(vsb, "    /* ");
-		EncString(vsb, sp->name, NULL, 0);
+		VSB_quote(vsb, sp->name, -1, VSB_QUOTE_CSTR);
 		VSB_printf(vsb, "*/\n");
 		VSB_printf(vsb, "\t");
-		EncString(vsb, sp->b, sp->e, 1);
+		VSB_quote(vsb, sp->b, sp->e - sp->b, VSB_QUOTE_CSTR);
 		VSB_printf(vsb, ",\n");
 	}
 	VSB_printf(vsb, "};\n\n");
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index c9c1396..da00d26 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -278,8 +278,6 @@ void *TlAlloc(struct vcc *tl, unsigned len);
 char *TlDup(struct vcc *tl, const char *s);
 char *TlDupTok(struct vcc *tl, const struct token *tok);
 
-void EncString(struct vsb *sb, const char *b, const char *e, int mode);
-
 /* vcc_expr.c */
 double vcc_DoubleVal(struct vcc *tl);
 void vcc_Duration(struct vcc *tl, double *);
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index aca8890..5d36bd3 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -200,7 +200,7 @@ vcc_ParseImport(struct vcc *tl)
 	VSB_printf(ifp->ini, "\t    sizeof(Vmod_%.*s_Func),\n", PF(mod));
 	VSB_printf(ifp->ini, "\t    \"%.*s\",\n", PF(mod));
 	VSB_printf(ifp->ini, "\t    ");
-	EncString(ifp->ini, fnp, NULL, 0);
+	VSB_quote(ifp->ini, fnp, -1, VSB_QUOTE_CSTR);
 	VSB_printf(ifp->ini, ",\n");
 	AN(vmd);
 	AN(vmd->file_id);



More information about the varnish-commit mailing list