Files
luban-lite/packages/third-party/awtk-ui/awtk/src/conf_io/conf_node.h

771 lines
18 KiB
C
Raw Normal View History

2023-11-09 20:19:51 +08:00
/**
* File: conf_node.h
* Author: AWTK Develop Team
* Brief: conf node
*
* Copyright (c) 2020 - 2023 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-05-11 Li XianJing <xianjimli@hotmail.com> created
*
*/
#ifndef TK_CONF_NODE_H
#define TK_CONF_NODE_H
#include "tkc/types_def.h"
#include "tkc/value.h"
#include "tkc/tokenizer.h"
BEGIN_C_DECLS
struct _conf_node_t;
typedef struct _conf_node_t conf_node_t;
/**
* @class conf_doc_t
*
*/
typedef struct _conf_doc_t {
/**
* @property {conf_node_t*} root
*
*/
conf_node_t* root;
/*private*/
conf_node_t* prealloc_nodes;
uint32_t prealloc_nodes_index;
uint32_t prealloc_nodes_used;
uint32_t prealloc_nodes_nr;
tokenizer_t tokenizer;
uint32_t max_deep_level;
} conf_doc_t;
/**
* @method conf_doc_create
*
*
*
* @param {uint32_t} prealloc_nodes_nr
*
* @return {conf_doc_t*} doc对象
*/
conf_doc_t* conf_doc_create(uint32_t prealloc_nodes_nr);
/**
* @method conf_doc_create_node
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} name
*
* @return {conf_node_t*}
*/
conf_node_t* conf_doc_create_node(conf_doc_t* doc, const char* name);
/**
* @method conf_doc_destroy_node
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_destroy_node(conf_doc_t* doc, conf_node_t* node);
/**
* @method conf_doc_append_sibling
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {conf_node_t*} sibling
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_append_sibling(conf_doc_t* doc, conf_node_t* node, conf_node_t* sibling);
/**
* @method conf_doc_dup_node
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {const char*} new_name
*
* @return {conf_node_t*}
*/
conf_node_t* conf_doc_dup_node(conf_doc_t* doc, conf_node_t* node, const char* new_name);
/**
* @method conf_doc_set_node_prop
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {const char*} name
* @param {const value_t*} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_set_node_prop(conf_doc_t* doc, conf_node_t* node, const char* name,
const value_t* v);
/**
* @method conf_doc_find_node
*
* path查找节点
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {const char*} path
* @param {bool_t} create_if_not_exist
*
* @return {conf_node_t*} RET_OK表示成功
*/
conf_node_t* conf_doc_find_node(conf_doc_t* doc, conf_node_t* node, const char* path,
bool_t create_if_not_exist);
/**
* @method conf_doc_append_child
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {conf_node_t*} child
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_append_child(conf_doc_t* doc, conf_node_t* node, conf_node_t* child);
/**
* @method conf_doc_remove_sibling
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {conf_node_t*} sibling
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_remove_sibling(conf_doc_t* doc, conf_node_t* node, conf_node_t* sibling);
/**
* @method conf_doc_remove_child
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {conf_node_t*} child
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_remove_child(conf_doc_t* doc, conf_node_t* node, conf_node_t* child);
/**
* @method conf_doc_remove_child_by_name
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {const char*} name
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_remove_child_by_name(conf_doc_t* doc, conf_node_t* node, const char* name);
/**
* @method conf_doc_remove_children
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_remove_children(conf_doc_t* doc, conf_node_t* node);
/**
* @method conf_doc_set
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {const value_t*} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_set(conf_doc_t* doc, const char* path, const value_t* v);
/**
* @method conf_doc_set_int
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {int32_t} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_set_int(conf_doc_t* doc, const char* path, int32_t v);
/**
* @method conf_doc_set_bool
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {bool_t} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_set_bool(conf_doc_t* doc, const char* path, bool_t v);
/**
* @method conf_doc_set_float
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {float} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_set_float(conf_doc_t* doc, const char* path, float v);
/**
* @method conf_doc_set_str
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {const char*} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_set_str(conf_doc_t* doc, const char* path, const char* v);
/**
* @method conf_doc_get
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {value_t*} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_get(conf_doc_t* doc, const char* path, value_t* v);
/**
* @method conf_doc_get_ex
*
*
*
* @param {conf_doc_t*} doc
* @param {conf_node_t*} node
* @param {const char*} path
* @param {value_t*} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_get_ex(conf_doc_t* doc, conf_node_t* node, const char* path, value_t* v);
/**
* @method conf_doc_get_int
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {int32_t} defval
*
* @return {int32_t}
*/
int32_t conf_doc_get_int(conf_doc_t* doc, const char* path, int32_t defval);
/**
* @method conf_doc_get_bool
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {bool_t} defval
*
* @return {bool_t}
*/
bool_t conf_doc_get_bool(conf_doc_t* doc, const char* path, bool_t defval);
/**
* @method conf_doc_get_float
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {float} defval
*
* @return {float}
*/
float conf_doc_get_float(conf_doc_t* doc, const char* path, float defval);
/**
* @method conf_doc_get_str
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
* @param {const char*} defval
*
* @return {const char*}
*/
const char* conf_doc_get_str(conf_doc_t* doc, const char* path, const char* defval);
/**
* @method conf_doc_remove
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_remove(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_clear
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_clear(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_move_up
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_move_up(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_move_down
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_move_down(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_exists
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {bool_t} TRUE表示成功FALSE表示失败
*/
bool_t conf_doc_exists(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_is_first
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {bool_t} TRUE表示是
*/
bool_t conf_doc_is_first(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_is_last
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {bool_t} TRUE表示是
*/
bool_t conf_doc_is_last(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_add_child
*
*
*
* @param {conf_doc_t*} doc
* @param {const char*} path
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_add_child(conf_doc_t* doc, const char* path);
/**
* @method conf_doc_destroy
*
*
*
* @param {conf_doc_t*} doc
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_doc_destroy(conf_doc_t* doc);
/**
* @enum conf_node_type_t
* @prefix CONF_NODE_
*
*/
typedef enum _conf_node_type_t {
/**
* @const CONF_NODE_NONE
*
*/
CONF_NODE_NONE = 0,
/**
* @const CONF_NODE_OBJECT
*
*/
CONF_NODE_OBJECT,
/**
* @const CONF_NODE_ARRAY
*
*/
CONF_NODE_ARRAY,
/**
* @const CONF_NODE_SIMPLE
*
*/
CONF_NODE_SIMPLE
} conf_node_type_t;
/**
* @enum conf_node_value_t
* @prefix CONF_NODE_VALUE_
*
*/
typedef enum _conf_node_value_t {
/**
* @const CONF_NODE_VALUE_NONE
*
*/
CONF_NODE_VALUE_NONE = 0,
/**
* @const CONF_NODE_VALUE_BOOL
* bool_t类型
*/
CONF_NODE_VALUE_BOOL,
/**
* @const CONF_NODE_VALUE_INT8
* int8_t类型
*/
CONF_NODE_VALUE_INT8,
/**
* @const CONF_NODE_VALUE_UINT8
* uint8_t类型
*/
CONF_NODE_VALUE_UINT8,
/**
* @const CONF_NODE_VALUE_INT16
* int16_t类型
*/
CONF_NODE_VALUE_INT16,
/**
* @const CONF_NODE_VALUE_UINT16
* uint16_t类型
*/
CONF_NODE_VALUE_UINT16,
/**
* @const CONF_NODE_VALUE_INT32
* int32_t类型
*/
CONF_NODE_VALUE_INT32,
/**
* @const CONF_NODE_VALUE_UINT32
* uint32_t类型
*/
CONF_NODE_VALUE_UINT32,
/**
* @const CONF_NODE_VALUE_INT64
* int64_t类型
*/
CONF_NODE_VALUE_INT64,
/**
* @const CONF_NODE_VALUE_UINT64
* uint64_t类型
*/
CONF_NODE_VALUE_UINT64,
/**
* @const CONF_NODE_VALUE_FLOAT32
* float类型
*/
CONF_NODE_VALUE_FLOAT32,
/**
* @const CONF_NODE_VALUE_DOUBLE
* double类型
*/
CONF_NODE_VALUE_DOUBLE,
/**
* @const CONF_NODE_VALUE_STRING
*
*/
CONF_NODE_VALUE_STRING,
/**
* @const CONF_NODE_VALUE_WSTRING
*
*/
CONF_NODE_VALUE_WSTRING,
/**
* @const CONF_NODE_VALUE_SMALL_STR
* (len<=7)
*/
CONF_NODE_VALUE_SMALL_STR,
/**
* @const CONF_NODE_VALUE_NODE
*
*/
CONF_NODE_VALUE_NODE
} conf_node_value_t;
/**
* @class conf_node_t
*
*
*/
struct _conf_node_t {
/**
* @property {conf_node_t*} next
*
*/
conf_node_t* next;
/**
* @property {conf_node_t*} parent
*
*/
conf_node_t* parent;
/**
* @property {uint8_t} value_type
*
*/
uint8_t value_type : 4;
/**
* @property {uint8_t} node_type
*
*/
uint8_t node_type : 3;
/*private*/
uint8_t is_small_name : 1;
union {
char* str;
char small_str[8];
} name;
union {
bool_t b;
int8_t i8;
uint8_t u8;
int16_t i16;
uint16_t u16;
int32_t i32;
uint32_t u32;
int64_t i64;
uint64_t u64;
float f32;
double f64;
char* str;
wchar_t* wstr;
char small_str[8];
conf_node_t* first_child;
} value;
};
/**
* @method conf_node_get_name
*
*
*
* @param {conf_node_t*} node
*
* @return {const char*}
*/
const char* conf_node_get_name(conf_node_t* node);
/**
* @method conf_node_find_child
*
*
*
* @param {conf_node_t*} node
* @param {const char*} name
*
* @return {conf_node_t*}
*/
conf_node_t* conf_node_find_child(conf_node_t* node, const char* name);
/**
* @method conf_node_find_child_by_index
*
*
*
* @param {conf_node_t*} node
* @param {int32_t} index
*
* @return {conf_node_t*}
*/
conf_node_t* conf_node_find_child_by_index(conf_node_t* node, int32_t index);
/**
* @method conf_node_find_sibling
*
*
*
* @param {conf_node_t*} node
* @param {const char*} name
*
* @return {conf_node_t*}
*/
conf_node_t* conf_node_find_sibling(conf_node_t* node, const char* name);
/**
* @method conf_node_set_value
*
*
*
* @param {conf_node_t*} node
* @param {const value_t*} v
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_node_set_value(conf_node_t* node, const value_t* v);
/**
* @method conf_node_get_value
*
*
*
* @param {conf_node_t*} node
* @param {value_t*} v ()
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_node_get_value(conf_node_t* node, value_t* v);
/**
* @method conf_node_get_child_value
*
*
*
* @param {conf_node_t*} node
* @param {const char*} name
* @param {value_t*} v ()
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_node_get_child_value(conf_node_t* node, const char* name, value_t* v);
/**
* @method conf_node_get_child_value_by_index
*
*
*
* @param {conf_node_t*} node
* @param {uint32_t} index
* @param {value_t*} v ()
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_node_get_child_value_by_index(conf_node_t* node, uint32_t index, value_t* v);
/**
* @method conf_node_get_first_child
*
*
*
* @param {conf_node_t*} node
*
* @return {conf_node_t*}
*/
conf_node_t* conf_node_get_first_child(conf_node_t* node);
/**
* @method conf_node_set_first_child
*
*
*
* @param {conf_node_t*} node
* @param {conf_node_t*} child
*
* @return {ret_t} RET_OK表示成功
*/
ret_t conf_node_set_first_child(conf_node_t* node, conf_node_t* child);
/**
* @method conf_node_count_children
*
*
*
* @param {conf_node_t*} node
*
* @return {uint32_t}
*/
uint32_t conf_node_count_children(conf_node_t* node);
#define CONF_NODE_ROOT_NAME "root"
#define CONF_SPECIAL_ATTR_SIZE "#size"
#define CONF_SPECIAL_ATTR_NAME "#name"
#define CONF_SPECIAL_ATTR_INDEX "#index"
END_C_DECLS
#endif /*TK_CONF_NODE_H*/