예제 #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"))
예제 #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))
예제 #3
0
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))
예제 #4
0
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))
예제 #5
0
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)))
예제 #6
0
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")