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 expand(tree, structs, visited):
    """
    Description: generate c language for parse json map string object
    Interface: None
    History: 2019-06-17
    """
    if tree.children is not None:
        for i in tree.children:
            if tree.subtypname:
                i.subtypname = "from_ref"
            expand(i, structs, visited=visited)
    if tree.subtypobj is not None:
        for i in tree.subtypobj:
            expand(i, structs, visited=visited)

    if tree.typ == 'array' and helpers.valid_basic_map_name(tree.subtyp):
        name = helpers.CombinateName(tree.name + "_element")
        node = helpers.Unite(name, tree.subtyp, None)
        expand(node, structs, visited)

    id_ = "%s:%s" % (tree.name, tree.typ)
    if id_ not in visited.keys():
        structs.append(tree)
        visited[id_] = tree

    return structs
Beispiel #3
0
def parse_schema(schema_info, schema, prefix):
    """
    Description: generate c language for parse json map string object
    Interface: None
    History: 2019-06-17
    """
    required = None
    if 'type' not in schema:
        return handle_type_not_in_schema(schema_info, schema, prefix)

    if 'object' in schema['type']:
        if 'required' in schema:
            required = schema['required']
        return helpers.Unite(
            helpers.CombinateName(prefix), 'object',
            parse_properties(schema_info, \
                            helpers.CombinateName(""), \
                            schema, schema, schema_info.name.name), \
            None, None, None, required)
    elif 'array' in schema['type']:
        item_type, _ = resolve_type(schema_info, helpers.CombinateName(""), \
                                    schema['items'], schema['items'], schema_info.name.name)
        if item_type.typ == 'array' and not helpers.valid_basic_map_name(item_type.subtyp):
            item_type.doublearray = True
            return item_type
        else:
            return helpers.Unite(helpers.CombinateName(prefix), 'array', None, item_type.typ, \
                            item_type.children, None, item_type.required)

    else:
        print("Not supported type '%s'" % schema['type'])
    return prefix, None
Beispiel #4
0
def gen_type_arr_typnode(node_info, src, typ, refname):
    """
    Description: generate c language for parse json map string object
    Interface: None
    History: 2019-06-17
    """
    schema_info = node_info.schema_info
    name = node_info.name
    cur = node_info.cur
    curfile = node_info.curfile

    item_type, src = resolve_type(schema_info, name, src, cur["items"], curfile)

    if typ == 'array' and typ == item_type.typ and not helpers.valid_basic_map_name(item_type.subtyp):
        return helpers.Unite(name,
                        typ,
                        None,
                        subtyp=item_type.subtyp,
                        subtypobj=item_type.subtypobj,
                        subtypname=item_type.subtypname,
                        required=item_type.required, doublearray=True), src
    else:
        return helpers.Unite(name,
                        typ,
                        None,
                        subtyp=item_type.typ,
                        subtypobj=item_type.children,
                        subtypname=refname,
                        required=item_type.required), src
Beispiel #5
0
def json_value_generator(c_file, level, src, dst, ptx, typ):
    """
    Description: json value generateor
    Interface: None
    History: 2019-06-17
    """
    if helpers.valid_basic_map_name(typ):
        c_file.write('%sstat = gen_%s(%s, %s, %s, err);\n' \
                     % ('    ' * (level), helpers.make_basic_map_name(typ), dst, src, ptx))
        c_file.write("%sif (yajl_gen_status_ok != stat)\n" % ('    ' * (level)))
        c_file.write("%sGEN_SET_ERROR_AND_RETURN(stat, err);\n" % ('    ' * (level + 1)))
    elif typ == 'string':
        c_file.write('%sstat = yajl_gen_string((yajl_gen)%s, \
        (const unsigned char *)(%s), strlen(%s));\n' % ('    ' * (level), dst, src, src))
        c_file.write("%sif (yajl_gen_status_ok != stat)\n" % ('    ' * (level)))
        c_file.write("%sGEN_SET_ERROR_AND_RETURN(stat, err);\n" % ('    ' * (level + 1)))
    elif helpers.judge_data_type(typ):
        if typ == 'double':
            c_file.write('%sstat = yajl_gen_double((yajl_gen)%s, %s);\n' \
                         % ('    ' * (level), dst, src))
        elif typ.startswith("uint") or typ == 'GID' or typ == 'UID':
            c_file.write('%sstat = map_uint(%s, %s);\n' % ('    ' * (level), dst, src))
        else:
            c_file.write('%sstat = map_int(%s, %s);\n' % ('    ' * (level), dst, src))
        c_file.write("%sif (yajl_gen_status_ok != stat)\n" % ('    ' * (level)))
        c_file.write("%sGEN_SET_ERROR_AND_RETURN(stat, err);\n" \
                     % ('    ' * (level + 1)))
    elif typ == 'boolean':
        c_file.write('%sstat = yajl_gen_bool((yajl_gen)%s, (int)(%s));\n' \
                     % ('    ' * (level), dst, src))
        c_file.write("%sif (yajl_gen_status_ok != stat)\n" % ('    ' * (level)))
        c_file.write("%sGEN_SET_ERROR_AND_RETURN(stat, err);\n" % ('    ' * (level + 1)))
