import os import sys import argparse import xmltodict def trav_Dict(d, prefix='',level=0): retVal =[] for k, v in d.items(): if isinstance(v, dict): retVal += trav_Dict(v, prefix=f"{prefix}_{k}", level = level + 1) else: retVal.append({ "funcname":f"{prefix}_{k}", "paramname":k, "value":v}) return retVal if __name__ == '__main__': argparser = argparse.ArgumentParser(description='XML to C functions') argparser.add_argument('infile', help='Input file (.xml)') argparser.add_argument('--outfile', help='Out file (.c). Only if special filename needed.') argparser.add_argument('--dry', help='true: No outfile is generated', action='store_true') args = argparser.parse_args() outfile = args.outfile if args.outfile else f"{args.infile}.c" obj=None if not os.path.isfile(args.infile): print(f"Input file doesnt exist: {args.infile}") sys.exit(1) with open(args.infile, "r+") as f: obj = xmltodict.parse(f.read()) if not obj: print(f"Error in reading input file: {args.infile}") sys.exit(2) if not 'root' in obj: print(f"No root element in input file!") sys.exit(3) outstring = "" if 'status' in obj['root']: outstring += "//======== status =========\n" status = trav_Dict(obj['root']['status'], prefix='status') for s in status: outstring += f"void get_{s['funcname']}(char* {s['paramname']})\n{{\n //{s['value']}\n}}\n" if 'config' in obj['root']: outstring += "//======== config =========\n" configs = trav_Dict(obj['root']['config'], prefix='config') for c in configs: outstring += f"void get_{c['funcname']}(char* {c['paramname']})\n{{\n //{c['value']}\n}}\n" outstring += f"void set_{c['funcname']}(char* {c['paramname']})\n{{\n //{c['value']}\n}}\n" if args.dry: print(outstring) else: with open(outfile, "w+") as f: f.write(outstring) print(f"Output file written: {outfile}\nDone!") sys.exit(0)