Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
J
json-editor
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
IOPSYS
json-editor
Commits
00a29f00
Commit
00a29f00
authored
5 years ago
by
Jakob Olsson
Browse files
Options
Downloads
Patches
Plain Diff
cleanup and add some comments
parent
c870d756
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
api.c
+101
-67
101 additions, 67 deletions
api.c
with
101 additions
and
67 deletions
api.c
+
101
−
67
View file @
00a29f00
...
...
@@ -70,7 +70,7 @@ int json_object_obj_to_file(struct json_object *obj, const char *path)
{
FILE
*
out
;
int
rv
=
-
1
;
char
*
data
;
const
char
*
data
;
if
(
!
obj
)
{
fprintf
(
stderr
,
"%s error: No object provided!
\n
"
,
__func__
);
...
...
@@ -102,7 +102,7 @@ out:
return
rv
;
}
int
get_idx
(
char
*
key
,
int
*
idx
,
char
*
out
)
static
int
get_idx
(
char
*
key
,
int
*
idx
,
char
*
out
)
{
char
*
open_brace
;
int
len
=
0
;
...
...
@@ -139,7 +139,7 @@ int get_idx(char *key, int *idx, char *out)
return
len
;
}
struct
json_object
*
dummy_val
(
char
*
val
,
enum
json_type
type
)
static
struct
json_object
*
dummy_val
(
char
*
val
,
enum
json_type
type
)
{
struct
json_object
*
j_val
;
...
...
@@ -170,39 +170,52 @@ struct json_object *dummy_val(char *val, enum json_type type)
return
j_val
;
}
int
add_array
(
struct
json_object
*
ptr
,
int
*
idx
,
int
len
,
struct
json_object
*
j_val
,
enum
json_type
type
,
char
*
key
)
/**
* If key to be added is indexed, makes sure specified key is an array and selects appropriate index.
* Should the key not be an array, it will be converted to an array and appropriate indexes will be prepared.
*
*/
static
int
iterate_array
(
struct
json_object
*
src
,
int
*
idx
,
int
len
,
struct
json_object
*
j_val
,
enum
json_type
type
,
char
*
key
)
{
struct
json_object
*
tmp
,
*
tmp1
;
struct
json_object
*
val
;
if
(
len
<
1
)
return
-
1
;
if
(
!
j_val
)
return
-
1
;
json_object_object_get_ex
(
ptr
,
key
,
&
tmp
);
if
(
!
tmp
||
!
json_object_is_type
(
tmp
,
json_type_array
))
{
tmp
=
json_object_new_array
();
json_object_object_add
(
ptr
,
key
,
tmp
);
/* select key, if it does not exist or is not an array, create one */
json_object_object_get_ex
(
src
,
key
,
&
val
);
if
(
!
val
||
!
json_object_is_type
(
val
,
json_type_array
))
{
val
=
json_object_new_array
();
json_object_object_add
(
src
,
key
,
val
);
}
/* iterate every index that was appended to the key */
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
struct
json_object
*
tmp1
;
struct
json_object
*
j_idx
;
/* select specified idx from currently selected array */
j_idx
=
json_object_array_get_idx
(
val
,
idx
[
i
]);
tmp1
=
json_object_array_get_idx
(
tmp
,
idx
[
i
]);
/* if we are not at final idx, make sure next entry is an array */
if
(
i
<
len
-
1
)
{
if
(
!
tmp1
||
!
json_object_is_type
(
tmp1
,
json_type_array
))
{
tmp1
=
json_object_new_array
();
if
(
!
j_idx
||
!
json_object_is_type
(
j_idx
,
json_type_array
))
{
j_idx
=
json_object_new_array
();
if
(
idx
[
i
]
>
-
1
)
json_object_array_put_idx
(
tmp
,
idx
[
i
],
tmp1
);
json_object_array_put_idx
(
val
,
idx
[
i
],
j_idx
);
else
json_object_array_add
(
tmp
,
tmp1
);
json_object_array_add
(
val
,
j_idx
);
}
tmp
=
tmp1
;
}
else
{
val
=
j_idx
;
}
/* at final index, place passed object at specified idx */
else
{
if
(
idx
[
i
]
>
-
1
)
json_object_array_put_idx
(
tmp
,
idx
[
i
],
j_val
);
json_object_array_put_idx
(
val
,
idx
[
i
],
j_val
);
else
json_object_array_add
(
tmp
,
j_val
);
json_object_array_add
(
val
,
j_val
);
}
}
...
...
@@ -210,7 +223,19 @@ int add_array(struct json_object *ptr, int *idx, int len, struct json_object *j_
return
0
;
}
int
add_val
(
struct
json_object
*
ptr
,
char
*
key
,
char
*
val
,
enum
json_type
type
)
static
void
copy_object_into_object
(
struct
json_object
*
src
,
struct
json_object
*
dst
)
{
json_object_object_foreach
(
src
,
key
,
val
)
json_object_object_add
(
dst
,
key
,
json_object_get
(
val
));
json_object_put
(
src
);
}
/**
* Add a value key pair to src object
*
*/
static
int
add_val
(
struct
json_object
*
src
,
char
*
key
,
char
*
val
,
enum
json_type
type
)
{
struct
json_object
*
j_val
;
int
idx
[
32
];
...
...
@@ -225,32 +250,36 @@ int add_val(struct json_object *ptr, char *key, char *val, enum json_type type)
return
-
1
;
}
/* if input object is of type object we need to iterate the object and copy {key:value} into specified key */
if
(
json_type_object
==
type
)
{
if
(
len
<
1
)
{
struct
json_object
*
tmp
=
ptr
;
/* if a key is provided, place input under that key, else place in root */
if
(
key
)
{
struct
json_object
*
tmp
;
if
(
key
)
ptr
=
json_object_new_object
();
tmp
=
json_object_new_object
();
if
(
!
tmp
)
return
-
1
;
json_object_object_foreach
(
j_val
,
key1
,
val1
)
json_object_object_add
(
ptr
,
key1
,
json_object_get
(
val1
));
if
(
key
)
{
json_object_object_add
(
tmp
,
parsed_key
,
ptr
);
}
json_object_put
(
j_val
);
}
else
{
add_array
(
ptr
,
idx
,
len
,
j_val
,
type
,
parsed_key
);
}
copy_object_into_object
(
j_val
,
tmp
);
json_object_object_add
(
src
,
parsed_key
,
tmp
);
}
else
copy_object_into_object
(
j_val
,
src
);
}
else
iterate_array
(
src
,
idx
,
len
,
j_val
,
type
,
parsed_key
);
return
0
;
goto
out
;
}
/* object type is not an object, attach to provided key */
if
(
len
<
1
||
type
==
json_type_array
)
json_object_object_add
(
ptr
,
parsed_key
,
j_val
);
json_object_object_add
(
src
,
parsed_key
,
j_val
);
else
{
add
_array
(
ptr
,
idx
,
len
,
j_val
,
type
,
parsed_key
);
iterate
_array
(
src
,
idx
,
len
,
j_val
,
type
,
parsed_key
);
}
out:
return
0
;
}
...
...
@@ -259,9 +288,13 @@ int json_object_set_by_string(struct json_object **src, char *fmt, char *val, en
return
json_object_set_by_string_delimiter
(
src
,
fmt
,
val
,
type
,
"."
);
}
/**
* Generate object according to javascript style format
*
*/
int
json_object_set_by_string_delimiter
(
struct
json_object
**
src
,
char
*
fmt
,
char
*
val
,
enum
json_type
type
,
const
char
*
delimiter
)
{
struct
json_object
*
ptr
,
*
outer_obj
,
*
tmp
;
struct
json_object
*
ptr
,
*
outer_obj
,
*
j_idx
;
char
fmt_cpy
[
1024
]
=
{
0
},
parsed_key
[
32
]
=
{
0
};
char
*
p
,
*
key
=
fmt
;
int
idx
[
32
];
...
...
@@ -289,47 +322,48 @@ int json_object_set_by_string_delimiter(struct json_object **src, char *fmt, cha
len
=
get_idx
(
key
,
idx
,
parsed_key
);
/*
if we need to step further and currently marked value isnt an object, we need to overwrite i
t */
/*
as next key exists (p), we muts create an object here if it is currently not an objec
t */
json_object_object_get_ex
(
outer_obj
,
parsed_key
,
&
ptr
);
if
(
!
json_object_is_type
(
ptr
,
json_type_object
)
&&
!
json_object_is_type
(
ptr
,
json_type_array
))
{
/* we know its an object because it is not the last key */
ptr
=
json_object_new_object
();
json_object_object_add
(
outer_obj
,
parsed_key
,
ptr
);
}
if
(
len
>
0
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
if
(
ptr
&&
json_object_get_type
(
ptr
)
==
json_type_array
)
{
if
(
idx
[
i
]
>
-
1
&&
idx
[
i
]
<
json_object_array_length
(
ptr
))
{
tmp
=
json_object_array_get_idx
(
ptr
,
idx
[
i
]);
if
(
!
json_object_is_type
(
tmp
,
json_type_object
))
{
struct
json_object
*
obj
=
json_object_new_object
();
if
(
!
obj
)
return
-
1
;
json_object_array_put_idx
(
ptr
,
idx
[
i
],
obj
);
tmp
=
json_object_array_get_idx
(
ptr
,
idx
[
i
]);
}
ptr
=
tmp
;
/* if the key is indexed, we need step into the array */
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
/* make sure ptr is an array, step into specified index */
if
(
ptr
&&
json_object_get_type
(
ptr
)
==
json_type_array
)
{
if
(
idx
[
i
]
>
-
1
&&
idx
[
i
]
<
json_object_array_length
(
ptr
))
{
j_idx
=
json_object_array_get_idx
(
ptr
,
idx
[
i
]);
if
(
!
json_object_is_type
(
j_idx
,
json_type_object
))
{
struct
json_object
*
obj
=
json_object_new_object
();
if
(
!
obj
)
return
-
1
;
json_object_array_put_idx
(
ptr
,
idx
[
i
],
obj
);
j_idx
=
json_object_array_get_idx
(
ptr
,
idx
[
i
]);
}
else
{
if
(
i
==
len
-
1
)
json_object_array_add
(
ptr
,
json_object_new_object
());
else
if
(
i
<
len
-
1
)
json_object_array_add
(
ptr
,
json_object_new_array
());
ptr
=
json_object_array_get_idx
(
ptr
,
json_object_array_length
(
ptr
)
-
1
);
}
}
else
{
ptr
=
json_object_new_array
();
json_object_object_add
(
outer_obj
,
parsed_key
,
ptr
);
if
(
i
==
len
-
1
)
{
ptr
=
j_idx
;
}
else
{
if
(
i
==
len
-
1
)
json_object_array_add
(
ptr
,
json_object_new_object
());
ptr
=
json_object_array_get_idx
(
ptr
,
json_object_array_length
(
ptr
)
-
1
);
}
else
if
(
i
<
len
-
1
)
json_object_array_add
(
ptr
,
json_object_new_array
());
ptr
=
json_object_array_get_idx
(
ptr
,
json_object_array_length
(
ptr
)
-
1
);
}
}
else
{
ptr
=
json_object_new_array
();
json_object_object_add
(
outer_obj
,
parsed_key
,
ptr
);
if
(
i
==
len
-
1
)
{
json_object_array_add
(
ptr
,
json_object_new_object
());
ptr
=
json_object_array_get_idx
(
ptr
,
json_object_array_length
(
ptr
)
-
1
);
}
}
}
/*
create key object if it
does not exist */
/*
if this point is reached and ptr is not set, a key is specified which
does not exist
- create it
*/
if
(
!
ptr
)
{
ptr
=
json_object_new_object
();
if
(
json_object_get_type
(
outer_obj
)
==
json_type_array
)
...
...
@@ -379,8 +413,8 @@ int json_object_set_delimiter(struct json_object *src, char *fmt, struct json_ob
tmp
=
ptr
;
}
json_object_object_foreach
(
val
,
key
,
val
1
)
json_object_object_add
(
src
,
key
,
val
1
);
json_object_object_foreach
(
val
,
key
,
j_
val
)
json_object_object_add
(
src
,
key
,
j_
val
);
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment