def append_header_child_arr(child, header, prefix): ''' Description: Write c header file of array of child Interface: None History: 2019-06-17 ''' if helpers.get_map_c_types(child.subtyp) != "": c_typ = helpers.get_map_c_types(child.subtyp) elif helpers.valid_basic_map_name(child.subtyp): c_typ = '%s *' % helpers.make_basic_map_name(child.subtyp) elif child.subtypname is not None: c_typ = child.subtypname elif child.subtypobj is not None: c_typ = helpers.get_name_substr(child.name, prefix) else: c_typ = helpers.get_prefixed_pointer(child.name, child.subtyp, prefix) if helpers.valid_basic_map_name(child.subtyp): header.write( " %s **%s;\n" % (helpers.make_basic_map_name(child.subtyp), child.fixname)) elif not helpers.judge_complex(child.subtyp): header.write(" %s%s*%s;\n" % (c_typ, " " if '*' not in c_typ else "", child.fixname)) else: header.write(" %s%s**%s;\n" % (c_typ, " " if '*' not in c_typ else "", child.fixname)) header.write(" size_t %s;\n\n" % (child.fixname + "_len"))
def append_header_arr(obj, header, prefix): ''' Description: Write c header file of array Interface: None History: 2019-06-17 ''' if not obj.subtypobj or obj.subtypname: return header.write("typedef struct {\n") for i in obj.subtypobj: if i.typ == 'array': c_typ = helpers.get_prefixed_pointer(i.name, i.subtyp, prefix) or \ helpers.get_map_c_types(i.subtyp) if i.subtypobj is not None: c_typ = helpers.get_name_substr(i.name, prefix) if not helpers.judge_complex(i.subtyp): header.write(" %s%s*%s;\n" % (c_typ, " " if '*' not in c_typ else "", \ i.fixname)) else: header.write(" %s **%s;\n" % (c_typ, i.fixname)) header.write(" size_t %s;\n\n" % (i.fixname + "_len")) else: c_typ = helpers.get_prefixed_pointer(i.name, i.typ, prefix) or \ helpers.get_map_c_types(i.typ) header.write(" %s%s%s;\n" % (c_typ, " " if '*' not in c_typ else "", i.fixname)) for i in obj.subtypobj: if helpers.judge_data_type(i.typ) or i.typ == 'boolean': header.write(" unsigned int %s_present : 1;\n" % (i.fixname)) typename = helpers.get_name_substr(obj.name, prefix) header.write("}\n%s;\n\n" % typename) header.write("void free_%s (%s *ptr);\n\n" % (typename, typename)) header.write("%s *make_%s (yajl_val tree, const struct parser_context *ctx, parser_error *err);"\ "\n\n" % (typename, typename))
def parse_json_to_c(obj, c_file, prefix): """ Description: generate c language for parse json file Interface: None History: 2019-06-17 """ if not helpers.judge_complex(obj.typ): return if obj.typ == 'object' or obj.typ == 'mapStringObject': if obj.subtypname: return obj_typename = typename = helpers.get_prefixe_name(obj.name, prefix) if obj.typ == 'array': obj_typename = typename = helpers.get_name_substr(obj.name, prefix) objs = obj.subtypobj if objs is None or obj.subtypname: return c_file.write("%s *make_%s(yajl_val tree, const struct parser_context *ctx, "\ "parser_error *err) {\n" % (typename, typename)) c_file.write(" %s *ret = NULL;\n" % (typename)) c_file.write(" *err = 0;\n") c_file.write(" if (tree == NULL)\n") c_file.write(" return ret;\n") c_file.write(" ret = safe_malloc(sizeof(*ret));\n") if obj.typ == 'mapStringObject': parse_map_string_obj(obj, c_file, prefix, obj_typename) if obj.typ == 'object' or (obj.typ == 'array' and obj.subtypobj): parse_obj_arr_obj(obj, c_file, prefix, obj_typename) c_file.write(' return ret;\n') c_file.write("}\n\n")
def get_c_json(obj, c_file, prefix): """ Description: c language generate json file Interface: None History: 2019-06-17 """ if not helpers.judge_complex(obj.typ) or obj.subtypname: return if obj.typ == 'object' or obj.typ == 'mapStringObject': typename = helpers.get_prefixe_name(obj.name, prefix) elif obj.typ == 'array': typename = helpers.get_name_substr(obj.name, prefix) objs = obj.subtypobj if objs is None: return c_file.write( "yajl_gen_status gen_%s(yajl_gen g, const %s *ptr, const struct parser_context " \ "*ctx, parser_error *err) {\n" % (typename, typename)) c_file.write(" yajl_gen_status stat = yajl_gen_status_ok;\n") c_file.write(" *err = 0;\n") if obj.typ == 'mapStringObject': get_map_string_obj(obj, c_file, prefix) elif obj.typ == 'object' or (obj.typ == 'array' and obj.subtypobj): nodes = obj.children if obj.typ == 'object' else obj.subtypobj if nodes is None: c_file.write(' if (!(ctx->options & OPT_GEN_SIMPLIFY))\n') c_file.write(' yajl_gen_config(g, yajl_gen_beautify, 0);\n') c_file.write(" stat = yajl_gen_map_open((yajl_gen)g);\n") c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") for i in nodes or []: get_obj_arr_obj(i, c_file, prefix) if obj.typ == 'object': if obj.children is not None: c_file.write(" if (ptr != NULL && ptr->_residual != NULL)\n") c_file.write(" {\n") c_file.write(" stat = gen_yajl_object_residual (ptr->_residual, g, err);\n") c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.write(" }\n") c_file.write(" stat = yajl_gen_map_close((yajl_gen)g);\n") c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") if nodes is None: c_file.write(' if (!(ctx->options & OPT_GEN_SIMPLIFY))\n') c_file.write(' yajl_gen_config(g, yajl_gen_beautify, 1);\n') c_file.write(' return yajl_gen_status_ok;\n') c_file.write("}\n\n")
def append_type_c_header(obj, header, prefix): ''' Description: Write c header file Interface: None History: 2019-06-17 ''' if not helpers.judge_complex(obj.typ): return if obj.typ == 'array': append_header_arr(obj, header, prefix) return if obj.typ == 'mapStringObject': if obj.subtypname is not None: return append_header_map_str_obj(obj, header, prefix) elif obj.typ == 'object': if obj.subtypname is not None: return header.write("typedef struct {\n") if obj.children is None: header.write( " char unuseful; // unuseful definition to avoid empty struct\n" ) for i in obj.children or []: if i.typ == 'array': append_header_child_arr(i, header, prefix) else: append_header_child_others(i, header, prefix) if helpers.judge_data_type(i.typ) or i.typ == 'boolean': header.write(" unsigned int %s_present : 1;\n" % (i.fixname)) if obj.children is not None: header.write(" yajl_val _residual;\n") typename = helpers.get_prefixed_name(obj.name, prefix) header.write("}\n%s;\n\n" % typename) header.write("void free_%s (%s *ptr);\n\n" % (typename, typename)) header.write("%s *make_%s (yajl_val tree, const struct parser_context *ctx, parser_error *err)"\ ";\n\n" % (typename, typename)) header.write("yajl_gen_status gen_%s (yajl_gen g, const %s *ptr, const struct parser_context "\ "*ctx, parser_error *err);\n\n" % (typename, typename))
def make_c_free(obj, c_file, prefix): """ Description: generate c free function Interface: None History: 2019-06-17 """ if not helpers.judge_complex(obj.typ) or obj.subtypname: return typename = helpers.get_prefixe_name(obj.name, prefix) case = obj.typ result = { 'mapStringObject': lambda x: [], 'object': lambda x: x.children, 'array': lambda x: x.subtypobj }[case](obj) objs = result if obj.typ == 'array': if objs is None: return else: typename = helpers.get_name_substr(obj.name, prefix) c_file.write("void free_%s(%s *ptr) {\n" % (typename, typename)) c_file.write(" if (ptr == NULL)\n") c_file.write(" return;\n") if obj.typ == 'mapStringObject': child = obj.children[0] if helpers.valid_basic_map_name(child.typ): childname = helpers.make_basic_map_name(child.typ) else: if child.subtypname: childname = child.subtypname else: childname = helpers.get_prefixe_name(child.name, prefix) c_file_map_str(c_file, child, childname) for i in objs or []: if helpers.valid_basic_map_name(i.typ): free_func = helpers.make_basic_map_name(i.typ) c_file.write(" free_%s(ptr->%s);\n" % (free_func, i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) if i.typ == 'mapStringObject': if i.subtypname: free_func = i.subtypname else: free_func = helpers.get_prefixe_name(i.name, prefix) c_file.write(" free_%s(ptr->%s);\n" % (free_func, i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) elif i.typ == 'array': if helpers.valid_basic_map_name(i.subtyp): free_func = helpers.make_basic_map_name(i.subtyp) c_file.write(" if (ptr->%s != NULL) {\n" % i.fixname) c_file.write(" size_t i;\n") c_file.write(" for (i = 0; i < ptr->%s_len; i++) {\n" % i.fixname) c_file.write(" if (ptr->%s[i] != NULL) {\n" % (i.fixname)) c_file.write(" free_%s(ptr->%s[i]);\n" % (free_func, i.fixname)) c_file.write(" ptr->%s[i] = NULL;\n" % (i.fixname)) c_file.write(" }\n") c_file.write(" }\n") c_file.write(" free(ptr->%s);\n" % (i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) c_file.write(" }\n") elif i.subtyp == 'string': c_file_str(c_file, i) elif not helpers.judge_complex(i.subtyp): c_file.write(" free(ptr->%s);\n" % (i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) elif i.subtyp == 'object' or i.subtypobj is not None: if i.subtypname is not None: free_func = i.subtypname else: free_func = helpers.get_name_substr(i.name, prefix) c_file.write(" if (ptr->%s != NULL) {\n" % i.fixname) c_file.write(" size_t i;\n") c_file.write(" for (i = 0; i < ptr->%s_len; i++)\n" % i.fixname) c_file.write(" if (ptr->%s[i] != NULL) {\n" % (i.fixname)) c_file.write(" free_%s(ptr->%s[i]);\n" % (free_func, i.fixname)) c_file.write(" ptr->%s[i] = NULL;\n" % (i.fixname)) c_file.write(" }\n") c_file.write(" free(ptr->%s);\n" % i.fixname) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) c_file.write(" }\n") c_typ = helpers.obtain_pointer(i.name, i.subtypobj, prefix) if c_typ == "": continue if i.subobj is not None: c_typ = c_typ + "_element" c_file.write(" free_%s(ptr->%s);\n" % (c_typ, i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) else: typename = helpers.get_prefixe_name(i.name, prefix) if i.typ == 'string' or i.typ == 'booleanPointer' or \ helpers.judge_data_pointer_type(i.typ): c_file.write(" free(ptr->%s);\n" % (i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) elif i.typ == 'object': if i.subtypname is not None: typename = i.subtypname c_file.write(" if (ptr->%s != NULL) {\n" % (i.fixname)) c_file.write(" free_%s(ptr->%s);\n" % (typename, i.fixname)) c_file.write(" ptr->%s = NULL;\n" % (i.fixname)) c_file.write(" }\n") c_file.write(" free(ptr);\n") c_file.write("}\n\n")