15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * testRegexp.c: simple module for testing regular expressions 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Daniel Veillard <veillard@redhat.com> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_AUTOMATA_ENABLED 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlautomata.h> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int scanNumber(char **ptr) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *cur; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = *ptr; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*cur >= '0') && (*cur <= '9')) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ret * 10 + (*cur - '0'); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr = cur; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testRegexpFile(const char *filename) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE *input; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char expr[5000]; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataPtr am; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr states[1000]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegexpPtr regexp = NULL; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr exec = NULL; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i<1000;i++) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[i] = NULL; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = fopen(filename, "r"); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cannot open %s for reading\n", filename); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) am = xmlNewAutomata(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (am == NULL) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cannot create automata\n"); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(input); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[0] = xmlAutomataGetInitState(am); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[0] == NULL) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cannot get start state\n"); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeAutomata(am); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(input); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (fgets(expr, 4500, input) != NULL) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expr[0] == '#') 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = strlen(expr); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len--; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((len >= 0) && 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((expr[len] == '\n') || (expr[len] == '\t') || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (expr[len] == '\r') || (expr[len] == ' '))) len--; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expr[len + 1] = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len >= 0) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((am != NULL) && (expr[0] == 't') && (expr[1] == ' ')) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *ptr = &expr[2]; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int from, to; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from = scanNumber(&ptr); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[from] == NULL) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[from] = xmlAutomataNewState(am); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to = scanNumber(&ptr); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[to] == NULL) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[to] = xmlAutomataNewState(am); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewTransition(am, states[from], states[to], 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST ptr, NULL); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((am != NULL) && (expr[0] == 'e') && (expr[1] == ' ')) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *ptr = &expr[2]; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int from, to; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from = scanNumber(&ptr); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[from] == NULL) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[from] = xmlAutomataNewState(am); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to = scanNumber(&ptr); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[to] == NULL) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[to] = xmlAutomataNewState(am); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewEpsilon(am, states[from], states[to]); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((am != NULL) && (expr[0] == 'f') && (expr[1] == ' ')) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *ptr = &expr[2]; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = scanNumber(&ptr); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[state] == NULL) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad state %d : %s\n", state, expr); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataSetFinalState(am, states[state]); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((am != NULL) && (expr[0] == 'c') && (expr[1] == ' ')) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *ptr = &expr[2]; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int from, to; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min, max; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from = scanNumber(&ptr); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[from] == NULL) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[from] = xmlAutomataNewState(am); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to = scanNumber(&ptr); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states[to] == NULL) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states[to] = xmlAutomataNewState(am); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min = scanNumber(&ptr); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max = scanNumber(&ptr); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*ptr != ' ') { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Bad line %s\n", expr); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr++; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewCountTrans(am, states[from], states[to], 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST ptr, min, max, NULL); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((am != NULL) && (expr[0] == '-') && (expr[1] == '-')) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* end of the automata */ 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regexp = xmlAutomataCompile(am); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeAutomata(am); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) am = NULL; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (regexp == NULL) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to compile the automata"); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((expr[0] == '=') && (expr[1] == '>')) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (regexp == NULL) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("=> failed not compiled\n"); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exec == NULL) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRegNewExecCtxt(regexp, NULL, NULL); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, NULL, NULL); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("=> Passed\n"); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((ret == 0) || (ret == -1)) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("=> Failed\n"); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("=> Error\n"); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeExecCtxt(exec); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = NULL; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (regexp != NULL) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exec == NULL) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRegNewExecCtxt(regexp, NULL, NULL); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, BAD_CAST expr, NULL); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unexpected line %s\n", expr); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(input); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (regexp != NULL) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeRegexp(regexp); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (exec != NULL) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeExecCtxt(exec); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (am != NULL) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeAutomata(am); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char **argv) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlInitMemory(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argc == 1) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataPtr am; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataStatePtr start, cur; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegexpPtr regexp; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegExecCtxtPtr exec; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) am = xmlNewAutomata(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = xmlAutomataGetInitState(am); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* generate a[ba]*a */ 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlAutomataNewTransition(am, start, NULL, BAD_CAST"a", NULL); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewTransition(am, cur, cur, BAD_CAST"b", NULL); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataNewTransition(am, cur, cur, BAD_CAST"a", NULL); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlAutomataNewCountTrans(am, cur, NULL, BAD_CAST"a", 2, 3, NULL); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAutomataSetFinalState(am, cur); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* compile it in a regexp and free the automata */ 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regexp = xmlAutomataCompile(am); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeAutomata(am); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* test the regexp */ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegexpPrint(stdout, regexp); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exec = xmlRegNewExecCtxt(regexp, NULL, NULL); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, BAD_CAST"a", NULL); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret =xmlRegExecPushString(exec, BAD_CAST"b", NULL); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRegExecPushString(exec, NULL, NULL); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("final\n"); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret < 0) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("error\n"); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeExecCtxt(exec); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* free the regexp */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRegFreeRegexp(regexp); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 1;i < argc;i++) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testRegexpFile(argv[i]); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCleanupParser(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMemoryDump(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s : Automata support not compiled in\n", argv[0]); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_AUTOMATA_ENABLED */ 310