Ethereal-dev: [Ethereal-dev] idl2eth - preparation for recursive/embedd structs
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Frank Singleton <frank.singleton@xxxxxxxxxxxx>
Date: Mon, 19 Nov 2001 13:34:18 -0600
Hi, I have started on handling of recursive/embedded structs and unions that can be found in CORBA IDL . patch1.diff - find all union/struct references and store in lists. This includes embedded unions and structs. - pass the struct and union lists onto ethereal_gen.py - print all found nodes at DEBUG patch2.diff - accept struct and union lists passed in via ethereal_be.py - these lists are unused until I add the templates for struct and union helper functions. So code generation is unchanged for the moment. Twas diffed against 2001-11-05 CVS nightly tarball :-) /Frank -- EUS/SV/Z Frank Singleton ASO Americas BSS Office : +1 972 583 3251 ECN 800 33251 Mobile : +1 214 228 0874 Amateur Radio: VK3FCS/KM5WS Email : frank.singleton@xxxxxxxxxxxx Hardware: HP Omnibook 4150 running Redhat Linux 7.1 (2.4.3-12 kernel).
--- ../ethereal-2001-11-05/ethereal_be.py Fri Oct 12 12:14:41 2001 +++ ../ethereal-2001-11-05.updated/ethereal_be.py Mon Nov 19 13:05:36 2001 @@ -1,6 +1,6 @@ # -*- python -*- # -# $Id: ethereal_be.py,v 1.5 2001/10/12 17:14:41 guy Exp $ +# $Id: ethereal_be.py,v 1.28 2001/11/19 19:05:36 frank Exp $ # # File : ethereal_be.py # @@ -45,14 +45,17 @@ # # Strategy. # -# Crawl all the way down all branches until I hit "Operation" nodes -# and "Attribute" nodes. Then store the "operation" nodes in oplist[] -# and "attribute" nodes in atlist[]. +# Crawl all the way down all branches until I hit "Operation", "Enum", "Attribute", +# "Struct" and "Union" nodes. Then store these nodes in lists. # -# Pass the obj.oplist[] and obj.atlist[](via an object ref) to the src code +# Pass these lists (via an object ref) to the src code # generator (ethereal_gen) class and let it do the hard work ! # # +# Dont forget structs can contain embedded structs etc .. so dont forget +# to peek inside and check :-) +# +# """Ethereal IDL compiler back-end.""" @@ -63,20 +66,28 @@ from ethereal_gen import ethereal_gen_C # -# This class finds the "Operation" nodes and "Attribute" nodes, and hands them off -# to an instance of the source code generator class "ethereal_gen" +# This class finds the "Operation" nodes ,Enum Nodes, "Attribute" nodes, Struct Nodes +# and Union Nodes. Then it hands them off to an instance of the source code generator +# class "ethereal_gen" # class EtherealVisitor: + + DEBUG = 0 # debug flag def __init__(self, st): self.st = st self.oplist = [] # list of operation nodes self.enlist = [] # list of enum nodes self.atlist = [] # list of attribute nodes + self.stlist = [] # list of struct nodes + self.unlist = [] # list of union nodes def visitAST(self, node): + if self.DEBUG: + print "XXX visitAST() node = ", node + for n in node.declarations(): if isinstance(n, idlast.Module): self.visitModule(n) @@ -88,9 +99,21 @@ self.visitAttribute(n) if isinstance(n, idlast.Enum): self.visitEnum(n) - - + if isinstance(n, idlast.Struct): + self.visitStruct(n) + if isinstance(n, idlast.Union): + self.visitUnion(n) + + # Check for Typedef structs and unions + + if isinstance(n, idlast.Typedef): + self.visitTypedef(n) # who are you ? + + def visitModule(self, node): + if self.DEBUG: + print "XXX visitModule() node = ", node + for n in node.definitions(): if isinstance(n, idlast.Module): self.visitModule(n) @@ -102,9 +125,21 @@ self.visitAttribute(n) if isinstance(n, idlast.Enum): self.visitEnum(n) - + if isinstance(n, idlast.Struct): + self.visitStruct(n) + if isinstance(n, idlast.Union): + self.visitUnion(n) + + # Check for Typedef structs and unions + + if isinstance(n, idlast.Typedef): + self.visitTypedef(n) # who are you ? + + def visitInterface(self, node): - #if node.mainFile(): + if self.DEBUG: + print "XXX visitInterface() node = ", node + for c in node.callables(): if isinstance(c, idlast.Operation): self.visitOperation(c) @@ -113,7 +148,22 @@ for d in node.contents(): if isinstance(d, idlast.Enum): - self.visitEnum(d) + self.visitEnum(d) + + if isinstance(d, idlast.Struct): + self.visitStruct(d) + + if isinstance(d, idlast.Union): + self.visitUnion(d) + + # Check for Typedef structs and unions + + if isinstance(d, idlast.Typedef): + self.visitTypedef(d) # who are you ? + + + + # # visitOperation # @@ -122,7 +172,8 @@ # def visitOperation(self,opnode): - self.oplist.append(opnode) # store operation node + if not opnode in self.oplist: + self.oplist.append(opnode) # store operation node # # visitAttribute @@ -132,21 +183,100 @@ # def visitAttribute(self,atnode): - self.atlist.append(atnode) # store attribute node + if not atnode in self.atlist: + self.atlist.append(atnode) # store attribute node + # # visitEnum # - # populates the enum node list "enumlist" + # populates the Enum node list "enlist" # # def visitEnum(self,enode): - #print "XXX - enum found" , enode - self.enlist.append(enode) # store enum node + if not enode in self.enlist: + self.enlist.append(enode) # store enum node if unique + + # + # visitTypedef + # + # Search to see if its a typedef'd struct, union, or enum + # + # eg: typdef enum colors {red, green, blue } mycolors; + # + + def visitTypedef(self,td): + d = td.aliasType() # get Type, possibly Declared + if isinstance(d,idltype.Declared): + self.visitDeclared(d) + + + # + # visitDeclared + # + # Search to see if its a struct, union, or enum + # + # + + def visitDeclared(self,d): + if isinstance(d,idltype.Declared): + sue = d.decl() # grab the struct or union or enum + + if isinstance(sue, idlast.Struct): + self.visitStruct(sue) + if isinstance(sue, idlast.Union): + self.visitUnion(sue) + if isinstance(sue, idlast.Enum): + self.visitEnum(sue) + + + + + # + # visitStruct + # + # populates the struct node list "stlist" + # and checks its members also + # + # + + def visitStruct(self,stnode): + if not stnode in self.stlist: + self.stlist.append(stnode) # store struct node if unique and avoid recursive loops + # if we come across recursive structs + + for m in stnode.members(): # find embedded struct definitions within this + mt = m.memberType() + if isinstance(mt,idltype.Declared): + self.visitDeclared(mt) # if declared, then check it out + + # + # visitUnion + # + # populates the struct node list "unlist" + # and checks its members also + # + # + + def visitUnion(self,unnode): + if not unnode in self.unlist: + self.unlist.append(unnode) # store union node if unique + + if unnode.constrType(): # enum defined within switch type + if isinstance(unnode.switchType(),idltype.Declared): + self.visitDeclared(unnode.switchType()) + + for c in unnode.cases(): + ct = c.caseType() + if isinstance(ct,idltype.Declared): + self.visitDeclared(ct) # if declared, then check it out + + + def run(tree, args): st = output.Stream(sys.stdout, 4) # set indent for stream @@ -159,16 +289,32 @@ # # Assumption: Name is of the form abcdefg.xyz (eg: CosNaming.idl) # - + fname = path.basename(tree.file()) # grab basename only, dont care about path nl = string.split(fname,".")[0] # split name of main IDL file using "." as separator # and grab first field (eg: CosNaming) + if ev.DEBUG: + for i in ev.oplist: + print "XXX - Operation node ", i, " repoId() = ", i.repoId() + for i in ev.atlist: + print "XXX - Attribute node ", i, " identifiers() = ", i.identifiers() + for i in ev.enlist: + print "XXX - Enum node ", i, " repoId() = ", i.repoId() + for i in ev.stlist: + print "XXX - Struct node ", i, " repoId() = ", i.repoId() + for i in ev.unlist: + print "XXX - Union node ", i, " repoId() = ", i.repoId() + + # create a C generator object # and generate some C code + + + eg = ethereal_gen_C(ev.st, string.upper(nl), string.lower(nl), string.capitalize(nl) + " Dissector Using GIOP API") - eg.genCode(ev.oplist, ev.atlist, ev.enlist) # pass them onto the C generator + eg.genCode(ev.oplist, ev.atlist, ev.enlist, ev.stlist, ev.unlist) # pass them onto the C generator
--- ../ethereal-2001-11-05/ethereal_gen.py Wed Oct 31 04:40:53 2001 +++ ../ethereal-2001-11-05.updated/ethereal_gen.py Mon Nov 19 13:02:24 2001 @@ -1,6 +1,6 @@ # -*- python -*- # -# $Id: ethereal_gen.py,v 1.15 2001/10/31 10:40:53 guy Exp $ +# $Id: ethereal_gen.py,v 1.2 2001/11/19 19:02:23 frank Exp $ # # ethereal_gen.py (part of idl2eth) # @@ -94,8 +94,9 @@ # 12. Implement IDL "union" code [done] # 13. Implement support for plugins [done] # 14. Dont generate code for empty operations (cf: exceptions without members) -# 15. Generate code to display Enums numerically ans symbolically [done] +# 15. Generate code to display Enums numerically and symbolically [done] # 16. Place structs in subtrees +# 17. Recursive struct and union handling [started - pass struct and union list to ethereal_gen.py ] # # Also test, Test, TEST # @@ -169,7 +170,7 @@ # # - def genCode(self,oplist, atlist, enlist): # operation and attribute lists + def genCode(self,oplist, atlist, enlist, stlist, unlist): # operation,attribute,enums,struct and union lists self.genHelpers(oplist) # sneaky .. call it now, to populate the fn_hash # so when I come to that operation later, I have the variables to
- Follow-Ups:
- Prev by Date: RE: [Ethereal-dev] SDL/HSD RS-232/V.35/etc Capture and Complete 7 Layer OSI for Ethereal
- Next by Date: Re: [Ethereal-dev] display filters and subtrees
- Previous by thread: RE: [Ethereal-dev] SDL/HSD RS-232/V.35/etc Capture and Complete 7 Layer OSI for Ethereal
- Next by thread: Re: [Ethereal-dev] idl2eth - preparation for recursive/embedd structs
- Index(es):