Annotation of embedaddon/libxml2/testRegexp.c, revision 1.1

1.1     ! misho       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_REGEXP_ENABLED
        !            11: #include <string.h>
        !            12: 
        !            13: #include <libxml/tree.h>
        !            14: #include <libxml/xmlregexp.h>
        !            15: 
        !            16: static int repeat = 0;
        !            17: static int debug = 0;
        !            18: 
        !            19: static void testRegexp(xmlRegexpPtr comp, const char *value) {
        !            20:     int ret;
        !            21: 
        !            22:     ret = xmlRegexpExec(comp, (const xmlChar *) value);
        !            23:     if (ret == 1)
        !            24:        printf("%s: Ok\n", value);
        !            25:     else if (ret == 0)
        !            26:        printf("%s: Fail\n", value);
        !            27:     else
        !            28:        printf("%s: Error: %d\n", value, ret);
        !            29:     if (repeat) {
        !            30:        int j;
        !            31:        for (j = 0;j < 999999;j++)
        !            32:            xmlRegexpExec(comp, (const xmlChar *) value);
        !            33:     }
        !            34: }
        !            35: 
        !            36: static void
        !            37: testRegexpFile(const char *filename) {
        !            38:     xmlRegexpPtr comp = NULL;
        !            39:     FILE *input;
        !            40:     char expression[5000];
        !            41:     int len;
        !            42: 
        !            43:     input = fopen(filename, "r");
        !            44:     if (input == NULL) {
        !            45:         xmlGenericError(xmlGenericErrorContext,
        !            46:                "Cannot open %s for reading\n", filename);
        !            47:        return;
        !            48:     }
        !            49:     while (fgets(expression, 4500, input) != NULL) {
        !            50:        len = strlen(expression);
        !            51:        len--;
        !            52:        while ((len >= 0) && 
        !            53:               ((expression[len] == '\n') || (expression[len] == '\t') ||
        !            54:                (expression[len] == '\r') || (expression[len] == ' '))) len--;
        !            55:        expression[len + 1] = 0;      
        !            56:        if (len >= 0) {
        !            57:            if (expression[0] == '#')
        !            58:                continue;
        !            59:            if ((expression[0] == '=') && (expression[1] == '>')) {
        !            60:                char *pattern = &expression[2];
        !            61: 
        !            62:                if (comp != NULL) {
        !            63:                    xmlRegFreeRegexp(comp);
        !            64:                    comp = NULL;
        !            65:                }
        !            66:                printf("Regexp: %s\n", pattern) ;
        !            67:                comp = xmlRegexpCompile((const xmlChar *) pattern);
        !            68:                if (comp == NULL) {
        !            69:                    printf("   failed to compile\n");
        !            70:                    break;
        !            71:                }
        !            72:            } else if (comp == NULL) {
        !            73:                printf("Regexp: %s\n", expression) ;
        !            74:                comp = xmlRegexpCompile((const xmlChar *) expression);
        !            75:                if (comp == NULL) {
        !            76:                    printf("   failed to compile\n");
        !            77:                    break;
        !            78:                }
        !            79:            } else if (comp != NULL) {
        !            80:                testRegexp(comp, expression);
        !            81:            }
        !            82:        }
        !            83:     }
        !            84:     fclose(input);
        !            85:     if (comp != NULL)
        !            86:        xmlRegFreeRegexp(comp);
        !            87: }
        !            88: 
        !            89: #ifdef LIBXML_EXPR_ENABLED
        !            90: static void
        !            91: runFileTest(xmlExpCtxtPtr ctxt, const char *filename) {
        !            92:     xmlExpNodePtr expr = NULL, sub;
        !            93:     FILE *input;
        !            94:     char expression[5000];
        !            95:     int len;
        !            96: 
        !            97:     input = fopen(filename, "r");
        !            98:     if (input == NULL) {
        !            99:         xmlGenericError(xmlGenericErrorContext,
        !           100:                "Cannot open %s for reading\n", filename);
        !           101:        return;
        !           102:     }
        !           103:     while (fgets(expression, 4500, input) != NULL) {
        !           104:        len = strlen(expression);
        !           105:        len--;
        !           106:        while ((len >= 0) && 
        !           107:               ((expression[len] == '\n') || (expression[len] == '\t') ||
        !           108:                (expression[len] == '\r') || (expression[len] == ' '))) len--;
        !           109:        expression[len + 1] = 0;      
        !           110:        if (len >= 0) {
        !           111:            if (expression[0] == '#')
        !           112:                continue;
        !           113:            if ((expression[0] == '=') && (expression[1] == '>')) {
        !           114:                char *str = &expression[2];
        !           115: 
        !           116:                if (expr != NULL) {
        !           117:                    xmlExpFree(ctxt, expr);
        !           118:                    if (xmlExpCtxtNbNodes(ctxt) != 0) 
        !           119:                        printf(" Parse/free of Expression leaked %d\n",
        !           120:                               xmlExpCtxtNbNodes(ctxt));
        !           121:                    expr = NULL;
        !           122:                }
        !           123:                printf("Expression: %s\n", str) ;
        !           124:                expr = xmlExpParse(ctxt, str);
        !           125:                if (expr == NULL) {
        !           126:                    printf("   parsing Failed\n");
        !           127:                    break;
        !           128:                }
        !           129:            } else if (expr != NULL) {
        !           130:                int expect = -1;
        !           131:                int nodes1, nodes2;
        !           132: 
        !           133:                if (expression[0] == '0')
        !           134:                    expect = 0;
        !           135:                if (expression[0] == '1')
        !           136:                    expect = 1;
        !           137:                printf("Subexp: %s", expression + 2) ;
        !           138:                nodes1 = xmlExpCtxtNbNodes(ctxt);
        !           139:                sub = xmlExpParse(ctxt, expression + 2);
        !           140:                if (sub == NULL) {
        !           141:                    printf("   parsing Failed\n");
        !           142:                    break;
        !           143:                } else {
        !           144:                    int ret;
        !           145:                    
        !           146:                    nodes2 = xmlExpCtxtNbNodes(ctxt);
        !           147:                    ret = xmlExpSubsume(ctxt, expr, sub);
        !           148: 
        !           149:                    if ((expect == 1) && (ret == 1)) {
        !           150:                        printf(" => accept, Ok\n");
        !           151:                    } else if ((expect == 0) && (ret == 0)) {
        !           152:                        printf(" => reject, Ok\n");
        !           153:                    } else if ((expect == 1) && (ret == 0)) {
        !           154:                        printf(" => reject, Failed\n");
        !           155:                    } else if ((expect == 0) && (ret == 1)) {
        !           156:                        printf(" => accept, Failed\n");
        !           157:                    } else {
        !           158:                        printf(" => fail internally\n");
        !           159:                    }
        !           160:                    if (xmlExpCtxtNbNodes(ctxt) > nodes2) {
        !           161:                        printf(" Subsume leaked %d\n",
        !           162:                               xmlExpCtxtNbNodes(ctxt) - nodes2);
        !           163:                        nodes1 += xmlExpCtxtNbNodes(ctxt) - nodes2;
        !           164:                    }
        !           165:                    xmlExpFree(ctxt, sub);
        !           166:                    if (xmlExpCtxtNbNodes(ctxt) > nodes1) {
        !           167:                        printf(" Parse/free leaked %d\n",
        !           168:                               xmlExpCtxtNbNodes(ctxt) - nodes1);
        !           169:                    }
        !           170:                }
        !           171: 
        !           172:            }
        !           173:        }
        !           174:     }
        !           175:     if (expr != NULL) {
        !           176:        xmlExpFree(ctxt, expr);
        !           177:        if (xmlExpCtxtNbNodes(ctxt) != 0) 
        !           178:            printf(" Parse/free of Expression leaked %d\n",
        !           179:                   xmlExpCtxtNbNodes(ctxt));
        !           180:     }
        !           181:     fclose(input);
        !           182: }
        !           183: 
        !           184: static void 
        !           185: testReduce(xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, const char *tst) {
        !           186:     xmlBufferPtr xmlExpBuf;
        !           187:     xmlExpNodePtr sub, deriv;
        !           188:     xmlExpBuf = xmlBufferCreate();
        !           189: 
        !           190:     sub = xmlExpParse(ctxt, tst);
        !           191:     if (sub == NULL) {
        !           192:         printf("Subset %s failed to parse\n", tst);
        !           193:        return;
        !           194:     }
        !           195:     xmlExpDump(xmlExpBuf, sub);
        !           196:     printf("Subset parsed as: %s\n",
        !           197:            (const char *) xmlBufferContent(xmlExpBuf));
        !           198:     deriv = xmlExpExpDerive(ctxt, expr, sub);
        !           199:     if (deriv == NULL) {
        !           200:         printf("Derivation led to an internal error, report this !\n");
        !           201:        return;
        !           202:     } else {
        !           203:         xmlBufferEmpty(xmlExpBuf);
        !           204:        xmlExpDump(xmlExpBuf, deriv);
        !           205:        if (xmlExpIsNillable(deriv))
        !           206:            printf("Resulting nillable derivation: %s\n",
        !           207:                   (const char *) xmlBufferContent(xmlExpBuf));
        !           208:        else
        !           209:            printf("Resulting derivation: %s\n",
        !           210:                   (const char *) xmlBufferContent(xmlExpBuf));
        !           211:        xmlExpFree(ctxt, deriv);
        !           212:     }
        !           213:     xmlExpFree(ctxt, sub);
        !           214: }
        !           215: 
        !           216: static void 
        !           217: exprDebug(xmlExpCtxtPtr ctxt, xmlExpNodePtr expr) {
        !           218:     xmlBufferPtr xmlExpBuf;
        !           219:     xmlExpNodePtr deriv;
        !           220:     const char *list[40];
        !           221:     int ret;
        !           222: 
        !           223:     xmlExpBuf = xmlBufferCreate();
        !           224: 
        !           225:     if (expr == NULL) {
        !           226:         printf("Failed to parse\n");
        !           227:        return;
        !           228:     }
        !           229:     xmlExpDump(xmlExpBuf, expr);
        !           230:     printf("Parsed as: %s\n", (const char *) xmlBufferContent(xmlExpBuf));
        !           231:     printf("Max token input = %d\n", xmlExpMaxToken(expr));
        !           232:     if (xmlExpIsNillable(expr) == 1)
        !           233:        printf("Is nillable\n");
        !           234:     ret = xmlExpGetLanguage(ctxt, expr, (const xmlChar **) &list[0], 40);
        !           235:     if (ret < 0)
        !           236:        printf("Failed to get list: %d\n", ret);
        !           237:     else {
        !           238:        int i;
        !           239: 
        !           240:        printf("Language has %d strings, testing string derivations\n", ret);
        !           241:        for (i = 0;i < ret;i++) {
        !           242:            deriv = xmlExpStringDerive(ctxt, expr, BAD_CAST list[i], -1);
        !           243:            if (deriv == NULL) {
        !           244:                printf("  %s -> derivation failed\n", list[i]);
        !           245:            } else {
        !           246:                xmlBufferEmpty(xmlExpBuf);
        !           247:                xmlExpDump(xmlExpBuf, deriv);
        !           248:                printf("  %s -> %s\n", list[i],
        !           249:                       (const char *) xmlBufferContent(xmlExpBuf));
        !           250:            }
        !           251:            xmlExpFree(ctxt, deriv);
        !           252:        }
        !           253:     }
        !           254:     xmlBufferFree(xmlExpBuf);
        !           255: }
        !           256: #endif
        !           257: 
        !           258: static void usage(const char *name) {
        !           259:     fprintf(stderr, "Usage: %s [flags]\n", name);
        !           260:     fprintf(stderr, "Testing tool for libxml2 string and pattern regexps\n");
        !           261:     fprintf(stderr, "   --debug: switch on debugging\n");
        !           262:     fprintf(stderr, "   --repeat: loop on the operation\n");
        !           263: #ifdef LIBXML_EXPR_ENABLED
        !           264:     fprintf(stderr, "   --expr: test xmlExp and not xmlRegexp\n");
        !           265: #endif
        !           266:     fprintf(stderr, "   --input filename: use the given filename for regexp\n");
        !           267:     fprintf(stderr, "   --input filename: use the given filename for exp\n");
        !           268: }
        !           269: 
        !           270: int main(int argc, char **argv) {
        !           271:     xmlRegexpPtr comp = NULL;
        !           272: #ifdef LIBXML_EXPR_ENABLED
        !           273:     xmlExpNodePtr expr = NULL;
        !           274:     int use_exp = 0;
        !           275:     xmlExpCtxtPtr ctxt = NULL;
        !           276: #endif
        !           277:     const char *pattern = NULL;
        !           278:     char *filename = NULL;
        !           279:     int i;
        !           280: 
        !           281:     xmlInitMemory();
        !           282: 
        !           283:     if (argc <= 1) {
        !           284:        usage(argv[0]);
        !           285:        return(1);
        !           286:     }
        !           287:     for (i = 1; i < argc ; i++) {
        !           288:        if (!strcmp(argv[i], "-"))
        !           289:            break;
        !           290: 
        !           291:        if (argv[i][0] != '-')
        !           292:            continue;
        !           293:        if (!strcmp(argv[i], "--"))
        !           294:            break;
        !           295: 
        !           296:        if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) {
        !           297:            debug++;
        !           298:        } else if ((!strcmp(argv[i], "-repeat")) ||
        !           299:                 (!strcmp(argv[i], "--repeat"))) {
        !           300:            repeat++;
        !           301: #ifdef LIBXML_EXPR_ENABLED
        !           302:        } else if ((!strcmp(argv[i], "-expr")) ||
        !           303:                 (!strcmp(argv[i], "--expr"))) {
        !           304:            use_exp++;
        !           305: #endif
        !           306:        } else if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "-f")) ||
        !           307:                   (!strcmp(argv[i], "--input")))
        !           308:            filename = argv[++i];
        !           309:         else {
        !           310:            fprintf(stderr, "Unknown option %s\n", argv[i]);
        !           311:            usage(argv[0]);
        !           312:        }
        !           313:     }
        !           314: 
        !           315: #ifdef LIBXML_EXPR_ENABLED
        !           316:     if (use_exp)
        !           317:        ctxt = xmlExpNewCtxt(0, NULL);
        !           318: #endif
        !           319: 
        !           320:     if (filename != NULL) {
        !           321: #ifdef LIBXML_EXPR_ENABLED
        !           322:         if (use_exp)
        !           323:            runFileTest(ctxt, filename);
        !           324:        else
        !           325: #endif
        !           326:            testRegexpFile(filename);
        !           327:     } else {
        !           328:         int  data = 0;
        !           329: #ifdef LIBXML_EXPR_ENABLED
        !           330: 
        !           331:         if (use_exp) {
        !           332:            for (i = 1; i < argc ; i++) {
        !           333:                if (strcmp(argv[i], "--") == 0)
        !           334:                    data = 1;
        !           335:                else if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0) ||
        !           336:                    (data == 1)) {
        !           337:                    if (pattern == NULL) {
        !           338:                        pattern = argv[i];
        !           339:                        printf("Testing expr %s:\n", pattern);
        !           340:                        expr = xmlExpParse(ctxt, pattern);
        !           341:                        if (expr == NULL) {
        !           342:                            printf("   failed to compile\n");
        !           343:                            break;
        !           344:                        }
        !           345:                        if (debug) {
        !           346:                            exprDebug(ctxt, expr);
        !           347:                        }
        !           348:                    } else {
        !           349:                        testReduce(ctxt, expr, argv[i]);
        !           350:                    }
        !           351:                }
        !           352:            }
        !           353:            if (expr != NULL) {
        !           354:                xmlExpFree(ctxt, expr);
        !           355:                expr = NULL;
        !           356:            }
        !           357:        } else
        !           358: #endif
        !           359:         {
        !           360:            for (i = 1; i < argc ; i++) {
        !           361:                if (strcmp(argv[i], "--") == 0)
        !           362:                    data = 1;
        !           363:                else if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0) ||
        !           364:                         (data == 1)) {
        !           365:                    if (pattern == NULL) {
        !           366:                        pattern = argv[i];
        !           367:                        printf("Testing %s:\n", pattern);
        !           368:                        comp = xmlRegexpCompile((const xmlChar *) pattern);
        !           369:                        if (comp == NULL) {
        !           370:                            printf("   failed to compile\n");
        !           371:                            break;
        !           372:                        }
        !           373:                        if (debug)
        !           374:                            xmlRegexpPrint(stdout, comp);
        !           375:                    } else {
        !           376:                        testRegexp(comp, argv[i]);
        !           377:                    }
        !           378:                }
        !           379:            }
        !           380:            if (comp != NULL)
        !           381:                xmlRegFreeRegexp(comp);
        !           382:         }
        !           383:     }
        !           384: #ifdef LIBXML_EXPR_ENABLED
        !           385:     if (ctxt != NULL) {
        !           386:        printf("Ops: %d nodes, %d cons\n",
        !           387:               xmlExpCtxtNbNodes(ctxt), xmlExpCtxtNbCons(ctxt));
        !           388:        xmlExpFreeCtxt(ctxt);
        !           389:     }
        !           390: #endif
        !           391:     xmlCleanupParser();
        !           392:     xmlMemoryDump();
        !           393:     return(0);
        !           394: }
        !           395: 
        !           396: #else
        !           397: #include <stdio.h>
        !           398: int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
        !           399:     printf("%s : Regexp support not compiled in\n", argv[0]);
        !           400:     return(0);
        !           401: }
        !           402: #endif /* LIBXML_REGEXP_ENABLED */

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