Beispiel #6
0
def parse_map_string_obj(obj, c_file, prefix, obj_typename):
    """
    Description: generate c language for parse json map string object
    Interface: None
    History: 2019-06-17
    """
    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.write('    if (YAJL_GET_OBJECT(tree) != NULL && YAJL_GET_OBJECT(tree)->len > 0) {\n')
    c_file.write('        size_t i;\n')
    c_file.write('        ret->len = YAJL_GET_OBJECT(tree)->len;\n')
    c_file.write('        ret->keys = safe_malloc((YAJL_GET_OBJECT(tree)->len + 1) ' \
                 '* sizeof(*ret->keys));\n')
    c_file.write('        ret->%s = safe_malloc((YAJL_GET_OBJECT(tree)->len + 1) ' \
                 '* sizeof(*ret->%s));\n' % (child.fixname, child.fixname))
    c_file.write('        for (i = 0; i < YAJL_GET_OBJECT(tree)->len; i++) {\n')
    c_file.write('            const char *tmpkey = YAJL_GET_OBJECT(tree)->keys[i];\n')
    c_file.write('            ret->keys[i] = safe_strdup(tmpkey ? tmpkey : "");\n')
    c_file.write('            yajl_val val = YAJL_GET_OBJECT(tree)->values[i];\n')
    c_file.write('            ret->%s[i] = make_%s(val, ctx, err);\n' \
                 % (child.fixname, childname))
    c_file.write('            if (ret->%s[i] == NULL) {\n' % (child.fixname))
    c_file.write("                free_%s(ret);\n" % obj_typename)
    c_file.write("                return NULL;\n")
    c_file.write('            }\n')
    c_file.write('        }\n')
    c_file.write('    }\n')
Beispiel #7
0
def resolve_type(schema_info, name, src, cur, curfile):
    """
    Description: generate c language for parse json map string object
    Interface: None
    History: 2019-06-17
    """
    children = None
    subtyp = None
    subtypobj = None
    required = None
    refname = None

    if '$ref' in cur:
        src, cur, curfile, refname = get_ref_root(schema_info, src,
                                                  cur['$ref'], curfile)

    if "oneOf" in cur:
        cur = cur['oneOf'][0]
        if '$ref' in cur:
            return resolve_type(schema_info, name, src, cur, curfile)
        else:
            typ = cur['type']
    else:
        typ = get_typ_notoneof(schema_info, src, cur, curfile)

    node_info = GenerateNodeInfo(schema_info, name, cur, curfile)

    if helpers.valid_basic_map_name(typ):
        pass
    elif typ == 'array':
        return gen_arr_typnode(node_info, src, typ, refname)
    elif typ == 'object' or typ == 'mapStringObject':
        return gen_obj_typnode(node_info, src, typ, refname)
    elif typ == 'ArrayOfStrings':
        typ = 'array'
        subtyp = 'string'
        children = subtypobj = None
    else:
        if not judge_support_type(typ):
            raise RuntimeError("Invalid schema type: %s" % typ)
        children = None

    return helpers.Unite(name,
                         typ,
                         children,
                         subtyp=subtyp,
                         subtypobj=subtypobj,
                         subtypname=refname,
                         required=required), src
Beispiel #8
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))
Beispiel #9
0
def append_header_map_str_obj(obj, header, prefix):
    '''
    Description: Write c header file of mapStringObject
    Interface: None
    History: 2019-06-17
    '''
    child = obj.children[0]
    header.write("typedef struct {\n")
    header.write("    char **keys;\n")
    if helpers.valid_basic_map_name(child.typ):
        c_typ = helpers.get_prefixe_pointer("", child.typ, "")
    elif child.subtypname:
        c_typ = child.subtypname
    else:
        c_typ = helpers.get_prefixe_pointer(child.name, child.typ, prefix)
    header.write("    %s%s*%s;\n" % (c_typ, " " if '*' not in c_typ else "", child.fixname))
    header.write("    size_t len;\n")
