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