awips2/pythonPackages/scientific/Tools/makeheader.py
root e2ecdcfe33 Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: a02aeb236c [formerly 9f19e3f712] [formerly a02aeb236c [formerly 9f19e3f712] [formerly 06a8b51d6d [formerly 64fa9254b946eae7e61bbc3f513b7c3696c4f54f]]]
Former-commit-id: 06a8b51d6d
Former-commit-id: 8e80217e59 [formerly 3360eb6c5f]
Former-commit-id: 377dcd10b9
2012-01-06 08:55:05 -06:00

145 lines
4.4 KiB
Python
Executable file

import sys
import string
exportfile = 'Scientific_mpi.export'
exports = open(exportfile).readlines()
exports = map(lambda s: s[:-1], exports)
exports = filter(None, exports)
modulename = exports[0]
moduleimport = exports[1]
prefix = exports[2]
moduledef = exports[3]
exports = exports[4:]
header = open(prefix+'_API.h', 'w')
header.write("/*\n * C API functions\n */\n\n")
apicounter = 0
index = 0
while index < len(exports):
if exports[index] == 'type':
header.write("#define %s_Type_NUM %d\n\n"
% (exports[index+1], apicounter))
apicounter = apicounter + 1
index = index + 2
elif exports[index] == 'function' or exports[index] == 'exportfunc':
header.write("#define %s_RET %s\n"
% (exports[index+2], exports[index+1]))
header.write("#define %s_PROTO Py_PROTO(%s)\n"
% (exports[index+2], exports[index+3]))
header.write("#define %s_NUM %d\n\n"
% (exports[index+2], apicounter))
apicounter = apicounter + 1
index = index + 4
elif exports[index] == 'typedef':
index = index + 3
else:
raise ValueError, "unknown export object " + exports[index]
header.write("#define %s_API_pointers %d\n\n" % (prefix, apicounter))
header.write("#ifdef %s\n\n" % moduledef)
index = 0
while index < len(exports):
if exports[index] == 'type':
header.write("statichere PyTypeObject %s_Type;\n" % exports[index+1])
header.write("#define %s_Check(op) ((op)->ob_type == &%s_Type)\n\n"
% (exports[index+1], exports[index+1]))
index = index + 2
elif exports[index] == 'function':
header.write("static %s_RET %s %s_PROTO;\n\n"
% (exports[index+2], exports[index+2], exports[index+2]))
index = index + 4
elif exports[index] == 'exportfunc':
index = index + 4
elif exports[index] == 'typedef':
index = index + 3
else:
raise ValueError, "unknown export object " + exports[index]
header.write("#define set_%s_API_pointers(){ \\\n" % prefix)
index = 0
while index < len(exports):
if exports[index] == 'type':
header.write(" %s_API[%s_Type_NUM] = (void *)&%s_Type; \\\n"
% (prefix, exports[index+1], exports[index+1]))
index = index + 2
elif exports[index] == 'function' or exports[index] == 'exportfunc':
header.write(" %s_API[%s_NUM] = (void *)&%s; \\\n"
% (prefix, exports[index+2], exports[index+2]))
index = index + 4
elif exports[index] == 'typedef':
index = index + 3
else:
raise ValueError, "unknown export object " + exports[index]
header.write("}\n\n")
header.write("#else\n\n")
linkage = "%s_API_LINKAGE" % (string.upper(prefix),)
header.write("#ifndef %s\n" % linkage)
header.write("#define %s static\n" % linkage)
header.write("#endif\n\n")
header.write("%s void **%s_API;\n\n" % (linkage, prefix))
index = 0
while index < len(exports):
if exports[index] == 'type':
header.write("#define %s_Check(op) \\\n" % exports[index+1])
header.write(" ((op)->ob_type == (PyTypePbject *)")
header.write("%s_API[%s_Type_Num])\n\n"
% (prefix, exports[index+1]))
index = index + 2
elif exports[index] == 'function' or exports[index] == 'exportfunc':
header.write("#define %s \\\n" % exports[index+2])
header.write(" (*(%s_RET (*)%s_PROTO) \\\n"
% (exports[index+2], exports[index+2]))
header.write(" %s_API[%s_NUM])\n\n" % (prefix, exports[index+2]))
index = index + 4
elif exports[index] == 'typedef':
header.write("typedef %s %s;\n\n" % (exports[index+1],
exports[index+2]))
index = index + 3
else:
raise ValueError, "unknown export object " + exports[index]
header.write('''\n
#define %s() \\
{ \\
PyObject *module = PyImport_ImportModule("%s"); \\
if (module != NULL) { \\
PyObject *module_dict = PyModule_GetDict(module); \\
PyObject *c_api_object = PyDict_GetItemString(module_dict, "_C_API"); \\
if (PyCObject_Check(c_api_object)) { \\
%s_API = (void **)PyCObject_AsVoidPtr(c_api_object); \\
} \\
} \\
}
''' % (moduleimport, modulename, prefix))
header.write("#endif\n");
header.close()