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 append_header_child_others(child, header, prefix): ''' Description: Write c header file of others of child Interface: None History: 2019-06-17 ''' if helpers.get_map_c_types(child.typ) != "": c_typ = helpers.get_map_c_types(child.typ) elif helpers.valid_basic_map_name(child.typ): c_typ = '%s *' % helpers.make_basic_map_name(child.typ) elif child.subtypname: c_typ = helpers.get_prefixe_pointer(child.subtypname, child.typ, "") else: c_typ = helpers.get_prefixe_pointer(child.name, child.typ, prefix) header.write(" %s%s%s;\n\n" % (c_typ, " " if '*' not in c_typ else "", child.fixname))
def header_reflect_top_array(obj, prefix, header): c_typ = helpers.get_prefixed_pointer(obj.name, obj.subtyp, prefix) or \ helpers.get_map_c_types(obj.subtyp) if obj.subtypobj is not None: c_typ = helpers.get_name_substr(obj.name, prefix) + " *" if c_typ == "": return typename = helpers.get_top_array_type_name(obj.name, prefix) header.write("typedef struct {\n") if obj.doublearray: header.write(" %s%s**items;\n" % (c_typ, " " if '*' not in c_typ else "")) header.write(" size_t *subitem_lens;\n\n") else: header.write(" %s%s*items;\n" % (c_typ, " " if '*' not in c_typ else "")) header.write(" size_t len;\n\n") header.write("}\n%s;\n\n" % (typename)) header.write("void free_%s (%s *ptr);\n\n" % (typename, typename)) header.write("%s *%s_parse_file(const char *filename, const struct "\ "parser_context *ctx, parser_error *err);\n\n" % (typename, typename)) header.write("%s *%s_parse_file_stream(FILE *stream, const struct "\ "parser_context *ctx, parser_error *err);\n\n" % (typename, typename)) header.write("%s *%s_parse_data(const char *jsondata, const struct "\ "parser_context *ctx, parser_error *err);\n\n" % (typename, typename)) header.write("char *%s_generate_json(const %s *ptr, "\ "const struct parser_context *ctx, parser_error *err);\n\n" % (typename, typename))
def read_val_generator(c_file, level, src, dest, typ, keyname, obj_typename): """ Description: read value generateor Interface: None History: 2019-06-17 """ if helpers.valid_basic_map_name(typ): c_file.write('%syajl_val val = %s;\n' % (' ' * level, src)) c_file.write('%sif (val != NULL) {\n' % (' ' * level)) c_file.write('%s%s = make_%s(val, ctx, err);\n' \ % (' ' * (level + 1), dest, helpers.make_basic_map_name(typ))) c_file.write('%sif (%s == NULL) {\n' % (' ' * (level + 1), dest)) c_file.write('%s char *new_error = NULL;\n' % (' ' * (level + 1))) c_file.write("%s if (asprintf(&new_error, \"Value error for key" \ " '%s': %%s\", *err ? *err : \"null\") < 0) {\n" \ % (' ' * (level + 1), keyname)) c_file.write('%s new_error = safe_strdup("error allocating memory");\n' \ % (' ' * (level + 1))) c_file.write('%s }\n' % (' ' * (level + 1))) c_file.write('%s free(*err);\n' % (' ' * (level + 1))) c_file.write('%s *err = new_error;\n' % (' ' * (level + 1))) c_file.write('%s free_%s(ret);\n' % (' ' * (level + 1), obj_typename)) c_file.write('%s return NULL;\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level))) elif typ == 'string': c_file.write('%syajl_val val = %s;\n' % (' ' * (level), src)) c_file.write('%sif (val != NULL) {\n' % (' ' * (level))) c_file.write('%schar *str = YAJL_GET_STRING(val);\n' % (' ' * (level + 1))) c_file.write('%s%s = safe_strdup(str ? str : "");\n' % (' ' * (level + 1), dest)) c_file.write('%s}\n' % (' ' * level)) elif helpers.judge_data_type(typ): c_file.write('%syajl_val val = %s;\n' % (' ' * (level), src)) c_file.write('%sif (val != NULL) {\n' % (' ' * (level))) if typ.startswith("uint") or \ (typ.startswith("int") and typ != "integer") or typ == "double": c_file.write('%sint invalid = common_safe_%s(YAJL_GET_NUMBER(val), &%s);\n' \ % (' ' * (level + 1), typ, dest)) elif typ == "integer": c_file.write('%sint invalid = common_safe_int(YAJL_GET_NUMBER(val), (int *)&%s);\n' \ % (' ' * (level + 1), dest)) elif typ == "UID" or typ == "GID": c_file.write('%sint invalid = common_safe_uint(YAJL_GET_NUMBER(val),' \ ' (unsigned int *)&%s);\n' % (' ' * (level + 1), dest)) c_file.write('%sif (invalid) {\n' % (' ' * (level + 1))) c_file.write('%s if (asprintf(err, "Invalid value \'%%s\' with type \'%s\' ' 'for key \'%s\': %%s", YAJL_GET_NUMBER(val), strerror(-invalid)) < 0)\n' \ % (' ' * (level + 1), typ, keyname)) c_file.write('%s *err = safe_strdup("error allocating memory");\n' \ % (' ' * (level + 1))) c_file.write('%s free_%s(ret);\n' % (' ' * (level + 1), obj_typename)) c_file.write('%s return NULL;\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level))) elif helpers.judge_data_pointer_type(typ): num_type = helpers.obtain_data_pointer_type(typ) if num_type == "": return c_file.write('%syajl_val val = %s;\n' % (' ' * (level), src)) c_file.write('%sif (val != NULL) {\n' % (' ' * (level))) c_file.write('%s%s = safe_malloc(sizeof(%s));\n' % (' ' * (level + 1), dest, helpers.get_map_c_types(num_type))) c_file.write('%sint invalid = common_safe_%s(YAJL_GET_NUMBER(val), %s);\n' \ % (' ' * (level + 1), num_type, dest)) c_file.write('%sif (invalid) {\n' % (' ' * (level + 1))) c_file.write('%s if (asprintf(err, "Invalid value \'%%s\' with type \'%s\' ' \ 'for key \'%s\': %%s", YAJL_GET_NUMBER(val), strerror(-invalid)) < 0)\n' \ % (' ' * (level + 1), typ, keyname)) c_file.write('%s *err = safe_strdup("error allocating memory");\n' \ % (' ' * (level + 1))) c_file.write('%s free_%s(ret);\n' % (' ' * (level + 1), obj_typename)) c_file.write('%s return NULL;\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level))) elif typ == 'boolean': c_file.write('%syajl_val val = %s;\n' % (' ' * (level), src)) c_file.write('%sif (val != NULL)\n' % (' ' * (level))) c_file.write('%s%s = YAJL_IS_TRUE(val);\n' % (' ' * (level + 1), dest)) elif typ == 'booleanPointer': c_file.write('%syajl_val val = %s;\n' % (' ' * (level), src)) c_file.write('%sif (val != NULL) {\n' % (' ' * (level))) c_file.write('%s%s = safe_malloc(sizeof(bool));\n' % (' ' * (level + 1), dest)) c_file.write('%s*(%s) = YAJL_IS_TRUE(val);\n' % (' ' * (level + 1), dest)) c_file.write('%s} else {\n' % (' ' * (level))) c_file.write('%sval = get_val(tree, "%s", yajl_t_false);\n' \ % (' ' * (level + 1), keyname)) c_file.write('%sif (val != NULL) {\n' % (' ' * (level + 1))) c_file.write('%s%s = safe_malloc(sizeof(bool));\n' % (' ' * (level + 2), dest)) c_file.write('%s*(%s) = YAJL_IS_TRUE(val);\n' % (' ' * (level + 2), dest)) c_file.write('%s}\n' % (' ' * (level + 1))) c_file.write('%s}\n' % (' ' * (level)))
def get_obj_arr_obj(obj, c_file, prefix): """ Description: c language generate object or array object Interface: None History: 2019-06-17 """ if obj.typ == 'string': c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) ||' \ ' (ptr != NULL && ptr->%s != NULL)) {\n' % obj.fixname) c_file.write(' char *str = "";\n') c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s != NULL) {\n" % obj.fixname) c_file.write(" str = ptr->%s;\n" % obj.fixname) c_file.write(" }\n") json_value_generator(c_file, 2, "str", 'g', 'ctx', obj.typ) c_file.write(" }\n") elif helpers.judge_data_type(obj.typ): c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) ||' \ ' (ptr != NULL && ptr->%s)) {\n' % obj.fixname) if obj.typ == 'double': numtyp = 'double' elif obj.typ.startswith( "uint") or obj.typ == 'GID' or obj.typ == 'UID': numtyp = 'long long unsigned int' else: numtyp = 'long long int' c_file.write(' %s num = 0;\n' % numtyp) c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s) {\n" % obj.fixname) c_file.write(" num = (%s)ptr->%s;\n" % (numtyp, obj.fixname)) c_file.write(" }\n") json_value_generator(c_file, 2, "num", 'g', 'ctx', obj.typ) c_file.write(" }\n") elif helpers.judge_data_pointer_type(obj.typ): c_file.write(' if ((ptr != NULL && ptr->%s != NULL)) {\n' % obj.fixname) numtyp = helpers.obtain_data_pointer_type(obj.typ) if numtyp == "": return c_file.write(' %s num = 0;\n' % helpers.get_map_c_types(numtyp)) c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s != NULL) {\n" % obj.fixname) c_file.write(" num = (%s)*(ptr->%s);\n" \ % (helpers.get_map_c_types(numtyp), obj.fixname)) c_file.write(" }\n") json_value_generator(c_file, 2, "num", 'g', 'ctx', numtyp) c_file.write(" }\n") elif obj.typ == 'boolean': c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) ||' \ ' (ptr != NULL && ptr->%s)) {\n' % obj.fixname) c_file.write(' bool b = false;\n') c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s) {\n" % obj.fixname) c_file.write(" b = ptr->%s;\n" % obj.fixname) c_file.write(" }\n") json_value_generator(c_file, 2, "b", 'g', 'ctx', obj.typ) c_file.write(" }\n") elif obj.typ == 'object' or obj.typ == 'mapStringObject': if obj.subtypname: typename = obj.subtypname else: typename = helpers.get_prefixe_name(obj.name, prefix) c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) ||' \ ' (ptr != NULL && ptr->%s != NULL)) {\n' % obj.fixname) c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(' stat = gen_%s(g, ptr != NULL ? ptr->%s : NULL, ctx, err);\n' \ % (typename, obj.fixname)) 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") elif obj.typ == 'array' and (obj.subtypobj or obj.subtyp == 'object'): if obj.subtypname: typename = obj.subtypname else: typename = helpers.get_name_substr(obj.name, prefix) c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) || ' \ '(ptr != NULL && ptr->%s != NULL)) {\n' % obj.fixname) c_file.write(' size_t len = 0, i;\n') c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s != NULL) {\n" % obj.fixname) c_file.write(" len = ptr->%s_len;\n" % obj.fixname) c_file.write(" }\n") c_file.write( " if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") c_file.write(' yajl_gen_config(g, yajl_gen_beautify, 0);\n') c_file.write(' stat = yajl_gen_array_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") c_file.write(' for (i = 0; i < len; i++) {\n') c_file.write(' stat = gen_%s(g, ptr->%s[i], ctx, err);\n' \ % (typename, obj.fixname)) 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_array_close((yajl_gen)g);\n') c_file.write( " if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") c_file.write(' yajl_gen_config(g, yajl_gen_beautify, 1);\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') elif obj.typ == 'array' and obj.subtyp == 'byte': c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) ||' \ ' (ptr != NULL && ptr->%s != NULL && ptr->%s_len)) {\n' \ % (obj.fixname, obj.fixname)) c_file.write(' const char *str = "";\n') c_file.write(' size_t len = 0;\n') c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s != NULL) {\n" % obj.fixname) c_file.write(" str = (const char *)ptr->%s;\n" % obj.fixname) c_file.write(" len = ptr->%s_len;\n" % obj.fixname) c_file.write(" }\n") c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)str, len);\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") elif obj.typ == 'array': c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) || ' \ '(ptr != NULL && ptr->%s != NULL)) {\n' % obj.fixname) c_file.write(' size_t len = 0, i;\n') c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(" if (ptr != NULL && ptr->%s != NULL) {\n" % obj.fixname) c_file.write(" len = ptr->%s_len;\n" % obj.fixname) c_file.write(" }\n") c_file.write( " if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") c_file.write(' yajl_gen_config(g, yajl_gen_beautify, 0);\n') c_file.write(' stat = yajl_gen_array_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") c_file.write(' for (i = 0; i < len; i++) {\n') json_value_generator(c_file, 3, "ptr->%s[i]" % obj.fixname, 'g', 'ctx', obj.subtyp) c_file.write(' }\n') c_file.write(' stat = yajl_gen_array_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") c_file.write( " if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") c_file.write(' yajl_gen_config(g, yajl_gen_beautify, 1);\n') c_file.write(' }\n') elif helpers.valid_basic_map_name(obj.typ): c_file.write(' if ((ctx->options & OPT_GEN_KAY_VALUE) || ' \ '(ptr != NULL && ptr->%s != NULL)) {\n' % obj.fixname) c_file.write(' stat = yajl_gen_string((yajl_gen)g, \ (const unsigned char *)("%s"), strlen("%s"));\n' % (obj.origname, obj.origname)) c_file.write(" if (yajl_gen_status_ok != stat)\n") c_file.write(" GEN_SET_ERROR_AND_RETURN(stat, err);\n") c_file.write(' stat = gen_%s(g, ptr ? ptr->%s : NULL, ctx, err);\n' \ % (helpers.make_basic_map_name(obj.typ), obj.fixname)) 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")