add some helper functions for json in str_t

This commit is contained in:
xianjimli 2020-03-18 08:20:13 +08:00
parent 29297fcb4a
commit 91373e9348
4 changed files with 160 additions and 4 deletions

View File

@ -1,15 +1,16 @@
# 最新动态
* 2020/03/18
* 增加 cjson。
* str 中增加了辅助一些 json 打包的函数。
* 2020/03/17
* 修复在 ubuntu 编译 fb_gl 模式下出现编译出错的问题(感谢智明提供补丁)。
* 修复圆角矩形半径为负数时候出现的bug感谢智明提供补丁
* 修复圆角矩形半径为负数时候出现的 bug感谢智明提供补丁
* progress circle 支持 line cap 属性。
* 增加 vgcanvas\_line\_join\_t 定义。
* 增加 vgcanvas\_line\_cap\_t 定义。
* 更新文档和idl.json
* 修改 dragger 放在list view中的问题感谢大恒提供补丁
* 更新文档和 idl.json
* 修改 dragger 放在 list view 中的问题(感谢大恒提供补丁)。
* 完善 combo_box (感谢尧燊提供补丁)。
* 完善 edit感谢尧燊提供补丁
* 完善 slide menu感谢尧燊提供补丁

View File

@ -578,3 +578,70 @@ ret_t str_pop(str_t* str) {
return RET_OK;
}
ret_t str_append_double(str_t* str, const char* format, double value) {
char buff[64];
const char* fmt = format != NULL ? format : "%.4lf";
return_value_if_fail(str != NULL, RET_BAD_PARAMS);
tk_snprintf(buff, sizeof(buff), fmt, value);
return str_append(str, buff);
}
ret_t str_append_json_str(str_t* str, const char* json_str) {
const char* p = json_str;
return_value_if_fail(str != NULL, RET_BAD_PARAMS);
return_value_if_fail(str_append_char(str, '\"') == RET_OK, RET_OOM);
if (p != NULL) {
while (*p) {
if (*p == '\"') {
return_value_if_fail(str_append_char(str, '\\') == RET_OK, RET_OOM);
}
return_value_if_fail(str_append_char(str, *p) == RET_OK, RET_OOM);
p++;
}
}
return_value_if_fail(str_append_char(str, '\"') == RET_OK, RET_OOM);
return RET_OK;
}
ret_t str_append_json_int_pair(str_t* str, const char* key, int32_t value) {
return_value_if_fail(str != NULL && key != NULL, RET_BAD_PARAMS);
return_value_if_fail(str_append_json_str(str, key) == RET_OK, RET_OOM);
return_value_if_fail(str_append_char(str, ':') == RET_OK, RET_OOM);
return_value_if_fail(str_append_int(str, value) == RET_OK, RET_OOM);
return RET_OK;
}
ret_t str_append_json_str_pair(str_t* str, const char* key, const char* value) {
return_value_if_fail(str != NULL && key != NULL && value != NULL, RET_BAD_PARAMS);
return_value_if_fail(str_append_json_str(str, key) == RET_OK, RET_OOM);
return_value_if_fail(str_append_char(str, ':') == RET_OK, RET_OOM);
return_value_if_fail(str_append_json_str(str, value) == RET_OK, RET_OOM);
return RET_OK;
}
ret_t str_append_json_double_pair(str_t* str, const char* key, double value) {
return_value_if_fail(str != NULL && key != NULL, RET_BAD_PARAMS);
return_value_if_fail(str_append_json_str(str, key) == RET_OK, RET_OOM);
return_value_if_fail(str_append_char(str, ':') == RET_OK, RET_OOM);
return_value_if_fail(str_append_double(str, NULL, value) == RET_OK, RET_OOM);
return RET_OK;
}
ret_t str_append_json_bool_pair(str_t* str, const char* key, bool_t value) {
return_value_if_fail(str != NULL && key != NULL, RET_BAD_PARAMS);
return_value_if_fail(str_append_json_str(str, key) == RET_OK, RET_OOM);
return_value_if_fail(str_append_char(str, ':') == RET_OK, RET_OOM);
return_value_if_fail(str_append(str, value ? "true" : "false") == RET_OK, RET_OOM);
return RET_OK;
}

View File

@ -204,6 +204,71 @@ ret_t str_append_char(str_t* str, char c);
*/
ret_t str_append_int(str_t* str, int32_t value);
/**
* @method str_append_double
*
* @param {str_t*} str str对象
* @param {const char*} format
* @param {double} value
*
* @return {ret_t} RET_OK表示成功
*/
ret_t str_append_double(str_t* str, const char* format, double value);
/**
* @method str_append_json_str
* \"
* @param {str_t*} str str对象
* @param {const char*} json_str
*
* @return {ret_t} RET_OK表示成功
*/
ret_t str_append_json_str(str_t* str, const char* json_str);
/**
* @method str_append_json_int_pair
* int格式的json键值对
* @param {str_t*} str str对象
* @param {const char*} key
* @param {int32_t} value
*
* @return {ret_t} RET_OK表示成功
*/
ret_t str_append_json_int_pair(str_t* str, const char* key, int32_t value);
/**
* @method str_append_json_str_pair
* json键值对
* @param {str_t*} str str对象
* @param {const char*} key
* @param {const char*} value
*
* @return {ret_t} RET_OK表示成功
*/
ret_t str_append_json_str_pair(str_t* str, const char* key, const char* value);
/**
* @method str_append_json_double_pair
* doube格式的json键值对
* @param {str_t*} str str对象
* @param {const char*} key
* @param {double} value
*
* @return {ret_t} RET_OK表示成功
*/
ret_t str_append_json_double_pair(str_t* str, const char* key, double value);
/**
* @method str_append_json_double_pair
* bool格式的json键值对
* @param {str_t*} str str对象
* @param {const char*} key
* @param {bool_t} value
*
* @return {ret_t} RET_OK表示成功
*/
ret_t str_append_json_bool_pair(str_t* str, const char* key, bool_t value);
/**
* @method str_pop
*

View File

@ -275,3 +275,26 @@ TEST(Str, from_wstr) {
str_reset(s);
}
TEST(Str, json) {
str_t str;
str_t* s = NULL;
s = str_init(&str, 100);
ASSERT_EQ(str_append_char(&str, '{'), RET_OK);
ASSERT_EQ(str_append_json_str_pair(&str, "name", "zhangshan"), RET_OK);
ASSERT_EQ(str_append_char(&str, ','), RET_OK);
ASSERT_EQ(str_append_json_int_pair(&str, "age", 100), RET_OK);
ASSERT_EQ(str_append_char(&str, ','), RET_OK);
ASSERT_EQ(str_append_json_double_pair(&str, "weight", 60.5), RET_OK);
ASSERT_EQ(str_append_char(&str, ','), RET_OK);
ASSERT_EQ(str_append_json_bool_pair(&str, "gender", TRUE), RET_OK);
ASSERT_EQ(str_append_char(&str, '}'), RET_OK);
ASSERT_STREQ(str.str, "{\"name\":\"zhangshan\",\"age\":100,\"weight\":60.5000,\"gender\":true}");
str_reset(s);
}