Blame testAutomata.c

Packit Service a31ea6
/*
Packit Service a31ea6
 * testRegexp.c: simple module for testing regular expressions
Packit Service a31ea6
 *
Packit Service a31ea6
 * See Copyright for the status of this software.
Packit Service a31ea6
 *
Packit Service a31ea6
 * Daniel Veillard <veillard@redhat.com>
Packit Service a31ea6
 */
Packit Service a31ea6
Packit Service a31ea6
#include "libxml.h"
Packit Service a31ea6
#ifdef LIBXML_AUTOMATA_ENABLED
Packit Service a31ea6
#include <string.h>
Packit Service a31ea6
Packit Service a31ea6
#include <libxml/tree.h>
Packit Service a31ea6
#include <libxml/xmlautomata.h>
Packit Service a31ea6
Packit Service a31ea6
static int scanNumber(char **ptr) {
Packit Service a31ea6
    int ret = 0;
Packit Service a31ea6
    char *cur;
Packit Service a31ea6
Packit Service a31ea6
    cur = *ptr;
Packit Service a31ea6
    while ((*cur >= '0') && (*cur <= '9')) {
Packit Service a31ea6
	ret = ret * 10 + (*cur - '0');
Packit Service a31ea6
	cur++;
Packit Service a31ea6
    }
Packit Service a31ea6
    *ptr = cur;
Packit Service a31ea6
    return(ret);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
static void
Packit Service a31ea6
testRegexpFile(const char *filename) {
Packit Service a31ea6
    FILE *input;
Packit Service a31ea6
    char expr[5000];
Packit Service a31ea6
    int len;
Packit Service a31ea6
    int ret;
Packit Service a31ea6
    int i;
Packit Service a31ea6
    xmlAutomataPtr am;
Packit Service a31ea6
    xmlAutomataStatePtr states[1000];
Packit Service a31ea6
    xmlRegexpPtr regexp = NULL;
Packit Service a31ea6
    xmlRegExecCtxtPtr exec = NULL;
Packit Service a31ea6
Packit Service a31ea6
    for (i = 0;i<1000;i++)
Packit Service a31ea6
	states[i] = NULL;
Packit Service a31ea6
Packit Service a31ea6
    input = fopen(filename, "r");
Packit Service a31ea6
    if (input == NULL) {
Packit Service a31ea6
        xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
		"Cannot open %s for reading\n", filename);
Packit Service a31ea6
	return;
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
    am = xmlNewAutomata();
Packit Service a31ea6
    if (am == NULL) {
Packit Service a31ea6
        xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
		"Cannot create automata\n");
Packit Service a31ea6
	fclose(input);
Packit Service a31ea6
	return;
Packit Service a31ea6
    }
Packit Service a31ea6
    states[0] = xmlAutomataGetInitState(am);
Packit Service a31ea6
    if (states[0] == NULL) {
Packit Service a31ea6
        xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
		"Cannot get start state\n");
Packit Service a31ea6
	xmlFreeAutomata(am);
Packit Service a31ea6
	fclose(input);
Packit Service a31ea6
	return;
Packit Service a31ea6
    }
Packit Service a31ea6
    ret = 0;
