Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F5365547
json.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
json.c
View Options
#include
"json.h"
#include
<inttypes.h>
#include
<string.h>
void
inspector_json_init
(
inspector_json_t
*
json
,
sbuf_t
*
out
)
{
json
->
out
=
out
;
json
->
depth
=
0
;
json
->
wrote_root
=
false
;
}
static
bool
inspector_json_before_value
(
inspector_json_t
*
json
)
{
if
(
!
json
||
!
json
->
out
)
return
false
;
if
(
json
->
depth
==
0
)
{
if
(
json
->
wrote_root
)
return
false
;
json
->
wrote_root
=
true
;
return
true
;
}
inspector_json_frame_t
*
frame
=
&
json
->
stack
[
json
->
depth
-
1
];
if
(
frame
->
type
==
INSPECTOR_JSON_ARRAY
)
{
if
(
frame
->
needs_comma
&&
!
sbuf_append
(
json
->
out
,
","
))
return
false
;
frame
->
needs_comma
=
true
;
return
true
;
}
if
(
!
frame
->
expecting_value
)
return
false
;
frame
->
expecting_value
=
false
;
return
true
;
}
static
bool
inspector_json_push
(
inspector_json_t
*
json
,
inspector_json_container_t
type
)
{
if
(
json
->
depth
>=
sizeof
(
json
->
stack
)
/
sizeof
(
json
->
stack
[
0
]))
return
false
;
json
->
stack
[
json
->
depth
++
]
=
(
inspector_json_frame_t
){
.
type
=
type
,
.
needs_comma
=
false
,
.
expecting_value
=
false
,
};
return
true
;
}
static
bool
inspector_json_pop
(
inspector_json_t
*
json
,
inspector_json_container_t
type
)
{
if
(
!
json
||
json
->
depth
==
0
)
return
false
;
inspector_json_frame_t
*
frame
=
&
json
->
stack
[
json
->
depth
-
1
];
if
(
frame
->
type
!=
type
||
frame
->
expecting_value
)
return
false
;
json
->
depth
--
;
return
true
;
}
bool
inspector_json_begin_object
(
inspector_json_t
*
json
)
{
return
inspector_json_before_value
(
json
)
&&
sbuf_append
(
json
->
out
,
"{"
)
&&
inspector_json_push
(
json
,
INSPECTOR_JSON_OBJECT
);
}
bool
inspector_json_end_object
(
inspector_json_t
*
json
)
{
return
inspector_json_pop
(
json
,
INSPECTOR_JSON_OBJECT
)
&&
sbuf_append
(
json
->
out
,
"}"
);
}
bool
inspector_json_begin_array
(
inspector_json_t
*
json
)
{
return
inspector_json_before_value
(
json
)
&&
sbuf_append
(
json
->
out
,
"["
)
&&
inspector_json_push
(
json
,
INSPECTOR_JSON_ARRAY
);
}
bool
inspector_json_end_array
(
inspector_json_t
*
json
)
{
return
inspector_json_pop
(
json
,
INSPECTOR_JSON_ARRAY
)
&&
sbuf_append
(
json
->
out
,
"]"
);
}
bool
inspector_json_key
(
inspector_json_t
*
json
,
const
char
*
key
)
{
if
(
!
json
||
json
->
depth
==
0
)
return
false
;
inspector_json_frame_t
*
frame
=
&
json
->
stack
[
json
->
depth
-
1
];
if
(
frame
->
type
!=
INSPECTOR_JSON_OBJECT
||
frame
->
expecting_value
)
return
false
;
if
(
frame
->
needs_comma
&&
!
sbuf_append
(
json
->
out
,
","
))
return
false
;
if
(
!
sbuf_json_string
(
json
->
out
,
key
?
key
:
""
))
return
false
;
if
(
!
sbuf_append
(
json
->
out
,
":"
))
return
false
;
frame
->
needs_comma
=
true
;
frame
->
expecting_value
=
true
;
return
true
;
}
bool
inspector_json_raw
(
inspector_json_t
*
json
,
const
char
*
raw
)
{
return
inspector_json_before_value
(
json
)
&&
sbuf_append
(
json
->
out
,
raw
?
raw
:
"null"
);
}
bool
inspector_json_string
(
inspector_json_t
*
json
,
const
char
*
value
)
{
return
inspector_json_string_len
(
json
,
value
?
value
:
""
,
value
?
strlen
(
value
)
:
0
);
}
bool
inspector_json_string_len
(
inspector_json_t
*
json
,
const
char
*
value
,
size_t
len
)
{
return
inspector_json_before_value
(
json
)
&&
sbuf_json_string_len
(
json
->
out
,
value
?
value
:
""
,
value
?
len
:
0
);
}
bool
inspector_json_bool
(
inspector_json_t
*
json
,
bool
value
)
{
return
inspector_json_raw
(
json
,
value
?
"true"
:
"false"
);
}
bool
inspector_json_int
(
inspector_json_t
*
json
,
int
value
)
{
if
(
!
inspector_json_before_value
(
json
))
return
false
;
return
sbuf_appendf
(
json
->
out
,
"%d"
,
value
);
}
bool
inspector_json_uint64
(
inspector_json_t
*
json
,
uint64_t
value
)
{
if
(
!
inspector_json_before_value
(
json
))
return
false
;
return
sbuf_appendf
(
json
->
out
,
"%"
PRIu64
,
value
);
}
bool
inspector_json_size
(
inspector_json_t
*
json
,
size_t
value
)
{
if
(
!
inspector_json_before_value
(
json
))
return
false
;
return
sbuf_appendf
(
json
->
out
,
"%zu"
,
value
);
}
bool
inspector_json_double
(
inspector_json_t
*
json
,
double
value
)
{
if
(
!
inspector_json_before_value
(
json
))
return
false
;
return
sbuf_appendf
(
json
->
out
,
"%.6f"
,
value
);
}
bool
inspector_json_null
(
inspector_json_t
*
json
)
{
return
inspector_json_raw
(
json
,
"null"
);
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Sun, May 17, 5:46 AM (1 d, 22 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
554534
Default Alt Text
json.c (3 KB)
Attached To
Mode
rANT Ant
Attached
Detach File
Event Timeline
Log In to Comment