[master] 658d378 Prepatory work for optional arguments

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


commit 658d37859386af32d045bc32338b0da47dc3a2a5
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Nov 25 09:03:27 2014 +0000

    Prepatory work for optional arguments

diff --git a/lib/libvcc/vmodtool.py b/lib/libvcc/vmodtool.py
index bff415a..3da3fd4 100755
--- a/lib/libvcc/vmodtool.py
+++ b/lib/libvcc/vmodtool.py
@@ -556,6 +556,7 @@ class Arg(object):
 		self.nam = nam
 		self.typ = typ
 		self.det = det
+		self.val = None
 
 	def __repr__(self):
 		return "<ARG %s %s %s>" % (self.nam, self.typ, str(self.det))
@@ -593,6 +594,44 @@ def parse_enum2(tl):
 	s += "\\0"
 	return Arg("ENUM", det=s)
 
+def parse_arg(tl, al):
+	t = tl.get_token()
+	assert t != None
+
+	if t.str == ")":
+		return t
+
+	if t.str == "ENUM":
+		al.append(parse_enum2(tl))
+	elif t.str in ctypes:
+		al.append(Arg(t.str))
+	else:
+		raise Exception("ARG? %s", t.str)
+
+	t = tl.get_token()
+	if t.str == "," or t.str == ")":
+		return t
+
+	if not is_c_name(t.str):
+		raise ParseError(
+		    'Expected ")", "," or argument name, not "%s"' % t.str)
+
+	al[-1].nam = t.str
+	t = tl.get_token()
+
+	if t.str == "," or t.str == ")":
+		return t
+
+	if t.str != "=":
+		raise ParseError(
+		    'Expected ")", "," or "=", not "%s"' % t.str)
+
+	t = tl.get_token()
+	al[-1].val = t.str
+
+	t = tl.get_token()
+	return t
+
 #######################################################################
 #
 #
@@ -630,33 +669,13 @@ def parse_func(tl, rt_type=None, pobj=None):
 	if t.str != "(":
 		raise ParseError("Expected \"(\" got \"%s\"", t.str)
 
-	t = None
 	while True:
-		if t == None:
-			t = tl.get_token()
-		assert t != None
-
-		if t.str == "ENUM":
-			al.append(parse_enum2(tl))
-		elif t.str in ctypes:
-			al.append(Arg(t.str))
-		elif t.str == ")":
-			break
-		else:
-			raise Exception("ARG? %s", t.str)
-		t = tl.get_token()
-		if is_c_name(t.str):
-			al[-1].nam = t.str
-			t = tl.get_token()
-		if t.str == ",":
-			t = None
-		elif t.str == ")":
+		t = parse_arg(tl, al)
+		if t.str == ")":
 			break
-		else:
-			raise ParseError(
-			    "Expected \")\" or \",\" not \"%s\"" % t.str)
-	if t.str != ")":
-		raise ParseError("End Of Input looking for ')'")
+		if t.str != ",":
+			raise ParseError("End Of Input looking for ')' or ','")
+
 	f = Func(fname, rt_type, al)
 
 	return f



More information about the varnish-commit mailing list