ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

testRegexp.c
Go to the documentation of this file.
00001 /*
00002  * testRegexp.c: simple module for testing regular expressions
00003  *
00004  * See Copyright for the status of this software.
00005  *
00006  * Daniel Veillard <veillard@redhat.com>
00007  */
00008 
00009 #include "libxml.h"
00010 #ifdef LIBXML_REGEXP_ENABLED
00011 #include <string.h>
00012 
00013 #include <libxml/tree.h>
00014 #include <libxml/xmlregexp.h>
00015 
00016 static int repeat = 0;
00017 static int debug = 0;
00018 
00019 static void testRegexp(xmlRegexpPtr comp, const char *value) {
00020     int ret;
00021 
00022     ret = xmlRegexpExec(comp, (const xmlChar *) value);
00023     if (ret == 1)
00024     printf("%s: Ok\n", value);
00025     else if (ret == 0)
00026     printf("%s: Fail\n", value);
00027     else
00028     printf("%s: Error: %d\n", value, ret);
00029     if (repeat) {
00030     int j;
00031     for (j = 0;j < 999999;j++)
00032         xmlRegexpExec(comp, (const xmlChar *) value);
00033     }
00034 }
00035 
00036 static void
00037 testRegexpFile(const char *filename) {
00038     xmlRegexpPtr comp = NULL;
00039     FILE *input;
00040     char expression[5000];
00041     int len;
00042 
00043     input = fopen(filename, "r");
00044     if (input == NULL) {
00045         xmlGenericError(xmlGenericErrorContext,
00046         "Cannot open %s for reading\n", filename);
00047     return;
00048     }
00049     while (fgets(expression, 4500, input) != NULL) {
00050     len = strlen(expression);
00051     len--;
00052     while ((len >= 0) && 
00053            ((expression[len] == '\n') || (expression[len] == '\t') ||
00054         (expression[len] == '\r') || (expression[len] == ' '))) len--;
00055     expression[len + 1] = 0;      
00056     if (len >= 0) {
00057         if (expression[0] == '#')
00058         continue;
00059         if ((expression[0] == '=') && (expression[1] == '>')) {
00060         char *pattern = &expression[2];
00061 
00062         if (comp != NULL) {
00063             xmlRegFreeRegexp(comp);
00064             comp = NULL;
00065         }
00066         printf("Regexp: %s\n", pattern) ;
00067         comp = xmlRegexpCompile((const xmlChar *) pattern);
00068         if (comp == NULL) {
00069             printf("   failed to compile\n");
00070             break;
00071         }
00072         } else if (comp == NULL) {
00073         printf("Regexp: %s\n", expression) ;
00074         comp = xmlRegexpCompile((const xmlChar *) expression);
00075         if (comp == NULL) {
00076             printf("   failed to compile\n");
00077             break;
00078         }
00079         } else if (comp != NULL) {
00080         testRegexp(comp, expression);
00081         }
00082     }
00083     }
00084     fclose(input);
00085     if (comp != NULL)
00086     xmlRegFreeRegexp(comp);
00087 }
00088 
00089 #ifdef LIBXML_EXPR_ENABLED
00090 static void
00091 runFileTest(xmlExpCtxtPtr ctxt, const char *filename) {
00092     xmlExpNodePtr expr = NULL, sub;
00093     FILE *input;
00094     char expression[5000];
00095     int len;
00096 
00097     input = fopen(filename, "r");
00098     if (input == NULL) {
00099         xmlGenericError(xmlGenericErrorContext,
00100         "Cannot open %s for reading\n", filename);
00101     return;
00102     }
00103     while (fgets(expression, 4500, input) != NULL) {
00104     len = strlen(expression);
00105     len--;
00106     while ((len >= 0) && 
00107            ((expression[len] == '\n') || (expression[len] == '\t') ||
00108         (expression[len] == '\r') || (expression[len] == ' '))) len--;
00109     expression[len + 1] = 0;      
00110     if (len >= 0) {
00111         if (expression[0] == '#')
00112         continue;
00113         if ((expression[0] == '=') && (expression[1] == '>')) {
00114         char *str = &expression[2];
00115 
00116         if (expr != NULL) {
00117             xmlExpFree(ctxt, expr);
00118             if (xmlExpCtxtNbNodes(ctxt) != 0) 
00119                 printf(" Parse/free of Expression leaked %d\n",
00120                    xmlExpCtxtNbNodes(ctxt));
00121             expr = NULL;
00122         }
00123         printf("Expression: %s\n", str) ;
00124         expr = xmlExpParse(ctxt, str);
00125         if (expr == NULL) {
00126             printf("   parsing Failed\n");
00127             break;
00128         }
00129         } else if (expr != NULL) {
00130             int expect = -1;
00131         int nodes1, nodes2;
00132 
00133         if (expression[0] == '0')
00134             expect = 0;
00135         if (expression[0] == '1')
00136             expect = 1;
00137         printf("Subexp: %s", expression + 2) ;
00138         nodes1 = xmlExpCtxtNbNodes(ctxt);
00139         sub = xmlExpParse(ctxt, expression + 2);
00140         if (sub == NULL) {
00141             printf("   parsing Failed\n");
00142             break;
00143         } else {
00144             int ret;
00145             
00146             nodes2 = xmlExpCtxtNbNodes(ctxt);
00147             ret = xmlExpSubsume(ctxt, expr, sub);
00148 
00149             if ((expect == 1) && (ret == 1)) {
00150             printf(" => accept, Ok\n");
00151             } else if ((expect == 0) && (ret == 0)) {
00152                 printf(" => reject, Ok\n");
00153             } else if ((expect == 1) && (ret == 0)) {
00154             printf(" => reject, Failed\n");
00155             } else if ((expect == 0) && (ret == 1)) {
00156             printf(" => accept, Failed\n");
00157             } else {
00158                 printf(" => fail internally\n");
00159             }
00160             if (xmlExpCtxtNbNodes(ctxt) > nodes2) {
00161                 printf(" Subsume leaked %d\n",
00162                    xmlExpCtxtNbNodes(ctxt) - nodes2);
00163             nodes1 += xmlExpCtxtNbNodes(ctxt) - nodes2;
00164             }
00165             xmlExpFree(ctxt, sub);
00166             if (xmlExpCtxtNbNodes(ctxt) > nodes1) {
00167                 printf(" Parse/free leaked %d\n",
00168                    xmlExpCtxtNbNodes(ctxt) - nodes1);
00169             }
00170         }
00171 
00172         }
00173     }
00174     }
00175     if (expr != NULL) {
00176     xmlExpFree(ctxt, expr);
00177     if (xmlExpCtxtNbNodes(ctxt) != 0) 
00178         printf(" Parse/free of Expression leaked %d\n",
00179            xmlExpCtxtNbNodes(ctxt));
00180     }
00181     fclose(input);
00182 }
00183 
00184 static void 
00185 testReduce(xmlExpCtxtPtr ctxt, xmlExpNodePtr expr, const char *tst) {
00186     xmlBufferPtr xmlExpBuf;
00187     xmlExpNodePtr sub, deriv;
00188     xmlExpBuf = xmlBufferCreate();
00189 
00190     sub = xmlExpParse(ctxt, tst);
00191     if (sub == NULL) {
00192         printf("Subset %s failed to parse\n", tst);
00193     return;
00194     }
00195     xmlExpDump(xmlExpBuf, sub);
00196     printf("Subset parsed as: %s\n",
00197            (const char *) xmlBufferContent(xmlExpBuf));
00198     deriv = xmlExpExpDerive(ctxt, expr, sub);
00199     if (deriv == NULL) {
00200         printf("Derivation led to an internal error, report this !\n");
00201     return;
00202     } else {
00203         xmlBufferEmpty(xmlExpBuf);
00204     xmlExpDump(xmlExpBuf, deriv);
00205     if (xmlExpIsNillable(deriv))
00206         printf("Resulting nillable derivation: %s\n",
00207                (const char *) xmlBufferContent(xmlExpBuf));
00208     else
00209         printf("Resulting derivation: %s\n",
00210                (const char *) xmlBufferContent(xmlExpBuf));
00211     xmlExpFree(ctxt, deriv);
00212     }
00213     xmlExpFree(ctxt, sub);
00214 }
00215 
00216 static void 
00217 exprDebug(xmlExpCtxtPtr ctxt, xmlExpNodePtr expr) {
00218     xmlBufferPtr xmlExpBuf;
00219     xmlExpNodePtr deriv;
00220     const char *list[40];
00221     int ret;
00222 
00223     xmlExpBuf = xmlBufferCreate();
00224 
00225     if (expr == NULL) {
00226         printf("Failed to parse\n");
00227     return;
00228     }
00229     xmlExpDump(xmlExpBuf, expr);
00230     printf("Parsed as: %s\n", (const char *) xmlBufferContent(xmlExpBuf));
00231     printf("Max token input = %d\n", xmlExpMaxToken(expr));
00232     if (xmlExpIsNillable(expr) == 1)
00233     printf("Is nillable\n");
00234     ret = xmlExpGetLanguage(ctxt, expr, (const xmlChar **) &list[0], 40);
00235     if (ret < 0)
00236     printf("Failed to get list: %d\n", ret);
00237     else {
00238     int i;
00239 
00240     printf("Language has %d strings, testing string derivations\n", ret);
00241     for (i = 0;i < ret;i++) {
00242         deriv = xmlExpStringDerive(ctxt, expr, BAD_CAST list[i], -1);
00243         if (deriv == NULL) {
00244         printf("  %s -> derivation failed\n", list[i]);
00245         } else {
00246         xmlBufferEmpty(xmlExpBuf);
00247         xmlExpDump(xmlExpBuf, deriv);
00248         printf("  %s -> %s\n", list[i],
00249                (const char *) xmlBufferContent(xmlExpBuf));
00250         }
00251         xmlExpFree(ctxt, deriv);
00252     }
00253     }
00254     xmlBufferFree(xmlExpBuf);
00255 }
00256 #endif
00257 
00258 static void usage(const char *name) {
00259     fprintf(stderr, "Usage: %s [flags]\n", name);
00260     fprintf(stderr, "Testing tool for libxml2 string and pattern regexps\n");
00261     fprintf(stderr, "   --debug: switch on debugging\n");
00262     fprintf(stderr, "   --repeat: loop on the operation\n");
00263 #ifdef LIBXML_EXPR_ENABLED
00264     fprintf(stderr, "   --expr: test xmlExp and not xmlRegexp\n");
00265 #endif
00266     fprintf(stderr, "   --input filename: use the given filename for regexp\n");
00267     fprintf(stderr, "   --input filename: use the given filename for exp\n");
00268 }
00269 
00270 int main(int argc, char **argv) {
00271     xmlRegexpPtr comp = NULL;
00272 #ifdef LIBXML_EXPR_ENABLED
00273     xmlExpNodePtr expr = NULL;
00274     int use_exp = 0;
00275     xmlExpCtxtPtr ctxt = NULL;
00276 #endif
00277     const char *pattern = NULL;
00278     char *filename = NULL;
00279     int i;
00280 
00281     xmlInitMemory();
00282 
00283     if (argc <= 1) {
00284     usage(argv[0]);
00285     return(1);
00286     }
00287     for (i = 1; i < argc ; i++) {
00288     if (!strcmp(argv[i], "-"))
00289         break;
00290 
00291     if (argv[i][0] != '-')
00292         continue;
00293     if (!strcmp(argv[i], "--"))
00294         break;
00295 
00296     if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) {
00297         debug++;
00298     } else if ((!strcmp(argv[i], "-repeat")) ||
00299              (!strcmp(argv[i], "--repeat"))) {
00300         repeat++;
00301 #ifdef LIBXML_EXPR_ENABLED
00302     } else if ((!strcmp(argv[i], "-expr")) ||
00303              (!strcmp(argv[i], "--expr"))) {
00304         use_exp++;
00305 #endif
00306     } else if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "-f")) ||
00307            (!strcmp(argv[i], "--input")))
00308         filename = argv[++i];
00309         else {
00310         fprintf(stderr, "Unknown option %s\n", argv[i]);
00311         usage(argv[0]);
00312     }
00313     }
00314 
00315 #ifdef LIBXML_EXPR_ENABLED
00316     if (use_exp)
00317     ctxt = xmlExpNewCtxt(0, NULL);
00318 #endif
00319 
00320     if (filename != NULL) {
00321 #ifdef LIBXML_EXPR_ENABLED
00322         if (use_exp)
00323         runFileTest(ctxt, filename);
00324     else
00325 #endif
00326         testRegexpFile(filename);
00327     } else {
00328         int  data = 0;
00329 #ifdef LIBXML_EXPR_ENABLED
00330 
00331         if (use_exp) {
00332         for (i = 1; i < argc ; i++) {
00333             if (strcmp(argv[i], "--") == 0)
00334             data = 1;
00335         else if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0) ||
00336             (data == 1)) {
00337             if (pattern == NULL) {
00338             pattern = argv[i];
00339             printf("Testing expr %s:\n", pattern);
00340             expr = xmlExpParse(ctxt, pattern);
00341             if (expr == NULL) {
00342                 printf("   failed to compile\n");
00343                 break;
00344             }
00345             if (debug) {
00346                 exprDebug(ctxt, expr);
00347             }
00348             } else {
00349             testReduce(ctxt, expr, argv[i]);
00350             }
00351         }
00352         }
00353         if (expr != NULL) {
00354         xmlExpFree(ctxt, expr);
00355         expr = NULL;
00356         }
00357     } else
00358 #endif
00359         {
00360         for (i = 1; i < argc ; i++) {
00361             if (strcmp(argv[i], "--") == 0)
00362             data = 1;
00363         else if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0) ||
00364                  (data == 1)) {
00365             if (pattern == NULL) {
00366             pattern = argv[i];
00367             printf("Testing %s:\n", pattern);
00368             comp = xmlRegexpCompile((const xmlChar *) pattern);
00369             if (comp == NULL) {
00370                 printf("   failed to compile\n");
00371                 break;
00372             }
00373             if (debug)
00374                 xmlRegexpPrint(stdout, comp);
00375             } else {
00376             testRegexp(comp, argv[i]);
00377             }
00378         }
00379         }
00380         if (comp != NULL)
00381         xmlRegFreeRegexp(comp);
00382         }
00383     }
00384 #ifdef LIBXML_EXPR_ENABLED
00385     if (ctxt != NULL) {
00386     printf("Ops: %d nodes, %d cons\n",
00387            xmlExpCtxtNbNodes(ctxt), xmlExpCtxtNbCons(ctxt));
00388     xmlExpFreeCtxt(ctxt);
00389     }
00390 #endif
00391     xmlCleanupParser();
00392     xmlMemoryDump();
00393     return(0);
00394 }
00395 
00396 #else
00397 #include <stdio.h>
00398 int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
00399     printf("%s : Regexp support not compiled in\n", argv[0]);
00400     return(0);
00401 }
00402 #endif /* LIBXML_REGEXP_ENABLED */

Generated on Sat May 26 2012 04:33:32 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.