Processed requests by kimgr
authorRick van Rein <rick@openfortress.nl>
Tue, 4 Oct 2016 09:40:10 +0000 (10:40 +0100)
committerRick van Rein <rick@openfortress.nl>
Tue, 4 Oct 2016 09:40:10 +0000 (10:40 +0100)
asn1ate/asn2quickder.py
asn1ate/sema.py

index c4ceb92..42d6b72 100755 (executable)
@@ -68,9 +68,9 @@ class QuickDERgen():
     def __init__(self, semamod, outfn, refmods):
         self.semamod = semamod
         self.refmods = refmods
-        if outfn [-2:] == '.h':
+       self.unit, outext = os.path.splitext (outfn)
+        if outext == '.h':
             raise Exception('File cannot overwrite itself -- use another extension than .h for input files')
-        self.unit = tosym(outfn.rsplit('.', 1) [0])
         self.outfile = open(self.unit + '.h', 'w')
         # Setup function maps
         self.overlay_funmap = {
@@ -136,22 +136,24 @@ class QuickDERgen():
         self.writeln('')
         self.writeln('')
         closer = ''
-        for rm in self.semamod.imports.module2symbols.keys():
-            rmfn = tosym(rm.rsplit('.', 1) [0]).lower()
+       rmfns = set ()
+        for rm in self.semamod.imports.symbols_imported.keys():
+            rmfns.add (tosym(rm.rsplit('.', 1) [0]).lower())
+       for rmfn in rmfns:
             self.writeln('#include <quick-der/' + rmfn + '.h>')
             closer = '\n\n'
         self.write(closer)
         closer = ''
-        for rm in self.semamod.imports.module2symbols.keys():
+        for rm in self.semamod.imports.symbols_imported.keys():
             rmfn = tosym(rm.rsplit('.', 1) [0]).lower()
-            for sym in self.semamod.imports.module2symbols [rm]:
+            for sym in self.semamod.imports.symbols_imported [rm]:
                 self.writeln('typedef DER_OVLY_' + tosym(rmfn) + '_' + tosym(sym) + ' DER_OVLY_' + tosym(self.unit) + '_' + tosym(sym) + ';')
                 closer = '\n\n'
         self.write(closer)
         closer = ''
-        for rm in self.semamod.imports.module2symbols.keys():
+        for rm in self.semamod.imports.symbols_imported.keys():
             rmfn = tosym(rm.rsplit('.', 1) [0]).lower()
-            for sym in self.semamod.imports.module2symbols [rm]:
+            for sym in self.semamod.imports.symbols_imported [rm]:
                 self.writeln('#define DER_PACK_' + tosym(self.unit) + '_' + tosym(sym) + ' DER_PACK_' + tosym(rmfn) + '_' + tosym(sym) + '')
                 closer = '\n\n'
         self.write(closer)
index a539b23..c240796 100644 (file)
@@ -343,6 +343,8 @@ class Module(SemaNode):
 
     def __str__(self):
         return '%s DEFINITIONS ::=\n' % self.name \
+           + str (self.exports) + '\n' \
+           + str (self.imports) + '\n' \
             + 'BEGIN\n' \
             + '\n'.join(map(str, self.assignments)) + '\n' \
             + 'END\n'
@@ -723,15 +725,35 @@ class ValueListType(SemaNode):
 
 class Imports(SemaNode):
     def __init__(self, elements):
-       self.module2symbols = { }
+       self.symbols_imported = { }
        for i in range(0, len(elements), 2):
-               self.module2symbols [elements [i+1].elements[0]] = set(elements [i])
+           mod = elements [i+1].elements[0]
+           old = self.symbols_imported.get(mod, set())
+           new = old.union(set(elements [i]))
+           self.symbols_imported [mod] = new
+
+    def __str__ (self):
+       clauses = set ()
+       for mod in self.symbols_imported.keys ():
+           clauses.add (','.join (self.symbols_imported [mod]) + ' FROM ' + mod)
+       if len (clauses) == 0:
+           return ''
+       else:
+           return 'IMPORTS ' + ' '.join (clauses) + ';'
+           
 
 class Exports(SemaNode):
     def __init__(self, elements):
-       self.module2symbols = { }
-       for i in range(0, len(elements), 2):
-               self.module2symbols [elements [i+1].elements[0]] = set(elements [i])
+       if len (elements) == 0:
+           self.symbols_exported = set ()
+       else:
+           self.symbols_exported = set (elements [0])
+
+    def __str__(self):
+       if len (self.symbols_exported) == 0:
+           return ''
+       else:
+           return 'EXPORTS ' + ','.join (self.symbols_exported) + ';'
 
 
 class BitStringType(SemaNode):