[experimental-ims] 0351ac9 Move lib/libvmod_std/vmod.py to lib/libvcl/vmodtool.py

Martin Blix Grydeland martin at varnish-software.com
Thu Dec 18 10:27:46 CET 2014


commit 0351ac952b100d311d77dd77036c2976e5937661
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Feb 28 14:41:49 2012 +0100

    Move lib/libvmod_std/vmod.py to lib/libvcl/vmodtool.py
    
    Move it to a more natural home, as it is not really about libvmod_std,
    and give it a name that matches it's function (inspired from libtool)

diff --git a/lib/libvcl/Makefile.am b/lib/libvcl/Makefile.am
index f135e43..ad16981 100644
--- a/lib/libvcl/Makefile.am
+++ b/lib/libvcl/Makefile.am
@@ -31,7 +31,8 @@ libvcl_la_SOURCES = \
 	vcc_xref.c
 
 EXTRA_DIST = \
-	generate.py
+	generate.py \
+	vmodtool.py
 
 vcc_obj.c vcc_fixed_token.c vcc_token_defs.h: \
 	$(srcdir)/generate.py $(top_srcdir)/include/vrt.h
diff --git a/lib/libvcl/vmodtool.py b/lib/libvcl/vmodtool.py
new file mode 100755
index 0000000..041edcb
--- /dev/null
+++ b/lib/libvcl/vmodtool.py
@@ -0,0 +1,321 @@
+#!/usr/local/bin/python
+#-
+# Copyright (c) 2010-2011 Varnish Software AS
+# All rights reserved.
+#
+# Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Read the vmod.spec file and produce the vmod.h and vmod.c files.
+#
+# vmod.h contains the prototypes for the published functions, the module
+# C-code should include this file to ensure type-consistency.
+#
+# vmod.c contains the symbols which VCC and varnishd will use to access
+# the module:  A structure of properly typed function pointers, the
+# size of this structure in bytes, and the definition of the structure
+# as a string, suitable for inclusion in the C-source of the compile VCL
+# program.
+
+import sys
+import re
+
+if len(sys.argv) == 2:
+	specfile = sys.argv[1]
+else:
+	specfile = "vmod.vcc"
+
+ctypes = {
+	'IP':		"struct sockaddr_storage *",
+	'STRING':	"const char *",
+	'STRING_LIST':	"const char *, ...",
+	'BOOL':		"unsigned",
+	'BACKEND':	"struct director *",
+	'ENUM':		"const char *",
+	'TIME':		"double",
+	'REAL':		"double",
+	'DURATION':	"double",
+	'INT':		"int",
+	'HEADER':	"enum gethdr_e, const char *",
+	'PRIV_VCL':	"struct vmod_priv *",
+	'PRIV_CALL':	"struct vmod_priv *",
+	'VOID':		"void",
+}
+
+#######################################################################
+
+initname = ""
+modname = "???"
+pstruct = ""
+pinit = ""
+tdl = ""
+plist = ""
+slist = ""
+
+def do_func(fname, rval, args, vargs):
+	global pstruct
+	global pinit
+	global plist
+	global slist
+	global tdl
+	#print(fname, rval, args)
+
+	# C argument list
+	cargs = "(struct sess *"
+	for i in args:
+		cargs += ", " + i
+	cargs += ")"
+
+	# Prototypes for vmod implementation and interface typedef
+	proto = ctypes[rval] + " vmod_" + fname + cargs
+	sproto = ctypes[rval] + " td_" + modname + "_" + fname + cargs
+
+	# append to lists of prototypes
+	plist += proto + ";\n"
+	tdl += "typedef " + sproto + ";\n"
+
+	# Append to struct members
+	pstruct += "\ttd_" + modname + "_" + fname + "\t*" + fname + ";\n"
+
+	# Append to struct initializer
+	pinit += "\tvmod_" + fname + ",\n"
+
+	# Compose the vmod spec-string
+	s = modname + '.' + fname + "\\0"
+	s += "Vmod_Func_" + modname + "." + fname + "\\0"
+	s += rval + '\\0'
+	for i in vargs:
+		s +=  i + '\\0'
+	slist += '\t"' + s + '",\n'
+
+#######################################################################
+
+def partition(string, separator):
+	if (hasattr(string,"partition")):
+		return string.partition(separator)
+	i = string.find(separator)
+	if i >= 0:
+		return (string[:i],separator,string[i+len(separator):])
+	return (string, '', '')
+
+#######################################################################
+
+def is_c_name(s):
+	return None != re.match("^[a-z][a-z0-9_]*$", s)
+
+#######################################################################
+
+def parse_enum(tq):
+	assert tq[0] == '{'
+	assert tq[-1] == '}'
+	f = tq[1:-1].split(',')
+	s="ENUM\\0"
+	b=dict()
+	for i in f:
+		i = i.strip()
+		if not is_c_name(i):
+			raise Exception("Enum value '%s' is illegal" % i)
+		if i in b:
+			raise Exception("Duplicate Enum value '%s'" % i)
+		b[i] = True
+		s = s + i.strip() + '\\0'
+	return s
+
+#######################################################################
+
+f = open(specfile, "r")
+
+def nextline():
+	while True:
+		l0 = f.readline()
+		if l0 == "":
+			return l0
+		l0 = re.sub("#.*$", "", l0)
+		l0 = re.sub("\s\s*", " ", l0.strip())
+		if l0 != "":
+			return l0
+
+while True:
+	l0 = nextline()
+	if l0 == "":
+		break;
+	l = partition(l0, " ")
+
+	if l[0] == "Module":
+		modname = l[2].strip();
+		if not is_c_name(modname):
+			raise Exception("Module name '%s' is illegal" % modname)
+		continue
+
+	if l[0] == "Init":
+		initname = l[2].strip();
+		if not is_c_name(initname):
+			raise Exception("Init name '%s' is illegal" % initname)
+		continue
+
+	if l[0] != "Function":
+		raise Exception("Expected 'Function' line, got '%s'" % l[0])
+
+	# Find the return type of the function
+	l = partition(l[2].strip(), " ")
+	rt_type = l[0]
+	if rt_type not in ctypes:
+		raise Exception("Return type '%s' not a valid type" % rt_type)
+
+	# Find the function name
+	l = partition(l[2].strip(), "(")
+
+	fname = l[0].strip()
+	if not is_c_name(fname):
+		raise Exception("Function name '%s' is illegal" % fname)
+
+	if l[1] != '(':
+		raise Exception("Missing '('")
+
+	l = l[2]
+
+	while -1 == l.find(")"):
+		l1 = nextline()
+		if l1 == "":
+			raise Exception("End Of Input looking for ')'")
+		l = l + l1
+
+	if -1 != l.find("("):
+		raise Exception("Nesting trouble with '(...)' ")
+
+	if l[-1:] != ')':
+		raise Exception("Junk after ')'")
+
+	l = l[:-1]
+
+	args = list()
+	vargs = list()
+
+	for i in re.finditer("([A-Z_]+)\s*({[^}]+})?(,|$)", l):
+		at = i.group(1)
+		tq = i.group(2)
+		if at not in ctypes:
+			raise Exception(
+			    "Argument type '%s' not a valid type" % at)
+
+		args.append(ctypes[at])
+
+		if at == "ENUM":
+			if tq == None:
+				raise Exception(
+				    "Argument type '%s' needs qualifier {...}"
+				    % at)
+			at=parse_enum(tq)
+
+		elif tq != None:
+			raise Exception(
+			    "Argument type '%s' cannot be qualified with {...}"
+			    % at)
+
+		vargs.append(at)
+
+	do_func(fname, rt_type, args, vargs)
+
+#######################################################################
+def dumps(s):
+	while True:
+		l = partition(s, "\n")
+		if len(l[0]) == 0:
+			break
+		fc.write('\t"' + l[0] + '\\n"\n')
+		s = l[2]
+
+#######################################################################
+
+if initname != "":
+	plist += "int " + initname
+	plist += "(struct vmod_priv *, const struct VCL_conf *);\n"
+	pstruct += "\tvmod_init_f\t*_init;\n"
+	pinit += "\t" + initname + ",\n"
+	slist += '\t"INIT\\0Vmod_Func_' + modname + '._init",\n'
+
+#######################################################################
+
+def file_header(fo):
+        fo.write("""/*
+ * NB:  This file is machine generated, DO NOT EDIT!
+ *
+ * Edit vmod.vcc and run vmod.py instead
+ */
+
+""")
+
+#######################################################################
+
+fc = open("vcc_if.c", "w")
+fh = open("vcc_if.h", "w")
+
+file_header(fc)
+file_header(fh)
+
+fh.write('struct sess;\n')
+fh.write('struct VCL_conf;\n')
+fh.write('struct vmod_priv;\n')
+fh.write("\n");
+
+fh.write(plist)
+
+
+fc.write('#include "config.h"\n')
+fc.write('\n')
+fc.write('#include "vrt.h"\n')
+fc.write('#include "vcc_if.h"\n')
+fc.write('#include "vmod_abi.h"\n')
+fc.write("\n");
+
+fc.write("\n");
+
+fc.write(tdl);
+fc.write("\n");
+
+fc.write('const char Vmod_Name[] = "' + modname + '";\n')
+
+fc.write("const struct Vmod_Func_" + modname + " {\n")
+fc.write(pstruct + "} Vmod_Func = {\n" + pinit + "};\n")
+fc.write("\n");
+
+fc.write("const int Vmod_Len = sizeof(Vmod_Func);\n")
+fc.write("\n");
+
+fc.write('const char Vmod_Proto[] =\n')
+dumps(tdl);
+fc.write('\t"\\n"\n')
+dumps("struct Vmod_Func_" + modname + " {\n")
+dumps(pstruct + "} Vmod_Func_" + modname + ";\n")
+fc.write('\t;\n')
+fc.write("\n");
+
+fc.write('const char * const Vmod_Spec[] = {\n' + slist + '\t0\n};\n')
+
+fc.write('const char Vmod_Varnish_ABI[] = VMOD_ABI_Version;\n')
+
+fh.write('extern const void * const Vmod_Id;\n')
+fc.write('const void * const Vmod_Id = &Vmod_Id;\n')
+
+fc.write("\n")
+
diff --git a/lib/libvmod_std/Makefile.am b/lib/libvmod_std/Makefile.am
index c4128ea..a872837 100644
--- a/lib/libvmod_std/Makefile.am
+++ b/lib/libvmod_std/Makefile.am
@@ -9,6 +9,7 @@ dist_man_MANS = vmod_std.3
 
 vmoddir = $(pkglibdir)/vmods
 vmod_srcdir = $(top_srcdir)/lib/libvmod_std
