⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparse.c

📁 Simple Jabber Client for Symbian Platform
💻 C
📖 第 1 页 / 共 5 页
字号:
}

void XML_SetNamespaceDeclHandler(XML_Parser parser,
                                 XML_StartNamespaceDeclHandler start,
                                 XML_EndNamespaceDeclHandler end)
{
    startNamespaceDeclHandler = start;
    endNamespaceDeclHandler = end;
}

void XML_SetNotStandaloneHandler(XML_Parser parser,
                                 XML_NotStandaloneHandler handler)
{
    notStandaloneHandler = handler;
}

void XML_SetExternalEntityRefHandler(XML_Parser parser,
                                     XML_ExternalEntityRefHandler handler)
{
    externalEntityRefHandler = handler;
}

void XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
{
    if (arg)
        externalEntityRefHandlerArg = arg;
    else
        externalEntityRefHandlerArg = parser;
}

void XML_SetUnknownEncodingHandler(XML_Parser parser,
                                   XML_UnknownEncodingHandler handler,
                                   void *data)
{
    unknownEncodingHandler = handler;
    unknownEncodingHandlerData = data;
}

int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
{
    if (len == 0) {
        if (!isFinal)
            return 1;
        positionPtr = bufferPtr;
        errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0);
        if (errorCode == XML_ERROR_NONE)
            return 1;
        eventEndPtr = eventPtr;
        return 0;
    }
    else if (bufferPtr == bufferEnd) {
        const char *end;
        int nLeftOver;
        parseEndByteIndex += len;
        positionPtr = s;
        if (isFinal) {
            errorCode = processor(parser, s, parseEndPtr = s + len, 0);
            if (errorCode == XML_ERROR_NONE)
                return 1;
            eventEndPtr = eventPtr;
            return 0;
        }
        errorCode = processor(parser, s, parseEndPtr = s + len, &end);
        if (errorCode != XML_ERROR_NONE) {
            eventEndPtr = eventPtr;
            return 0;
        }
        XmlUpdatePosition(encoding, positionPtr, end, &position);
        nLeftOver = s + len - end;
        if (nLeftOver) {
            if (buffer == 0 || nLeftOver > bufferLim - buffer) {
                /* FIXME avoid integer overflow */
                buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2);
                if (!buffer) {
                    errorCode = XML_ERROR_NO_MEMORY;
                    eventPtr = eventEndPtr = 0;
                    return 0;
                }
                bufferLim = buffer + len * 2;
            }
            memcpy(buffer, end, nLeftOver);
            bufferPtr = buffer;
            bufferEnd = buffer + nLeftOver;
        }
        return 1;
    }
    else {
        memcpy(XML_GetBuffer(parser, len), s, len);
        return XML_ParseBuffer(parser, len, isFinal);
    }
}

int XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
{
    const char *start = bufferPtr;
    positionPtr = start;
    bufferEnd += len;
    parseEndByteIndex += len;
    errorCode = processor(parser, start, parseEndPtr = bufferEnd,
                          isFinal ? (const char **)0 : &bufferPtr);
    if (errorCode == XML_ERROR_NONE) {
        if (!isFinal)
            XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
        return 1;
    }
    else {
        eventEndPtr = eventPtr;
        return 0;
    }
}

void *XML_GetBuffer(XML_Parser parser, int len)
{
    if (len > bufferLim - bufferEnd) {
        /* FIXME avoid integer overflow */
        int neededSize = len + (bufferEnd - bufferPtr);
        if (neededSize  <= bufferLim - buffer) {
            memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
            bufferEnd = buffer + (bufferEnd - bufferPtr);
            bufferPtr = buffer;
        }
        else {
            char *newBuf;
            int bufferSize = bufferLim - bufferPtr;
            if (bufferSize == 0)
                bufferSize = INIT_BUFFER_SIZE;
            do {
                bufferSize *= 2;
            } while (bufferSize < neededSize);
            newBuf = malloc(bufferSize);
            if (newBuf == 0) {
                errorCode = XML_ERROR_NO_MEMORY;
                return 0;
            }
            bufferLim = newBuf + bufferSize;
            if (bufferPtr) {
                memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
                free(buffer);
            }
            bufferEnd = newBuf + (bufferEnd - bufferPtr);
            bufferPtr = buffer = newBuf;
        }
    }
    return bufferEnd;
}

enum XML_Error XML_GetErrorCode(XML_Parser parser)
{
    return errorCode;
}

long XML_GetCurrentByteIndex(XML_Parser parser)
{
    if (eventPtr)
        return parseEndByteIndex - (parseEndPtr - eventPtr);
    return -1;
}

int XML_GetCurrentByteCount(XML_Parser parser)
{
    if (eventEndPtr && eventPtr)
        return eventEndPtr - eventPtr;
    return 0;
}

int XML_GetCurrentLineNumber(XML_Parser parser)
{
    if (eventPtr) {
        XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
        positionPtr = eventPtr;
    }
    return position.lineNumber + 1;
}

int XML_GetCurrentColumnNumber(XML_Parser parser)
{
    if (eventPtr) {
        XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
        positionPtr = eventPtr;
    }
    return position.columnNumber;
}

