[master] 50de179 Encode and ignore vmod argument names and default values

Poul-Henning Kamp phk at FreeBSD.org
Tue Nov 25 11:18:36 CET 2014


commit 50de1790fd64814ef747d1efdc61f444fab811cb
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Nov 25 10:16:55 2014 +0000

    Encode and ignore vmod argument names and default values

diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 32e544c..2eb9e73 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -532,15 +532,50 @@ vcc_Eval_Var(struct vcc *tl, struct expr **e, const struct symbol *sym)
 /*--------------------------------------------------------------------
  */
 
+static struct expr *
+vcc_priv_arg(struct vcc *tl, const char *p, const char *name)
+{
+	const char *r;
+	struct expr *e2;
+	char buf[32];
+	struct inifin *ifp;
+
+	if (!strcmp(p, "PRIV_VCL")) {
+		r = strchr(name, '.');
+		AN(r);
+		e2 = vcc_mk_expr(VOID, "&vmod_priv_%.*s",
+		    (int) (r - name), name);
+	} else if (!strcmp(p, "PRIV_CALL")) {
+		bprintf(buf, "vmod_priv_%u", tl->unique++);
+		ifp = New_IniFin(tl);
+		Fh(tl, 0, "static struct vmod_priv %s;\n", buf);
+		VSB_printf(ifp->fin, "\tVRT_priv_fini(&%s);", buf);
+		e2 = vcc_mk_expr(VOID, "&%s", buf);
+	} else if (!strcmp(p, "PRIV_REQ")) {
+		r = strchr(name, '.');
+		AN(r);
+		e2 = vcc_mk_expr(VOID,
+		    "VRT_priv_req(ctx, &VGC_vmod_%.*s)",
+		    (int) (r - name), name);
+	} else if (!strcmp(p, "PRIV_SESS")) {
+		r = strchr(name, '.');
+		AN(r);
+		e2 = vcc_mk_expr(VOID,
+		    "VRT_priv_sess(ctx, &VGC_vmod_%.*s)",
+		    (int) (r - name), name);
+	} else {
+		WRONG("Wrong PRIV_ type");
+	}
+	return (e2);
+}
+
 static void
 vcc_func(struct vcc *tl, struct expr **e, const char *cfunc,
     const char *extra, const char *name, const char *args)
 {
 	const char *p, *r;
 	struct expr *e1, *e2;
-	struct inifin *ifp;
 	enum var_type fmt;
-	char buf[32];
 
 	AN(cfunc);
 	AN(args);
@@ -553,34 +588,14 @@ vcc_func(struct vcc *tl, struct expr **e, const char *cfunc,
 	while (*p != '\0') {
 		e2 = NULL;
 		fmt = vcc_arg_type(&p);
-		if (fmt == VOID && !strcmp(p, "PRIV_VCL")) {
-			r = strchr(name, '.');
-			AN(r);
-			e2 = vcc_mk_expr(VOID, "&vmod_priv_%.*s",
-			    (int) (r - name), name);
-			p += strlen(p) + 1;
-		} else if (fmt == VOID && !strcmp(p, "PRIV_CALL")) {
-			bprintf(buf, "vmod_priv_%u", tl->unique++);
-			ifp = New_IniFin(tl);
-			Fh(tl, 0, "static struct vmod_priv %s;\n", buf);
-			VSB_printf(ifp->fin, "\tVRT_priv_fini(&%s);", buf);
-			e2 = vcc_mk_expr(VOID, "&%s", buf);
-			p += strlen(p) + 1;
-		} else if (fmt == VOID && !strcmp(p, "PRIV_REQ")) {
-			r = strchr(name, '.');
-			AN(r);
-			e2 = vcc_mk_expr(VOID,
-			    "VRT_priv_req(ctx, &VGC_vmod_%.*s)",
-			    (int) (r - name), name);
-			p += strlen(p) + 1;
-		} else if (fmt == VOID && !strcmp(p, "PRIV_SESS")) {
-			r = strchr(name, '.');
-			AN(r);
-			e2 = vcc_mk_expr(VOID,
-			    "VRT_priv_sess(ctx, &VGC_vmod_%.*s)",
-			    (int) (r - name), name);
+		if (!memcmp(p, "PRIV_", 5)) {
+			assert(fmt == VOID);
+			e2 = vcc_priv_arg(tl, p, name);
+			e1 = vcc_expr_edit(e1->fmt, "\v1,\n\v2", e1, e2);
 			p += strlen(p) + 1;
-		} else if (fmt == ENUM) {
+			continue;
+		}
+		if (fmt == ENUM) {
 			ExpectErr(tl, ID);
 			ERRCHK(tl);
 			r = p;
@@ -604,8 +619,6 @@ vcc_func(struct vcc *tl, struct expr **e, const char *cfunc,
 				p += strlen(p) + 1;
 			p++;
 			SkipToken(tl, ID);
-			if (*p != '\0')		/*lint !e448 */
-				SkipToken(tl, ',');
 		} else {
 			vcc_expr0(tl, &e2, fmt);
 			ERRCHK(tl);
@@ -624,10 +637,20 @@ vcc_func(struct vcc *tl, struct expr **e, const char *cfunc,
 				    "\v+\n\v1,\nvrt_magic_string_end\v-",
 				    e2, NULL);
 			}
-			if (*p != '\0')
-				SkipToken(tl, ',');
 		}
 		e1 = vcc_expr_edit(e1->fmt, "\v1,\n\v2", e1, e2);
+
+		/* XXX: ignore argument name and default value for now */
+		if (*p == '\1') {
+			/* Argument name */
+			p = strchr(p, '\0') + 1;
+			if (*p == '\2') {
+				/* Argument default value */
+				p = strchr(p, '\0') + 1;
+			}
+		}
+		if (*p != '\0')		/*lint !e448 */
+			SkipToken(tl, ',');
 	}
 	SkipToken(tl, ')');
 	e1 = vcc_expr_edit(e1->fmt, "\v1\n)\v-", e1, NULL);
diff --git a/lib/libvcc/vmodtool.py b/lib/libvcc/vmodtool.py
index 3da3fd4..2d335fc 100755
--- a/lib/libvcc/vmodtool.py
+++ b/lib/libvcc/vmodtool.py
@@ -103,6 +103,15 @@ def lwrap(s, w=72):
 		l.append(p + s)
 	return l
 
+def quote(s):
+	t = ""
+	for i in s:
+		if i == '"':
+			t += '\\"'
+		else:
+			t += i
+	return t
+
 #######################################################################
 
 def is_c_name(s):
@@ -563,10 +572,14 @@ class Arg(object):
 
 	def c_strspec(self):
 		if self.det == None:
-			return self.typ + "\\0"
+			s = self.typ + "\\0"
 		else:
-			return self.det
-		return "??"
+			s = self.det
+		if self.nam != None:
+			s += '"\n\t\t    "\\1' + self.nam + '\\0'
+		if self.val != None:
+			s += '"\n\t\t\t"\\2' + quote(self.val) + "\\0"
+		return s
 
 #######################################################################
 #



More information about the varnish-commit mailing list