Packit Service a31ea6
Packit Service a31ea6
    while (fgets(expr, 4500, input) != NULL) {
Packit Service a31ea6
	if (expr[0] == '#')
Packit Service a31ea6
	    continue;
Packit Service a31ea6
	len = strlen(expr);
Packit Service a31ea6
	len--;
Packit Service a31ea6
	while ((len >= 0) &&
Packit Service a31ea6
	       ((expr[len] == '\n') || (expr[len] == '\t') ||
Packit Service a31ea6
		(expr[len] == '\r') || (expr[len] == ' '))) len--;
Packit Service a31ea6
	expr[len + 1] = 0;
Packit Service a31ea6
	if (len >= 0) {
Packit Service a31ea6
	    if ((am != NULL) && (expr[0] == 't') && (expr[1] == ' ')) {
Packit Service a31ea6
		char *ptr = &expr[2];
Packit Service a31ea6
		int from, to;
Packit Service a31ea6
Packit Service a31ea6
		from = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		if (states[from] == NULL)
Packit Service a31ea6
		    states[from] = xmlAutomataNewState(am);
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		to = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		if (states[to] == NULL)
Packit Service a31ea6
		    states[to] = xmlAutomataNewState(am);
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		xmlAutomataNewTransition(am, states[from], states[to],
Packit Service a31ea6
			                 BAD_CAST ptr, NULL);
Packit Service a31ea6
	    } else if ((am != NULL) && (expr[0] == 'e') && (expr[1] == ' ')) {
Packit Service a31ea6
		char *ptr = &expr[2];
Packit Service a31ea6
		int from, to;
Packit Service a31ea6
Packit Service a31ea6
		from = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		if (states[from] == NULL)
Packit Service a31ea6
		    states[from] = xmlAutomataNewState(am);
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		to = scanNumber(&ptr);
Packit Service a31ea6
		if (states[to] == NULL)
Packit Service a31ea6
		    states[to] = xmlAutomataNewState(am);
Packit Service a31ea6
		xmlAutomataNewEpsilon(am, states[from], states[to]);
Packit Service a31ea6
	    } else if ((am != NULL) && (expr[0] == 'f') && (expr[1] == ' ')) {
Packit Service a31ea6
		char *ptr = &expr[2];
Packit Service a31ea6
		int state;
Packit Service a31ea6
Packit Service a31ea6
		state = scanNumber(&ptr);
Packit Service a31ea6
		if (states[state] == NULL) {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad state %d : %s\n", state, expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		xmlAutomataSetFinalState(am, states[state]);
Packit Service a31ea6
	    } else if ((am != NULL) && (expr[0] == 'c') && (expr[1] == ' ')) {
Packit Service a31ea6
		char *ptr = &expr[2];
Packit Service a31ea6
		int from, to;
Packit Service a31ea6
		int min, max;
Packit Service a31ea6
Packit Service a31ea6
		from = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		if (states[from] == NULL)
Packit Service a31ea6
		    states[from] = xmlAutomataNewState(am);
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		to = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		if (states[to] == NULL)
Packit Service a31ea6
		    states[to] = xmlAutomataNewState(am);
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		min = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		max = scanNumber(&ptr);
Packit Service a31ea6
		if (*ptr != ' ') {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Bad line %s\n", expr);
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
		ptr++;
Packit Service a31ea6
		xmlAutomataNewCountTrans(am, states[from], states[to],
Packit Service a31ea6
			                 BAD_CAST ptr, min, max, NULL);
Packit Service a31ea6
	    } else if ((am != NULL) && (expr[0] == '-') && (expr[1] == '-')) {
Packit Service a31ea6
		/* end of the automata */
Packit Service a31ea6
		regexp = xmlAutomataCompile(am);
Packit Service a31ea6
		xmlFreeAutomata(am);
Packit Service a31ea6
		am = NULL;
Packit Service a31ea6
		if (regexp == NULL) {
Packit Service a31ea6
		    xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			    "Failed to compile the automata");
Packit Service a31ea6
		    break;
Packit Service a31ea6
		}
Packit Service a31ea6
	    } else if ((expr[0] == '=') && (expr[1] == '>')) {
Packit Service a31ea6
		if (regexp == NULL) {
Packit Service a31ea6
		    printf("=> failed not compiled\n");
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    if (exec == NULL)
Packit Service a31ea6
			exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
Packit Service a31ea6
		    if (ret == 0) {
Packit Service a31ea6
			ret = xmlRegExecPushString(exec, NULL, NULL);
Packit Service a31ea6
		    }
Packit Service a31ea6
		    if (ret == 1)
Packit Service a31ea6
			printf("=> Passed\n");
Packit Service a31ea6
		    else if ((ret == 0) || (ret == -1))
Packit Service a31ea6
			printf("=> Failed\n");
Packit Service a31ea6
		    else if (ret < 0)
Packit Service a31ea6
			printf("=> Error\n");
Packit Service a31ea6
		    xmlRegFreeExecCtxt(exec);
Packit Service a31ea6
		    exec = NULL;
Packit Service a31ea6
		}
Packit Service a31ea6
		ret = 0;
Packit Service a31ea6
	    } else if (regexp != NULL) {
Packit Service a31ea6
		if (exec == NULL)
Packit Service a31ea6
		    exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
Packit Service a31ea6
		ret = xmlRegExecPushString(exec, BAD_CAST expr, NULL);
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
			"Unexpected line %s\n", expr);
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
    }
Packit Service a31ea6
    fclose(input);
Packit Service a31ea6
    if (regexp != NULL)
Packit Service a31ea6
	xmlRegFreeRegexp(regexp);
Packit Service a31ea6
    if (exec != NULL)
Packit Service a31ea6
	xmlRegFreeExecCtxt(exec);
Packit Service a31ea6
    if (am != NULL)
Packit Service a31ea6
	xmlFreeAutomata(am);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
int main(int argc, char **argv) {
Packit Service a31ea6
Packit Service a31ea6
    xmlInitMemory();
Packit Service a31ea6
Packit Service a31ea6
    if (argc == 1) {
Packit Service a31ea6
	int ret;
Packit Service a31ea6
	xmlAutomataPtr am;
Packit Service a31ea6
	xmlAutomataStatePtr start, cur;
Packit Service a31ea6
	xmlRegexpPtr regexp;
Packit Service a31ea6
	xmlRegExecCtxtPtr exec;
Packit Service a31ea6
Packit Service a31ea6
	am = xmlNewAutomata();
Packit Service a31ea6
	start = xmlAutomataGetInitState(am);
Packit Service a31ea6
Packit Service a31ea6
	/* generate a[ba]*a */
Packit Service a31ea6
	cur = xmlAutomataNewTransition(am, start, NULL, BAD_CAST"a", NULL);
Packit Service a31ea6
	xmlAutomataNewTransition(am, cur, cur, BAD_CAST"b", NULL);
Packit Service a31ea6
	xmlAutomataNewTransition(am, cur, cur, BAD_CAST"a", NULL);
Packit Service a31ea6
	cur = xmlAutomataNewCountTrans(am, cur, NULL, BAD_CAST"a", 2, 3, NULL);
Packit Service a31ea6
	xmlAutomataSetFinalState(am, cur);
Packit Service a31ea6
Packit Service a31ea6
	/* compile it in a regexp and free the automata */
Packit Service a31ea6
	regexp = xmlAutomataCompile(am);
Packit Service a31ea6
	xmlFreeAutomata(am);
Packit Service a31ea6
Packit Service a31ea6
	/* test the regexp */
Packit Service a31ea6
	xmlRegexpPrint(stdout, regexp);
Packit Service a31ea6
	exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
Packit Service a31ea6
	ret = xmlRegExecPushString(exec, BAD_CAST"a", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	ret =xmlRegExecPushString(exec, BAD_CAST"b", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
Packit Service a31ea6
	if (ret == 1)
Packit Service a31ea6
	    printf("final\n");
Packit Service a31ea6
	else if (ret < 0)
Packit Service a31ea6
	    printf("error\n");
Packit Service a31ea6
	if (ret == 0) {
Packit Service a31ea6
	    ret = xmlRegExecPushString(exec, NULL, NULL);
Packit Service a31ea6
	    if (ret == 1)
Packit Service a31ea6
		printf("final\n");
Packit Service a31ea6
	    else if (ret < 0)
Packit Service a31ea6
		printf("error\n");
Packit Service a31ea6
	}
Packit Service a31ea6
	xmlRegFreeExecCtxt(exec);
Packit Service a31ea6
Packit Service a31ea6
	/* free the regexp */
Packit Service a31ea6
	xmlRegFreeRegexp(regexp);
Packit Service a31ea6
    } else {
Packit Service a31ea6
	int i;
Packit Service a31ea6
Packit Service a31ea6
	for (i = 1;i < argc;i++)
Packit Service a31ea6
	    testRegexpFile(argv[i]);
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
    xmlCleanupParser();
Packit Service a31ea6
    xmlMemoryDump();
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
#else
Packit Service a31ea6
#include <stdio.h>
Packit Service a31ea6
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
Packit Service a31ea6
    printf("%s : Automata support not compiled in\n", argv[0]);
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
#endif /* LIBXML_AUTOMATA_ENABLED */