Beispiel #1
0
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"))
Beispiel #2
0
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))
Beispiel #3
0
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")
Beispiel #4
0
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")
Beispiel #5
0
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))
Beispiel #6
0
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")