Browse Source

Merge pull request #268 from acplt/python3

python 3 fixes for generate_datatypes.py and amalgamate.py
Sten Grüner 9 years ago
parent
commit
8c3c7a52c4
2 changed files with 57 additions and 22 deletions
  1. 24 15
      tools/amalgamate.py
  2. 33 7
      tools/generate_datatypes.py

+ 24 - 15
tools/amalgamate.py

@@ -2,6 +2,7 @@ from __future__ import print_function
 import re
 import argparse
 import os.path
+import io
 
 parser = argparse.ArgumentParser()
 parser.add_argument('version', help='version to include')
@@ -19,20 +20,24 @@ includes = []
 
 is_c = False
 
+print ("Starting amalgamating file "+ args.outfile)
+
 for fname in args.inputs:
     if("util.h" in fname):
         is_c = True
         continue
-    with open(fname) as infile:
+    with io.open(fname, encoding="utf8") as infile:
+        print ("Integrating file '" + fname + "'...", end=""),
         for line in infile:
             res = include_re.match(line)
             if res:
                 inc = res.group(1)
                 if not inc in includes and not inc[0] == '"':
                     includes.append(inc)
+        print ("done."),
 
-file = open(args.outfile, 'w')
-file.write('''/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES 
+file = io.open(args.outfile, 'w')
+file.write(u'''/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES 
  * visit http://open62541.org/ for information about this software
  * Git-Revision: %s
  */
@@ -53,45 +58,49 @@ file.write('''/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62
  */\n\n''' % args.version)
 
 if not is_c:
-    file.write('''#ifndef %s
+    file.write(u'''#ifndef %s
 #define %s
 
 #ifdef __cplusplus
 extern "C" {
-#endif\n\n''' % (outname.upper() + "_H_", outname.upper() + "_H_") )
+#endif\n\n''' % (outname.upper() + u"_H_", outname.upper() + u"_H_") )
 
 if not is_c:
     for inc in includes:
-        file.write("#include " + inc + "\n")
+        file.write(u"#include " + inc + "\n")
 else:
-    file.write("#define UA_AMALGAMATE\n")
-    file.write('''#ifndef UA_DYNAMIC_LINKING
+    file.write(u"#define UA_AMALGAMATE\n")
+    file.write(u'''#ifndef UA_DYNAMIC_LINKING
 # define UA_DYNAMIC_LINKING
 #endif\n\n''')
     for fname in args.inputs:
         if "ua_config.h" in fname or "ua_util.h" in fname:
-            with open(fname) as infile:
+            with io.open(fname, encoding="utf8") as infile:
+                print ("Integrating file '" + fname + "'...", end=""),
                 for line in infile:
                     file.write(line)
-    file.write("#include \"" + outname + ".h\"\n")
+                print ("done."),
+    file.write(u"#include \"" + outname + ".h\"\n")
 
 for fname in args.inputs:
     if not "util.h" in fname:
-        with open(fname) as infile:
-            file.write("/*********************************** amalgamated original file \"" + fname + "\" ***********************************/\n")
+        with io.open(fname, encoding="utf8") as infile:
+            file.write(u"/*********************************** amalgamated original file \"" + fname + u"\" ***********************************/\n")
+            print ("Integrating file '" + fname + "'...", end=""),
             for line in infile:
                 inc_res = include_re.match(line)
                 guard_res = guard_re.match(line)
                 if not inc_res and not guard_res:
                     file.write(line)
+            print ("done."),
 
 if not is_c:
-    file.write('''
+    file.write(u'''
 #ifdef __cplusplus
 } // extern "C"
 #endif
 
-#endif /* %s */''' % (outname.upper() + "_H_"))
+#endif /* %s */''' % (outname.upper() + u"_H_"))
 file.close()
 
-print ("The size of "+args.outfile+" is "+ str(os.path.getsize(args.outfile)))
+print ("The size of "+args.outfile+" is "+ str(os.path.getsize(args.outfile))+" Bytes.")

+ 33 - 7
tools/generate_datatypes.py

@@ -156,8 +156,12 @@ class EnumerationType(object):
         return True
 
     def typedef_c(self):
+        if sys.version_info[0] < 3:
+            values = self.elements.iteritems()
+        else:
+            values = self.elements.items()
         return "typedef enum { \n    " + \
-            ",\n    ".join(map(lambda kv : kv[0].upper() + " = " + kv[1], self.elements.iteritems())) + \
+            ",\n    ".join(map(lambda kv : kv[0].upper() + " = " + kv[1], values)) + \
             "\n} " + self.name + ";"
 
     def typelayout_c(self, namespace_0, description, outname):
@@ -253,7 +257,11 @@ class StructType(object):
         if len(self.members) == 0:
             return "typedef void * " + self.name + ";"
         returnstr =  "typedef struct {\n"
-        for name, member in self.members.iteritems():
+        if sys.version_info[0] < 3:
+            values = self.members.iteritems()
+        else:
+            values = self.members.items()
+        for name, member in values:
             if member.isArray:
                 returnstr += "    UA_Int32 " + name + "Size;\n"
                 returnstr += "    " + member.memberType.name + " *" +name + ";\n"
@@ -287,7 +295,10 @@ class StructType(object):
                 before_endpos = "0"
                 thispos = "offsetof(%s, %s)" % (self.name, member.name)
                 if index > 0:
-                    before = self.members.values()[index-1]
+                    if sys.version_info[0] < 3:
+                        before = self.members.values()[index-1]
+                    else:
+                        before = list(self.members.values())[index-1]
                     before_endpos = "(offsetof(%s, %s)" % (self.name, before.name)
                     if before.isArray:
                         before_endpos += " + sizeof(void*))"
@@ -439,10 +450,16 @@ existing_types = OrderedDict()
 if args.namespace_id == 0 or args.ns0_types_xml:
     existing_types = OrderedDict([(t, BuiltinType(t)) for t in builtin_types])
 if args.ns0_types_xml:
-    OrderedDict(existing_types.items() + parseTypeDefinitions(args.ns0_types_xml[0], existing_types).items())
+    if sys.version_info[0] < 3:
+        OrderedDict(existing_types.items() + parseTypeDefinitions(args.ns0_types_xml[0], existing_types).items())
+    else:
+        OrderedDict(existing_types.items() | parseTypeDefinitions(args.ns0_types_xml[0], existing_types).items())
 types = parseTypeDefinitions(args.types_xml, existing_types)
 if args.namespace_id == 0:
-    types = OrderedDict(existing_types.items() + types.items())
+    if sys.version_info[0] < 3:
+        types = OrderedDict(existing_types.items() + types.items())
+    else:
+        types = OrderedDict(existing_types.items() | types.items())
 
 typedescriptions = {}
 if args.typedescriptions:
@@ -488,7 +505,12 @@ printh("#define " + outname.upper() + "_COUNT %s\n" % (str(len(types))))
 printh("extern UA_EXPORT const UA_DataType *" + outname.upper() + ";\n")
 
 i = 0
-for t in types.itervalues():
+if sys.version_info[0] < 3:
+    values = types.itervalues()
+else:
+    values = types.values()
+
+for t in values:
     if type(t) != BuiltinType:
         printh("")
         if t.description != "":
@@ -518,7 +540,11 @@ printc('''/**
 #include "ua_types.h"
 #include "''' + outname + '''_generated.h"\n
 const UA_DataType *''' + outname.upper() + ''' = (UA_DataType[]){''')
-for t in types.itervalues():
+if sys.version_info[0] < 3:
+    values = types.itervalues()
+else:
+    values = types.values()
+for t in values:
     printc("")
     printc("/* " + t.name + " */")
     if args.typedescriptions: