Annotation of embedaddon/libxml2/doc/examples/parse4.c, revision 1.1

1.1     ! misho       1: /**
        !             2:  * section: Parsing
        !             3:  * synopsis: Parse an XML document chunk by chunk to a tree and free it
        !             4:  * purpose: Demonstrate the use of xmlCreatePushParserCtxt() and
        !             5:  *          xmlParseChunk() to read an XML file progressively
        !             6:  *          into a tree and and xmlFreeDoc() to free the resulting tree
        !             7:  * usage: parse4 test3.xml
        !             8:  * test: parse4 test3.xml
        !             9:  * author: Daniel Veillard
        !            10:  * copy: see Copyright for the status of this software.
        !            11:  */
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include <libxml/parser.h>
        !            15: #include <libxml/tree.h>
        !            16: 
        !            17: #ifdef LIBXML_PUSH_ENABLED
        !            18: static FILE *desc;
        !            19: 
        !            20: /**
        !            21:  * readPacket:
        !            22:  * @mem: array to store the packet
        !            23:  * @size: the packet size
        !            24:  *
        !            25:  * read at most @size bytes from the document and store it in @mem
        !            26:  *
        !            27:  * Returns the number of bytes read
        !            28:  */
        !            29: static int
        !            30: readPacket(char *mem, int size) {
        !            31:     int res;
        !            32: 
        !            33:     res = fread(mem, 1, size, desc);
        !            34:     return(res);
        !            35: }
        !            36: 
        !            37: /**
        !            38:  * example4Func:
        !            39:  * @filename: a filename or an URL
        !            40:  *
        !            41:  * Parse the resource and free the resulting tree
        !            42:  */
        !            43: static void
        !            44: example4Func(const char *filename) {
        !            45:     xmlParserCtxtPtr ctxt;
        !            46:     char chars[4];
        !            47:     xmlDocPtr doc; /* the resulting document tree */
        !            48:     int res;
        !            49: 
        !            50:     /*
        !            51:      * Read a few first byte to check the input used for the
        !            52:      * encoding detection at the parser level.
        !            53:      */
        !            54:     res = readPacket(chars, 4);
        !            55:     if (res <= 0) {
        !            56:         fprintf(stderr, "Failed to parse %s\n", filename);
        !            57:        return;
        !            58:     }
        !            59: 
        !            60:     /*
        !            61:      * Create a progressive parsing context, the 2 first arguments
        !            62:      * are not used since we want to build a tree and not use a SAX
        !            63:      * parsing interface. We also pass the first bytes of the document
        !            64:      * to allow encoding detection when creating the parser but this
        !            65:      * is optional.
        !            66:      */
        !            67:     ctxt = xmlCreatePushParserCtxt(NULL, NULL,
        !            68:                                    chars, res, filename);
        !            69:     if (ctxt == NULL) {
        !            70:         fprintf(stderr, "Failed to create parser context !\n");
        !            71:        return;
        !            72:     }
        !            73: 
        !            74:     /*
        !            75:      * loop on the input getting the document data, of course 4 bytes
        !            76:      * at a time is not realistic but allows to verify testing on small
        !            77:      * documents.
        !            78:      */
        !            79:     while ((res = readPacket(chars, 4)) > 0) {
        !            80:         xmlParseChunk(ctxt, chars, res, 0);
        !            81:     }
        !            82: 
        !            83:     /*
        !            84:      * there is no more input, indicate the parsing is finished.
        !            85:      */
        !            86:     xmlParseChunk(ctxt, chars, 0, 1);
        !            87: 
        !            88:     /*
        !            89:      * collect the document back and if it was wellformed
        !            90:      * and destroy the parser context.
        !            91:      */
        !            92:     doc = ctxt->myDoc;
        !            93:     res = ctxt->wellFormed;
        !            94:     xmlFreeParserCtxt(ctxt);
        !            95: 
        !            96:     if (!res) {
        !            97:         fprintf(stderr, "Failed to parse %s\n", filename);
        !            98:     }
        !            99: 
        !           100:     /*
        !           101:      * since we don't use the document, destroy it now.
        !           102:      */
        !           103:     xmlFreeDoc(doc);
        !           104: }
        !           105: 
        !           106: int main(int argc, char **argv) {
        !           107:     if (argc != 2)
        !           108:         return(1);
        !           109: 
        !           110:     /*
        !           111:      * this initialize the library and check potential ABI mismatches
        !           112:      * between the version it was compiled for and the actual shared
        !           113:      * library used.
        !           114:      */
        !           115:     LIBXML_TEST_VERSION
        !           116: 
        !           117:     /*
        !           118:      * simulate a progressive parsing using the input file.
        !           119:      */
        !           120:     desc = fopen(argv[1], "rb");
        !           121:     if (desc != NULL) {
        !           122:        example4Func(argv[1]);
        !           123:        fclose(desc);
        !           124:     } else {
        !           125:         fprintf(stderr, "Failed to parse %s\n", argv[1]);
        !           126:     }
        !           127: 
        !           128:     /*
        !           129:      * Cleanup function for the XML library.
        !           130:      */
        !           131:     xmlCleanupParser();
        !           132:     /*
        !           133:      * this is to debug memory for regression tests
        !           134:      */
        !           135:     xmlMemoryDump();
        !           136:     return(0);
        !           137: }
        !           138: #else /* ! LIBXML_PUSH_ENABLED */
        !           139: int main(int argc, char **argv) {
        !           140:     fprintf(stderr, "Library not compiled with push parser support\n");
        !           141:     return(1);
        !           142: }
        !           143: #endif

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