def gen_messages(opts) : """Generate pprzlink message formatters and parsers using options. This function allows python scripts under Windows to control generators using the same interface as shell scripts under Unix""" fname = opts.definition # Enable validation by default, disabling it if explicitly requested if opts.validate: try: from lib.genxmlif import GenXmlIfError from lib.minixsv import pyxsval except: print("WARNING: Unable to load XML validator libraries. XML validation will not be performed") opts.validate = False def pprz_validate(fname, schema, errorLimitNumber) : """Uses minixsv to validate an XML file with a given XSD schema file. We define pprz_validate here because it relies on the XML libs that were loaded in gen_messages(), so it can't be called standalone""" # use default values of minixsv, location of the schema file must be specified in the XML file try: domTreeWrapper = pyxsval.parseAndValidate(fname, xsdFile=schema, errorLimit=errorLimitNumber) except pyxsval.XsvalError as errstr: print(errstr) return 1 except GenXmlIfError as errstr: print(errstr) return 1 return 0 # Process XML file, validating as necessary. validation_result = 0 if opts.validate: print("Validating msg_class %s in %s" % (opts.class_name, fname)) validation_result = pprz_validate(fname, schemaFile, opts.error_limit) else: print("Validation skipped for msg_class %s in %s." % (opts.class_name, fname)) print("Parsing %s" % fname) xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol) if pprz_parse.check_duplicates(xml): sys.exit(1) print("Found %u PPRZLink messages of msg_class %s in XML file %s" % ( pprz_parse.total_msgs(xml), opts.class_name, fname)) if opts.only_validate: sys.exit(validation_result) # Convert language option to lowercase and validate opts.language = opts.language.lower() if opts.language == 'c': import gen_messages_c gen_messages_c.generate(opts.output, xml) else: print("Unsupported language %s" % opts.language)
xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol) if pprz_parse.check_duplicates(xml): sys.exit(1) print("Found %u PPRZLink message types in XML file %s" % (pprz_parse.total_msgs(xml), fname)) if opts.only_validate: sys.exit(validation_result) # Convert language option to lowercase and validate opts.language = opts.language.lower() if opts.language == 'c': import gen_messages_c gen_messages_c.generate(opts.output, xml) else: print("Unsupported language %s" % opts.language) if __name__ == "__main__": import pprz_parse from argparse import ArgumentParser parser = ArgumentParser( description= "This tool generate implementations from PPRZLink message definitions") parser.add_argument("-o", "--output", default="stdout", help="output file or stream [default: %(default)s]")
def gen_messages(opts): """Generate pprzlink message formatters and parsers using options. This function allows python scripts under Windows to control generators using the same interface as shell scripts under Unix""" fname = opts.definition # Enable validation by default, disabling it if explicitly requested if opts.validate: try: from lib.genxmlif import GenXmlIfError from lib.minixsv import pyxsval except: print( "WARNING: Unable to load XML validator libraries. XML validation will not be performed" ) opts.validate = False def pprz_validate(fname, schema, errorLimitNumber): """Uses minixsv to validate an XML file with a given XSD schema file. We define pprz_validate here because it relies on the XML libs that were loaded in gen_messages(), so it can't be called standalone""" # use default values of minixsv, location of the schema file must be specified in the XML file try: domTreeWrapper = pyxsval.parseAndValidate( fname, xsdFile=schema, errorLimit=errorLimitNumber) except pyxsval.XsvalError as errstr: print(errstr) return 1 except GenXmlIfError as errstr: print(errstr) return 1 return 0 # Process XML file, validating as necessary. validation_result = 0 if opts.validate: print("Validating msg_class %s in %s" % (opts.class_name, fname)) validation_result = pprz_validate(fname, schemaFile, opts.error_limit) else: print("Validation skipped for msg_class %s in %s." % (opts.class_name, fname)) print("Parsing %s" % fname) xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol) if pprz_parse.check_duplicates(xml): sys.exit(1) print("Found %u PPRZLink messages of msg_class %s in XML file %s" % (pprz_parse.total_msgs(xml), opts.class_name, fname)) if opts.only_validate: sys.exit(validation_result) # Convert language option to lowercase and validate opts.language = opts.language.lower() if opts.language == 'c': import gen_messages_c gen_messages_c.generate(opts.output, xml) else: print("Unsupported language %s" % opts.language)
xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol) if pprz_parse.check_duplicates(xml): sys.exit(1) print("Found %u PPRZLink messages of msg_class %s in XML file %s" % ( pprz_parse.total_msgs(xml), opts.class_name, fname)) if opts.only_validate: sys.exit(validation_result) # Convert language option to lowercase and validate opts.language = opts.language.lower() if opts.language == 'c': import gen_messages_c gen_messages_c.generate(opts.output, xml) else: print("Unsupported language %s" % opts.language) if __name__ == "__main__": import pprz_parse from argparse import ArgumentParser parser = ArgumentParser(description="This tool generate implementations from PPRZLink message definitions") parser.add_argument("-o", "--output", default="stdout", help="output file or stream [default: %(default)s]") parser.add_argument("--lang", dest="language", choices=supportedLanguages, default=DEFAULT_LANGUAGE, help="language of generated code [default: %(default)s]") parser.add_argument("--protocol", choices=[pprz_parse.PROTOCOL_1_0], default=DEFAULT_PROTOCOL, help="PPRZLink protocol version. [default: %(default)s]") parser.add_argument("--no-validate", action="store_false", dest="validate", default=DEFAULT_VALIDATE, help="Do not perform XML validation. Can speed up code generation if XML files are known to be correct.") parser.add_argument("--only-validate", action="store_true", dest="only_validate", help="Only validate messages without generation.") parser.add_argument("--error-limit", default=DEFAULT_ERROR_LIMIT, help="maximum number of validation errors to display")