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>