+vmodtool = $(top_srcdir)/lib/libvcl/vmodtool.py
 vmod_LTLIBRARIES = libvmod_std.la
 
 libvmod_std_la_LDFLAGS = -module -export-dynamic -avoid-version
@@ -20,10 +21,10 @@ libvmod_std_la_SOURCES = \
 	vmod_std_fileread.c \
 	vmod_std_conversions.c
 
-vcc_if.c vcc_if.h: $(vmod_srcdir)/vmod.py $(vmod_srcdir)/vmod.vcc 
-	@PYTHON@ $(vmod_srcdir)/vmod.py $(vmod_srcdir)/vmod.vcc
+vcc_if.c vcc_if.h: $(vmodtool) $(vmod_srcdir)/vmod.vcc
+	@PYTHON@ $(vmodtool) $(vmod_srcdir)/vmod.vcc
 
-EXTRA_DIST = vmod.py vmod.vcc
+EXTRA_DIST = vmod.vcc
 
 CLEANFILES = $(builddir)/vcc_if.c $(builddir)/vcc_if.h
 
diff --git a/lib/libvmod_std/vmod.py b/lib/libvmod_std/vmod.py
deleted file mode 100755
index 041edcb..0000000
--- a/lib/libvmod_std/vmod.py
+++ /dev/null
@@ -1,321 +0,0 @@
-#!/usr/local/bin/python
-#-
-# Copyright (c) 2010-2011 Varnish Software AS
-# All rights reserved.
-#
-# Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# Read the vmod.spec file and produce the vmod.h and vmod.c files.
-#
-# vmod.h contains the prototypes for the published functions, the module
-# C-code should include this file to ensure type-consistency.
-#
-# vmod.c contains the symbols which VCC and varnishd will use to access
-# the module:  A structure of properly typed function pointers, the
-# size of this structure in bytes, and the definition of the structure
-# as a string, suitable for inclusion in the C-source of the compile VCL
-# program.
-
-import sys
-import re
-
-if len(sys.argv) == 2:
-	specfile = sys.argv[1]
-else:
-	specfile = "vmod.vcc"
-
-ctypes = {
-	'IP':		"struct sockaddr_storage *",
-	'STRING':	"const char *",
-	'STRING_LIST':	"const char *, ...",
-	'BOOL':		"unsigned",
-	'BACKEND':	"struct director *",
-	'ENUM':		"const char *",
-	'TIME':		"double",
-	'REAL':		"double",
-	'DURATION':	"double",
-	'INT':		"int",
-	'HEADER':	"enum gethdr_e, const char *",
-	'PRIV_VCL':	"struct vmod_priv *",
-	'PRIV_CALL':	"struct vmod_priv *",
-	'VOID':		"void",
-}
-
-#######################################################################
-
-initname = ""
-modname = "???"
-pstruct = ""
-pinit = ""
-tdl = ""
-plist = ""
-slist = ""
-
-def do_func(fname, rval, args, vargs):
-	global pstruct
-	global pinit
-	global plist
-	global slist
-	global tdl
-	#print(fname, rval, args)
-
-	# C argument list
-	cargs = "(struct sess *"
-	for i in args:
-		cargs += ", " + i
-	cargs += ")"
-
-	# Prototypes for vmod implementation and interface typedef
-	proto = ctypes[rval] + " vmod_" + fname + cargs
-	sproto = ctypes[rval] + " td_" + modname + "_" + fname + cargs
-
-	# append to lists of prototypes
-	plist += proto + ";\n"
-	tdl += "typedef " + sproto + ";\n"
-
-	# Append to struct members
-	pstruct += "\ttd_" + modname + "_" + fname + "\t*" + fname + ";\n"
-
-	# Append to struct initializer
-	pinit += "\tvmod_" + fname + ",\n"
-
-	# Compose the vmod spec-string
-	s = modname + '.' + fname + "\\0"
-	s += "Vmod_Func_" + modname + "." + fname + "\\0"
-	s += rval + '\\0'
-	for i in vargs:
-		s +=  i + '\\0'
-	slist += '\t"' + s + '",\n'
-
-#######################################################################
-
-def partition(string, separator):
-	if (hasattr(string,"partition")):
-		return string.partition(separator)
-	i = string.find(separator)
-	if i >= 0:
-		return (string[:i],separator,string[i+len(separator):])
-	return (string, '', '')
-
-#######################################################################
-
-def is_c_name(s):
-	return None != re.match("^[a-z][a-z0-9_]*$", s)
-
-#######################################################################
-
-def parse_enum(tq):
-	assert tq[0] == '{'
-	assert tq[-1] == '}'
-	f = tq[1:-1].split(',')
-	s="ENUM\\0"
-	b=dict()
-	for i in f:
-		i = i.strip()
-		if not is_c_name(i):
-			raise Exception("Enum value '%s' is illegal" % i)
-		if i in b:
-			raise Exception("Duplicate Enum value '%s'" % i)
-		b[i] = True
-		s = s + i.strip() + '\\0'
-	return s
-
-#######################################################################
-
-f = open(specfile, "r")
-
-def nextline():
-	while True:
-		l0 = f.readline()
-		if l0 == "":
-			return l0
-		l0 = re.sub("#.*$", "", l0)
-		l0 = re.sub("\s\s*", " ", l0.strip())
-		if l0 != "":
-			return l0
-
-while True:
-	l0 = nextline()
-	if l0 == "":
-		break;
-	l = partition(l0, " ")
-
-	if l[0] == "Module":
-		modname = l[2].strip();
-		if not is_c_name(modname):
-			raise Exception("Module name '%s' is illegal" % modname)
-		continue
-
-	if l[0] == "Init":
-		initname = l[2].strip();
-		if not is_c_name(initname):
-			raise Exception("Init name '%s' is illegal" % initname)
-		continue
-
-	if l[0] != "Function":
-		raise Exception("Expected 'Function' line, got '%s'" % l[0])
-
-	# Find the return type of the function
-	l = partition(l[2].strip(), " ")
-	rt_type = l[0]
-	if rt_type not in ctypes:
-		raise Exception("Return type '%s' not a valid type" % rt_type)
-
-	# Find the function name
-	l = partition(l[2].strip(), "(")
-
-	fname = l[0].strip()
-	if not is_c_name(fname):
-		raise Exception("Function name '%s' is illegal" % fname)
-
-	if l[1] != '(':
-		raise Exception("Missing '('")
-
-	l = l[2]
-
-	while -1 == l.find(")"):
-		l1 = nextline()
-		if l1 == "":
-			raise Exception("End Of Input looking for ')'")
-		l = l + l1
-
-	if -1 != l.find("("):
-		raise Exception("Nesting trouble with '(...)' ")
-
-	if l[-1:] != ')':
-		raise Exception("Junk after ')'")
-
-	l = l[:-1]
-
-	args = list()
-	vargs = list()
-
-	for i in re.finditer("([A-Z_]+)\s*({[^}]+})?(,|$)", l):
-		at = i.group(1)
-		tq = i.group(2)
-		if at not in ctypes:
-			raise Exception(
-			    "Argument type '%s' not a valid type" % at)
-
-		args.append(ctypes[at])
-
-		if at == "ENUM":
-			if tq == None:
-				raise Exception(
-				    "Argument type '%s' needs qualifier {...}"
-				    % at)
-			at=parse_enum(tq)
-
-		elif tq != None:
-			raise Exception(
-			    "Argument type '%s' cannot be qualified with {...}"
-			    % at)
-
-		vargs.append(at)
-
-	do_func(fname, rt_type, args, vargs)
-
-#######################################################################
-def dumps(s):
-	while True:
-		l = partition(s, "\n")
-		if len(l[0]) == 0:
-			break
-		fc.write('\t"' + l[0] + '\\n"\n')
-		s = l[2]
-
-#######################################################################
-
-if initname != "":
-	plist += "int " + initname
-	plist += "(struct vmod_priv *, const struct VCL_conf *);\n"
-	pstruct += "\tvmod_init_f\t*_init;\n"
-	pinit += "\t" + initname + ",\n"
-	slist += '\t"INIT\\0Vmod_Func_' + modname + '._init",\n'
-
-#######################################################################
-
-def file_header(fo):
-        fo.write("""/*
- * NB:  This file is machine generated, DO NOT EDIT!
- *
- * Edit vmod.vcc and run vmod.py instead
- */
-
-""")
-
-#######################################################################
-
-fc = open("vcc_if.c", "w")
-fh = open("vcc_if.h", "w")
-
-file_header(fc)
-file_header(fh)
-
-fh.write('struct sess;\n')
-fh.write('struct VCL_conf;\n')
-fh.write('struct vmod_priv;\n')
-fh.write("\n");
-
-fh.write(plist)
-
-
-fc.write('#include "config.h"\n')
-fc.write('\n')
-fc.write('#include "vrt.h"\n')
-fc.write('#include "vcc_if.h"\n')
-fc.write('#include "vmod_abi.h"\n')
-fc.write("\n");
-
-fc.write("\n");
-
-fc.write(tdl);
-fc.write("\n");
-
-fc.write('const char Vmod_Name[] = "' + modname + '";\n')
-
-fc.write("const struct Vmod_Func_" + modname + " {\n")
-fc.write(pstruct + "} Vmod_Func = {\n" + pinit + "};\n")
-fc.write("\n");
-
-fc.write("const int Vmod_Len = sizeof(Vmod_Func);\n")
-fc.write("\n");
-
-fc.write('const char Vmod_Proto[] =\n')
-dumps(tdl);
-fc.write('\t"\\n"\n')
-dumps("struct Vmod_Func_" + modname + " {\n")
-dumps(pstruct + "} Vmod_Func_" + modname + ";\n")
-fc.write('\t;\n')
-fc.write("\n");
-
-fc.write('const char * const Vmod_Spec[] = {\n' + slist + '\t0\n};\n')
-
-fc.write('const char Vmod_Varnish_ABI[] = VMOD_ABI_Version;\n')
-
-fh.write('extern const void * const Vmod_Id;\n')
-fc.write('const void * const Vmod_Id = &Vmod_Id;\n')
-
-fc.write("\n")
-



More information about the varnish-commit mailing list