00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "xmldef.h"
00032 #include "xmlparse.h"
00033
00034 #ifdef XML_UNICODE
00035 #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
00036 #define XmlConvert XmlUtf16Convert
00037 #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
00038 #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
00039 #define XmlEncode XmlUtf16Encode
00040 #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
00041 typedef unsigned short ICHAR;
00042 #else
00043 #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
00044 #define XmlConvert XmlUtf8Convert
00045 #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
00046 #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
00047 #define XmlEncode XmlUtf8Encode
00048 #define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
00049 typedef char ICHAR;
00050 #endif
00051
00052
00053 #ifndef XML_NS
00054
00055 #define XmlInitEncodingNS XmlInitEncoding
00056 #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
00057 #undef XmlGetInternalEncodingNS
00058 #define XmlGetInternalEncodingNS XmlGetInternalEncoding
00059 #define XmlParseXmlDeclNS XmlParseXmlDecl
00060
00061 #endif
00062
00063
00064 #ifdef XML_UNICODE_WCHAR_T
00065 #define XML_T(x) L ## x
00066 #else
00067 #define XML_T(x) x
00068 #endif
00069
00070
00071 #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
00072
00073 #include "xmltok.h"
00074 #include "xmlrole.h"
00075 #include "hashtable.h"
00076
00077 #define INIT_TAG_BUF_SIZE 32
00078 #define INIT_DATA_BUF_SIZE 1024
00079 #define INIT_ATTS_SIZE 16
00080 #define INIT_BLOCK_SIZE 1024
00081 #define INIT_BUFFER_SIZE 1024
00082
00083 #define EXPAND_SPARE 24
00084
00085 typedef struct binding {
00086 struct prefix *prefix;
00087 struct binding *nextTagBinding;
00088 struct binding *prevPrefixBinding;
00089 const struct attribute_id *attId;
00090 XML_Char *uri;
00091 int uriLen;
00092 int uriAlloc;
00093 } BINDING;
00094
00095 typedef struct prefix {
00096 const XML_Char *name;
00097 BINDING *binding;
00098 } PREFIX;
00099
00100 typedef struct {
00101 const XML_Char *str;
00102 const XML_Char *localPart;
00103 int uriLen;
00104 } TAG_NAME;
00105
00106 typedef struct tag {
00107 struct tag *parent;
00108 const char *rawName;
00109 int rawNameLength;
00110 TAG_NAME name;
00111 char *buf;
00112 char *bufEnd;
00113 BINDING *bindings;
00114 } TAG;
00115
00116 typedef struct {
00117 const XML_Char *name;
00118 const XML_Char *textPtr;
00119 int textLen;
00120 const XML_Char *systemId;
00121 const XML_Char *base;
00122 const XML_Char *publicId;
00123 const XML_Char *notation;
00124 char open;
00125 } ENTITY;
00126
00127 typedef struct block {
00128 struct block *next;
00129 int size;
00130 XML_Char s[1];
00131 } BLOCK;
00132
00133 typedef struct {
00134 BLOCK *blocks;
00135 BLOCK *freeBlocks;
00136 const XML_Char *end;
00137 XML_Char *ptr;
00138 XML_Char *start;
00139 } STRING_POOL;
00140
00141
00142
00143 typedef struct attribute_id {
00144 XML_Char *name;
00145 PREFIX *prefix;
00146 char maybeTokenized;
00147 char xmlns;
00148 } ATTRIBUTE_ID;
00149
00150 typedef struct {
00151 const ATTRIBUTE_ID *id;
00152 char isCdata;
00153 const XML_Char *value;
00154 } DEFAULT_ATTRIBUTE;
00155
00156 typedef struct {
00157 const XML_Char *name;
00158 PREFIX *prefix;
00159 int nDefaultAtts;
00160 int allocDefaultAtts;
00161 DEFAULT_ATTRIBUTE *defaultAtts;
00162 } ELEMENT_TYPE;
00163
00164 typedef struct {
00165 HASH_TABLE generalEntities;
00166 HASH_TABLE elementTypes;
00167 HASH_TABLE attributeIds;
00168 HASH_TABLE prefixes;
00169 STRING_POOL pool;
00170 int complete;
00171 int standalone;
00172 const XML_Char *base;
00173 PREFIX defaultPrefix;
00174 } DTD;
00175
00176 typedef struct open_internal_entity {
00177 const char *internalEventPtr;
00178 const char *internalEventEndPtr;
00179 struct open_internal_entity *next;
00180 ENTITY *entity;
00181 } OPEN_INTERNAL_ENTITY;
00182
00183 typedef enum XML_Error Processor(XML_Parser parser,
00184 const char *start,
00185 const char *end,
00186 const char **endPtr);
00187
00188 static Processor prologProcessor;
00189 static Processor prologInitProcessor;
00190 static Processor contentProcessor;
00191 static Processor cdataSectionProcessor;
00192 static Processor epilogProcessor;
00193 static Processor externalEntityInitProcessor;
00194 static Processor externalEntityInitProcessor2;
00195 static Processor externalEntityInitProcessor3;
00196 static Processor externalEntityContentProcessor;
00197
00198 static enum XML_Error
00199 handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
00200 static enum XML_Error
00201 processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *);
00202 static enum XML_Error
00203 initializeEncoding(XML_Parser parser);
00204 static enum XML_Error
00205 doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
00206 const char *start, const char *end, const char **endPtr);
00207 static enum XML_Error
00208 doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr);
00209 static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const char *s,
00210 TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
00211 static
00212 int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr);
00213 static int
00214 defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, const XML_Char *dfltValue);
00215 static enum XML_Error
00216 storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *,
00217 STRING_POOL *);
00218 static enum XML_Error
00219 appendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *,
00220 STRING_POOL *);
00221 static ATTRIBUTE_ID *
00222 getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
00223 static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
00224 static enum XML_Error
00225 storeEntityValue(XML_Parser parser, const char *start, const char *end);
00226 static int
00227 reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
00228 static int
00229 reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
00230 static void
00231 reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
00232
00233 static const XML_Char *getContext(XML_Parser parser);
00234 static int setContext(XML_Parser parser, const XML_Char *context);
00235 static void normalizePublicId(XML_Char *s);
00236 static int dtdInit(DTD *);
00237 static void dtdDestroy(DTD *);
00238 static int dtdCopy(DTD *newDtd, const DTD *oldDtd);
00239 static void poolInit(STRING_POOL *);
00240 static void poolClear(STRING_POOL *);
00241 static void poolDestroy(STRING_POOL *);
00242 static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc,
00243 const char *ptr, const char *end);
00244 static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc,
00245 const char *ptr, const char *end);
00246 static int poolGrow(STRING_POOL *pool);
00247 static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s);
00248 static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
00249
00250 #define poolStart(pool) ((pool)->start)
00251 #define poolEnd(pool) ((pool)->ptr)
00252 #define poolLength(pool) ((pool)->ptr - (pool)->start)
00253 #define poolChop(pool) ((void)--(pool->ptr))
00254 #define poolLastChar(pool) (((pool)->ptr)[-1])
00255 #define poolDiscard(pool) ((pool)->ptr = (pool)->start)
00256 #define poolFinish(pool) ((pool)->start = (pool)->ptr)
00257 #define poolAppendChar(pool, c) \
00258 (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
00259 ? 0 \
00260 : ((*((pool)->ptr)++ = c), 1))
00261
00262 typedef struct {
00263
00264 void *m_userData;
00265 void *m_handlerArg;
00266 char *m_buffer;
00267
00268 const char *m_bufferPtr;
00269
00270 char *m_bufferEnd;
00271
00272 const char *m_bufferLim;
00273 long m_parseEndByteIndex;
00274 const char *m_parseEndPtr;
00275 XML_Char *m_dataBuf;
00276 XML_Char *m_dataBufEnd;
00277 XML_StartElementHandler m_startElementHandler;
00278 XML_EndElementHandler m_endElementHandler;
00279 XML_CharacterDataHandler m_characterDataHandler;
00280 XML_ProcessingInstructionHandler m_processingInstructionHandler;
00281 XML_CommentHandler m_commentHandler;
00282 XML_StartCdataSectionHandler m_startCdataSectionHandler;
00283 XML_EndCdataSectionHandler m_endCdataSectionHandler;
00284 XML_DefaultHandler m_defaultHandler;
00285 XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
00286 XML_NotationDeclHandler m_notationDeclHandler;
00287 XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
00288 XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
00289 XML_NotStandaloneHandler m_notStandaloneHandler;
00290 XML_ExternalEntityRefHandler m_externalEntityRefHandler;
00291 void *m_externalEntityRefHandlerArg;
00292 XML_UnknownEncodingHandler m_unknownEncodingHandler;
00293 const ENCODING *m_encoding;
00294 INIT_ENCODING m_initEncoding;
00295 const XML_Char *m_protocolEncodingName;
00296 int m_ns;
00297 void *m_unknownEncodingMem;
00298 void *m_unknownEncodingData;
00299 void *m_unknownEncodingHandlerData;
00300 void (*m_unknownEncodingRelease)(void *);
00301 PROLOG_STATE m_prologState;
00302 Processor *m_processor;
00303 enum XML_Error m_errorCode;
00304 const char *m_eventPtr;
00305 const char *m_eventEndPtr;
00306 const char *m_positionPtr;
00307 OPEN_INTERNAL_ENTITY *m_openInternalEntities;
00308 int m_defaultExpandInternalEntities;
00309 int m_tagLevel;
00310 ENTITY *m_declEntity;
00311 const XML_Char *m_declNotationName;
00312 const XML_Char *m_declNotationPublicId;
00313 ELEMENT_TYPE *m_declElementType;
00314 ATTRIBUTE_ID *m_declAttributeId;
00315 char m_declAttributeIsCdata;
00316 DTD m_dtd;
00317 TAG *m_tagStack;
00318 TAG *m_freeTagList;
00319 BINDING *m_inheritedBindings;
00320 BINDING *m_freeBindingList;
00321 int m_attsSize;
00322 int m_nSpecifiedAtts;
00323 ATTRIBUTE *m_atts;
00324 POSITION m_position;
00325 STRING_POOL m_tempPool;
00326 STRING_POOL m_temp2Pool;
00327 char *m_groupConnector;
00328 unsigned m_groupSize;
00329 int m_hadExternalDoctype;
00330 XML_Char m_namespaceSeparator;
00331 } Parser;
00332
00333 #define userData (((Parser *)parser)->m_userData)
00334 #define handlerArg (((Parser *)parser)->m_handlerArg)
00335 #define startElementHandler (((Parser *)parser)->m_startElementHandler)
00336 #define endElementHandler (((Parser *)parser)->m_endElementHandler)
00337 #define characterDataHandler (((Parser *)parser)->m_characterDataHandler)
00338 #define processingInstructionHandler (((Parser *)parser)->m_processingInstructionHandler)
00339 #define commentHandler (((Parser *)parser)->m_commentHandler)
00340 #define startCdataSectionHandler (((Parser *)parser)->m_startCdataSectionHandler)
00341 #define endCdataSectionHandler (((Parser *)parser)->m_endCdataSectionHandler)
00342 #define defaultHandler (((Parser *)parser)->m_defaultHandler)
00343 #define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler)
00344 #define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler)
00345 #define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler)
00346 #define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler)
00347 #define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler)
00348 #define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler)
00349 #define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg)
00350 #define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler)
00351 #define encoding (((Parser *)parser)->m_encoding)
00352 #define initEncoding (((Parser *)parser)->m_initEncoding)
00353 #define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem)
00354 #define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData)
00355 #define unknownEncodingHandlerData \
00356 (((Parser *)parser)->m_unknownEncodingHandlerData)
00357 #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease)
00358 #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName)
00359 #define ns (((Parser *)parser)->m_ns)
00360 #define prologState (((Parser *)parser)->m_prologState)
00361 #define processor (((Parser *)parser)->m_processor)
00362 #define errorCode (((Parser *)parser)->m_errorCode)
00363 #define eventPtr (((Parser *)parser)->m_eventPtr)
00364 #define eventEndPtr (((Parser *)parser)->m_eventEndPtr)
00365 #define positionPtr (((Parser *)parser)->m_positionPtr)
00366 #define position (((Parser *)parser)->m_position)
00367 #define openInternalEntities (((Parser *)parser)->m_openInternalEntities)
00368 #define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities)
00369 #define tagLevel (((Parser *)parser)->m_tagLevel)
00370 #define buffer (((Parser *)parser)->m_buffer)
00371 #define bufferPtr (((Parser *)parser)->m_bufferPtr)
00372 #define bufferEnd (((Parser *)parser)->m_bufferEnd)
00373 #define parseEndByteIndex (((Parser *)parser)->m_parseEndByteIndex)
00374 #define parseEndPtr (((Parser *)parser)->m_parseEndPtr)
00375 #define bufferLim (((Parser *)parser)->m_bufferLim)
00376 #define dataBuf (((Parser *)parser)->m_dataBuf)
00377 #define dataBufEnd (((Parser *)parser)->m_dataBufEnd)
00378 #define dtd (((Parser *)parser)->m_dtd)
00379 #define declEntity (((Parser *)parser)->m_declEntity)
00380 #define declNotationName (((Parser *)parser)->m_declNotationName)
00381 #define declNotationPublicId (((Parser *)parser)->m_declNotationPublicId)
00382 #define declElementType (((Parser *)parser)->m_declElementType)
00383 #define declAttributeId (((Parser *)parser)->m_declAttributeId)
00384 #define declAttributeIsCdata (((Parser *)parser)->m_declAttributeIsCdata)
00385 #define freeTagList (((Parser *)parser)->m_freeTagList)
00386 #define freeBindingList (((Parser *)parser)->m_freeBindingList)
00387 #define inheritedBindings (((Parser *)parser)->m_inheritedBindings)
00388 #define tagStack (((Parser *)parser)->m_tagStack)
00389 #define atts (((Parser *)parser)->m_atts)
00390 #define attsSize (((Parser *)parser)->m_attsSize)
00391 #define nSpecifiedAtts (((Parser *)parser)->m_nSpecifiedAtts)
00392 #define tempPool (((Parser *)parser)->m_tempPool)
00393 #define temp2Pool (((Parser *)parser)->m_temp2Pool)
00394 #define groupConnector (((Parser *)parser)->m_groupConnector)
00395 #define groupSize (((Parser *)parser)->m_groupSize)
00396 #define hadExternalDoctype (((Parser *)parser)->m_hadExternalDoctype)
00397 #define namespaceSeparator (((Parser *)parser)->m_namespaceSeparator)
00398
00399 #ifdef _MSC_VER
00400 #ifdef _DEBUG
00401 Parser *asParser(XML_Parser parser)
00402 {
00403 return parser;
00404 }
00405 #endif
00406 #endif
00407
00408 XML_Parser XML_ParserCreate(const XML_Char *encodingName)
00409 {
00410 XML_Parser parser = malloc(sizeof(Parser));
00411 if (!parser)
00412 return parser;
00413 processor = prologInitProcessor;
00414 XmlPrologStateInit(&prologState);
00415 userData = 0;
00416 handlerArg = 0;
00417 startElementHandler = 0;
00418 endElementHandler = 0;
00419 characterDataHandler = 0;
00420 processingInstructionHandler = 0;
00421 commentHandler = 0;
00422 startCdataSectionHandler = 0;
00423 endCdataSectionHandler = 0;
00424 defaultHandler = 0;
00425 unparsedEntityDeclHandler = 0;
00426 notationDeclHandler = 0;
00427 startNamespaceDeclHandler = 0;
00428 endNamespaceDeclHandler = 0;
00429 notStandaloneHandler = 0;
00430 externalEntityRefHandler = 0;
00431 externalEntityRefHandlerArg = parser;
00432 unknownEncodingHandler = 0;
00433 buffer = 0;
00434 bufferPtr = 0;
00435 bufferEnd = 0;
00436 parseEndByteIndex = 0;
00437 parseEndPtr = 0;
00438 bufferLim = 0;
00439 declElementType = 0;
00440 declAttributeId = 0;
00441 declEntity = 0;
00442 declNotationName = 0;
00443 declNotationPublicId = 0;
00444 memset(&position, 0, sizeof(POSITION));
00445 errorCode = XML_ERROR_NONE;
00446 eventPtr = 0;
00447 eventEndPtr = 0;
00448 positionPtr = 0;
00449 openInternalEntities = 0;
00450 tagLevel = 0;
00451 tagStack = 0;
00452 freeTagList = 0;
00453 freeBindingList = 0;
00454 inheritedBindings = 0;
00455 attsSize = INIT_ATTS_SIZE;
00456 atts = malloc(attsSize * sizeof(ATTRIBUTE));
00457 nSpecifiedAtts = 0;
00458 dataBuf = malloc(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
00459 groupSize = 0;
00460 groupConnector = 0;
00461 hadExternalDoctype = 0;
00462 unknownEncodingMem = 0;
00463 unknownEncodingRelease = 0;
00464 unknownEncodingData = 0;
00465 unknownEncodingHandlerData = 0;
00466 namespaceSeparator = '!';
00467 ns = 0;
00468 poolInit(&tempPool);
00469 poolInit(&temp2Pool);
00470 protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0;
00471 if (!dtdInit(&dtd) || !atts || !dataBuf
00472 || (encodingName && !protocolEncodingName)) {
00473 XML_ParserFree(parser);
00474 return 0;
00475 }
00476 dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
00477 XmlInitEncoding(&initEncoding, &encoding, 0);
00478 return parser;
00479 }
00480
00481 XML_Parser XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
00482 {
00483 static
00484 const XML_Char implicitContext[] = {
00485 XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='),
00486 XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'),
00487 XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'),
00488 XML_T('.'), XML_T('w'), XML_T('3'),
00489 XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'),
00490 XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'),
00491 XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'),
00492 XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'),
00493 XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'),
00494 XML_T('\0')
00495 };
00496
00497 XML_Parser parser = XML_ParserCreate(encodingName);
00498 if (parser) {
00499 XmlInitEncodingNS(&initEncoding, &encoding, 0);
00500 ns = 1;
00501 namespaceSeparator = nsSep;
00502 }
00503 if (!setContext(parser, implicitContext)) {
00504 XML_ParserFree(parser);
00505 return 0;
00506 }
00507 return parser;
00508 }
00509
00510 int XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
00511 {
00512 if (!encodingName)
00513 protocolEncodingName = 0;
00514 else {
00515 protocolEncodingName = poolCopyString(&tempPool, encodingName);
00516 if (!protocolEncodingName)
00517 return 0;
00518 }
00519 return 1;
00520 }
00521
00522 XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser,
00523 const XML_Char *context,
00524 const XML_Char *encodingName)
00525 {
00526 XML_Parser parser = oldParser;
00527 DTD *oldDtd = &dtd;
00528 XML_StartElementHandler oldStartElementHandler = startElementHandler;
00529 XML_EndElementHandler oldEndElementHandler = endElementHandler;
00530 XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
00531 XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler;
00532 XML_CommentHandler oldCommentHandler = commentHandler;
00533 XML_StartCdataSectionHandler oldStartCdataSectionHandler = startCdataSectionHandler;
00534 XML_EndCdataSectionHandler oldEndCdataSectionHandler = endCdataSectionHandler;
00535 XML_DefaultHandler oldDefaultHandler = defaultHandler;
00536 XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler = startNamespaceDeclHandler;
00537 XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler = endNamespaceDeclHandler;
00538 XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;
00539 XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler;
00540 XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler;
00541 void *oldUserData = userData;
00542 void *oldHandlerArg = handlerArg;
00543 int oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
00544 void *oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
00545
00546 parser = (ns
00547 ? XML_ParserCreateNS(encodingName, namespaceSeparator)
00548 : XML_ParserCreate(encodingName));
00549 if (!parser)
00550 return 0;
00551 startElementHandler = oldStartElementHandler;
00552 endElementHandler = oldEndElementHandler;
00553 characterDataHandler = oldCharacterDataHandler;
00554 processingInstructionHandler = oldProcessingInstructionHandler;
00555 commentHandler = oldCommentHandler;
00556 startCdataSectionHandler = oldStartCdataSectionHandler;
00557 endCdataSectionHandler = oldEndCdataSectionHandler;
00558 defaultHandler = oldDefaultHandler;
00559 startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
00560 endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
00561 notStandaloneHandler = oldNotStandaloneHandler;
00562 externalEntityRefHandler = oldExternalEntityRefHandler;
00563 unknownEncodingHandler = oldUnknownEncodingHandler;
00564 userData = oldUserData;
00565 if (oldUserData == oldHandlerArg)
00566 handlerArg = userData;
00567 else
00568 handlerArg = parser;
00569 if (oldExternalEntityRefHandlerArg != oldParser)
00570 externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
00571 defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
00572 if (!dtdCopy(&dtd, oldDtd) || !setContext(parser, context)) {
00573 XML_ParserFree(parser);
00574 return 0;
00575 }
00576 processor = externalEntityInitProcessor;
00577 return parser;
00578 }
00579
00580 static
00581 void destroyBindings(BINDING *bindings)
00582 {
00583 for (;;) {
00584 BINDING *b = bindings;
00585 if (!b)
00586 break;
00587 bindings = b->nextTagBinding;
00588 free(b->uri);
00589 free(b);
00590 }
00591 }
00592
00593 void XML_ParserFree(XML_Parser parser)
00594 {
00595 for (;;) {
00596 TAG *p;
00597 if (tagStack == 0) {
00598 if (freeTagList == 0)
00599 break;
00600 tagStack = freeTagList;
00601 freeTagList = 0;
00602 }
00603 p = tagStack;
00604 tagStack = tagStack->parent;
00605 free(p->buf);
00606 destroyBindings(p->bindings);
00607 free(p);
00608 }
00609 destroyBindings(freeBindingList);
00610 destroyBindings(inheritedBindings);
00611 poolDestroy(&tempPool);
00612 poolDestroy(&temp2Pool);
00613 dtdDestroy(&dtd);
00614 free((void *)atts);
00615 free(groupConnector);
00616 free(buffer);
00617 free(dataBuf);
00618 free(unknownEncodingMem);
00619 if (unknownEncodingRelease)
00620 unknownEncodingRelease(unknownEncodingData);
00621 free(parser);
00622 }
00623
00624 void XML_UseParserAsHandlerArg(XML_Parser parser)
00625 {
00626 handlerArg = parser;
00627 }
00628
00629 void XML_SetUserData(XML_Parser parser, void *p)
00630 {
00631 if (handlerArg == userData)
00632 handlerArg = userData = p;
00633 else
00634 userData = p;
00635 }
00636
00637 int XML_SetBase(XML_Parser parser, const XML_Char *p)
00638 {
00639 if (p) {
00640 p = poolCopyString(&dtd.pool, p);
00641 if (!p)
00642 return 0;
00643 dtd.base = p;
00644 }
00645 else
00646 dtd.base = 0;
00647 return 1;
00648 }
00649
00650 const XML_Char *XML_GetBase(XML_Parser parser)
00651 {
00652 return dtd.base;
00653 }
00654
00655 int XML_GetSpecifiedAttributeCount(XML_Parser parser)
00656 {
00657 return nSpecifiedAtts;
00658 }
00659
00660 void XML_SetElementHandler(XML_Parser parser,
00661 XML_StartElementHandler start,
00662 XML_EndElementHandler end)
00663 {
00664 startElementHandler = start;
00665 endElementHandler = end;
00666 }
00667
00668 void XML_SetCharacterDataHandler(XML_Parser parser,
00669 XML_CharacterDataHandler handler)
00670 {
00671 characterDataHandler = handler;
00672 }
00673
00674 void XML_SetProcessingInstructionHandler(XML_Parser parser,
00675 XML_ProcessingInstructionHandler handler)
00676 {
00677 processingInstructionHandler = handler;
00678 }
00679
00680 void XML_SetCommentHandler(XML_Parser parser,
00681 XML_CommentHandler handler)
00682 {
00683 commentHandler = handler;
00684 }
00685
00686 void XML_SetCdataSectionHandler(XML_Parser parser,
00687 XML_StartCdataSectionHandler start,
00688 XML_EndCdataSectionHandler end)
00689 {
00690 startCdataSectionHandler = start;
00691 endCdataSectionHandler = end;
00692 }
00693
00694 void XML_SetDefaultHandler(XML_Parser parser,
00695 XML_DefaultHandler handler)
00696 {
00697 defaultHandler = handler;
00698 defaultExpandInternalEntities = 0;
00699 }
00700
00701 void XML_SetDefaultHandlerExpand(XML_Parser parser,
00702 XML_DefaultHandler handler)
00703 {
00704 defaultHandler = handler;
00705 defaultExpandInternalEntities = 1;
00706 }
00707
00708 void XML_SetUnparsedEntityDeclHandler(XML_Parser parser,
00709 XML_UnparsedEntityDeclHandler handler)
00710 {
00711 unparsedEntityDeclHandler = handler;
00712 }
00713
00714 void XML_SetNotationDeclHandler(XML_Parser parser,
00715 XML_NotationDeclHandler handler)
00716 {
00717 notationDeclHandler = handler;
00718 }
00719
00720 void XML_SetNamespaceDeclHandler(XML_Parser parser,
00721 XML_StartNamespaceDeclHandler start,
00722 XML_EndNamespaceDeclHandler end)
00723 {
00724 startNamespaceDeclHandler = start;
00725 endNamespaceDeclHandler = end;
00726 }
00727
00728 void XML_SetNotStandaloneHandler(XML_Parser parser,
00729 XML_NotStandaloneHandler handler)
00730 {
00731 notStandaloneHandler = handler;
00732 }
00733
00734 void XML_SetExternalEntityRefHandler(XML_Parser parser,
00735 XML_ExternalEntityRefHandler handler)
00736 {
00737 externalEntityRefHandler = handler;
00738 }
00739
00740 void XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
00741 {
00742 if (arg)
00743 externalEntityRefHandlerArg = arg;
00744 else
00745 externalEntityRefHandlerArg = parser;
00746 }
00747
00748 void XML_SetUnknownEncodingHandler(XML_Parser parser,
00749 XML_UnknownEncodingHandler handler,
00750 void *data)
00751 {
00752 unknownEncodingHandler = handler;
00753 unknownEncodingHandlerData = data;
00754 }
00755
00756 int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
00757 {
00758 if (len == 0) {
00759 if (!isFinal)
00760 return 1;
00761 positionPtr = bufferPtr;
00762 errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0);
00763 if (errorCode == XML_ERROR_NONE)
00764 return 1;
00765 eventEndPtr = eventPtr;
00766 return 0;
00767 }
00768 else if (bufferPtr == bufferEnd) {
00769 const char *end;
00770 int nLeftOver;
00771 parseEndByteIndex += len;
00772 positionPtr = s;
00773 if (isFinal) {
00774 errorCode = processor(parser, s, parseEndPtr = s + len, 0);
00775 if (errorCode == XML_ERROR_NONE)
00776 return 1;
00777 eventEndPtr = eventPtr;
00778 return 0;
00779 }
00780 errorCode = processor(parser, s, parseEndPtr = s + len, &end);
00781 if (errorCode != XML_ERROR_NONE) {
00782 eventEndPtr = eventPtr;
00783 return 0;
00784 }
00785 XmlUpdatePosition(encoding, positionPtr, end, &position);
00786 nLeftOver = s + len - end;
00787 if (nLeftOver) {
00788 if (buffer == 0 || nLeftOver > bufferLim - buffer) {
00789
00790 buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2);
00791 if (!buffer) {
00792 errorCode = XML_ERROR_NO_MEMORY;
00793 eventPtr = eventEndPtr = 0;
00794 return 0;
00795 }
00796 bufferLim = buffer + len * 2;
00797 }
00798 memcpy(buffer, end, nLeftOver);
00799 bufferPtr = buffer;
00800 bufferEnd = buffer + nLeftOver;
00801 }
00802 return 1;
00803 }
00804 else {
00805 memcpy(XML_GetBuffer(parser, len), s, len);
00806 return XML_ParseBuffer(parser, len, isFinal);
00807 }
00808 }
00809
00810 int XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
00811 {
00812 const char *start = bufferPtr;
00813 positionPtr = start;
00814 bufferEnd += len;
00815 parseEndByteIndex += len;
00816 errorCode = processor(parser, start, parseEndPtr = bufferEnd,
00817 isFinal ? (const char **)0 : &bufferPtr);
00818 if (errorCode == XML_ERROR_NONE) {
00819 if (!isFinal)
00820 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
00821 return 1;
00822 }
00823 else {
00824 eventEndPtr = eventPtr;
00825 return 0;
00826 }
00827 }
00828
00829 void *XML_GetBuffer(XML_Parser parser, int len)
00830 {
00831 if (len > bufferLim - bufferEnd) {
00832
00833 int neededSize = len + (bufferEnd - bufferPtr);
00834 if (neededSize <= bufferLim - buffer) {
00835 memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
00836 bufferEnd = buffer + (bufferEnd - bufferPtr);
00837 bufferPtr = buffer;
00838 }
00839 else {
00840 char *newBuf;
00841 int bufferSize = bufferLim - bufferPtr;
00842 if (bufferSize == 0)
00843 bufferSize = INIT_BUFFER_SIZE;
00844 do {
00845 bufferSize *= 2;
00846 } while (bufferSize < neededSize);
00847 newBuf = malloc(bufferSize);
00848 if (newBuf == 0) {
00849 errorCode = XML_ERROR_NO_MEMORY;
00850 return 0;
00851 }
00852 bufferLim = newBuf + bufferSize;
00853 if (bufferPtr) {
00854 memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
00855 free(buffer);
00856 }
00857 bufferEnd = newBuf + (bufferEnd - bufferPtr);
00858 bufferPtr = buffer = newBuf;
00859 }
00860 }
00861 return bufferEnd;
00862 }
00863
00864 enum XML_Error XML_GetErrorCode(XML_Parser parser)
00865 {
00866 return errorCode;
00867 }
00868
00869 long XML_GetCurrentByteIndex(XML_Parser parser)
00870 {
00871 if (eventPtr)
00872 return parseEndByteIndex - (parseEndPtr - eventPtr);
00873 return -1;
00874 }
00875
00876 int XML_GetCurrentByteCount(XML_Parser parser)
00877 {
00878 if (eventEndPtr && eventPtr)
00879 return eventEndPtr - eventPtr;
00880 return 0;
00881 }
00882
00883 int XML_GetCurrentLineNumber(XML_Parser parser)
00884 {
00885 if (eventPtr) {
00886 XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
00887 positionPtr = eventPtr;
00888 }
00889 return position.lineNumber + 1;
00890 }
00891
00892 int XML_GetCurrentColumnNumber(XML_Parser parser)
00893 {
00894 if (eventPtr) {
00895 XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
00896 positionPtr = eventPtr;
00897 }
00898 return position.columnNumber;
00899 }
00900
00901 void XML_DefaultCurrent(XML_Parser parser)
00902 {
00903 if (defaultHandler) {
00904 if (openInternalEntities)
00905 reportDefault(parser,
00906 ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(),
00907 openInternalEntities->internalEventPtr,
00908 openInternalEntities->internalEventEndPtr);
00909 else
00910 reportDefault(parser, encoding, eventPtr, eventEndPtr);
00911 }
00912 }
00913
00914 const XML_LChar *XML_ErrorString(int code)
00915 {
00916 static const XML_LChar *message[] = {
00917 0,
00918 XML_T("out of memory"),
00919 XML_T("syntax error"),
00920 XML_T("no element found"),
00921 XML_T("not well-formed"),
00922 XML_T("unclosed token"),
00923 XML_T("unclosed token"),
00924 XML_T("mismatched tag"),
00925 XML_T("duplicate attribute"),
00926 XML_T("junk after document element"),
00927 XML_T("illegal parameter entity reference"),
00928 XML_T("undefined entity"),
00929 XML_T("recursive entity reference"),
00930 XML_T("asynchronous entity"),
00931 XML_T("reference to invalid character number"),
00932 XML_T("reference to binary entity"),
00933 XML_T("reference to external entity in attribute"),
00934 XML_T("xml processing instruction not at start of external entity"),
00935 XML_T("unknown encoding"),
00936 XML_T("encoding specified in XML declaration is incorrect"),
00937 XML_T("unclosed CDATA section"),
00938 XML_T("error in processing external entity reference"),
00939 XML_T("document is not standalone")
00940 };
00941 if (code > 0 && code < sizeof(message)/sizeof(message[0]))
00942 return message[code];
00943 return 0;
00944 }
00945
00946 static
00947 enum XML_Error contentProcessor(XML_Parser parser,
00948 const char *start,
00949 const char *end,
00950 const char **endPtr)
00951 {
00952 return doContent(parser, 0, encoding, start, end, endPtr);
00953 }
00954
00955 static
00956 enum XML_Error externalEntityInitProcessor(XML_Parser parser,
00957 const char *start,
00958 const char *end,
00959 const char **endPtr)
00960 {
00961 enum XML_Error result = initializeEncoding(parser);
00962 if (result != XML_ERROR_NONE)
00963 return result;
00964 processor = externalEntityInitProcessor2;
00965 return externalEntityInitProcessor2(parser, start, end, endPtr);
00966 }
00967
00968 static
00969 enum XML_Error externalEntityInitProcessor2(XML_Parser parser,
00970 const char *start,
00971 const char *end,
00972 const char **endPtr)
00973 {
00974 const char *next;
00975 int tok = XmlContentTok(encoding, start, end, &next);
00976 switch (tok) {
00977 case XML_TOK_BOM:
00978 start = next;
00979 break;
00980 case XML_TOK_PARTIAL:
00981 if (endPtr) {
00982 *endPtr = start;
00983 return XML_ERROR_NONE;
00984 }
00985 eventPtr = start;
00986 return XML_ERROR_UNCLOSED_TOKEN;
00987 case XML_TOK_PARTIAL_CHAR:
00988 if (endPtr) {
00989 *endPtr = start;
00990 return XML_ERROR_NONE;
00991 }
00992 eventPtr = start;
00993 return XML_ERROR_PARTIAL_CHAR;
00994 }
00995 processor = externalEntityInitProcessor3;
00996 return externalEntityInitProcessor3(parser, start, end, endPtr);
00997 }
00998
00999 static
01000 enum XML_Error externalEntityInitProcessor3(XML_Parser parser,
01001 const char *start,
01002 const char *end,
01003 const char **endPtr)
01004 {
01005 const char *next;
01006 int tok = XmlContentTok(encoding, start, end, &next);
01007 switch (tok) {
01008 case XML_TOK_XML_DECL:
01009 {
01010 enum XML_Error result = processXmlDecl(parser, 1, start, next);
01011 if (result != XML_ERROR_NONE)
01012 return result;
01013 start = next;
01014 }
01015 break;
01016 case XML_TOK_PARTIAL:
01017 if (endPtr) {
01018 *endPtr = start;
01019 return XML_ERROR_NONE;
01020 }
01021 eventPtr = start;
01022 return XML_ERROR_UNCLOSED_TOKEN;
01023 case XML_TOK_PARTIAL_CHAR:
01024 if (endPtr) {
01025 *endPtr = start;
01026 return XML_ERROR_NONE;
01027 }
01028 eventPtr = start;
01029 return XML_ERROR_PARTIAL_CHAR;
01030 }
01031 processor = externalEntityContentProcessor;
01032 tagLevel = 1;
01033 return doContent(parser, 1, encoding, start, end, endPtr);
01034 }
01035
01036 static
01037 enum XML_Error externalEntityContentProcessor(XML_Parser parser,
01038 const char *start,
01039 const char *end,
01040 const char **endPtr)
01041 {
01042 return doContent(parser, 1, encoding, start, end, endPtr);
01043 }
01044
01045 static enum XML_Error
01046 doContent(XML_Parser parser,
01047 int startTagLevel,
01048 const ENCODING *enc,
01049 const char *s,
01050 const char *end,
01051 const char **nextPtr)
01052 {
01053 const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding();
01054 const char **eventPP;
01055 const char **eventEndPP;
01056 if (enc == encoding) {
01057 eventPP = &eventPtr;
01058 eventEndPP = &eventEndPtr;
01059 }
01060 else {
01061 eventPP = &(openInternalEntities->internalEventPtr);
01062 eventEndPP = &(openInternalEntities->internalEventEndPtr);
01063 }
01064 *eventPP = s;
01065 for (;;) {
01066 const char *next = s;
01067 int tok = XmlContentTok(enc, s, end, &next);
01068 *eventEndPP = next;
01069 switch (tok) {
01070 case XML_TOK_TRAILING_CR:
01071 if (nextPtr) {
01072 *nextPtr = s;
01073 return XML_ERROR_NONE;
01074 }
01075 *eventEndPP = end;
01076 if (characterDataHandler) {
01077 XML_Char c = 0xA;
01078 characterDataHandler(handlerArg, &c, 1);
01079 }
01080 else if (defaultHandler)
01081 reportDefault(parser, enc, s, end);
01082 if (startTagLevel == 0)
01083 return XML_ERROR_NO_ELEMENTS;
01084 if (tagLevel != startTagLevel)
01085 return XML_ERROR_ASYNC_ENTITY;
01086 return XML_ERROR_NONE;
01087 case XML_TOK_NONE:
01088 if (nextPtr) {
01089 *nextPtr = s;
01090 return XML_ERROR_NONE;
01091 }
01092 if (startTagLevel > 0) {
01093 if (tagLevel != startTagLevel)
01094 return XML_ERROR_ASYNC_ENTITY;
01095 return XML_ERROR_NONE;
01096 }
01097 return XML_ERROR_NO_ELEMENTS;
01098 case XML_TOK_INVALID:
01099 *eventPP = next;
01100 return XML_ERROR_INVALID_TOKEN;
01101 case XML_TOK_PARTIAL:
01102 if (nextPtr) {
01103 *nextPtr = s;
01104 return XML_ERROR_NONE;
01105 }
01106 return XML_ERROR_UNCLOSED_TOKEN;
01107 case XML_TOK_PARTIAL_CHAR:
01108 if (nextPtr) {
01109 *nextPtr = s;
01110 return XML_ERROR_NONE;
01111 }
01112 return XML_ERROR_PARTIAL_CHAR;
01113 case XML_TOK_ENTITY_REF:
01114 {
01115 const XML_Char *name;
01116 ENTITY *entity;
01117 XML_Char ch = XmlPredefinedEntityName(enc,
01118 s + enc->minBytesPerChar,
01119 next - enc->minBytesPerChar);
01120 if (ch) {
01121 if (characterDataHandler)
01122 characterDataHandler(handlerArg, &ch, 1);
01123 else if (defaultHandler)
01124 reportDefault(parser, enc, s, next);
01125 break;
01126 }
01127 name = poolStoreString(&dtd.pool, enc,
01128 s + enc->minBytesPerChar,
01129 next - enc->minBytesPerChar);
01130 if (!name)
01131 return XML_ERROR_NO_MEMORY;
01132 entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0);
01133 poolDiscard(&dtd.pool);
01134 if (!entity) {
01135 if (dtd.complete || dtd.standalone)
01136 return XML_ERROR_UNDEFINED_ENTITY;
01137 if (defaultHandler)
01138 reportDefault(parser, enc, s, next);
01139 break;
01140 }
01141 if (entity->open)
01142 return XML_ERROR_RECURSIVE_ENTITY_REF;
01143 if (entity->notation)
01144 return XML_ERROR_BINARY_ENTITY_REF;
01145 if (entity) {
01146 if (entity->textPtr) {
01147 enum XML_Error result;
01148 OPEN_INTERNAL_ENTITY openEntity;
01149 if (defaultHandler && !defaultExpandInternalEntities) {
01150 reportDefault(parser, enc, s, next);
01151 break;
01152 }
01153 entity->open = 1;
01154 openEntity.next = openInternalEntities;
01155 openInternalEntities = &openEntity;
01156 openEntity.entity = entity;
01157 openEntity.internalEventPtr = 0;
01158 openEntity.internalEventEndPtr = 0;
01159 result = doContent(parser,
01160 tagLevel,
01161 internalEnc,
01162 (char *)entity->textPtr,
01163 (char *)(entity->textPtr + entity->textLen),
01164 0);
01165 entity->open = 0;
01166 openInternalEntities = openEntity.next;
01167 if (result)
01168 return result;
01169 }
01170 else if (externalEntityRefHandler) {
01171 const XML_Char *context;
01172 entity->open = 1;
01173 context = getContext(parser);
01174 entity->open = 0;
01175 if (!context)
01176 return XML_ERROR_NO_MEMORY;
01177 if (!externalEntityRefHandler(externalEntityRefHandlerArg,
01178 context,
01179 dtd.base,
01180 entity->systemId,
01181 entity->publicId))
01182 return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
01183 poolDiscard(&tempPool);
01184 }
01185 else if (defaultHandler)
01186 reportDefault(parser, enc, s, next);
01187 }
01188 break;
01189 }
01190 case XML_TOK_START_TAG_WITH_ATTS:
01191 if (!startElementHandler) {
01192 enum XML_Error result = storeAtts(parser, enc, s, 0, 0);
01193 if (result)
01194 return result;
01195 }
01196
01197 case XML_TOK_START_TAG_NO_ATTS:
01198 {
01199 TAG *tag;
01200 if (freeTagList) {
01201 tag = freeTagList;
01202 freeTagList = freeTagList->parent;
01203 }
01204 else {
01205 tag = malloc(sizeof(TAG));
01206 if (!tag)
01207 return XML_ERROR_NO_MEMORY;
01208 tag->buf = malloc(INIT_TAG_BUF_SIZE);
01209 if (!tag->buf)
01210 return XML_ERROR_NO_MEMORY;
01211 tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
01212 }
01213 tag->bindings = 0;
01214 tag->parent = tagStack;
01215 tagStack = tag;
01216 tag->name.localPart = 0;
01217 tag->rawName = s + enc->minBytesPerChar;
01218 tag->rawNameLength = XmlNameLength(enc, tag->rawName);
01219 if (nextPtr) {
01220
01221
01222 if (tag->rawNameLength + (int)(sizeof(XML_Char) - 1) + (int)sizeof(XML_Char) > tag->bufEnd - tag->buf) {
01223 int bufSize = tag->rawNameLength * 4;
01224 bufSize = ROUND_UP(bufSize, sizeof(XML_Char));
01225 tag->buf = realloc(tag->buf, bufSize);
01226 if (!tag->buf)
01227 return XML_ERROR_NO_MEMORY;
01228 tag->bufEnd = tag->buf + bufSize;
01229 }
01230 memcpy(tag->buf, tag->rawName, tag->rawNameLength);
01231 tag->rawName = tag->buf;
01232 }
01233 ++tagLevel;
01234 if (startElementHandler) {
01235 enum XML_Error result;
01236 XML_Char *toPtr;
01237 for (;;) {
01238 const char *rawNameEnd = tag->rawName + tag->rawNameLength;
01239 const char *fromPtr = tag->rawName;
01240 int bufSize;
01241 if (nextPtr)
01242 toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)));
01243 else
01244 toPtr = (XML_Char *)tag->buf;
01245 tag->name.str = toPtr;
01246 XmlConvert(enc,
01247 &fromPtr, rawNameEnd,
01248 (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
01249 if (fromPtr == rawNameEnd)
01250 break;
01251 bufSize = (tag->bufEnd - tag->buf) << 1;
01252 tag->buf = realloc(tag->buf, bufSize);
01253 if (!tag->buf)
01254 return XML_ERROR_NO_MEMORY;
01255 tag->