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

📄 xmlparse.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
📖 第 1 页 / 共 5 页
字号:
}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 *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;}staticenum XML_Error contentProcessor(XML_Parser parser,                                const char *start,                                const char *end,                                const char **endPtr){    return doContent(parser, 0, encoding, start, end, endPtr);}staticenum 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);}staticenum 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);}staticenum 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);}staticenum 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_ErrordoContent(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) {                XML_Char c = 0xA;                characterDataHandler(handlerArg, &c, 1);            }            else if (defaultHandler)                reportDefault(parser, enc, s, end);            if (startTagLevel == 0)                return XML_ERROR_NO_ELEMENTS;            if (tagLevel != startTagLevel)                return XML_ERROR_ASYNC_ENTITY;            return XML_ERROR_NONE;        case XML_TOK_NONE:            if (nextPtr) {                *nextPtr = s;                return XML_ERROR_NONE;            }            if (startTagLevel > 0) {                if (tagLevel != startTagLevel)                    return XML_ERROR_ASYNC_ENTITY;                return XML_ERROR_NONE;            }            return XML_ERROR_NO_ELEMENTS;        case XML_TOK_INVALID:            *eventPP = next;            return XML_ERROR_INVALID_TOKEN;        case XML_TOK_PARTIAL:            if (nextPtr) {                *nextPtr = s;                return XML_ERROR_NONE;            }            return XML_ERROR_UNCLOSED_TOKEN;        case XML_TOK_PARTIAL_CHAR:            if (nextPtr) {                *nextPtr = s;                return XML_ERROR_NONE;            }            return XML_ERROR_PARTIAL_CHAR;        case XML_TOK_ENTITY_REF:            {                const XML_Char *name;                ENTITY *entity;                XML_Char ch = XmlPredefinedEntityName(enc,                                                      s + enc->minBytesPerChar,                                                      next - enc->minBytesPerChar);                if (ch) {                    if (characterDataHandler)                        characterDataHandler(handlerArg, &ch, 1);                    else if (defaultHandler)                        reportDefault(parser, enc, s, next);                    break;

⌨️ 快捷键说明

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