[master] 0fca8adf1 Add VARGS() macro for vmod argument structures.

Poul-Henning Kamp phk at FreeBSD.org
Mon Feb 4 13:44:09 UTC 2019


commit 0fca8adf15a0a024fc03d40eeb61534187fb623d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Feb 4 13:41:55 2019 +0000

    Add VARGS() macro for vmod argument structures.
    
    Change name for enums and args to have "enum_" and "arg_" prefixes.
    
    Minimal changes to the vmods to react to these changes.

diff --git a/bin/varnishd/flint.lnt b/bin/varnishd/flint.lnt
index 4664df7ff..88e89b36d 100644
--- a/bin/varnishd/flint.lnt
+++ b/bin/varnishd/flint.lnt
@@ -67,6 +67,12 @@
 
 -emacro(845, HTTPH)	// Info 845: The left argument to operator '&&' is certain to be 0
 -esym(773, PCRE_DATE)	// Expression-like macro '___' not parenthesized
+
+//////////////
+// Macros defined differently in each VMOD
+-esym(767, VPFX)	// macro '___' was defined differently in another module
+-esym(767, VARGS)	// macro '___' was defined differently in another module
+-esym(767, VENUM)	// macro '___' was defined differently in another module 
 //////////////
 -efunc(1791, pdiff)	// return last on line
 //////////////
diff --git a/lib/libvcc/vmodtool.py b/lib/libvcc/vmodtool.py
index 1f02696d2..310f4a43f 100755
--- a/lib/libvcc/vmodtool.py
+++ b/lib/libvcc/vmodtool.py
@@ -31,6 +31,7 @@ Read the vmod.vcc file (inputvcc) and produce:
     vmod_if.h -- Prototypes for the implementation
     vmod_if.c -- Magic glue & datastructures to make things a VMOD.
     vmod_${name}.rst -- Extracted documentation