void XML_DefaultCurrent(XML_Parser parser)
{
    if (defaultHandler) {
        if (openInternalEntities)
            reportDefault(parser,
                          ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(),
                          openInternalEntities->internalEventPtr,
                          openInternalEntities->internalEventEndPtr);
        else
            reportDefault(parser, encoding, eventPtr, eventEndPtr);
    }
}

const XML_LChar *XML_ErrorString(int code)
{
    static const XML_LChar* const message[] = {
        0,
        XML_T("out of memory"),
        XML_T("syntax error"),
        XML_T("no element found"),
        XML_T("not well-formed"),
        XML_T("unclosed token"),
        XML_T("unclosed token"),
        XML_T("mismatched tag"),
        XML_T("duplicate attribute"),
        XML_T("junk after document element"),
        XML_T("illegal parameter entity reference"),
        XML_T("undefined entity"),
        XML_T("recursive entity reference"),
        XML_T("asynchronous entity"),
        XML_T("reference to invalid character number"),
        XML_T("reference to binary entity"),
        XML_T("reference to external entity in attribute"),
        XML_T("xml processing instruction not at start of external entity"),
        XML_T("unknown encoding"),
        XML_T("encoding specified in XML declaration is incorrect"),
        XML_T("unclosed CDATA section"),
        XML_T("error in processing external entity reference"),
        XML_T("document is not standalone")
    };
    if (code > 0 && code < sizeof(message)/sizeof(message[0]))
        return message[code];
    return 0;
}

static
enum XML_Error contentProcessor(XML_Parser parser,
                                const char *start,
                                const char *end,
                                const char **endPtr)
{
    return doContent(parser, 0, encoding, start, end, endPtr);
}

static
enum XML_Error externalEntityInitProcessor(XML_Parser parser,
        const char *start,
        const char *end,
        const char **endPtr)
{
    enum XML_Error result = initializeEncoding(parser);
    if (result != XML_ERROR_NONE)
        return result;
    processor = externalEntityInitProcessor2;
    return externalEntityInitProcessor2(parser, start, end, endPtr);
}

static
enum XML_Error externalEntityInitProcessor2(XML_Parser parser,
        const char *start,
        const char *end,
        const char **endPtr)
{
    const char *next;
    int tok = XmlContentTok(encoding, start, end, &next);
    switch (tok) {
    case XML_TOK_BOM:
        start = next;
        break;
    case XML_TOK_PARTIAL:
        if (endPtr) {
            *endPtr = start;
            return XML_ERROR_NONE;
        }
        eventPtr = start;
        return XML_ERROR_UNCLOSED_TOKEN;
    case XML_TOK_PARTIAL_CHAR:
        if (endPtr) {
            *endPtr = start;
            return XML_ERROR_NONE;
        }
        eventPtr = start;
        return XML_ERROR_PARTIAL_CHAR;
    }
    processor = externalEntityInitProcessor3;
    return externalEntityInitProcessor3(parser, start, end, endPtr);
}

static
enum XML_Error externalEntityInitProcessor3(XML_Parser parser,
        const char *start,
        const char *end,
        const char **endPtr)
{
    const char *next;
    int tok = XmlContentTok(encoding, start, end, &next);
    switch (tok) {
    case XML_TOK_XML_DECL:
        {
            enum XML_Error result = processXmlDecl(parser, 1, start, next);
            if (result != XML_ERROR_NONE)
                return result;
            start = next;
        }
        break;
    case XML_TOK_PARTIAL:
        if (endPtr) {
            *endPtr = start;
            return XML_ERROR_NONE;
        }
        eventPtr = start;
        return XML_ERROR_UNCLOSED_TOKEN;
    case XML_TOK_PARTIAL_CHAR:
        if (endPtr) {
            *endPtr = start;
            return XML_ERROR_NONE;
        }
        eventPtr = start;
        return XML_ERROR_PARTIAL_CHAR;
    }
    processor = externalEntityContentProcessor;
    tagLevel = 1;
    return doContent(parser, 1, encoding, start, end, endPtr);
}

static
enum XML_Error externalEntityContentProcessor(XML_Parser parser,
        const char *start,
        const char *end,
        const char **endPtr)
{
    return doContent(parser, 1, encoding, start, end, endPtr);
}

static enum XML_Error
doContent(XML_Parser parser,
          int startTagLevel,
          const ENCODING *enc,
          const char *s,
          const char *end,
          const char **nextPtr)
{
    const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding();
    const char **eventPP;
    const char **eventEndPP;
    if (enc == encoding) {
        eventPP = &eventPtr;
        eventEndPP = &eventEndPtr;
    }
    else {
        eventPP = &(openInternalEntities->internalEventPtr);
        eventEndPP = &(openInternalEntities->internalEventEndPtr);
    }
    *eventPP = s;
    for (;;) {
        const char *next = s; /* XmlContentTok doesn't always set the last arg */
        int tok = XmlContentTok(enc, s, end, &next);
        *eventEndPP = next;
        switch (tok) {
        case XML_TOK_TRAILING_CR:
            if (nextPtr) {
                *nextPtr = s;
                return XML_ERROR_NONE;
            }
            *eventEndPP = end;
            if (characterDataHandler) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -