Annotation of embedaddon/libxml2/testHTML.c, revision 1.1.1.2
1.1 misho 1: /*
2: * testHTML.c : a small tester program for HTML input.
3: *
4: * See Copyright for the status of this software.
5: *
6: * daniel@veillard.com
7: */
8:
9: #include "libxml.h"
10:
11: #ifdef LIBXML_HTML_ENABLED
12:
13: #include <string.h>
14: #include <stdarg.h>
15:
16:
17: #ifdef HAVE_SYS_TYPES_H
18: #include <sys/types.h>
19: #endif
20: #ifdef HAVE_SYS_STAT_H
21: #include <sys/stat.h>
22: #endif
23: #ifdef HAVE_FCNTL_H
24: #include <fcntl.h>
25: #endif
26: #ifdef HAVE_UNISTD_H
27: #include <unistd.h>
28: #endif
29: #ifdef HAVE_STDLIB_H
30: #include <stdlib.h>
31: #endif
32:
33: #include <libxml/xmlmemory.h>
34: #include <libxml/HTMLparser.h>
35: #include <libxml/HTMLtree.h>
36: #include <libxml/debugXML.h>
37: #include <libxml/xmlerror.h>
38: #include <libxml/globals.h>
39:
40: #ifdef LIBXML_DEBUG_ENABLED
41: static int debug = 0;
42: #endif
43: static int copy = 0;
44: static int sax = 0;
45: static int repeat = 0;
46: static int noout = 0;
47: #ifdef LIBXML_PUSH_ENABLED
48: static int push = 0;
49: #endif /* LIBXML_PUSH_ENABLED */
50: static char *encoding = NULL;
51: static int options = 0;
52:
53: static xmlSAXHandler emptySAXHandlerStruct = {
54: NULL, /* internalSubset */
55: NULL, /* isStandalone */
56: NULL, /* hasInternalSubset */
57: NULL, /* hasExternalSubset */
58: NULL, /* resolveEntity */
59: NULL, /* getEntity */
60: NULL, /* entityDecl */
61: NULL, /* notationDecl */
62: NULL, /* attributeDecl */
63: NULL, /* elementDecl */
64: NULL, /* unparsedEntityDecl */
65: NULL, /* setDocumentLocator */
66: NULL, /* startDocument */
67: NULL, /* endDocument */
68: NULL, /* startElement */
69: NULL, /* endElement */
70: NULL, /* reference */
71: NULL, /* characters */
72: NULL, /* ignorableWhitespace */
73: NULL, /* processingInstruction */
74: NULL, /* comment */
75: NULL, /* xmlParserWarning */
76: NULL, /* xmlParserError */
77: NULL, /* xmlParserError */
78: NULL, /* getParameterEntity */
79: NULL, /* cdataBlock */
80: NULL, /* externalSubset */
81: 1, /* initialized */
82: NULL, /* private */
83: NULL, /* startElementNsSAX2Func */
84: NULL, /* endElementNsSAX2Func */
85: NULL /* xmlStructuredErrorFunc */
86: };
87:
88: static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
89: extern xmlSAXHandlerPtr debugSAXHandler;
90:
91: /************************************************************************
92: * *
93: * Debug Handlers *
94: * *
95: ************************************************************************/
96:
97: /**
98: * isStandaloneDebug:
99: * @ctxt: An XML parser context
100: *
101: * Is this document tagged standalone ?
102: *
103: * Returns 1 if true
104: */
105: static int
106: isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
107: {
108: fprintf(stdout, "SAX.isStandalone()\n");
109: return(0);
110: }
111:
112: /**
113: * hasInternalSubsetDebug:
114: * @ctxt: An XML parser context
115: *
116: * Does this document has an internal subset
117: *
118: * Returns 1 if true
119: */
120: static int
121: hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
122: {
123: fprintf(stdout, "SAX.hasInternalSubset()\n");
124: return(0);
125: }
126:
127: /**
128: * hasExternalSubsetDebug:
129: * @ctxt: An XML parser context
130: *
131: * Does this document has an external subset
132: *
133: * Returns 1 if true
134: */
135: static int
136: hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
137: {
138: fprintf(stdout, "SAX.hasExternalSubset()\n");
139: return(0);
140: }
141:
142: /**
143: * hasInternalSubsetDebug:
144: * @ctxt: An XML parser context
145: *
146: * Does this document has an internal subset
147: */
148: static void
149: internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
150: const xmlChar *ExternalID, const xmlChar *SystemID)
151: {
152: fprintf(stdout, "SAX.internalSubset(%s,", name);
153: if (ExternalID == NULL)
154: fprintf(stdout, " ,");
155: else
156: fprintf(stdout, " %s,", ExternalID);
157: if (SystemID == NULL)
158: fprintf(stdout, " )\n");
159: else
160: fprintf(stdout, " %s)\n", SystemID);
161: }
162:
163: /**
164: * resolveEntityDebug:
165: * @ctxt: An XML parser context
166: * @publicId: The public ID of the entity
167: * @systemId: The system ID of the entity
168: *
169: * Special entity resolver, better left to the parser, it has
170: * more context than the application layer.
171: * The default behaviour is to NOT resolve the entities, in that case
172: * the ENTITY_REF nodes are built in the structure (and the parameter
173: * values).
174: *
175: * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
176: */
177: static xmlParserInputPtr
178: resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
179: {
180: /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
181:
1.1.1.2 ! misho 182:
1.1 misho 183: fprintf(stdout, "SAX.resolveEntity(");
184: if (publicId != NULL)
185: fprintf(stdout, "%s", (char *)publicId);
186: else
187: fprintf(stdout, " ");
188: if (systemId != NULL)
189: fprintf(stdout, ", %s)\n", (char *)systemId);
190: else
191: fprintf(stdout, ", )\n");
192: /*********
193: if (systemId != NULL) {
194: return(xmlNewInputFromFile(ctxt, (char *) systemId));
195: }
196: *********/
197: return(NULL);
198: }
199:
200: /**
201: * getEntityDebug:
202: * @ctxt: An XML parser context
203: * @name: The entity name
204: *
205: * Get an entity by name
206: *
207: * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
208: */
209: static xmlEntityPtr
210: getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
211: {
212: fprintf(stdout, "SAX.getEntity(%s)\n", name);
213: return(NULL);
214: }
215:
216: /**
217: * getParameterEntityDebug:
218: * @ctxt: An XML parser context
219: * @name: The entity name
220: *
221: * Get a parameter entity by name
222: *
223: * Returns the xmlParserInputPtr
224: */
225: static xmlEntityPtr
226: getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
227: {
228: fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
229: return(NULL);
230: }
231:
232:
233: /**
234: * entityDeclDebug:
235: * @ctxt: An XML parser context
1.1.1.2 ! misho 236: * @name: the entity name
! 237: * @type: the entity type
1.1 misho 238: * @publicId: The public ID of the entity
239: * @systemId: The system ID of the entity
240: * @content: the entity value (without processing).
241: *
242: * An entity definition has been parsed
243: */
244: static void
245: entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
246: const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
247: {
248: fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
249: name, type, publicId, systemId, content);
250: }
251:
252: /**
253: * attributeDeclDebug:
254: * @ctxt: An XML parser context
1.1.1.2 ! misho 255: * @name: the attribute name
! 256: * @type: the attribute type
1.1 misho 257: *
258: * An attribute definition has been parsed
259: */
260: static void
261: attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *elem, const xmlChar *name,
262: int type, int def, const xmlChar *defaultValue,
263: xmlEnumerationPtr tree ATTRIBUTE_UNUSED)
264: {
265: fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
266: elem, name, type, def, defaultValue);
267: }
268:
269: /**
270: * elementDeclDebug:
271: * @ctxt: An XML parser context
1.1.1.2 ! misho 272: * @name: the element name
! 273: * @type: the element type
1.1 misho 274: * @content: the element value (without processing).
275: *
276: * An element definition has been parsed
277: */
278: static void
279: elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
280: xmlElementContentPtr content ATTRIBUTE_UNUSED)
281: {
282: fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
283: name, type);
284: }
285:
286: /**
287: * notationDeclDebug:
288: * @ctxt: An XML parser context
289: * @name: The name of the notation
290: * @publicId: The public ID of the entity
291: * @systemId: The system ID of the entity
292: *
293: * What to do when a notation declaration has been parsed.
294: */
295: static void
296: notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
297: const xmlChar *publicId, const xmlChar *systemId)
298: {
299: fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
300: (char *) name, (char *) publicId, (char *) systemId);
301: }
302:
303: /**
304: * unparsedEntityDeclDebug:
305: * @ctxt: An XML parser context
306: * @name: The name of the entity
307: * @publicId: The public ID of the entity
308: * @systemId: The system ID of the entity
309: * @notationName: the name of the notation
310: *
311: * What to do when an unparsed entity declaration is parsed
312: */
313: static void
314: unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
315: const xmlChar *publicId, const xmlChar *systemId,
316: const xmlChar *notationName)
317: {
318: fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
319: (char *) name, (char *) publicId, (char *) systemId,
320: (char *) notationName);
321: }
322:
323: /**
324: * setDocumentLocatorDebug:
325: * @ctxt: An XML parser context
326: * @loc: A SAX Locator
327: *
328: * Receive the document locator at startup, actually xmlDefaultSAXLocator
329: * Everything is available on the context, so this is useless in our case.
330: */
331: static void
332: setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
333: {
334: fprintf(stdout, "SAX.setDocumentLocator()\n");
335: }
336:
337: /**
338: * startDocumentDebug:
339: * @ctxt: An XML parser context
340: *
341: * called when the document start being processed.
342: */
343: static void
344: startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
345: {
346: fprintf(stdout, "SAX.startDocument()\n");
347: }
348:
349: /**
350: * endDocumentDebug:
351: * @ctxt: An XML parser context
352: *
353: * called when the document end has been detected.
354: */
355: static void
356: endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
357: {
358: fprintf(stdout, "SAX.endDocument()\n");
359: }
360:
361: /**
362: * startElementDebug:
363: * @ctxt: An XML parser context
364: * @name: The element name
365: *
366: * called when an opening tag has been processed.
367: */
368: static void
369: startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
370: {
371: int i;
372:
373: fprintf(stdout, "SAX.startElement(%s", (char *) name);
374: if (atts != NULL) {
375: for (i = 0;(atts[i] != NULL);i++) {
376: fprintf(stdout, ", %s", atts[i++]);
377: if (atts[i] != NULL) {
378: unsigned char output[40];
379: const unsigned char *att = atts[i];
380: int outlen, attlen;
381: fprintf(stdout, "='");
382: while ((attlen = strlen((char*)att)) > 0) {
383: outlen = sizeof output - 1;
384: htmlEncodeEntities(output, &outlen, att, &attlen, '\'');
385: output[outlen] = 0;
386: fprintf(stdout, "%s", (char *) output);
387: att += attlen;
388: }
389: fprintf(stdout, "'");
390: }
391: }
392: }
393: fprintf(stdout, ")\n");
394: }
395:
396: /**
397: * endElementDebug:
398: * @ctxt: An XML parser context
399: * @name: The element name
400: *
401: * called when the end of an element has been detected.
402: */
403: static void
404: endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
405: {
406: fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
407: }
408:
409: /**
410: * charactersDebug:
411: * @ctxt: An XML parser context
412: * @ch: a xmlChar string
413: * @len: the number of xmlChar
414: *
415: * receiving some chars from the parser.
416: * Question: how much at a time ???
417: */
418: static void
419: charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
420: {
421: unsigned char output[40];
422: int inlen = len, outlen = 30;
423:
424: htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
425: output[outlen] = 0;
426:
427: fprintf(stdout, "SAX.characters(%s, %d)\n", output, len);
428: }
429:
430: /**
431: * cdataDebug:
432: * @ctxt: An XML parser context
433: * @ch: a xmlChar string
434: * @len: the number of xmlChar
435: *
436: * receiving some cdata chars from the parser.
437: * Question: how much at a time ???
438: */
439: static void
440: cdataDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
441: {
442: unsigned char output[40];
443: int inlen = len, outlen = 30;
444:
445: htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
446: output[outlen] = 0;
447:
448: fprintf(stdout, "SAX.cdata(%s, %d)\n", output, len);
449: }
450:
451: /**
452: * referenceDebug:
453: * @ctxt: An XML parser context
454: * @name: The entity name
455: *
1.1.1.2 ! misho 456: * called when an entity reference is detected.
1.1 misho 457: */
458: static void
459: referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
460: {
461: fprintf(stdout, "SAX.reference(%s)\n", name);
462: }
463:
464: /**
465: * ignorableWhitespaceDebug:
466: * @ctxt: An XML parser context
467: * @ch: a xmlChar string
468: * @start: the first char in the string
469: * @len: the number of xmlChar
470: *
471: * receiving some ignorable whitespaces from the parser.
472: * Question: how much at a time ???
473: */
474: static void
475: ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
476: {
477: char output[40];
478: int i;
479:
480: for (i = 0;(i<len) && (i < 30);i++)
481: output[i] = ch[i];
482: output[i] = 0;
483:
484: fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
485: }
486:
487: /**
488: * processingInstructionDebug:
489: * @ctxt: An XML parser context
490: * @target: the target name
491: * @data: the PI data's
492: * @len: the number of xmlChar
493: *
494: * A processing instruction has been parsed.
495: */
496: static void
497: processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
498: const xmlChar *data)
499: {
500: fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
501: (char *) target, (char *) data);
502: }
503:
504: /**
505: * commentDebug:
506: * @ctxt: An XML parser context
507: * @value: the comment content
508: *
509: * A comment has been parsed.
510: */
511: static void
512: commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
513: {
514: fprintf(stdout, "SAX.comment(%s)\n", value);
515: }
516:
517: /**
518: * warningDebug:
519: * @ctxt: An XML parser context
520: * @msg: the message to display/transmit
521: * @...: extra parameters for the message display
522: *
523: * Display and format a warning messages, gives file, line, position and
524: * extra parameters.
525: */
526: static void XMLCDECL
527: warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
528: {
529: va_list args;
530:
531: va_start(args, msg);
532: fprintf(stdout, "SAX.warning: ");
533: vfprintf(stdout, msg, args);
534: va_end(args);
535: }
536:
537: /**
538: * errorDebug:
539: * @ctxt: An XML parser context
540: * @msg: the message to display/transmit
541: * @...: extra parameters for the message display
542: *
543: * Display and format a error messages, gives file, line, position and
544: * extra parameters.
545: */
546: static void XMLCDECL
547: errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
548: {
549: va_list args;
550:
551: va_start(args, msg);
552: fprintf(stdout, "SAX.error: ");
553: vfprintf(stdout, msg, args);
554: va_end(args);
555: }
556:
557: /**
558: * fatalErrorDebug:
559: * @ctxt: An XML parser context
560: * @msg: the message to display/transmit
561: * @...: extra parameters for the message display
562: *
563: * Display and format a fatalError messages, gives file, line, position and
564: * extra parameters.
565: */
566: static void XMLCDECL
567: fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
568: {
569: va_list args;
570:
571: va_start(args, msg);
572: fprintf(stdout, "SAX.fatalError: ");
573: vfprintf(stdout, msg, args);
574: va_end(args);
575: }
576:
577: static xmlSAXHandler debugSAXHandlerStruct = {
578: internalSubsetDebug,
579: isStandaloneDebug,
580: hasInternalSubsetDebug,
581: hasExternalSubsetDebug,
582: resolveEntityDebug,
583: getEntityDebug,
584: entityDeclDebug,
585: notationDeclDebug,
586: attributeDeclDebug,
587: elementDeclDebug,
588: unparsedEntityDeclDebug,
589: setDocumentLocatorDebug,
590: startDocumentDebug,
591: endDocumentDebug,
592: startElementDebug,
593: endElementDebug,
594: referenceDebug,
595: charactersDebug,
596: ignorableWhitespaceDebug,
597: processingInstructionDebug,
598: commentDebug,
599: warningDebug,
600: errorDebug,
601: fatalErrorDebug,
602: getParameterEntityDebug,
603: cdataDebug,
604: NULL,
605: 1,
606: NULL,
607: NULL,
608: NULL,
609: NULL
610: };
611:
612: xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
613: /************************************************************************
614: * *
615: * Debug *
616: * *
617: ************************************************************************/
618:
619: static void
620: parseSAXFile(char *filename) {
621: htmlDocPtr doc = NULL;
622:
623: /*
624: * Empty callbacks for checking
625: */
626: #ifdef LIBXML_PUSH_ENABLED
627: if (push) {
628: FILE *f;
629:
630: #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
631: f = fopen(filename, "rb");
632: #else
633: f = fopen(filename, "r");
634: #endif
635: if (f != NULL) {
636: int res, size = 3;
637: char chars[4096];
638: htmlParserCtxtPtr ctxt;
639:
640: /* if (repeat) */
641: size = 4096;
642: res = fread(chars, 1, 4, f);
643: if (res > 0) {
644: ctxt = htmlCreatePushParserCtxt(emptySAXHandler, NULL,
645: chars, res, filename, XML_CHAR_ENCODING_NONE);
646: while ((res = fread(chars, 1, size, f)) > 0) {
647: htmlParseChunk(ctxt, chars, res, 0);
648: }
649: htmlParseChunk(ctxt, chars, 0, 1);
650: doc = ctxt->myDoc;
651: htmlFreeParserCtxt(ctxt);
652: }
653: if (doc != NULL) {
654: fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
655: xmlFreeDoc(doc);
656: }
657: fclose(f);
658: }
659: if (!noout) {
660: #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
661: f = fopen(filename, "rb");
662: #else
663: f = fopen(filename, "r");
664: #endif
665: if (f != NULL) {
666: int res, size = 3;
667: char chars[4096];
668: htmlParserCtxtPtr ctxt;
669:
670: /* if (repeat) */
671: size = 4096;
672: res = fread(chars, 1, 4, f);
673: if (res > 0) {
674: ctxt = htmlCreatePushParserCtxt(debugSAXHandler, NULL,
675: chars, res, filename, XML_CHAR_ENCODING_NONE);
676: while ((res = fread(chars, 1, size, f)) > 0) {
677: htmlParseChunk(ctxt, chars, res, 0);
678: }
679: htmlParseChunk(ctxt, chars, 0, 1);
680: doc = ctxt->myDoc;
681: htmlFreeParserCtxt(ctxt);
682: }
683: if (doc != NULL) {
684: fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
685: xmlFreeDoc(doc);
686: }
687: fclose(f);
688: }
689: }
1.1.1.2 ! misho 690: } else {
1.1 misho 691: #endif /* LIBXML_PUSH_ENABLED */
692: doc = htmlSAXParseFile(filename, NULL, emptySAXHandler, NULL);
693: if (doc != NULL) {
694: fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
695: xmlFreeDoc(doc);
696: }
697:
698: if (!noout) {
699: /*
700: * Debug callback
701: */
702: doc = htmlSAXParseFile(filename, NULL, debugSAXHandler, NULL);
703: if (doc != NULL) {
704: fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
705: xmlFreeDoc(doc);
706: }
707: }
708: #ifdef LIBXML_PUSH_ENABLED
709: }
710: #endif /* LIBXML_PUSH_ENABLED */
711: }
712:
713: static void
714: parseAndPrintFile(char *filename) {
715: htmlDocPtr doc = NULL;
716:
717: /*
718: * build an HTML tree from a string;
719: */
720: #ifdef LIBXML_PUSH_ENABLED
721: if (push) {
722: FILE *f;
723:
724: #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
725: f = fopen(filename, "rb");
726: #else
727: f = fopen(filename, "r");
728: #endif
729: if (f != NULL) {
730: int res, size = 3;
731: char chars[4096];
732: htmlParserCtxtPtr ctxt;
733:
734: /* if (repeat) */
735: size = 4096;
736: res = fread(chars, 1, 4, f);
737: if (res > 0) {
738: ctxt = htmlCreatePushParserCtxt(NULL, NULL,
739: chars, res, filename, XML_CHAR_ENCODING_NONE);
740: while ((res = fread(chars, 1, size, f)) > 0) {
741: htmlParseChunk(ctxt, chars, res, 0);
742: }
743: htmlParseChunk(ctxt, chars, 0, 1);
744: doc = ctxt->myDoc;
745: htmlFreeParserCtxt(ctxt);
746: }
747: fclose(f);
748: }
1.1.1.2 ! misho 749: } else {
1.1 misho 750: doc = htmlReadFile(filename, NULL, options);
751: }
752: #else
753: doc = htmlReadFile(filename,NULL,options);
754: #endif
755: if (doc == NULL) {
756: xmlGenericError(xmlGenericErrorContext,
757: "Could not parse %s\n", filename);
758: }
759:
760: #ifdef LIBXML_TREE_ENABLED
761: /*
762: * test intermediate copy if needed.
763: */
764: if (copy) {
765: htmlDocPtr tmp;
766:
767: tmp = doc;
768: doc = xmlCopyDoc(doc, 1);
769: xmlFreeDoc(tmp);
770: }
771: #endif
772:
773: #ifdef LIBXML_OUTPUT_ENABLED
774: /*
775: * print it.
776: */
1.1.1.2 ! misho 777: if (!noout) {
1.1 misho 778: #ifdef LIBXML_DEBUG_ENABLED
779: if (!debug) {
780: if (encoding)
781: htmlSaveFileEnc("-", doc, encoding);
782: else
783: htmlDocDump(stdout, doc);
784: } else
785: xmlDebugDumpDocument(stdout, doc);
786: #else
787: if (encoding)
788: htmlSaveFileEnc("-", doc, encoding);
789: else
790: htmlDocDump(stdout, doc);
791: #endif
1.1.1.2 ! misho 792: }
1.1 misho 793: #endif /* LIBXML_OUTPUT_ENABLED */
794:
795: /*
796: * free it.
797: */
798: xmlFreeDoc(doc);
799: }
800:
801: int main(int argc, char **argv) {
802: int i, count;
803: int files = 0;
804:
805: for (i = 1; i < argc ; i++) {
806: #ifdef LIBXML_DEBUG_ENABLED
807: if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
808: debug++;
809: else
810: #endif
811: if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
812: copy++;
813: #ifdef LIBXML_PUSH_ENABLED
814: else if ((!strcmp(argv[i], "-push")) || (!strcmp(argv[i], "--push")))
815: push++;
816: #endif /* LIBXML_PUSH_ENABLED */
817: else if ((!strcmp(argv[i], "-sax")) || (!strcmp(argv[i], "--sax")))
818: sax++;
819: else if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout")))
820: noout++;
821: else if ((!strcmp(argv[i], "-repeat")) ||
822: (!strcmp(argv[i], "--repeat")))
823: repeat++;
824: else if ((!strcmp(argv[i], "-encode")) ||
825: (!strcmp(argv[i], "--encode"))) {
826: i++;
827: encoding = argv[i];
828: }
829: }
830: for (i = 1; i < argc ; i++) {
831: if ((!strcmp(argv[i], "-encode")) ||
832: (!strcmp(argv[i], "--encode"))) {
833: i++;
834: continue;
835: }
836: if (argv[i][0] != '-') {
837: if (repeat) {
838: for (count = 0;count < 100 * repeat;count++) {
839: if (sax)
840: parseSAXFile(argv[i]);
1.1.1.2 ! misho 841: else
1.1 misho 842: parseAndPrintFile(argv[i]);
1.1.1.2 ! misho 843: }
1.1 misho 844: } else {
845: if (sax)
846: parseSAXFile(argv[i]);
1.1.1.2 ! misho 847: else
1.1 misho 848: parseAndPrintFile(argv[i]);
849: }
850: files ++;
851: }
852: }
853: if (files == 0) {
854: printf("Usage : %s [--debug] [--copy] [--copy] HTMLfiles ...\n",
855: argv[0]);
856: printf("\tParse the HTML files and output the result of the parsing\n");
857: #ifdef LIBXML_DEBUG_ENABLED
858: printf("\t--debug : dump a debug tree of the in-memory document\n");
859: #endif
860: printf("\t--copy : used to test the internal copy implementation\n");
861: printf("\t--sax : debug the sequence of SAX callbacks\n");
862: printf("\t--repeat : parse the file 100 times, for timing\n");
863: printf("\t--noout : do not print the result\n");
864: #ifdef LIBXML_PUSH_ENABLED
865: printf("\t--push : use the push mode parser\n");
866: #endif /* LIBXML_PUSH_ENABLED */
867: printf("\t--encode encoding : output in the given encoding\n");
868: }
869: xmlCleanupParser();
870: xmlMemoryDump();
871:
872: return(0);
873: }
874: #else /* !LIBXML_HTML_ENABLED */
875: #include <stdio.h>
876: int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
877: printf("%s : HTML support not compiled in\n", argv[0]);
878: return(0);
879: }
880: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>