Beispiel #10
0
def get_map_string_obj(obj, c_file, prefix):
    """
    Description: c language generate map string object
    Interface: None
    History: 2019-06-17
    """
    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.write('    size_t len = 0, i;\n')
    c_file.write("    if (ptr != NULL)\n")
    c_file.write("        len = ptr->len;\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_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")
    c_file.write('    if (len ||(ptr != NULL && ptr->keys != NULL && ptr->%s != NULL)) {\n' \
                 % child.fixname)
    c_file.write('        for (i = 0; i < len; i++) {\n')
    c_file.write('            char *str = ptr->keys[i] ? ptr->keys[i] : "";\n')
    c_file.write('            stat = yajl_gen_string((yajl_gen)g, \
        (const unsigned char *)str, strlen(str));\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('            stat = gen_%s(g, ptr->%s[i], ctx, err);\n' \
                 % (childname, child.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('    }\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")
    c_file.write("    if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n")
    c_file.write('        yajl_gen_config(g, yajl_gen_beautify, 1);\n')
Beispiel #11
0
def gen_obj_typnode(node_info, src, typ, refname):
    """
    Description: generate c language for parse json map string object
    Interface: None
    History: 2019-06-17
    """
    schema_info = node_info.schema_info
    name = node_info.name
    cur = node_info.cur
    curfile = node_info.curfile
    children = None
    subtyp = None
    subtypobj = None
    required = None

    if 'allOf' in cur:
        children = merge(
            resolve_list(schema_info, name, src, cur['allOf'], curfile))
    elif 'anyOf' in cur:
        children = resolve_list(schema_info, name, src, cur['anyOf'], curfile)
    elif 'patternProperties' in cur:
        children = parse_properties(schema_info, name, src, cur, curfile)
        children[0].name = children[0].name.replace('_{1,}', 'element').replace('_{2,}', \
                                                                                'element')
        children[0].fixname = "values"
        if helpers.valid_basic_map_name(children[0].typ):
            children[0].name = helpers.make_basic_map_name(children[0].typ)
    else:
        children = parse_properties(schema_info, name, src, cur, curfile) \
            if 'properties' in cur else None
    if 'required' in cur:
        required = cur['required']
    return helpers.Unite(name,\
            typ,\
            children,\
            subtyp=subtyp,\
            subtypobj=subtypobj,\
            subtypname=refname,\
            required=required), src
