def parseTypeDefinitions(outname, xmlDescription, namespace): def typeReady(element): "Are all member types defined?" for child in element: if child.tag == "{http://opcfoundation.org/BinarySchema/}Field": childname = getTypeName(child.get("TypeName")) if childname not in types: return False return True def unknownTypes(element): "Return all unknown types" unknowns = [] for child in element: if child.tag == "{http://opcfoundation.org/BinarySchema/}Field": childname = getTypeName(child.get("TypeName")) if childname not in types: unknowns.append(childname) return unknowns def skipType(name): if name in excluded_types: return True if "Test" in name: # skip all test types return True if re.search("NodeId$", name) != None: return True return False snippets = {} for typeXml in etree.parse(xmlDescription).getroot(): if not typeXml.get("Name"): continue name = typeXml.get("Name") snippets[name] = typeXml detectLoop = len(snippets)+1 while(len(snippets) > 0): if detectLoop == len(snippets): name, typeXml = (snippets.items())[0] raise RuntimeError("Infinite loop detected trying to processing types " + name + ": unknonwn subtype " + str(unknownTypes(typeXml))) detectLoop = len(snippets) for name, typeXml in list(snippets.items()): if name in types or skipType(name): del snippets[name] continue if not typeReady(typeXml): continue if name in builtin_types: types[name] = BuiltinType(name) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}EnumeratedType": types[name] = EnumerationType(outname, typeXml, namespace) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}OpaqueType": types[name] = OpaqueType(outname, typeXml, namespace, get_base_type_for_opaque(name)['name']) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}StructuredType": types[name] = StructType(outname, typeXml, namespace) else: raise Exception("Type not known") del snippets[name]
def parseTypeDefinitions(outname, xmlDescription, namespace): def typeReady(element): "Are all member types defined?" for child in element: if child.tag == "{http://opcfoundation.org/BinarySchema/}Field": childname = child.get("TypeName") if childname[childname.find(":") + 1:] not in types: return False return True def skipType(name): if name in excluded_types: return True if "Test" in name: # skip all test types return True if re.search("NodeId$", name) != None: return True return False snippets = {} for typeXml in etree.parse(xmlDescription).getroot(): if not typeXml.get("Name"): continue name = typeXml.get("Name") snippets[name] = typeXml while (len(snippets) > 0): for name, typeXml in list(snippets.items()): if name in types or skipType(name): del snippets[name] continue if not typeReady(typeXml): continue if name in builtin_types: types[name] = BuiltinType(name) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}EnumeratedType": types[name] = EnumerationType(outname, typeXml, namespace) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}OpaqueType": types[name] = OpaqueType( outname, typeXml, namespace, get_base_type_for_opaque(name)['name']) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}StructuredType": types[name] = StructType(outname, typeXml, namespace) else: raise Exception("Type not known") del snippets[name]
def parseTypeDefinitions(outname, xmlDescription, namespace): def typeReady(element): "Are all member types defined?" for child in element: if child.tag == "{http://opcfoundation.org/BinarySchema/}Field": childname = child.get("TypeName") if childname[childname.find(":")+1:] not in types: return False return True def skipType(name): if name in excluded_types: return True if "Test" in name: # skip all test types return True if re.search("NodeId$", name) != None: return True return False snippets = {} for typeXml in etree.parse(xmlDescription).getroot(): if not typeXml.get("Name"): continue name = typeXml.get("Name") snippets[name] = typeXml while(len(snippets) > 0): for name, typeXml in list(snippets.items()): if name in types or skipType(name): del snippets[name] continue if not typeReady(typeXml): continue if name in builtin_types: types[name] = BuiltinType(name) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}EnumeratedType": types[name] = EnumerationType(outname, typeXml, namespace) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}OpaqueType": types[name] = OpaqueType(outname, typeXml, namespace, get_base_type_for_opaque(name)['name']) elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}StructuredType": types[name] = StructType(outname, typeXml, namespace) else: raise Exception("Type not known") del snippets[name]
i = 0 # Generate alias for opaque types for t in filtered_opaque_types: if i != 0: printh("\n") printh("/**\n * " + t.name) printh(" * " + "^" * len(t.name)) if t.description == "": printh(" */") else: printh(" * " + t.description + " */") if type(t) != BuiltinType: printh(t.typedef_h() + "\n") printh("#define " + outname.upper() + "_" + t.name.upper() + " " + outname.upper() + "_" + get_base_type_for_opaque(t.name)['name'].upper()) i += 1 printh(''' #ifdef __cplusplus } // extern "C" #endif\n #endif /* %s_GENERATED_H_ */''' % outname.upper()) ################## # Print Handling # ################## printf('''/* Generated from ''' + inname + ''' with script ''' + sys.argv[0] + ''' * on host ''' + platform.uname()[1] + ''' by user ''' + getpass.getuser() + \ ''' at ''' + time.strftime("%Y-%m-%d %I:%M:%S") + ''' */