Annotation of libwww/Library/src/HTXML.c, revision 2.1

2.1     ! frystyk     1: /*
        !             2: **     LIBWWW STREAM WRAPPER FOR EXPAT XML PARSER
        !             3: **
        !             4: **     (c) COPYRIGHT MIT 1995.
        !             5: **     Please first read the full copyright statement in the file COPYRIGH.
        !             6: **     @(#) $Id: HTZip.c,v 2.7 1998/05/04 19:37:44 frystyk Exp $
        !             7: **
        !             8: **     This module requires expat in order to compile/link
        !             9: */
        !            10: 
        !            11: /* Library include files */
        !            12: #include "wwwsys.h"
        !            13: #include "WWWUtil.h"
        !            14: #include "WWWCore.h"
        !            15: #include "HTXML.h"                                      /* Implemented here */
        !            16: 
        !            17: #include <xmlparse.h>
        !            18: 
        !            19: struct _HTStream {
        !            20:     const HTStreamClass *      isa;
        !            21:     int                                state;
        !            22:     HTRequest *                        request;
        !            23:     HTStream *                 target;
        !            24:     XML_Parser                         xmlstream;
        !            25: };
        !            26: 
        !            27: /* ------------------------------------------------------------------------- */
        !            28: 
        !            29: PRIVATE int HTXML_flush (HTStream * me)
        !            30: {
        !            31:     return me->target ? (*me->target->isa->flush)(me->target) : HT_OK;
        !            32: }
        !            33: 
        !            34: PRIVATE int HTXML_free (HTStream * me)
        !            35: {
        !            36:     int status = HT_OK;
        !            37:     XML_ParserFree(me->xmlstream);
        !            38:     if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)
        !            39:        return HT_WOULD_BLOCK;
        !            40:     if (STREAM_TRACE) HTTrace("XML Parser.. FREEING...\n");
        !            41:     HT_FREE(me);
        !            42:     return status;
        !            43: }
        !            44: 
        !            45: PRIVATE int HTXML_abort (HTStream * me, HTList * e)
        !            46: {
        !            47:     if (STREAM_TRACE) HTTrace("XML Parser.. ABORTING...\n");
        !            48:     XML_ParserFree(me->xmlstream);
        !            49:     (*me->target->isa->abort)(me->target, NULL);
        !            50:     HT_FREE(me);
        !            51:     return HT_ERROR;
        !            52: }
        !            53: 
        !            54: PRIVATE int HTXML_write (HTStream * me, const char * buf, int len)
        !            55: {
        !            56:     if (me->state == HT_OK) {
        !            57:        int status = XML_Parse(me->xmlstream, buf, len, 0);
        !            58:        if (!status) {
        !            59:            HTTrace("XML Parser.. `%s\'\n", XML_ErrorString(status));
        !            60:            me->state = HT_ERROR;
        !            61:        }
        !            62:     }
        !            63:     return me->state;
        !            64: }
        !            65: 
        !            66: PRIVATE int HTXML_putCharacter (HTStream * me, char c)
        !            67: {
        !            68:     return HTXML_write(me, &c, 1);
        !            69: }
        !            70: 
        !            71: PRIVATE int HTXML_putString (HTStream * me, const char * s)
        !            72: {
        !            73:     return HTXML_write(me, s, (int) strlen(s));
        !            74: }
        !            75: 
        !            76: PRIVATE const HTStreamClass HTXMLClass =
        !            77: {              
        !            78:     "xml",
        !            79:     HTXML_flush,
        !            80:     HTXML_free,
        !            81:     HTXML_abort,
        !            82:     HTXML_putCharacter,
        !            83:     HTXML_putString,
        !            84:     HTXML_write
        !            85: }; 
        !            86: 
        !            87: PUBLIC HTStream * HTXML_new (HTRequest *       request,
        !            88:                             void *             param,
        !            89:                             HTFormat           input_format,
        !            90:                             HTFormat           output_format,
        !            91:                             HTStream *         output_stream)
        !            92: {
        !            93:     HTStream * me = NULL;
        !            94:     HTCharset charset = HTResponse_charset (HTRequest_response(request));
        !            95:     if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
        !            96:        HT_OUTOFMEM("HTXML_new");
        !            97:     me->isa = &HTXMLClass;
        !            98:     me->state = HT_OK;
        !            99:     me->request = request;
        !           100:     me->target = output_stream ? output_stream : HTErrorStream();
        !           101: 
        !           102:     /* Now create the XML parser instance */
        !           103:     if ((me->xmlstream = XML_ParserCreate(HTAtom_name(charset))) == NULL) {
        !           104:        HT_FREE(me);
        !           105:        return HTErrorStream();
        !           106:     }
        !           107: 
        !           108:     if (STREAM_TRACE) HTTrace("XML Parser.. Stream created\n");
        !           109:     return me;
        !           110: }

Webmaster