Files
xen/tools/ocaml/libs/xentoollog/genlevels.py
T
Wei Liu a57a1b26ec tools/ocaml: make python scripts 2 and 3 compatible
1. Explicitly import reduce because that's required in 3.
2. Change print to function.
3. Eliminate invocations of has_key.

Signed-off-by: M A Young <m.a.young@durham.ac.uk>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Christian Lindig <christian.lindig@citrix.com>
2019-04-02 09:50:58 +01:00

131 lines
2.7 KiB
Python
Executable File

#!/usr/bin/python
from __future__ import print_function
import sys
from functools import reduce
def read_levels():
f = open('../../../libs/toollog/include/xentoollog.h', 'r')
levels = []
record = False
for l in f.readlines():
if 'XTL_NUM_LEVELS' in l:
break
if record == True:
levels.append(l.split(',')[0].strip())
if 'XTL_NONE' in l:
record = True
f.close()
olevels = [level[4:].capitalize() for level in levels]
return levels, olevels
# .ml
def gen_ml(olevels):
s = ""
s += "type level = \n"
for level in olevels:
s += '\t| %s\n' % level
s += "\nlet level_to_string level =\n"
s += "\tmatch level with\n"
for level in olevels:
s += '\t| %s -> "%s"\n' % (level, level)
s += "\nlet level_to_prio level =\n"
s += "\tmatch level with\n"
for index,level in enumerate(olevels):
s += '\t| %s -> %d\n' % (level, index)
return s
# .mli
def gen_mli(olevels):
s = ""
s += "type level = \n"
for level in olevels:
s += '\t| %s\n' % level
return s
# .c
def gen_c(level):
s = ""
s += "static value Val_level(xentoollog_level c_level)\n"
s += "{\n"
s += "\tswitch (c_level) {\n"
s += "\tcase XTL_NONE: /* Not a real value */\n"
s += '\t\tcaml_raise_sys_error(caml_copy_string("Val_level XTL_NONE"));\n'
s += "\t\tbreak;\n"
for index,level in enumerate(levels):
s += "\tcase %s:\n\t\treturn Val_int(%d);\n" % (level, index)
s += """\tcase XTL_NUM_LEVELS: /* Not a real value! */
\t\tcaml_raise_sys_error(
\t\t\tcaml_copy_string("Val_level XTL_NUM_LEVELS"));
#if 0 /* Let the compiler catch this */
\tdefault:
\t\tcaml_raise_sys_error(caml_copy_string("Val_level Unknown"));
\t\tbreak;
#endif
\t}
\tabort();
}
"""
return s
def autogen_header(open_comment, close_comment):
s = open_comment + " AUTO-GENERATED FILE DO NOT EDIT " + close_comment + "\n"
s += open_comment + " autogenerated by \n"
s += reduce(lambda x,y: x + " ", range(len(open_comment + " ")), "")
s += "%s" % " ".join(sys.argv)
s += "\n " + close_comment + "\n\n"
return s
if __name__ == '__main__':
if len(sys.argv) < 3:
print("Usage: genlevels.py <mli> <ml> <c-inc>", file=sys.stderr)
sys.exit(1)
levels, olevels = read_levels()
_mli = sys.argv[1]
mli = open(_mli, 'w')
mli.write(autogen_header("(*", "*)"))
_ml = sys.argv[2]
ml = open(_ml, 'w')
ml.write(autogen_header("(*", "*)"))
_cinc = sys.argv[3]
cinc = open(_cinc, 'w')
cinc.write(autogen_header("/*", "*/"))
mli.write(gen_mli(olevels))
mli.write("\n")
ml.write(gen_ml(olevels))
ml.write("\n")
cinc.write(gen_c(levels))
cinc.write("\n")
ml.write("(* END OF AUTO-GENERATED CODE *)\n")
ml.close()
mli.write("(* END OF AUTO-GENERATED CODE *)\n")
mli.close()
cinc.close()