mirror of
https://github.com/haiwen/libsearpc.git
synced 2025-09-11 09:39:21 +00:00
Make searpc-codegen python3-compatible. (#28)
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
#!/usr/bin/env python2
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""
|
||||
Generate function define macros.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
import string
|
||||
import sys
|
||||
import os
|
||||
@@ -16,24 +17,24 @@ import os
|
||||
# <default_ret_value>)
|
||||
type_table = {
|
||||
"string": ("const char*",
|
||||
"char*",
|
||||
"char*",
|
||||
"json_array_get_string_or_null_element",
|
||||
"searpc_set_string_to_ret_object",
|
||||
"json_array_add_string_or_null_element",
|
||||
"NULL"),
|
||||
"int": ("int",
|
||||
"int",
|
||||
"int": ("int",
|
||||
"int",
|
||||
"json_array_get_int_element",
|
||||
"searpc_set_int_to_ret_object",
|
||||
"json_array_add_int_element",
|
||||
"-1"),
|
||||
"int64": ("gint64",
|
||||
"gint64",
|
||||
"int64": ("gint64",
|
||||
"gint64",
|
||||
"json_array_get_int_element",
|
||||
"searpc_set_int_to_ret_object",
|
||||
"json_array_add_int_element",
|
||||
"-1"),
|
||||
"object": ("GObject*",
|
||||
"object": ("GObject*",
|
||||
"GObject*",
|
||||
"",
|
||||
"searpc_set_object_to_ret_object",
|
||||
@@ -83,8 +84,8 @@ def generate_marshal(ret_type, arg_types):
|
||||
stmt = " %s param%d = %s (param_array, %d);\n" %(
|
||||
type_item[0], i+1, type_item[2], i+1)
|
||||
get_parameters += stmt
|
||||
|
||||
# func_prototype should be something like
|
||||
|
||||
# func_prototype should be something like
|
||||
# GList* (*)(const char*, int, GError **)
|
||||
func_prototype = ret_type_in_c + " (*)("
|
||||
for arg_type in arg_types:
|
||||
@@ -98,18 +99,22 @@ def generate_marshal(ret_type, arg_types):
|
||||
|
||||
func_call = "%s ret = ((%s)func) (%s);" % (ret_type_in_c, func_prototype,
|
||||
func_args)
|
||||
|
||||
|
||||
convert_ret = "%s (object, ret);" % ret_type_item[3]
|
||||
|
||||
|
||||
return template.substitute(marshal_name=marshal_name,
|
||||
get_parameters=get_parameters,
|
||||
func_call=func_call,
|
||||
convert_ret=convert_ret)
|
||||
|
||||
def write_file(f, s):
|
||||
f.write(s)
|
||||
f.write('\n')
|
||||
|
||||
def gen_marshal_functions(f):
|
||||
from rpc_table import func_table
|
||||
for item in func_table:
|
||||
print >>f, generate_marshal(item[0], item[1])
|
||||
write_file(f, generate_marshal(item[0], item[1]))
|
||||
|
||||
|
||||
marshal_register_item = r"""
|
||||
@@ -136,11 +141,11 @@ def generate_marshal_register_item(ret_type, arg_types):
|
||||
|
||||
def gen_marshal_register_function(f):
|
||||
from rpc_table import func_table
|
||||
print >>f, "static void register_marshals()"""
|
||||
print >>f, "{"
|
||||
write_file(f, "static void register_marshals()""")
|
||||
write_file(f, "{")
|
||||
for item in func_table:
|
||||
print >>f, generate_marshal_register_item(item[0], item[1]),
|
||||
print >>f, "}"
|
||||
write_file(f, generate_marshal_register_item(item[0], item[1]))
|
||||
write_file(f, "}")
|
||||
|
||||
signature_template = r"""
|
||||
inline static gchar *
|
||||
@@ -159,20 +164,18 @@ def generate_signature(ret_type, arg_types):
|
||||
else:
|
||||
signature_name = "searpc_signature_" + ret_type + "__" + (
|
||||
'_'.join(arg_types))
|
||||
|
||||
|
||||
args = "\"" + ret_type + "\"" + ", " + str(len(arg_types))
|
||||
for arg_type in arg_types:
|
||||
args += ", " + "\"" + arg_type + "\""
|
||||
|
||||
|
||||
template = string.Template(signature_template)
|
||||
return template.substitute(signature_name=signature_name, args=args)
|
||||
|
||||
def gen_signature_list():
|
||||
f = open('searpc-signature.h', 'w')
|
||||
for item in func_table:
|
||||
print >>f,generate_signature(item[0], item[1])
|
||||
f.close()
|
||||
|
||||
with open('searpc-signature.h', 'w') as f:
|
||||
for item in func_table:
|
||||
write_file(f, generate_signature(item[0], item[1]))
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.path.append(os.getcwd())
|
||||
@@ -180,20 +183,15 @@ if __name__ == "__main__":
|
||||
# load function table
|
||||
if len(sys.argv) == 2:
|
||||
abspath = os.path.abspath(sys.argv[1])
|
||||
d = os.path.dirname(abspath)
|
||||
f = os.path.basename(abspath)
|
||||
mod = f[:f.rfind('.')]
|
||||
sys.path.append(d)
|
||||
rpc_mod = __import__(mod, globals(), locals(), [], -1)
|
||||
print "loaded func_table from %s" % (rpc_mod.__file__)
|
||||
func_table = rpc_mod.func_table
|
||||
with open(abspath, 'r') as fp:
|
||||
exec(fp.read())
|
||||
print("loaded func_table from %s" % abspath)
|
||||
else:
|
||||
# load from default rpc_table.py
|
||||
from rpc_table import func_table
|
||||
|
||||
# gen code
|
||||
marshal = open('searpc-marshal.h', 'w')
|
||||
gen_marshal_functions(marshal)
|
||||
gen_marshal_register_function(marshal)
|
||||
marshal.close()
|
||||
with open('searpc-marshal.h', 'w') as marshal:
|
||||
gen_marshal_functions(marshal)
|
||||
gen_marshal_register_function(marshal)
|
||||
gen_signature_list()
|
||||
|
Reference in New Issue
Block a user