36 #define strtok_r strtok_s 41 #define XML_READ_BUFFSIZE 8192 44 #define XML_ROOT_DEPTH 0 46 #define IS_XML_ROOT(el) (el->def->depth == XML_ROOT_DEPTH) 73 static void XMLCALL
xml_elem_start (
void *data,
const char *parsed_el_name,
const char **attr);
74 static void XMLCALL
xml_elem_end (
void *data,
const char *parsed_el_name);
75 static void XMLCALL
xml_data_handler (
void *data,
const XML_Char * s,
int len);
77 static int xml_parse (
void *data, FILE * fp,
bool * is_finished);
98 if (xml_parse_tree ==
NULL)
110 for (i = 0; i <
count; i++)
118 return xml_parse_tree;
164 if (schema_src ==
NULL)
170 if (xml_parse_tree ==
NULL)
176 xml_parse_tree->
def = schema_src->
def;
177 xml_parse_tree->
match =
false;
180 xml_parse_tree->
prev = prev;
181 xml_parse_tree->
parent = parent;
196 return xml_parse_tree;
212 bool has_error =
false;
229 if (xml_node ==
NULL)
234 xml_node->
def = new_elem;
239 xml_node->
match =
false;
256 const char *new_elem_short_name;
267 if (new_elem_short_name ==
NULL ||
strlen (new_elem_short_name) == 0)
284 if (xml_new_node ==
NULL)
291 xml_new_node->
short_name = new_elem_short_name;
296 xml_new_node->
next = xml_node->
next;
299 xml_node->
next->
prev = xml_new_node;
301 xml_node->
next = xml_new_node;
302 xml_new_node->
prev = xml_node;
311 xml_new_node->
next = xml_node;
312 xml_node->
prev = xml_new_node;
317 xml_new_node->
prev = xml_node->
prev;
318 xml_node->
prev->
next = xml_new_node;
319 xml_new_node->
next = xml_node;
320 xml_node->
prev = xml_new_node;
339 if (xml_new_node ==
NULL)
344 xml_new_node->
parent = xml_node;
345 xml_node->
child = xml_new_node;
346 xml_new_node->
short_name = new_elem_short_name;
374 xml_node = xml_node->
child;
398 xml_node = xml_node->
child;
428 xml_node = xml_node->
next;
438 else if (el_order > 0)
479 xml_node = xml_node->
next;
488 else if (el_order > 0)
519 const char *tok_start =
NULL;
520 const char *tok_end =
NULL;
527 tok_end = strchr (tok_start,
' ');
530 tok_end = tok_start +
strlen (tok_start);
535 tok_start = tok_end + 1;
536 tok_end = strchr (tok_start,
' ');
539 tok_end = tok_start +
strlen (tok_start);
549 memcpy (short_name, tok_start, tok_end - tok_start);
550 short_name[tok_end - tok_start] =
'\0';
564 const char *result =
NULL;
569 result = strrchr (el_def->
full_name,
' ');
600 return strcmp (el->
short_name, check_el_name);
616 if (encoding ==
NULL || strcmp ((
char *) encoding,
"UTF-8"))
700 int elem_start_res = 0;
713 if (start_func !=
NULL)
715 elem_start_res = (*start_func) (pd, attr);
718 if (elem_start_res > 0)
726 else if (elem_start_res < 0)
741 assert (elem_start_res == 0);
748 if (data_func !=
NULL)
792 if (end_func !=
NULL)
795 end_res = (*end_func) (data, parsed_el_name);
845 if (data_func !=
NULL)
847 data_res = (*data_func) (data, (
const char *) s, len);
883 p = XML_ParserCreate (encoding);
891 memcpy (pd->
encoding, encoding, encoding_len);
901 XML_SetUserData (p, pd);
906 if (strcmp (encoding,
"UTF-8") == 0)
1004 XML_Parser
p =
NULL;
1006 bool is_success =
true;
1023 new_pd->
ud = pd->
ud;
1033 if (!is_success && new_pd->
sc !=
NULL)
1044 new_pd->
ce = new_pd->
sc;
1109 XML_ParsingStatus xml_status;
1123 isFinal = (feof (fp) != 0) ? 1 : 0;
1125 XML_GetParsingStatus (pd->
xml_parser, &xml_status);
1126 if (xml_status.parsing == XML_FINISHED)
1128 *is_finished =
true;
1132 if (XML_Parse (pd->
xml_parser, pd->
buf, len, isFinal) == XML_STATUS_ERROR)
1154 const char **curr_att = attrs;
1160 for (; *curr_att !=
NULL; curr_att++, curr_att++)
1162 if (strcmp (curr_att[0], att_name) == 0 && strcmp (curr_att[1], att_value) == 0)
1182 const char **curr_att = attrs;
1189 for (; *curr_att !=
NULL; curr_att++, curr_att++)
1191 if (strcmp (curr_att[0], att_name) == 0)
1193 *p_att_value = (
char *) curr_att[1];
1222 if (strcmp (cpd->
filepath, new_file) == 0)
1242 bool is_finished =
false;
static int xml_parse(void *data, FILE *fp, bool *is_finished)
XML_ELEMENT_DEF xml_elem_XML
#define XML_CUB_ERR_FILE_MISSING
static XML_ELEMENT * xml_clone_node(XML_ELEMENT *schema_src, XML_ELEMENT *parent, XML_ELEMENT *prev, bool *has_error)
static void xml_destroy_schema_tree(XML_ELEMENT *pt)
XML_PARSER_DATA * xml_create_subparser(XML_PARSER_DATA *pd, char *new_file)
#define XML_READ_BUFFSIZE
static int check_xml_elem_name(XML_ELEMENT *el, const char *check_el_name)
static void XMLCALL xml_header_validation_utf8(void *userData, const XML_Char *version, const XML_Char *encoding, int standalone)
static XML_ELEMENT * xml_init_schema_tree(XML_ELEMENT_DEF **element_array, const int count)
int(* ELEM_START_FUNC)(void *, const char **)
XML_Parser xml_init_parser(void *data, const char *xml_file, const char *encoding, XML_ELEMENT_DEF **element_array, const int count)
#define XML_CUB_OUT_OF_MEMORY
static const char * get_short_elem_name(const XML_ELEMENT_DEF *el_def)
#define XML_CUB_ERR_PARSER
#define XML_CUB_SCHEMA_BROKEN
#define XML_USER_DATA(xml)
#define XML_CUB_ERR_HEADER_ENCODING
static XML_Parser xml_init_parser_common(void *data, const char *xml_file, const char *encoding)
static int add_xml_element(XML_ELEMENT *xml_node, XML_ELEMENT_DEF *new_elem_def)
static void XMLCALL xml_elem_start(void *data, const char *parsed_el_name, const char **attr)
#define XML_CUB_ERR_FILE_READ
static bool xml_copy_schema_tree(XML_ELEMENT *src, XML_ELEMENT **dest)
void xml_parser_exec(XML_PARSER_DATA *pd)
static bool xml_check_include_loop(XML_PARSER_DATA *pd, char *new_file)
static XML_ELEMENT * select_xml_branch_node(XML_ELEMENT *xml_node, const char *sel_name)
char encoding[MAX_ENCODE_LEN]
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
FILE * fopen_ex(const char *filename, const char *type)
static void error(const char *msg)
static XML_ELEMENT * create_xml_node(XML_ELEMENT_DEF *new_elem)
int(* ELEM_DATA_FUNC)(void *, const char *, int)
int(* ELEM_END_FUNC)(void *, const char *)
void xml_destroy_parser_data(void *data)
void xml_destroy_parser(void *data)
int xml_check_att_value(const char **attrs, const char *att_name, const char *att_value)
static char * get_elem_path_token_at(const XML_ELEMENT_DEF *el_def, const int level, char *short_name)
#define XML_CUB_ERR_PARSER_INIT_FAIL
static XML_ELEMENT * select_xml_node_for_ins(XML_ELEMENT *xml_node, const char *sel_name, XML_INS_POS *insert_pos)
int xml_get_att_value(const char **attrs, const char *att_name, char **p_att_value)
#define XML_CUB_ERR_INCLUDE_LOOP
static void XMLCALL xml_elem_end(void *data, const char *parsed_el_name)
static void XMLCALL xml_data_handler(void *data, const XML_Char *s, int len)