From 672bb90032b9c226adee5e63a4dd273eaf8f8c12 Mon Sep 17 00:00:00 2001 From: Shuai Lin Date: Tue, 20 Jun 2017 01:36:59 -0500 Subject: [PATCH] Make searpc-codegen python3-compatible. (#28) --- debian/control | 3 +- lib/searpc-codegen.py | 66 +++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/debian/control b/debian/control index 3216f2b..3abe3e9 100644 --- a/debian/control +++ b/debian/control @@ -30,8 +30,7 @@ Section: libdevel Architecture: any Depends: ${misc:Depends}, - python2 (>= 2.7) | python (>= 2.7), - python2 (<< 2.8) | python (<< 2.8), + python (>= 2.7), libsearpc1 (= ${binary:Version}) Conflicts: seafile Description: Development files for the libsearpc1 package. diff --git a/lib/searpc-codegen.py b/lib/searpc-codegen.py index a357e90..ca58428 100644 --- a/lib/searpc-codegen.py +++ b/lib/searpc-codegen.py @@ -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 # ) 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()