tests/test_json_parser.c OK.

vote_node
YuQing 2022-06-03 22:03:31 +08:00
parent 5f34bc872b
commit 009d33480f
3 changed files with 77 additions and 48 deletions

View File

@ -308,8 +308,9 @@ static inline void json_quote_string(fc_json_context_t
*buff = p; *buff = p;
} }
const BufferInfo *fc_encode_json_array(fc_json_context_t *context, int fc_encode_json_array_ex(fc_json_context_t *context,
const string_t *elements, const int count) const string_t *elements, const int count,
BufferInfo *buffer)
{ {
const string_t *el; const string_t *el;
const string_t *end; const string_t *end;
@ -322,17 +323,17 @@ const BufferInfo *fc_encode_json_array(fc_json_context_t *context,
expect_size += 6 * el->len + 3; expect_size += 6 * el->len + 3;
} }
if (context->output.alloc_size < expect_size) { if (buffer->alloc_size < expect_size) {
if ((context->error_no=fc_realloc_buffer(&context->output, if ((context->error_no=fc_realloc_buffer(buffer, context->
context->init_buff_size, expect_size)) != 0) init_buff_size, expect_size)) != 0)
{ {
context->error_info.len = snprintf(context->error_info.str, context->error_info.len = snprintf(context->error_info.str,
context->error_size, "realloc buffer fail"); context->error_size, "realloc buffer fail");
return NULL; return context->error_no;
} }
} }
p = context->output.buff; p = buffer->buff;
*p++ = '['; *p++ = '[';
for (el=elements; el<end; el++) { for (el=elements; el<end; el++) {
if (el > elements) { if (el > elements) {
@ -344,12 +345,13 @@ const BufferInfo *fc_encode_json_array(fc_json_context_t *context,
*p++ = ']'; *p++ = ']';
*p = '\0'; *p = '\0';
context->output.length = p - context->output.buff; buffer->length = p - buffer->buff;
return &context->output; return 0;
} }
const BufferInfo *fc_encode_json_map(fc_json_context_t *context, int fc_encode_json_map_ex(fc_json_context_t *context,
const key_value_pair_t *elements, const int count) const key_value_pair_t *elements, const int count,
BufferInfo *buffer)
{ {
const key_value_pair_t *pair; const key_value_pair_t *pair;
const key_value_pair_t *end; const key_value_pair_t *end;
@ -362,17 +364,17 @@ const BufferInfo *fc_encode_json_map(fc_json_context_t *context,
expect_size += 6 * (pair->key.len + pair->value.len) + 5; expect_size += 6 * (pair->key.len + pair->value.len) + 5;
} }
if (context->output.alloc_size < expect_size) { if (buffer->alloc_size < expect_size) {
if ((context->error_no=fc_realloc_buffer(&context->output, if ((context->error_no=fc_realloc_buffer(buffer, context->
context->init_buff_size, expect_size)) != 0) init_buff_size, expect_size)) != 0)
{ {
context->error_info.len = snprintf(context->error_info.str, context->error_info.len = snprintf(context->error_info.str,
context->error_size, "realloc buffer fail"); context->error_size, "realloc buffer fail");
return NULL; return context->error_no;
} }
} }
p = context->output.buff; p = buffer->buff;
*p++ = '{'; *p++ = '{';
for (pair=elements; pair<end; pair++) { for (pair=elements; pair<end; pair++) {
if (pair > elements) { if (pair > elements) {
@ -386,8 +388,8 @@ const BufferInfo *fc_encode_json_map(fc_json_context_t *context,
*p++ = '}'; *p++ = '}';
*p = '\0'; *p = '\0';
context->output.length = p - context->output.buff; buffer->length = p - buffer->buff;
return &context->output; return 0;
} }
const fc_json_array_t *fc_decode_json_array(fc_json_context_t const fc_json_array_t *fc_decode_json_array(fc_json_context_t

View File

@ -163,11 +163,37 @@ extern "C" {
int fc_detect_json_type(const string_t *input); int fc_detect_json_type(const string_t *input);
const BufferInfo *fc_encode_json_array(fc_json_context_t *context, int fc_encode_json_array_ex(fc_json_context_t *context,
const string_t *elements, const int count); const string_t *elements, const int count,
BufferInfo *buffer);
const BufferInfo *fc_encode_json_map(fc_json_context_t *context, int fc_encode_json_map_ex(fc_json_context_t *context,
const key_value_pair_t *elements, const int count); const key_value_pair_t *elements, const int count,
BufferInfo *buffer);
static inline const BufferInfo *fc_encode_json_array(fc_json_context_t
*context, const string_t *elements, const int count)
{
if (fc_encode_json_array_ex(context, elements, count,
&context->output) == 0)
{
return &context->output;
} else {
return NULL;
}
}
static inline const BufferInfo *fc_encode_json_map(fc_json_context_t
*context, const key_value_pair_t *elements, const int count)
{
if (fc_encode_json_map_ex(context, elements, count,
&context->output) == 0)
{
return &context->output;
} else {
return NULL;
}
}
const fc_json_array_t *fc_decode_json_array(fc_json_context_t const fc_json_array_t *fc_decode_json_array(fc_json_context_t
*context, const string_t *input); *context, const string_t *input);

View File

@ -30,9 +30,10 @@ int main(int argc, char *argv[])
{ {
int result; int result;
int json_type; int json_type;
fc_json_context_t json_ctx;
char error_info[256]; char error_info[256];
string_t input; string_t input;
string_t output; BufferInfo output;
if (argc < 2) { if (argc < 2) {
fprintf(stderr, "Usage: %s <json_string | json_array | json_map>\n", fprintf(stderr, "Usage: %s <json_string | json_array | json_map>\n",
@ -42,52 +43,52 @@ int main(int argc, char *argv[])
log_init(); log_init();
input.str = argv[1]; if ((result=fc_init_json_context_ex(&json_ctx, 1024,
input.len = strlen(input.str); error_info, sizeof(error_info))) != 0)
json_type = detect_json_type(&input);
if (json_type == FC_JSON_TYPE_ARRAY) {
json_array_t array;
if ((result=decode_json_array(&input, &array, error_info,
sizeof(error_info))) != 0)
{ {
fprintf(stderr, "decode json array fail, %s\n", error_info);
return result; return result;
} }
memset(&output, 0, sizeof(output));
if ((result=encode_json_array(&array, &output, input.str = argv[1];
error_info, sizeof(error_info))) != 0) input.len = strlen(input.str);
json_type = fc_detect_json_type(&input);
if (json_type == FC_JSON_TYPE_ARRAY) {
const fc_json_array_t *array;
if ((array=fc_decode_json_array(&json_ctx, &input)) == NULL) {
fprintf(stderr, "decode json array fail, %s\n", error_info);
return fc_json_parser_get_error_no(&json_ctx);
}
if ((result=fc_encode_json_array_ex(&json_ctx, array->elements,
array->count, &output)) != 0)
{ {
fprintf(stderr, "encode json array fail, %s\n", error_info); fprintf(stderr, "encode json array fail, %s\n", error_info);
return result; return result;
} }
printf("%s\n", output.str); printf("%.*s\n", output.length, output.buff);
free_json_string(&output);
free_json_array(&array);
} else if (json_type == FC_JSON_TYPE_MAP) { } else if (json_type == FC_JSON_TYPE_MAP) {
json_map_t map; const fc_json_map_t *map;
if ((result=decode_json_map(&input, &map, error_info, if ((map=fc_decode_json_map(&json_ctx, &input)) == NULL) {
sizeof(error_info))) != 0)
{
fprintf(stderr, "decode json map fail, %s\n", error_info); fprintf(stderr, "decode json map fail, %s\n", error_info);
return result; return fc_json_parser_get_error_no(&json_ctx);
} }
if ((result=encode_json_map(&map, &output, if ((result=fc_encode_json_map_ex(&json_ctx, map->elements,
error_info, sizeof(error_info))) != 0) map->count, &output)) != 0)
{ {
fprintf(stderr, "encode json map fail, %s\n", error_info); fprintf(stderr, "encode json map fail, %s\n", error_info);
return result; return result;
} }
printf("%s\n", output.str); printf("%.*s\n", output.length, output.buff);
free_json_string(&output);
free_json_map(&map);
} else { } else {
fprintf(stderr, "string\n"); fprintf(stderr, "string\n");
} }
fc_destroy_json_context(&json_ctx);
return 0; return 0;
} }