xmlparse.c

00001 /*
00002 The contents of this file are subject to the Mozilla Public License
00003 Version 1.1 (the "License"); you may not use this file except in
00004 compliance with the License. You may obtain a copy of the License at
00005 http://www.mozilla.org/MPL/
00006 
00007 Software distributed under the License is distributed on an "AS IS"
00008 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
00009 License for the specific language governing rights and limitations
00010 under the License.
00011 
00012 The Original Code is expat.
00013 
00014 The Initial Developer of the Original Code is James Clark.
00015 Portions created by James Clark are Copyright (C) 1998, 1999
00016 James Clark. All Rights Reserved.
00017 
00018 Contributor(s):
00019 
00020 Alternatively, the contents of this file may be used under the terms
00021 of the GNU General Public License (the "GPL"), in which case the
00022 provisions of the GPL are applicable instead of those above.  If you
00023 wish to allow use of your version of this file only under the terms of
00024 the GPL and not to allow others to use your version of this file under
00025 the MPL, indicate your decision by deleting the provisions above and
00026 replace them with the notice and other provisions required by the
00027 GPL. If you do not delete the provisions above, a recipient may use
00028 your version of this file under either the MPL or the GPL.
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 /* Round up n to be a multiple of sz, where sz is a power of 2. */
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  /* must be a multiple of sizeof(XML_Char) */
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 /* The XML_Char before the name is used to determine whether
00142 an attribute has been specified. */
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   /* The first member must be userData so that the XML_GetUserData macro works. */
00264   void *m_userData;
00265   void *m_handlerArg;
00266   char *m_buffer;
00267   /* first character to be parsed */
00268   const char *m_bufferPtr;
00269   /* past last character to be parsed */
00270   char *m_bufferEnd;
00271   /* allocated end of buffer */
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         /* FIXME avoid integer overflow */
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     /* FIXME avoid integer overflow */
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; /* XmlContentTok doesn't always set the last arg */
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       /* fall through */
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           /* Need to guarantee that:
01221              tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)) <= tag->bufEnd - sizeof(XML_Char) */
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->