import os, sys, re p = re.compile("Array_(\w*)\s") cnt = 0 f=None try: f = open("/opt/zentific/include/Common.h") except: print "--------------------------------------------------------------------" print "ERROR: Could not open required header /opt/zentific/include/Common.h" print "This is a required file that can be obtained from the zrpc core." print "\t Please build and install:" print "\t cd /path/to/source/of/zrpc/" print "\t ./configure --enable-zrpc=no && make && make install" print "--------------------------------------------------------------------" sys.exit(1) filestart = f.tell() o = open("zpy-typewrappers.c", "a") h = open("zpy-typewrappers.h", "a") #code o.write("#include \n") o.write("#include \"zpy-typewrappers.h\"\n") o.write("#include \"zpy.h\"\n") o.write("\n"); #header h.write("#ifndef ZPY_TYPEWRAPPERS\n") h.write("#define ZPY_TYPEWRAPPERS\n") h.write("\n") h.write("#include \n") h.write("#include \n") h.write("\n") while 1: line = f.readline() cnt+=1 if not line: break if line.startswith("struct _"): structtype = line.replace("struct _", "").rstrip() #header h.write("PyObject * %s_to_dict (void *d);\n" % structtype) #code o.write("PyObject * %s_to_dict (void *d) {" % structtype) o.write("\n") o.write("\t%s *input = d;" % structtype) o.write("\n") o.write("\tPyObject *dict = NULL;") o.write("\n") f.readline() #swallow opening brace cnt+=1 convert="" err="" while 2: line = f.readline() cnt+=1 #end of this struct if line.startswith("};"): break decl = line.split(" ") varname = decl[1].replace(";","").rstrip() vartype = decl[0].replace(";","").strip() o.write("\n\tPyObject * %s = NULL;" % varname) if "int" in vartype: convert+="\t%s = PyInt_FromLong(input->%s);\n" % (varname, varname) elif "char*" in vartype: convert+="\tif(!(%s = PyString_FromString((input->%s) ? input->%s : \"\")))\n" % (varname, varname, varname) convert+="\t\tgoto err;\n\n" elif "gboolean" in vartype: convert+="\t%s = PyBool_FromLong(input->%s);\n" % (varname, varname) elif "double" in vartype: convert+="\t%s = PyFloat_FromDouble(input->%s);\n" % (varname, varname) elif "GSList" in vartype: if "Array_string" in line: convert+="\t%s = GSList_to_PyList(input->%s, (pydatacb)PyString_FromString);\n" % (varname, varname) elif "Array_int" in line: convert+="\t%s = GSList_to_PyList(input->%s, PyInt_FromGSListEntry);\n" % (varname, varname) else: m = p.search(line) if m: listtype = m.group(1) if listtype: convert+="\t%s = GSList_to_PyList(input->%s, %s_to_dict);\n" % (varname, varname, listtype) else: print "FATAL ERR, line '%d': '%s'" % (cnt, line) sys.exit(1) else: objmember = vartype.replace("*","").strip() #convert+=" UNHANDLED TYPE '%s', name %s\n" % (vartype, varname) convert+="\t%s = %s_to_dict(input->%s);\n" % (varname, objmember, varname) convert+="\tPyDict_SetItemString(dict, \"%s\", %s);\n\n" % (varname, varname) err+="\tPy_XDECREF(%s);\n" % varname o.write("\n") o.write("\tif(!input) goto err;") o.write("\n") o.write("\tif(!(dict = PyDict_New()))\n") o.write("\t\tgoto err;") o.write("\n") o.write(convert) o.write("\n\treturn dict;") o.write("\n") o.write("err:") o.write("\n") o.write(err) o.write("\n\tERR(\"Python module: %s - PyObject construction failed\", __func__);\n") errmsg="Python module: %s_to_dict - PyObject construction failed" % structtype o.write("\n\tPyErr_SetString(PyExc_RuntimeError, \"%s\");" % errmsg) o.write("\n") o.write("\tPy_INCREF(Py_None);") o.write("\n") o.write("\treturn Py_None;") o.write("\n") o.write("}") o.write("\n") o.write("\n") f.seek(filestart) while 1: line = f.readline() cnt+=1 if not line: break if line.startswith("struct _"): structtype = line.replace("struct _", "").rstrip() #header h.write("%s * dict_to_%s (PyObject *dict) ;" % (structtype, structtype)) h.write("int dict_arg_to_%s (PyObject *dict, %s **out) ;" % (structtype, structtype)) #code o.write("%s * dict_to_%s (PyObject *dict) {" % (structtype, structtype)) o.write("\n") o.write("\t%s *ret = NULL;" % structtype) o.write("\n") o.write("\tPyObject *obj = NULL;") o.write("\n") o.write("\tif(!dict){\n") o.write("\t\tPyErr_SetString(PyExc_TypeError, \"Input must be a dict\");\n") o.write("\t\tgoto err;\n") o.write("\t}\n") o.write("\n") o.write("\tif(!PyDict_Check(dict)){\n") o.write("\t\tPyErr_SetString(PyExc_TypeError, \"Input must be a dict\");\n") o.write("\t\tgoto err;\n") o.write("\t}\n") o.write("\n") o.write("\tif(!(ret = %s_new())){\n" % structtype) o.write("\t\tPyErr_SetString(PyExc_RuntimeError, \"Could not allocate memory\");\n") o.write("\t\tgoto err;\n") o.write("\t}\n") o.write("\n") f.readline() #swallow opening brace cnt+=1 convert="" err="" while 2: line = f.readline() cnt+=1 #end of this struct if line.startswith("};"): break decl = line.split(" ") varname = decl[1].replace(";","").rstrip() vartype = decl[0].replace(";","").strip() o.write("\n") o.write("\tif((obj = PyDict_GetItemString(dict, \"%s\"))){" % varname) o.write("\n") if "int" in vartype: o.write("\t\tif(!PyInt_Check(obj)){\n") o.write("\t\t\tPyErr_SetString(PyExc_TypeError, \"Field %s->%s must be an integer\");\n" % (structtype, varname)) o.write("\t\t\tgoto err;\n") o.write("\t\t}\n") o.write("\n") o.write("\t\t//no error checking here..\n") o.write("\t\tret->%s = PyInt_AS_LONG(obj);\n" % varname) o.write("\n") elif "char*" in vartype: o.write("\t\tif(!PyString_Check(obj)){\n") o.write("\t\t\tPyErr_SetString(PyExc_TypeError, \"Field %s->%s must be a string\");\n" % (structtype, varname)) o.write("\t\t\tgoto err;\n") o.write("\t\t}\n") o.write("\n") o.write("\t\tret->%s = strdup(PyString_AsString(obj));\n" % varname) o.write("\n") elif "gboolean" in vartype: o.write("\t\tif(!PyBool_Check(obj)){\n") o.write("\t\t\tPyErr_SetString(PyExc_TypeError, \"Field %s->%s must be a boolean\");\n" % (structtype, varname)) o.write("\t\t\tgoto err;\n") o.write("\t\t}") o.write("\n") o.write("\t\tret->%s = (obj == Py_True) ? TRUE : FALSE;" % varname) o.write("\n") elif "double" in vartype: o.write("\t\tif(!PyFloat_Check(obj)){\n") o.write("\t\t\tPyErr_SetString(PyExc_TypeError, \"Field %s->%s must be a double/float\");\n" % (structtype, varname)) o.write("\t\t\tgoto err;\n") o.write("\t\t}") o.write("\n") o.write("\t\t//no error checking here..\n") o.write("\t\tret->%s = PyFloat_AS_DOUBLE(obj);\n" % varname) o.write("\n") elif "GSList" in vartype: if "Array_string" in line: o.write("\tret->%s = PyList_to_GSList(obj, (dictconv)_to_string, (intconv)NULL);\n" % varname) elif "Array_int" in line: o.write("\tret->%s = PyList_to_GSList(obj, (dictconv)NULL, (intconv)PyInt_toGSListEntry);\n" % varname) else: m = p.search(line) if m: listtype = m.group(1) if listtype: o.write("\t\tret->%s = PyList_to_GSList(obj, (dictconv)dict_to_%s, (intconv)NULL);\n" % (varname, listtype)) else: print "FATAL ERR, line '%d': '%s'" % (cnt, line) sys.exit(1) else: objmember = vartype.replace("*","").strip() #convert+=" UNHANDLED TYPE '%s', name %s\n" % (vartype, varname) o.write("\tret->%s = dict_to_%s(obj);\n" % (varname, objmember)) o.write("\t} else {") o.write("\n") o.write("\t\tPyErr_SetString(PyExc_TypeError, \"Field %s->%s was not found in the passed dict\");" % (structtype, varname)) o.write("\n") o.write("\t\tgoto err;") o.write("\n") o.write("\t}") o.write("\n") o.write("\n") o.write("\treturn ret;") o.write("\n") o.write("err:\n") o.write("\n") o.write("\tif(!PyErr_Occurred()){\n") o.write("\n") o.write("\t\tPyErr_SetString(PyExc_RuntimeError, \"Python module: PyObject construction failed\");\n") o.write("\t}\n") o.write("\n") o.write("\tERR(\"Python module: %s - PyObject construction failed\", __func__);\n") o.write("\n") o.write("\treturn NULL;\n") o.write("\n") o.write("}\n") o.write("\n") o.write("int dict_arg_to_%s (PyObject *dict, %s **out) {" % (structtype, structtype)) o.write("\n") o.write("\tif(!out) return 0;\n") o.write("\n") o.write("\t*out = dict_to_%s(dict);\n" % structtype) o.write("\n") o.write("\treturn 1;\n") o.write("\n") o.write("}\n") o.write("\n") h.write("\n") h.write("#endif\n") o.close() f.close()