File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / testAutomata.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 19:53:29 2014 UTC (9 years, 11 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, HEAD
libxml2 2.9.1

    1: /*
    2:  * testRegexp.c: simple module for testing regular expressions
    3:  *
    4:  * See Copyright for the status of this software.
    5:  *
    6:  * Daniel Veillard <veillard@redhat.com>
    7:  */
    8: 
    9: #include "libxml.h"
   10: #ifdef LIBXML_AUTOMATA_ENABLED
   11: #include <string.h>
   12: 
   13: #include <libxml/tree.h>
   14: #include <libxml/xmlautomata.h>
   15: 
   16: static int scanNumber(char **ptr) {
   17:     int ret = 0;
   18:     char *cur;
   19: 
   20:     cur = *ptr;
   21:     while ((*cur >= '0') && (*cur <= '9')) {
   22: 	ret = ret * 10 + (*cur - '0');
   23: 	cur++;
   24:     }
   25:     *ptr = cur;
   26:     return(ret);
   27: }
   28: 
   29: static void
   30: testRegexpFile(const char *filename) {
   31:     FILE *input;
   32:     char expr[5000];
   33:     int len;
   34:     int ret;
   35:     int i;
   36:     xmlAutomataPtr am;
   37:     xmlAutomataStatePtr states[1000];
   38:     xmlRegexpPtr regexp = NULL;
   39:     xmlRegExecCtxtPtr exec = NULL;
   40: 
   41:     for (i = 0;i<1000;i++)
   42: 	states[i] = NULL;
   43: 
   44:     input = fopen(filename, "r");
   45:     if (input == NULL) {
   46:         xmlGenericError(xmlGenericErrorContext,
   47: 		"Cannot open %s for reading\n", filename);
   48: 	return;
   49:     }
   50: 
   51:     am = xmlNewAutomata();
   52:     if (am == NULL) {
   53:         xmlGenericError(xmlGenericErrorContext,
   54: 		"Cannot create automata\n");
   55: 	fclose(input);
   56: 	return;
   57:     }
   58:     states[0] = xmlAutomataGetInitState(am);
   59:     if (states[0] == NULL) {
   60:         xmlGenericError(xmlGenericErrorContext,
   61: 		"Cannot get start state\n");
   62: 	xmlFreeAutomata(am);
   63: 	fclose(input);
   64: 	return;
   65:     }
   66:     ret = 0;
   67: 
   68:     while (fgets(expr, 4500, input) != NULL) {
   69: 	if (expr[0] == '#')
   70: 	    continue;
   71: 	len = strlen(expr);
   72: 	len--;
   73: 	while ((len >= 0) &&
   74: 	       ((expr[len] == '\n') || (expr[len] == '\t') ||
   75: 		(expr[len] == '\r') || (expr[len] == ' '))) len--;
   76: 	expr[len + 1] = 0;
   77: 	if (len >= 0) {
   78: 	    if ((am != NULL) && (expr[0] == 't') && (expr[1] == ' ')) {
   79: 		char *ptr = &expr[2];
   80: 		int from, to;
   81: 
   82: 		from = scanNumber(&ptr);
   83: 		if (*ptr != ' ') {
   84: 		    xmlGenericError(xmlGenericErrorContext,
   85: 			    "Bad line %s\n", expr);
   86: 		    break;
   87: 		}
   88: 		if (states[from] == NULL)
   89: 		    states[from] = xmlAutomataNewState(am);
   90: 		ptr++;
   91: 		to = scanNumber(&ptr);
   92: 		if (*ptr != ' ') {
   93: 		    xmlGenericError(xmlGenericErrorContext,
   94: 			    "Bad line %s\n", expr);
   95: 		    break;
   96: 		}
   97: 		if (states[to] == NULL)
   98: 		    states[to] = xmlAutomataNewState(am);
   99: 		ptr++;
  100: 		xmlAutomataNewTransition(am, states[from], states[to],
  101: 			                 BAD_CAST ptr, NULL);
  102: 	    } else if ((am != NULL) && (expr[0] == 'e') && (expr[1] == ' ')) {
  103: 		char *ptr = &expr[2];
  104: 		int from, to;
  105: 
  106: 		from = scanNumber(&ptr);
  107: 		if (*ptr != ' ') {
  108: 		    xmlGenericError(xmlGenericErrorContext,
  109: 			    "Bad line %s\n", expr);
  110: 		    break;
  111: 		}
  112: 		if (states[from] == NULL)
  113: 		    states[from] = xmlAutomataNewState(am);
  114: 		ptr++;
  115: 		to = scanNumber(&ptr);
  116: 		if (states[to] == NULL)
  117: 		    states[to] = xmlAutomataNewState(am);
  118: 		xmlAutomataNewEpsilon(am, states[from], states[to]);
  119: 	    } else if ((am != NULL) && (expr[0] == 'f') && (expr[1] == ' ')) {
  120: 		char *ptr = &expr[2];
  121: 		int state;
  122: 
  123: 		state = scanNumber(&ptr);
  124: 		if (states[state] == NULL) {
  125: 		    xmlGenericError(xmlGenericErrorContext,
  126: 			    "Bad state %d : %s\n", state, expr);
  127: 		    break;
  128: 		}
  129: 		xmlAutomataSetFinalState(am, states[state]);
  130: 	    } else if ((am != NULL) && (expr[0] == 'c') && (expr[1] == ' ')) {
  131: 		char *ptr = &expr[2];
  132: 		int from, to;
  133: 		int min, max;
  134: 
  135: 		from = scanNumber(&ptr);
  136: 		if (*ptr != ' ') {
  137: 		    xmlGenericError(xmlGenericErrorContext,
  138: 			    "Bad line %s\n", expr);
  139: 		    break;
  140: 		}
  141: 		if (states[from] == NULL)
  142: 		    states[from] = xmlAutomataNewState(am);
  143: 		ptr++;
  144: 		to = scanNumber(&ptr);
  145: 		if (*ptr != ' ') {
  146: 		    xmlGenericError(xmlGenericErrorContext,
  147: 			    "Bad line %s\n", expr);
  148: 		    break;
  149: 		}
  150: 		if (states[to] == NULL)
  151: 		    states[to] = xmlAutomataNewState(am);
  152: 		ptr++;
  153: 		min = scanNumber(&ptr);
  154: 		if (*ptr != ' ') {
  155: 		    xmlGenericError(xmlGenericErrorContext,
  156: 			    "Bad line %s\n", expr);
  157: 		    break;
  158: 		}
  159: 		ptr++;
  160: 		max = scanNumber(&ptr);
  161: 		if (*ptr != ' ') {
  162: 		    xmlGenericError(xmlGenericErrorContext,
  163: 			    "Bad line %s\n", expr);
  164: 		    break;
  165: 		}
  166: 		ptr++;
  167: 		xmlAutomataNewCountTrans(am, states[from], states[to],
  168: 			                 BAD_CAST ptr, min, max, NULL);
  169: 	    } else if ((am != NULL) && (expr[0] == '-') && (expr[1] == '-')) {
  170: 		/* end of the automata */
  171: 		regexp = xmlAutomataCompile(am);
  172: 		xmlFreeAutomata(am);
  173: 		am = NULL;
  174: 		if (regexp == NULL) {
  175: 		    xmlGenericError(xmlGenericErrorContext,
  176: 			    "Failed to compile the automata");
  177: 		    break;
  178: 		}
  179: 	    } else if ((expr[0] == '=') && (expr[1] == '>')) {
  180: 		if (regexp == NULL) {
  181: 		    printf("=> failed not compiled\n");
  182: 		} else {
  183: 		    if (exec == NULL)
  184: 			exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
  185: 		    if (ret == 0) {
  186: 			ret = xmlRegExecPushString(exec, NULL, NULL);
  187: 		    }
  188: 		    if (ret == 1)
  189: 			printf("=> Passed\n");
  190: 		    else if ((ret == 0) || (ret == -1))
  191: 			printf("=> Failed\n");
  192: 		    else if (ret < 0)
  193: 			printf("=> Error\n");
  194: 		    xmlRegFreeExecCtxt(exec);
  195: 		    exec = NULL;
  196: 		}
  197: 		ret = 0;
  198: 	    } else if (regexp != NULL) {
  199: 		if (exec == NULL)
  200: 		    exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
  201: 		ret = xmlRegExecPushString(exec, BAD_CAST expr, NULL);
  202: 	    } else {
  203: 		xmlGenericError(xmlGenericErrorContext,
  204: 			"Unexpected line %s\n", expr);
  205: 	    }
  206: 	}
  207:     }
  208:     fclose(input);
  209:     if (regexp != NULL)
  210: 	xmlRegFreeRegexp(regexp);
  211:     if (exec != NULL)
  212: 	xmlRegFreeExecCtxt(exec);
  213:     if (am != NULL)
  214: 	xmlFreeAutomata(am);
  215: }
  216: 
  217: int main(int argc, char **argv) {
  218: 
  219:     xmlInitMemory();
  220: 
  221:     if (argc == 1) {
  222: 	int ret;
  223: 	xmlAutomataPtr am;
  224: 	xmlAutomataStatePtr start, cur;
  225: 	xmlRegexpPtr regexp;
  226: 	xmlRegExecCtxtPtr exec;
  227: 
  228: 	am = xmlNewAutomata();
  229: 	start = xmlAutomataGetInitState(am);
  230: 
  231: 	/* generate a[ba]*a */
  232: 	cur = xmlAutomataNewTransition(am, start, NULL, BAD_CAST"a", NULL);
  233: 	xmlAutomataNewTransition(am, cur, cur, BAD_CAST"b", NULL);
  234: 	xmlAutomataNewTransition(am, cur, cur, BAD_CAST"a", NULL);
  235: 	cur = xmlAutomataNewCountTrans(am, cur, NULL, BAD_CAST"a", 2, 3, NULL);
  236: 	xmlAutomataSetFinalState(am, cur);
  237: 
  238: 	/* compile it in a regexp and free the automata */
  239: 	regexp = xmlAutomataCompile(am);
  240: 	xmlFreeAutomata(am);
  241: 
  242: 	/* test the regexp */
  243: 	xmlRegexpPrint(stdout, regexp);
  244: 	exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
  245: 	ret = xmlRegExecPushString(exec, BAD_CAST"a", NULL);
  246: 	if (ret == 1)
  247: 	    printf("final\n");
  248: 	else if (ret < 0)
  249: 	    printf("error\n");
  250: 	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
  251: 	if (ret == 1)
  252: 	    printf("final\n");
  253: 	else if (ret < 0)
  254: 	    printf("error\n");
  255: 	ret =xmlRegExecPushString(exec, BAD_CAST"b", NULL);
  256: 	if (ret == 1)
  257: 	    printf("final\n");
  258: 	else if (ret < 0)
  259: 	    printf("error\n");
  260: 	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
  261: 	if (ret == 1)
  262: 	    printf("final\n");
  263: 	else if (ret < 0)
  264: 	    printf("error\n");
  265: 	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
  266: 	if (ret == 1)
  267: 	    printf("final\n");
  268: 	else if (ret < 0)
  269: 	    printf("error\n");
  270: 	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
  271: 	if (ret == 1)
  272: 	    printf("final\n");
  273: 	else if (ret < 0)
  274: 	    printf("error\n");
  275: 	ret =xmlRegExecPushString(exec, BAD_CAST"a", NULL);
  276: 	if (ret == 1)
  277: 	    printf("final\n");
  278: 	else if (ret < 0)
  279: 	    printf("error\n");
  280: 	if (ret == 0) {
  281: 	    ret = xmlRegExecPushString(exec, NULL, NULL);
  282: 	    if (ret == 1)
  283: 		printf("final\n");
  284: 	    else if (ret < 0)
  285: 		printf("error\n");
  286: 	}
  287: 	xmlRegFreeExecCtxt(exec);
  288: 
  289: 	/* free the regexp */
  290: 	xmlRegFreeRegexp(regexp);
  291:     } else {
  292: 	int i;
  293: 
  294: 	for (i = 1;i < argc;i++)
  295: 	    testRegexpFile(argv[i]);
  296:     }
  297: 
  298:     xmlCleanupParser();
  299:     xmlMemoryDump();
  300:     return(0);
  301: }
  302: 
  303: #else
  304: #include <stdio.h>
  305: int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
  306:     printf("%s : Automata support not compiled in\n", argv[0]);
  307:     return(0);
  308: }
  309: #endif /* LIBXML_AUTOMATA_ENABLED */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>