Raise RpcGenError in event_rpcgen.py; from jmanison and Zack Weinberg

svn:r1333
This commit is contained in:
Niels Provos 2009-07-03 17:20:56 +00:00
parent 342ad3550b
commit 37d3e16ce9
2 changed files with 46 additions and 48 deletions

View File

@ -36,6 +36,7 @@ Changes in 2.0.2-alpha:
o Activate fd events in a pseudorandom order with O(N) backends, so that we don't systematically favor low fds (select) or earlier-added fds (poll, win32).
o Replace some read()/write() instances with send()/recv() to work properly on win32.
o Set truncated flag correctly in evdns server replies.
o Raise RpcGenError in event_rpcgen.py; from jmanison and Zack Weinberg
Changes in 2.0.1-alpha:

View File

@ -24,6 +24,13 @@ cppdirect = []
def TranslateList(mylist, mydict):
return map(lambda x: x % mydict, mylist)
# Exception class for parse errors
class RpcGenError(Exception):
def __init__(self, why):
self.why = why
def __str__(self):
return str(self.why)
# Holds everything that makes a struct
class Struct:
def __init__(self, name):
@ -34,11 +41,10 @@ class Struct:
def AddEntry(self, entry):
if self._tags.has_key(entry.Tag()):
print >>sys.stderr, ( 'Entry "%s" duplicates tag number '
'%d from "%s" around line %d' ) % (
entry.Name(), entry.Tag(),
self._tags[entry.Tag()], line_count)
sys.exit(1)
raise RpcGenError(
'Entry "%s" duplicates tag number %d from "%s" '
'around line %d' % (entry.Name(), entry.Tag(),
self._tags[entry.Tag()], line_count))
self._entries.append(entry)
self._tags[entry.Tag()] = entry.Name()
print >>sys.stderr, ' Added entry: %s' % entry.Name()
@ -367,20 +373,17 @@ class Entry:
def Verify(self):
if self.Array() and not self._can_be_array:
print >>sys.stderr, (
raise RpcGenError(
'Entry "%s" cannot be created as an array '
'around line %d' ) % (self._name, self.LineCount())
sys.exit(1)
'around line %d' % (self._name, self.LineCount()))
if not self._struct:
print >>sys.stderr, (
raise RpcGenError(
'Entry "%s" does not know which struct it belongs to '
'around line %d' ) % (self._name, self.LineCount())
sys.exit(1)
'around line %d' % (self._name, self.LineCount()))
if self._optional and self._array:
print >>sys.stderr, ( 'Entry "%s" has illegal combination of '
'optional and array around line %d' ) % (
self._name, self.LineCount() )
sys.exit(1)
raise RpcGenError(
'Entry "%s" has illegal combination of optional and array '
'around line %d' % (self._name, self.LineCount()))
def GetTranslation(self, extradict = {}):
mapping = {
@ -568,9 +571,9 @@ class EntryBytes(Entry):
def Verify(self):
if not self._length:
print >>sys.stderr, 'Entry "%s" needs a length around line %d' % (
self._name, self.LineCount() )
sys.exit(1)
raise RpcGenError(
'Entry "%s" needs a length '
'around line %d' % (self._name, self.LineCount()))
Entry.Verify(self)
@ -1306,9 +1309,9 @@ def ProcessOneEntry(factory, newstruct, entry):
if not name:
res = re.match(r'^([^\[\]]+)(\[.*\])?$', token)
if not res:
print >>sys.stderr, 'Cannot parse name: \"%s\" around %d' % (
entry, line_count)
sys.exit(1)
raise RpcGenError(
'Cannot parse name: \"%s\" '
'around line %d' % (entry, line_count))
name = res.group(1)
fixed_length = res.group(2)
if fixed_length:
@ -1318,25 +1321,21 @@ def ProcessOneEntry(factory, newstruct, entry):
if not separator:
separator = token
if separator != '=':
print >>sys.stderr, 'Expected "=" after name \"%s\" got %s' % (
name, token)
sys.exit(1)
raise RpcGenError('Expected "=" after name \"%s\" got %s'
% (name, token))
continue
if not tag_set:
tag_set = 1
if not re.match(r'^(0x)?[0-9]+$', token):
print >>sys.stderr, 'Expected tag number: \"%s\"' % entry
sys.exit(1)
raise RpcGenError('Expected tag number: \"%s\"' % entry)
tag = int(token, 0)
continue
print >>sys.stderr, 'Cannot parse \"%s\"' % entry
sys.exit(1)
raise RpcGenError('Cannot parse \"%s\"' % entry)
if not tag_set:
print >>sys.stderr, 'Need tag number: \"%s\"' % entry
sys.exit(1)
raise RpcGenError('Need tag number: \"%s\"' % entry)
# Create the right entry
if entry_type == 'bytes':
@ -1357,8 +1356,7 @@ def ProcessOneEntry(factory, newstruct, entry):
# References another struct defined in our file
newentry = factory.EntryStruct(entry_type, name, tag, res.group(1))
else:
print >>sys.stderr, 'Bad type: "%s" in "%s"' % (entry_type, entry)
sys.exit(1)
raise RpcGenError('Bad type: "%s" in "%s"' % (entry_type, entry))
structs = []
@ -1459,9 +1457,8 @@ def GetNextStruct(file):
if not re.match(r'^struct %s {$' % _STRUCT_RE,
line, re.IGNORECASE):
print >>sys.stderr, 'Missing struct on line %d: %s' % (
line_count, line)
sys.exit(1)
raise RpcGenError('Missing struct on line %d: %s'
% (line_count, line))
else:
got_struct = 1
data += line
@ -1474,9 +1471,8 @@ def GetNextStruct(file):
continue
if len(tokens[1]):
print >>sys.stderr, 'Trailing garbage after struct on line %d' % (
line_count )
sys.exit(1)
raise RpcGenError('Trailing garbage after struct on line %d'
% line_count)
# We found the end of the struct
data += ' %s}' % tokens[0]
@ -1609,8 +1605,7 @@ class CCodeGenerator:
def Generate(factory, filename):
ext = filename.split('.')[-1]
if ext != 'rpc':
print >>sys.stderr, 'Unrecognized file extension: %s' % ext
sys.exit(1)
raise RpcGenError('Unrecognized file extension: %s' % ext)
print >>sys.stderr, 'Reading \"%s\"' % filename
@ -1644,12 +1639,14 @@ def Generate(factory, filename):
entry.PrintCode(impl_fp)
impl_fp.close()
def main(argv):
if len(argv) < 2 or not argv[1]:
print >>sys.stderr, 'Need RPC description file as first argument.'
if __name__ == '__main__':
try:
if len(sys.argv) < 2 or not sys.argv[1]:
raise RpcGenError('Need RPC description file as first argument.')
Generate(CCodeGenerator(), sys.argv[1])
sys.exit(0)
except RpcGenError, e:
print >>sys.stderr, e
sys.exit(1)
Generate(CCodeGenerator(), argv[1])
if __name__ == '__main__':
main(sys.argv)