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