Annotation of embedaddon/libxml2/testRegexp.c, revision 1.1.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>