+    vmod_${name}.man.rst -- Extracted documentation (rst2man input)
 """
 
 # This script should work with both Python 2 and Python 3.
@@ -129,10 +130,14 @@ def unquote(txt):
 
 def fmt_cstruct(fo, a, b):
     ''' Output line in vmod struct '''
-    t = "\t%s\t" % a
+    t = '\t%s' % a
+    if len(t.expandtabs()) > 40:
+        t += '\n\t\t\t\t\t'
+    else:
+        t += '\t'
     while len(t.expandtabs()) < 40:
-        t += "\t"
-    fo.write("%s%s\n" % (t, b))
+        t += '\t'
+    fo.write('%s%s\n' % (t, b))
 
 #######################################################################
 
@@ -430,7 +435,7 @@ class ProtoType(object):
         return "typedef " + self.proto(args, name=self.typedef_name())
 
     def argstructname(self):
-        return "struct %s_arg" % self.cname(True)
+        return "struct VARGS(%s)" % self.cname(False)
 
     def argstructure(self):
         s = "\n" + self.argstructname() + " {\n"
@@ -471,7 +476,8 @@ class ProtoType(object):
         self.retval.jsonproto(ll)
         ll.append('%s.%s' % (self.st.vcc.csn, cfunc))
         if self.argstruct:
-            ll.append(self.argstructname())
+            # We cannot use VARGS() here, we are after the #undef
+            ll.append('struct arg_%s' % self.cname(True))
         else:
             ll.append("")
         for i in self.args:
@@ -662,8 +668,7 @@ class EventStanza(Stanza):
 
     def cstuff(self, fo, where):
         if where == 'h':
-            fo.write("vmod_event_f %s%s;\n" %
-                     (self.vcc.sympfx, self.event_func))
+            fo.write("vmod_event_f VPFX(%s);\n" % self.event_func)
 
     def cstruct(self, fo, define):
         if define:
@@ -741,7 +746,7 @@ class ObjectStanza(Stanza):
                     fo.write('      :ref:`%s`\n  \n' % i.rstlbl)
 
     def cstuff(self, fo, w):
-        sn = self.vcc.sympfx + self.vcc.modname + "_" + self.proto.name
+        sn = 'VPFX(' + self.vcc.modname + '_' + self.proto.name + ')'
         fo.write("struct %s;\n" % sn)
 
         fo.write(self.init.cproto(
@@ -952,8 +957,17 @@ class vcc(object):
         fo.write("#endif\n")
         fo.write("\n")
 
+        fo.write('#define VPFX(a) %s##a\n' % self.sympfx)
+        fo.write('#define VARGS(a) arg_%s##a\n' % self.sympfx)
+        fo.write('#define VENUM(a) enum_%s##a\n' % self.sympfx)
+        fo.write('\n')
+
         for j in sorted(self.enums):
-            fo.write("extern VCL_ENUM %senum_%s;\n" % (self.sympfx, j))
+            fo.write("extern VCL_ENUM VENUM(%s);\n" % j)
+        fo.write("\n")
+        for j in sorted(self.enums):
+            fo.write("//lint -esym(759, enum_%s%s)\n" % (self.sympfx, j))
+            fo.write("//lint -esym(765, enum_%s%s)\n" % (self.sympfx, j))
         fo.write("\n")
 
         for j in self.contents:
@@ -974,7 +988,7 @@ class vcc(object):
             j.cstruct(fo, False)
         fo.write("\n")
         for j in sorted(self.enums):
-            fo.write("\t&%senum_%s,\n" % (self.sympfx, j))
+            fmt_cstruct(fo, '.enum_%s =' % j, '&VENUM(%s),' % j)
         fo.write("};\n")
 
     def json(self, fo):
@@ -1026,6 +1040,11 @@ class vcc(object):
 
         write_c_file_warning(fo)
 
+        fx.write('#define VPFX(a) %s##a\n' % self.sympfx)
+        fx.write('#define VARGS(a) arg_%s##a\n' % self.sympfx)
+        fx.write('#define VENUM(a) enum_%s##a\n' % self.sympfx)
+        fx.write('\n')
+
         fo.write('#include "config.h"\n')
         fo.write('#include <stdio.h>\n')
         for i in ["vdef", "vrt", self.pfx, "vmod_abi"]:
@@ -1033,7 +1052,7 @@ class vcc(object):
         fo.write("\n")
 
         for j in sorted(self.enums):
-            fo.write('VCL_ENUM %senum_%s = "%s";\n' % (self.sympfx, j, j))
+            fo.write('VCL_ENUM VENUM(%s) = "%s";\n' % (j, j))
         fo.write("\n")
 
         for i in self.contents:
@@ -1053,6 +1072,10 @@ class vcc(object):
         fo.write("\n/*lint -esym(754, " + self.csn + "::*) */\n")
         self.cstruct_init(fo)
 
+        fx.write('#undef VPFX\n')
+        fx.write('#undef VARGS\n')
+        fx.write('#undef VENUM\n')
+
         fx.close()
 
         fo.write("\nstatic const char Vmod_Proto[] =\n")
diff --git a/lib/libvmod_blob/vmod_blob.c b/lib/libvmod_blob/vmod_blob.c
index 66b9f4e24..d032a439b 100644
--- a/lib/libvmod_blob/vmod_blob.c
+++ b/lib/libvmod_blob/vmod_blob.c
@@ -118,7 +118,7 @@ static const struct vrt_blob null_blob[1] = {{
 static enum encoding
 parse_encoding(VCL_ENUM e)
 {
-#define VMODENUM(n) if (e == vmod_enum_ ## n) return(n);
+#define VMODENUM(n) if (e == VENUM(n)) return(n);
 #include "tbl_encodings.h"
 	WRONG("illegal encoding enum");
 }
@@ -126,7 +126,7 @@ parse_encoding(VCL_ENUM e)
 static enum case_e
 parse_case(VCL_ENUM e)
 {
-#define VMODENUM(n) if (e == vmod_enum_ ## n) return(n);
+#define VMODENUM(n) if (e == VENUM(n)) return(n);
 #include "tbl_case.h"
 	WRONG("illegal case enum");
 }
diff --git a/lib/libvmod_debug/vmod_debug.c b/lib/libvmod_debug/vmod_debug.c
index 43e203262..c62b3e85e 100644
--- a/lib/libvmod_debug/vmod_debug.c
+++ b/lib/libvmod_debug/vmod_debug.c
@@ -94,16 +94,16 @@ xyzzy_author(VRT_CTX, VCL_ENUM person, VCL_ENUM someone)
 	(void)someone;
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
-	if (person == xyzzy_enum_phk)
+	if (person == VENUM(phk))
 		return ("Poul-Henning");
 	assert(strcmp(person, "phk"));
-	if (person == xyzzy_enum_des)
+	if (person == VENUM(des))
 		return ("Dag-Erling");
 	assert(strcmp(person, "des"));
-	if (person == xyzzy_enum_kristian)
+	if (person == VENUM(kristian))
 		return ("Kristian");
 	assert(strcmp(person, "kristian"));
-	if (person == xyzzy_enum_mithrandir)
+	if (person == VENUM(mithrandir))
 		return ("Tollef");
 	assert(strcmp(person, "mithrandir"));
 	WRONG("Illegal VMOD enum");
@@ -194,7 +194,7 @@ xyzzy_rot52(VRT_CTX, VCL_HTTP hp)
 }
 
 VCL_STRING v_matchproto_(td_debug_argtest)
-xyzzy_argtest(VRT_CTX, struct xyzzy_argtest_arg *arg)
+xyzzy_argtest(VRT_CTX, struct VARGS(argtest) *arg)
 {
 	char buf[100];
 
diff --git a/lib/libvmod_debug/vmod_debug_obj.c b/lib/libvmod_debug/vmod_debug_obj.c
index 4e716dae4..0dea592a3 100644
--- a/lib/libvmod_debug/vmod_debug_obj.c
+++ b/lib/libvmod_debug/vmod_debug_obj.c
@@ -157,17 +157,17 @@ xyzzy_obj_test_priv_top(VRT_CTX,
  * obj_opt (optional arguments and privs)
  */
 struct xyzzy_debug_obj_opt {
-	unsigned			  magic;
-#define VMOD_DEBUG_OBJ_OPT_MAGIC	  0xccbd9b78
-	char				  *name;
-	struct xyzzy_obj_opt_meth_opt_arg args;
-	void				  *freeptr;
+	unsigned			magic;
+#define VMOD_DEBUG_OBJ_OPT_MAGIC	0xccbd9b78
+	char				*name;
+	struct VARGS(obj_opt_meth_opt)	args;
+	void				*freeptr;
 };
 
 VCL_VOID v_matchproto_()
 xyzzy_obj_opt__init(VRT_CTX,
     struct xyzzy_debug_obj_opt **op, const char *vcl_name,
-    struct xyzzy_obj_opt__init_arg *args)
+    struct VARGS(obj_opt__init) *args)
 {
 	struct xyzzy_debug_obj_opt *o;
 
@@ -221,7 +221,7 @@ xyzzy_obj_opt__fini(struct xyzzy_debug_obj_opt **op)
 VCL_STRING v_matchproto_()
 xyzzy_obj_opt_meth_opt(VRT_CTX,
     struct xyzzy_debug_obj_opt *o,
-    struct xyzzy_obj_opt_meth_opt_arg *args)
+    struct VARGS(obj_opt_meth_opt) *args)
 {
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(o, VMOD_DEBUG_OBJ_OPT_MAGIC);
diff --git a/lib/libvmod_directors/vmod_shard.c b/lib/libvmod_directors/vmod_shard.c
index 9e8abcbc0..4495474d3 100644
--- a/lib/libvmod_directors/vmod_shard.c
+++ b/lib/libvmod_directors/vmod_shard.c
@@ -182,7 +182,7 @@ struct vmod_directors_shard {
 static enum by_e
 parse_by_e(VCL_ENUM e)
 {
-#define VMODENUM(n) if (e == vmod_enum_ ## n) return(BY_ ## n);
+#define VMODENUM(n) if (e == VENUM(n)) return(BY_ ## n);
 #include "tbl_by.h"
        WRONG("illegal by enum");
 }
@@ -190,7 +190,7 @@ parse_by_e(VCL_ENUM e)
 static enum healthy_e
 parse_healthy_e(VCL_ENUM e)
 {
-#define VMODENUM(n) if (e == vmod_enum_ ## n) return(n);
+#define VMODENUM(n) if (e == VENUM(n)) return(n);
 #include "tbl_healthy.h"
        WRONG("illegal healthy enum");
 }
@@ -198,7 +198,7 @@ parse_healthy_e(VCL_ENUM e)
 static enum resolve_e
 parse_resolve_e(VCL_ENUM e)
 {
-#define VMODENUM(n) if (e == vmod_enum_ ## n) return(n);
+#define VMODENUM(n) if (e == VENUM(n)) return(n);
 #include "tbl_resolve.h"
        WRONG("illegal resolve enum");
 }
@@ -343,7 +343,7 @@ vmod_shard_associate(VRT_CTX,
 
 VCL_BOOL v_matchproto_(td_directors_shard_add_backend)
 vmod_shard_add_backend(VRT_CTX, struct vmod_directors_shard *vshard,
-    struct vmod_shard_add_backend_arg *args)
+    struct VARGS(shard_add_backend) *args)
 {
 	CHECK_OBJ_NOTNULL(vshard, VMOD_SHARD_SHARD_MAGIC);
 
@@ -361,7 +361,7 @@ vmod_shard_add_backend(VRT_CTX, struct vmod_directors_shard *vshard,
 
 VCL_BOOL v_matchproto_(td_directors_shard_remove_backend)
 vmod_shard_remove_backend(VRT_CTX, struct vmod_directors_shard *vshard,
-    struct vmod_shard_remove_backend_arg *args)
+    struct VARGS(shard_remove_backend) *args)
 {
 	VCL_BACKEND be = args->valid_backend ? args->backend : NULL;
 	VCL_STRING ident = args->valid_ident ? args->ident : NULL;
@@ -498,7 +498,7 @@ shard_blob_key(VCL_BLOB key_blob)
 #define tobit(args, name) ((args)->valid_##name ? arg_##name : 0)
 
 static uint32_t
-shard_backend_arg_mask(const struct vmod_shard_backend_arg * const a)
+shard_backend_arg_mask(const struct VARGS(shard_backend) * const a)
 {
 	return (tobit(a, by)		|
 		tobit(a, key)		|
@@ -511,7 +511,7 @@ shard_backend_arg_mask(const struct vmod_shard_backend_arg * const a)
 		tobit(a, resolve));
 }
 static uint32_t
-shard_param_set_mask(const struct vmod_shard_param_set_arg * const a)
+shard_param_set_mask(const struct VARGS(shard_param_set) * const a)
 {
 	return (tobit(a, by)		|
 		tobit(a, key)		|
@@ -640,7 +640,7 @@ shard_param_args(VRT_CTX,
 
 VCL_BACKEND v_matchproto_(td_directors_shard_backend)
 vmod_shard_backend(VRT_CTX, struct vmod_directors_shard *vshard,
-		   struct vmod_shard_backend_arg *a)
+		   struct VARGS(shard_backend) *a)
 {
 	struct vmod_directors_shard_param pstk;
 	struct vmod_directors_shard_param *pp = NULL;
@@ -884,7 +884,7 @@ shard_param_prep(VRT_CTX, struct vmod_directors_shard_param *p,
 
 VCL_VOID v_matchproto_(td_directors_shard_param_set)
 vmod_shard_param_set(VRT_CTX, struct vmod_directors_shard_param *p,
-		     struct vmod_shard_param_set_arg *a)
+		     struct VARGS(shard_param_set) *a)
 {
 	uint32_t args = shard_param_set_mask(a);
 


More information about the varnish-commit mailing list