]> granicus.if.org Git - libevent/commitdiff
Allow C identifiers as struct names; allow multiple comments in .rpc files; from...
authorNiels Provos <provos@gmail.com>
Fri, 3 Jul 2009 17:43:26 +0000 (17:43 +0000)
committerNiels Provos <provos@gmail.com>
Fri, 3 Jul 2009 17:43:26 +0000 (17:43 +0000)
svn:r1336

ChangeLog
event_rpcgen.py
test/regress.rpc

index 1aa2f003b0e3ef3f5a1107f02c3f1356539ed789..bfebd19ff9a522048a2d8eb1238ed0a35fb42395 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -39,6 +39,7 @@ Changes in 2.0.2-alpha:
  o Raise RpcGenError in event_rpcgen.py; from jmanison and Zack Weinberg
  o Fix preamble of rpcgen-generated files to rely on event2 includes; based on work by jmansion; patch from Zack Weinberg.
  o Allow specifying the output filename for rpcgen; based on work by jmansion; patch from Zack Weinberg.
+ o Allow C identifiers as struct names; allow multiple comments in .rpc files; from Zack Weinberg
 
 
 Changes in 2.0.1-alpha:
index b47d2a6d6e6b1a97fd4c7958c0274d5c57a838f3..c401fab21ac801d7c197022ad44f020e6173dc87 100755 (executable)
@@ -5,20 +5,29 @@
 #
 # Generates marshaling code based on libevent.
 
+# TODO:
+# 1) use optparse to allow the strategy shell to parse options, and
+#    to allow the instantiated factory (for the specific output language)
+#    to parse remaining options
+# 2) move the globals into a class that manages execution (including the
+#    progress outputs that space stderr at the moment)
+# 3) emit other languages
+
 import sys
 import re
 
-#
 _NAME = "event_rpcgen.py"
 _VERSION = "0.1"
-_STRUCT_RE = '[a-z][a-z_0-9]*'
 
 # Globals
 line_count = 0
 
-white = re.compile(r'^\s+')
+white = re.compile(r'\s+')
 cppcomment = re.compile(r'\/\/.*$')
 nonident = re.compile(r'[^a-zA-Z0-9_]')
+structref = re.compile(r'^struct\[([a-zA-Z_][a-zA-Z0-9_]*)\]$')
+structdef = re.compile(r'^struct +[a-zA-Z_][a-zA-Z0-9_]* *{$')
+
 headerdirect = []
 cppdirect = []
 
@@ -1351,8 +1360,7 @@ def ProcessOneEntry(factory, newstruct, entry):
     elif entry_type == 'string' and not fixed_length:
         newentry = factory.EntryString(entry_type, name, tag)
     else:
-        res = re.match(r'^struct\[(%s)\]$' % _STRUCT_RE,
-                       entry_type, re.IGNORECASE)
+        res = structref.match(entry_type)
         if res:
             # References another struct defined in our file
             newentry = factory.EntryStruct(entry_type, name, tag, res.group(1))
@@ -1426,8 +1434,8 @@ def GetNextStruct(file):
         line = line[:-1]
 
         if not have_c_comment and re.search(r'/\*', line):
-            if re.search(r'/\*.*\*/', line):
-                line = re.sub(r'/\*.*\*/', '', line)
+            if re.search(r'/\*.*?\*/', line):
+                line = re.sub(r'/\*.*?\*/', '', line)
             else:
                 line = re.sub(r'/\*.*$', '', line)
                 have_c_comment = 1
@@ -1456,8 +1464,7 @@ def GetNextStruct(file):
                 headerdirect.append(line)
                 continue
 
-            if not re.match(r'^struct %s {$' % _STRUCT_RE,
-                            line, re.IGNORECASE):
+            if not structdef.match(line):
                 raise RpcGenError('Missing struct on line %d: %s'
                                   % (line_count, line))
             else:
index c0170a788047c6a52fbf5cb589321d6aa2349685..0ee904e9139f361648961b838ea93deb54efa93d 100644 (file)
@@ -1,7 +1,7 @@
 /* tests data packing and unpacking */
 
 struct msg {
-       string from_name = 1;
+       string /* sender */ from_name = 1; /* be verbose */
        string to_name = 2;
        optional struct[kill] attack = 3;
        array struct[run] run = 4;