Beispiel #12
0
def parse_obj_type(obj, c_file, prefix, obj_typename):
    """
    Description: generate c language for parse object type
    Interface: None
    History: 2019-06-17
    """
    if obj.typ == 'string':
        c_file.write('    {\n')
        read_val_generator(c_file, 2, 'get_val(tree, "%s", yajl_t_string)' % obj.origname, \
                             "ret->%s" % obj.fixname, obj.typ, obj.origname, obj_typename)
        c_file.write('    }\n')
    elif helpers.judge_data_type(obj.typ):
        c_file.write('    {\n')
        read_val_generator(c_file, 2, 'get_val(tree, "%s", yajl_t_number)' % obj.origname, \
                             "ret->%s" % obj.fixname, obj.typ, obj.origname, obj_typename)
        c_file.write('    }\n')
    elif helpers.judge_data_pointer_type(obj.typ):
        c_file.write('    {\n')
        read_val_generator(c_file, 2, 'get_val(tree, "%s", yajl_t_number)' % obj.origname, \
                             "ret->%s" % obj.fixname, obj.typ, obj.origname, obj_typename)
        c_file.write('    }\n')
    if obj.typ == 'boolean':
        c_file.write('    {\n')
        read_val_generator(c_file, 2, 'get_val(tree, "%s", yajl_t_true)' % obj.origname, \
                             "ret->%s" % obj.fixname, obj.typ, obj.origname, obj_typename)
        c_file.write('    }\n')
    if obj.typ == 'booleanPointer':
        c_file.write('    {\n')
        read_val_generator(c_file, 2, 'get_val(tree, "%s", yajl_t_true)' % obj.origname, \
                             "ret->%s" % obj.fixname, obj.typ, obj.origname, obj_typename)
        c_file.write('    }\n')
    elif obj.typ == 'object' or obj.typ == 'mapStringObject':
        if obj.subtypname is not None:
            typename = obj.subtypname
        else:
            typename = helpers.get_prefixe_name(obj.name, prefix)
        c_file.write(
            '    ret->%s = make_%s(get_val(tree, "%s", yajl_t_object), ctx, err);\n' \
            % (obj.fixname, typename, obj.origname))
        c_file.write("    if (ret->%s == NULL && *err != 0) {\n" % obj.fixname)
        c_file.write("        free_%s(ret);\n" % obj_typename)
        c_file.write("        return NULL;\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('    {\n')
        c_file.write('        yajl_val tmp = get_val(tree, "%s", yajl_t_array);\n' \
                     % (obj.origname))
        c_file.write('        if (tmp != NULL && YAJL_GET_ARRAY(tmp) != NULL &&' \
                     ' YAJL_GET_ARRAY(tmp)->len > 0) {\n')
        c_file.write('            size_t i;\n')
        c_file.write('            ret->%s_len = YAJL_GET_ARRAY(tmp)->len;\n' %
                     (obj.fixname))
        c_file.write('            ret->%s = safe_malloc((YAJL_GET_ARRAY(tmp)->len + 1) ' \
                     '* sizeof(*ret->%s));\n' % (obj.fixname, obj.fixname))
        c_file.write(
            '            for (i = 0; i < YAJL_GET_ARRAY(tmp)->len; i++) {\n')
        c_file.write(
            '                yajl_val val = YAJL_GET_ARRAY(tmp)->values[i];\n')
        c_file.write('                ret->%s[i] = make_%s(val, ctx, err);\n' \
                     % (obj.fixname, typename))
        c_file.write('                if (ret->%s[i] == NULL) {\n' %
                     (obj.fixname))
        c_file.write("                    free_%s(ret);\n" % obj_typename)
        c_file.write("                    return NULL;\n")
        c_file.write('                }\n')
        c_file.write('            }\n')
        c_file.write('        }\n')
        c_file.write('    }\n')
    elif obj.typ == 'array' and obj.subtyp == 'byte':
        c_file.write('    {\n')
        c_file.write('        yajl_val tmp = get_val(tree, "%s", yajl_t_string);\n' \
                     % (obj.origname))
        c_file.write('        if (tmp != NULL) {\n')
        c_file.write('            char *str = YAJL_GET_STRING(tmp);\n')
        c_file.write('            ret->%s = (uint8_t *)safe_strdup(str ? str : "");\n' \
                     % obj.fixname)
        c_file.write('            ret->%s_len = str != NULL ? strlen(str) : 0;\n' \
                     % obj.fixname)
        c_file.write('        }\n')
        c_file.write('    }\n')
    elif obj.typ == 'array':
        c_file.write('    {\n')
        c_file.write('        yajl_val tmp = get_val(tree, "%s", yajl_t_array);\n' \
                     % (obj.origname))
        c_file.write('        if (tmp != NULL && YAJL_GET_ARRAY(tmp) != NULL &&'  \
                     ' YAJL_GET_ARRAY(tmp)->len > 0) {\n')
        c_file.write('            size_t i;\n')
        c_file.write('            ret->%s_len = YAJL_GET_ARRAY(tmp)->len;\n' %
                     (obj.fixname))
        c_file.write(
            '            ret->%s = safe_malloc((YAJL_GET_ARRAY(tmp)->len + 1) *' \
            ' sizeof(*ret->%s));\n' % (obj.fixname, obj.fixname))
        c_file.write(
            '            for (i = 0; i < YAJL_GET_ARRAY(tmp)->len; i++) {\n')
        read_val_generator(c_file, 4, 'YAJL_GET_ARRAY(tmp)->values[i]', \
                             "ret->%s[i]" % obj.fixname, obj.subtyp, obj.origname, obj_typename)
        c_file.write('            }\n')
        c_file.write('        }\n')
        c_file.write('    }\n')
    elif helpers.valid_basic_map_name(obj.typ):
        c_file.write('    {\n')
        c_file.write('        yajl_val tmp = get_val(tree, "%s", yajl_t_object);\n' \
                     % (obj.origname))
        c_file.write('        if (tmp != NULL) {\n')
        c_file.write('            ret->%s = make_%s(tmp, ctx, err);\n' \
                     % (obj.fixname, helpers.make_basic_map_name(obj.typ)))
        c_file.write('            if (ret->%s == NULL) {\n' % (obj.fixname))
        c_file.write('                char *new_error = NULL;\n')
        c_file.write("                if (asprintf(&new_error, \"Value error for key" \
                     " '%s': %%s\", *err ? *err : \"null\") < 0) {\n" % (obj.origname))
        c_file.write('                    new_error = safe_strdup(' \
                     '"error allocating memory");\n')
        c_file.write('                }\n')
        c_file.write('                free(*err);\n')
        c_file.write('                *err = new_error;\n')
        c_file.write('                free_%s(ret);\n' % obj_typename)
        c_file.write('                return NULL;\n')
        c_file.write('            }\n')
        c_file.write('        }\n')
        c_file.write('    }\n')
Beispiel #13
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")
Beispiel #14
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)))
Beispiel #15
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")