More efficient conversion of data

This commit is contained in:
James Clark 1998-02-03 11:40:36 +00:00
parent b1c9b03eba
commit d958fac99a

View File

@ -136,6 +136,8 @@ typedef struct {
/* allocated end of buffer */
const char *bufferLim;
long bufferEndByteIndex;
char *dataBuf;
char *dataBufEnd;
void *userData;
XML_StartElementHandler startElementHandler;
XML_EndElementHandler endElementHandler;
@ -185,6 +187,8 @@ typedef struct {
#define bufferEnd (((Parser *)parser)->bufferEnd)
#define bufferEndByteIndex (((Parser *)parser)->bufferEndByteIndex)
#define bufferLim (((Parser *)parser)->bufferLim)
#define dataBuf (((Parser *)parser)->dataBuf)
#define dataBufEnd (((Parser *)parser)->dataBufEnd)
#define dtd (((Parser *)parser)->dtd)
#define declEntity (((Parser *)parser)->declEntity)
#define declElementType (((Parser *)parser)->declElementType)
@ -230,15 +234,17 @@ XML_Parser XML_ParserCreate(const char *encodingName)
tagStackPtr = tagStack;
attsSize = 1024;
atts = malloc(attsSize * sizeof(ATTRIBUTE));
dataBuf = malloc(1024);
groupSize = 0;
groupConnector = 0;
poolInit(&tempPool);
poolInit(&temp2Pool);
if (!dtdInit(&dtd) || !atts || !tagStack) {
if (!dtdInit(&dtd) || !atts || !tagStack || !dataBuf) {
XML_ParserFree(parser);
return 0;
}
tagStackEnd = tagStack + 1024;
dataBufEnd = dataBuf + 1024;
*tagStackPtr++ = '\0';
return parser;
}
@ -252,6 +258,7 @@ void XML_ParserFree(XML_Parser parser)
free((void *)atts);
free(groupConnector);
free(buffer);
free(dataBuf);
free(parser);
}
@ -663,22 +670,22 @@ doContent(XML_Parser parser,
break;
case XML_TOK_CDATA_SECTION:
if (characterDataHandler) {
if (!poolAppend(&tempPool,
enc,
s + enc->minBytesPerChar * 9,
next - enc->minBytesPerChar * 3))
return XML_ERROR_NO_MEMORY;
characterDataHandler(userData, poolStart(&tempPool), poolLength(&tempPool));
poolDiscard(&tempPool);
const char *lim = next - enc->minBytesPerChar * 3;
s += enc->minBytesPerChar * 9;
do {
char *dataPtr = dataBuf;
XmlConvert(enc, XML_UTF8_ENCODING, &s, lim, &dataPtr, dataBufEnd);
characterDataHandler(userData, dataBuf, dataPtr - dataBuf);
} while (s != lim);
}
break;
case XML_TOK_DATA_CHARS:
if (characterDataHandler) {
/* FIXME Do this efficiently */
if (!poolAppend(&tempPool, enc, s, next))
return XML_ERROR_NO_MEMORY;
characterDataHandler(userData, poolStart(&tempPool), poolLength(&tempPool));
poolDiscard(&tempPool);
do {
char *dataPtr = dataBuf;
XmlConvert(enc, XML_UTF8_ENCODING, &s, next, &dataPtr, dataBufEnd);
characterDataHandler(userData, dataBuf, dataPtr - dataBuf);
} while (s != next);
}
break;
case XML_TOK_PI: