my_bool my_parse_charset_xml(MY_CHARSET_LOADER *loader, const char *buf, size_t len) { MY_XML_PARSER p; struct my_cs_file_info info; my_bool rc; my_charset_file_init(&info); my_xml_parser_create(&p); my_xml_set_enter_handler(&p,cs_enter); my_xml_set_value_handler(&p,cs_value); my_xml_set_leave_handler(&p,cs_leave); info.loader= loader; my_xml_set_user_data(&p, (void *) &info); rc= (my_xml_parse(&p,buf,len) == MY_XML_OK) ? FALSE : TRUE; my_xml_parser_free(&p); my_charset_file_free(&info); if (rc != MY_XML_OK) { const char *errstr= my_xml_error_string(&p); if (sizeof(loader->error) > 32 + strlen(errstr)) { /* We cannot use my_snprintf() here. See previous comment. */ sprintf(loader->error, "at line %d pos %d: %s", my_xml_error_lineno(&p)+1, (int) my_xml_error_pos(&p), my_xml_error_string(&p)); } } return rc; }
my_bool my_parse_charset_xml(const char *buf, uint len, int (*add_collation)(CHARSET_INFO *cs)) { MY_XML_PARSER p; struct my_cs_file_info i; my_bool rc; my_xml_parser_create(&p); my_xml_set_enter_handler(&p,cs_enter); my_xml_set_value_handler(&p,cs_value); my_xml_set_leave_handler(&p,cs_leave); i.add_collation= add_collation; my_xml_set_user_data(&p,(void*)&i); rc= (my_xml_parse(&p,buf,len) == MY_XML_OK) ? FALSE : TRUE; my_xml_parser_free(&p); return rc; }
int main(int ac, char **av) { char str[1024*64]=""; const char *fn; int f; uint len; MY_XML_PARSER p; if (ac<2) { usage(av[0]); return 0; } fn=av[1]?av[1]:"test.xml"; if ((f=open(fn,O_RDONLY))<0) { fprintf(stderr,"Err '%s'\n",fn); return 1; } len=read(f,str,sizeof(str)-1); str[len]='\0'; my_xml_parser_create(&p); my_xml_set_enter_handler(&p,bstr); my_xml_set_value_handler(&p,dstr); my_xml_set_leave_handler(&p,estr); if (MY_XML_OK!=(f=my_xml_parse(&p,str,len))) { printf("ERROR at line %d pos %d '%s'\n", my_xml_error_lineno(&p)+1, my_xml_error_pos(&p), my_xml_error_string(&p)); } my_xml_parser_free(&p); return 0; }