2 Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
3 See the file COPYING for copying permission.
6 #ifdef COMPILED_FROM_DSP
7 # include "winconfig.h"
8 # define XMLPARSEAPI(type) __declspec(dllexport) type __cdecl
17 # define XMLPARSEAPI(type) __declspec(dllexport) type __cdecl
25 #endif /* ndef COMPILED_FROM_DSP */
31 #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
32 #define XmlConvert XmlUtf16Convert
33 #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
34 #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
35 #define XmlEncode XmlUtf16Encode
36 #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
37 typedef unsigned short ICHAR
;
39 #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
40 #define XmlConvert XmlUtf8Convert
41 #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
42 #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
43 #define XmlEncode XmlUtf8Encode
44 #define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
51 #define XmlInitEncodingNS XmlInitEncoding
52 #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
53 #undef XmlGetInternalEncodingNS
54 #define XmlGetInternalEncodingNS XmlGetInternalEncoding
55 #define XmlParseXmlDeclNS XmlParseXmlDecl
59 #ifdef XML_UNICODE_WCHAR_T
60 #define XML_T(x) L ## x
65 /* Round up n to be a multiple of sz, where sz is a power of 2. */
66 #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
71 typedef const XML_Char
*KEY
;
82 XML_Memory_Handling_Suite
*mem
;
90 #define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */
91 #define INIT_DATA_BUF_SIZE 1024
92 #define INIT_ATTS_SIZE 16
93 #define INIT_BLOCK_SIZE 1024
94 #define INIT_BUFFER_SIZE 1024
96 #define EXPAND_SPARE 24
98 typedef struct binding
{
99 struct prefix
*prefix
;
100 struct binding
*nextTagBinding
;
101 struct binding
*prevPrefixBinding
;
102 const struct attribute_id
*attId
;
108 typedef struct prefix
{
109 const XML_Char
*name
;
115 const XML_Char
*localPart
;
130 const XML_Char
*name
;
131 const XML_Char
*textPtr
;
133 const XML_Char
*systemId
;
134 const XML_Char
*base
;
135 const XML_Char
*publicId
;
136 const XML_Char
*notation
;
142 enum XML_Content_Type type
;
143 enum XML_Content_Quant quant
;
144 const XML_Char
* name
;
151 typedef struct block
{
163 XML_Memory_Handling_Suite
*mem
;
166 /* The XML_Char before the name is used to determine whether
167 an attribute has been specified. */
168 typedef struct attribute_id
{
176 const ATTRIBUTE_ID
*id
;
178 const XML_Char
*value
;
182 const XML_Char
*name
;
184 const ATTRIBUTE_ID
*idAtt
;
186 int allocDefaultAtts
;
187 DEFAULT_ATTRIBUTE
*defaultAtts
;
191 HASH_TABLE generalEntities
;
192 HASH_TABLE elementTypes
;
193 HASH_TABLE attributeIds
;
199 HASH_TABLE paramEntities
;
201 PREFIX defaultPrefix
;
202 /* === scaffolding for building content model === */
204 CONTENT_SCAFFOLD
*scaffold
;
205 unsigned contentStringLen
;
212 typedef struct open_internal_entity
{
213 const char *internalEventPtr
;
214 const char *internalEventEndPtr
;
215 struct open_internal_entity
*next
;
217 } OPEN_INTERNAL_ENTITY
;
219 typedef enum XML_Error
Processor(XML_Parser parser
,
222 const char **endPtr
);
224 static Processor prologProcessor
;
225 static Processor prologInitProcessor
;
226 static Processor contentProcessor
;
227 static Processor cdataSectionProcessor
;
229 static Processor ignoreSectionProcessor
;
231 static Processor epilogProcessor
;
232 static Processor errorProcessor
;
233 static Processor externalEntityInitProcessor
;
234 static Processor externalEntityInitProcessor2
;
235 static Processor externalEntityInitProcessor3
;
236 static Processor externalEntityContentProcessor
;
238 static enum XML_Error
239 handleUnknownEncoding(XML_Parser parser
, const XML_Char
*encodingName
);
240 static enum XML_Error
241 processXmlDecl(XML_Parser parser
, int isGeneralTextEntity
, const char *, const char *);
242 static enum XML_Error
243 initializeEncoding(XML_Parser parser
);
244 static enum XML_Error
245 doProlog(XML_Parser parser
, const ENCODING
*enc
, const char *s
,
246 const char *end
, int tok
, const char *next
, const char **nextPtr
);
247 static enum XML_Error
248 processInternalParamEntity(XML_Parser parser
, ENTITY
*entity
);
249 static enum XML_Error
250 doContent(XML_Parser parser
, int startTagLevel
, const ENCODING
*enc
,
251 const char *start
, const char *end
, const char **endPtr
);
252 static enum XML_Error
253 doCdataSection(XML_Parser parser
, const ENCODING
*, const char **startPtr
, const char *end
, const char **nextPtr
);
255 static enum XML_Error
256 doIgnoreSection(XML_Parser parser
, const ENCODING
*, const char **startPtr
, const char *end
, const char **nextPtr
);
258 static enum XML_Error
storeAtts(XML_Parser parser
, const ENCODING
*, const char *s
,
259 TAG_NAME
*tagNamePtr
, BINDING
**bindingsPtr
);
261 int addBinding(XML_Parser parser
, PREFIX
*prefix
, const ATTRIBUTE_ID
*attId
, const XML_Char
*uri
, BINDING
**bindingsPtr
);
264 defineAttribute(ELEMENT_TYPE
*type
, ATTRIBUTE_ID
*,
265 int isCdata
, int isId
, const XML_Char
*dfltValue
,
268 static enum XML_Error
269 storeAttributeValue(XML_Parser parser
, const ENCODING
*, int isCdata
, const char *, const char *,
271 static enum XML_Error
272 appendAttributeValue(XML_Parser parser
, const ENCODING
*, int isCdata
, const char *, const char *,
274 static ATTRIBUTE_ID
*
275 getAttributeId(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
);
276 static int setElementTypePrefix(XML_Parser parser
, ELEMENT_TYPE
*);
277 static enum XML_Error
278 storeEntityValue(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
);
280 reportProcessingInstruction(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
);
282 reportComment(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
);
284 reportDefault(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
);
286 static const XML_Char
*getContext(XML_Parser parser
);
287 static int setContext(XML_Parser parser
, const XML_Char
*context
);
288 static void normalizePublicId(XML_Char
*s
);
289 static int dtdInit(DTD
*, XML_Parser parser
);
291 static void dtdDestroy(DTD
*, XML_Parser parser
);
293 static int dtdCopy(DTD
*newDtd
, const DTD
*oldDtd
, XML_Parser parser
);
295 static int copyEntityTable(HASH_TABLE
*, STRING_POOL
*, const HASH_TABLE
*,
299 static void dtdSwap(DTD
*, DTD
*);
302 static NAMED
*lookup(HASH_TABLE
*table
, KEY name
, size_t createSize
);
304 static void hashTableInit(HASH_TABLE
*, XML_Memory_Handling_Suite
*ms
);
306 static void hashTableDestroy(HASH_TABLE
*);
307 static void hashTableIterInit(HASH_TABLE_ITER
*, const HASH_TABLE
*);
308 static NAMED
*hashTableIterNext(HASH_TABLE_ITER
*);
309 static void poolInit(STRING_POOL
*, XML_Memory_Handling_Suite
*ms
);
310 static void poolClear(STRING_POOL
*);
311 static void poolDestroy(STRING_POOL
*);
312 static XML_Char
*poolAppend(STRING_POOL
*pool
, const ENCODING
*enc
,
313 const char *ptr
, const char *end
);
314 static XML_Char
*poolStoreString(STRING_POOL
*pool
, const ENCODING
*enc
,
315 const char *ptr
, const char *end
);
317 static int poolGrow(STRING_POOL
*pool
);
319 static int nextScaffoldPart(XML_Parser parser
);
320 static XML_Content
*build_model(XML_Parser parser
);
322 static const XML_Char
*poolCopyString(STRING_POOL
*pool
, const XML_Char
*s
);
323 static const XML_Char
*poolCopyStringN(STRING_POOL
*pool
, const XML_Char
*s
, int n
);
324 static const XML_Char
*poolAppendString(STRING_POOL
*pool
, const XML_Char
*s
);
325 static ELEMENT_TYPE
* getElementType(XML_Parser Paraser
,
330 #define poolStart(pool) ((pool)->start)
331 #define poolEnd(pool) ((pool)->ptr)
332 #define poolLength(pool) ((pool)->ptr - (pool)->start)
333 #define poolChop(pool) ((void)--(pool->ptr))
334 #define poolLastChar(pool) (((pool)->ptr)[-1])
335 #define poolDiscard(pool) ((pool)->ptr = (pool)->start)
336 #define poolFinish(pool) ((pool)->start = (pool)->ptr)
337 #define poolAppendChar(pool, c) \
338 (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
340 : ((*((pool)->ptr)++ = c), 1))
343 /* The first member must be userData so that the XML_GetUserData macro works. */
347 XML_Memory_Handling_Suite m_mem
;
348 /* first character to be parsed */
349 const char *m_bufferPtr
;
350 /* past last character to be parsed */
352 /* allocated end of buffer */
353 const char *m_bufferLim
;
354 long m_parseEndByteIndex
;
355 const char *m_parseEndPtr
;
357 XML_Char
*m_dataBufEnd
;
358 XML_StartElementHandler m_startElementHandler
;
359 XML_EndElementHandler m_endElementHandler
;
360 XML_CharacterDataHandler m_characterDataHandler
;
361 XML_ProcessingInstructionHandler m_processingInstructionHandler
;
362 XML_CommentHandler m_commentHandler
;
363 XML_StartCdataSectionHandler m_startCdataSectionHandler
;
364 XML_EndCdataSectionHandler m_endCdataSectionHandler
;
365 XML_DefaultHandler m_defaultHandler
;
366 XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler
;
367 XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler
;
368 XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler
;
369 XML_NotationDeclHandler m_notationDeclHandler
;
370 XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler
;
371 XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler
;
372 XML_NotStandaloneHandler m_notStandaloneHandler
;
373 XML_ExternalEntityRefHandler m_externalEntityRefHandler
;
374 void *m_externalEntityRefHandlerArg
;
375 XML_UnknownEncodingHandler m_unknownEncodingHandler
;
376 XML_ElementDeclHandler m_elementDeclHandler
;
377 XML_AttlistDeclHandler m_attlistDeclHandler
;
378 XML_EntityDeclHandler m_entityDeclHandler
;
379 XML_XmlDeclHandler m_xmlDeclHandler
;
380 const ENCODING
*m_encoding
;
381 INIT_ENCODING m_initEncoding
;
382 const ENCODING
*m_internalEncoding
;
383 const XML_Char
*m_protocolEncodingName
;
386 void *m_unknownEncodingMem
;
387 void *m_unknownEncodingData
;
388 void *m_unknownEncodingHandlerData
;
389 void (*m_unknownEncodingRelease
)(void *);
390 PROLOG_STATE m_prologState
;
391 Processor
*m_processor
;
392 enum XML_Error m_errorCode
;
393 const char *m_eventPtr
;
394 const char *m_eventEndPtr
;
395 const char *m_positionPtr
;
396 OPEN_INTERNAL_ENTITY
*m_openInternalEntities
;
397 int m_defaultExpandInternalEntities
;
399 ENTITY
*m_declEntity
;
400 const XML_Char
*m_doctypeName
;
401 const XML_Char
*m_doctypeSysid
;
402 const XML_Char
*m_doctypePubid
;
403 const XML_Char
*m_declAttributeType
;
404 const XML_Char
*m_declNotationName
;
405 const XML_Char
*m_declNotationPublicId
;
406 ELEMENT_TYPE
*m_declElementType
;
407 ATTRIBUTE_ID
*m_declAttributeId
;
408 char m_declAttributeIsCdata
;
409 char m_declAttributeIsId
;
411 const XML_Char
*m_curBase
;
414 BINDING
*m_inheritedBindings
;
415 BINDING
*m_freeBindingList
;
417 int m_nSpecifiedAtts
;
421 STRING_POOL m_tempPool
;
422 STRING_POOL m_temp2Pool
;
423 char *m_groupConnector
;
424 unsigned m_groupSize
;
425 int m_hadExternalDoctype
;
426 XML_Char m_namespaceSeparator
;
428 enum XML_ParamEntityParsing m_paramEntityParsing
;
429 XML_Parser m_parentParser
;
433 #define MALLOC(s) (((Parser *)parser)->m_mem.malloc_fcn((s)))
434 #define REALLOC(p,s) (((Parser *)parser)->m_mem.realloc_fcn((p),(s)))
435 #define FREE(p) (((Parser *)parser)->m_mem.free_fcn((p)))
437 #define userData (((Parser *)parser)->m_userData)
438 #define handlerArg (((Parser *)parser)->m_handlerArg)
439 #define startElementHandler (((Parser *)parser)->m_startElementHandler)
440 #define endElementHandler (((Parser *)parser)->m_endElementHandler)
441 #define characterDataHandler (((Parser *)parser)->m_characterDataHandler)
442 #define processingInstructionHandler (((Parser *)parser)->m_processingInstructionHandler)
443 #define commentHandler (((Parser *)parser)->m_commentHandler)
444 #define startCdataSectionHandler (((Parser *)parser)->m_startCdataSectionHandler)
445 #define endCdataSectionHandler (((Parser *)parser)->m_endCdataSectionHandler)
446 #define defaultHandler (((Parser *)parser)->m_defaultHandler)
447 #define startDoctypeDeclHandler (((Parser *)parser)->m_startDoctypeDeclHandler)
448 #define endDoctypeDeclHandler (((Parser *)parser)->m_endDoctypeDeclHandler)
449 #define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler)
450 #define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler)
451 #define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler)
452 #define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler)
453 #define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler)
454 #define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler)
455 #define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg)
456 #define internalEntityRefHandler (((Parser *)parser)->m_internalEntityRefHandler)
457 #define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler)
458 #define elementDeclHandler (((Parser *)parser)->m_elementDeclHandler)
459 #define attlistDeclHandler (((Parser *)parser)->m_attlistDeclHandler)
460 #define entityDeclHandler (((Parser *)parser)->m_entityDeclHandler)
461 #define xmlDeclHandler (((Parser *)parser)->m_xmlDeclHandler)
462 #define encoding (((Parser *)parser)->m_encoding)
463 #define initEncoding (((Parser *)parser)->m_initEncoding)
464 #define internalEncoding (((Parser *)parser)->m_internalEncoding)
465 #define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem)
466 #define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData)
467 #define unknownEncodingHandlerData \
468 (((Parser *)parser)->m_unknownEncodingHandlerData)
469 #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease)
470 #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName)
471 #define ns (((Parser *)parser)->m_ns)
472 #define ns_triplets (((Parser *)parser)->m_ns_triplets)
473 #define prologState (((Parser *)parser)->m_prologState)
474 #define processor (((Parser *)parser)->m_processor)
475 #define errorCode (((Parser *)parser)->m_errorCode)
476 #define eventPtr (((Parser *)parser)->m_eventPtr)
477 #define eventEndPtr (((Parser *)parser)->m_eventEndPtr)
478 #define positionPtr (((Parser *)parser)->m_positionPtr)
479 #define position (((Parser *)parser)->m_position)
480 #define openInternalEntities (((Parser *)parser)->m_openInternalEntities)
481 #define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities)
482 #define tagLevel (((Parser *)parser)->m_tagLevel)
483 #define buffer (((Parser *)parser)->m_buffer)
484 #define bufferPtr (((Parser *)parser)->m_bufferPtr)
485 #define bufferEnd (((Parser *)parser)->m_bufferEnd)
486 #define parseEndByteIndex (((Parser *)parser)->m_parseEndByteIndex)
487 #define parseEndPtr (((Parser *)parser)->m_parseEndPtr)
488 #define bufferLim (((Parser *)parser)->m_bufferLim)
489 #define dataBuf (((Parser *)parser)->m_dataBuf)
490 #define dataBufEnd (((Parser *)parser)->m_dataBufEnd)
491 #define dtd (((Parser *)parser)->m_dtd)
492 #define curBase (((Parser *)parser)->m_curBase)
493 #define declEntity (((Parser *)parser)->m_declEntity)
494 #define doctypeName (((Parser *)parser)->m_doctypeName)
495 #define doctypeSysid (((Parser *)parser)->m_doctypeSysid)
496 #define doctypePubid (((Parser *)parser)->m_doctypePubid)
497 #define declAttributeType (((Parser *)parser)->m_declAttributeType)
498 #define declNotationName (((Parser *)parser)->m_declNotationName)
499 #define declNotationPublicId (((Parser *)parser)->m_declNotationPublicId)
500 #define declElementType (((Parser *)parser)->m_declElementType)
501 #define declAttributeId (((Parser *)parser)->m_declAttributeId)
502 #define declAttributeIsCdata (((Parser *)parser)->m_declAttributeIsCdata)
503 #define declAttributeIsId (((Parser *)parser)->m_declAttributeIsId)
504 #define freeTagList (((Parser *)parser)->m_freeTagList)
505 #define freeBindingList (((Parser *)parser)->m_freeBindingList)
506 #define inheritedBindings (((Parser *)parser)->m_inheritedBindings)
507 #define tagStack (((Parser *)parser)->m_tagStack)
508 #define atts (((Parser *)parser)->m_atts)
509 #define attsSize (((Parser *)parser)->m_attsSize)
510 #define nSpecifiedAtts (((Parser *)parser)->m_nSpecifiedAtts)
511 #define idAttIndex (((Parser *)parser)->m_idAttIndex)
512 #define tempPool (((Parser *)parser)->m_tempPool)
513 #define temp2Pool (((Parser *)parser)->m_temp2Pool)
514 #define groupConnector (((Parser *)parser)->m_groupConnector)
515 #define groupSize (((Parser *)parser)->m_groupSize)
516 #define hadExternalDoctype (((Parser *)parser)->m_hadExternalDoctype)
517 #define namespaceSeparator (((Parser *)parser)->m_namespaceSeparator)
519 #define parentParser (((Parser *)parser)->m_parentParser)
520 #define paramEntityParsing (((Parser *)parser)->m_paramEntityParsing)
523 #ifdef COMPILED_FROM_DSP
524 BOOL WINAPI
DllMain(HINSTANCE h
, DWORD r
, LPVOID p
) {
527 #endif /* def COMPILED_FROM_DSP */
531 Parser
*asParser(XML_Parser parser
)
538 XML_Parser
XML_ParserCreate(const XML_Char
*encodingName
)
540 return XML_ParserCreate_MM(encodingName
, NULL
, NULL
);
543 XML_Parser
XML_ParserCreateNS(const XML_Char
*encodingName
, XML_Char nsSep
)
547 return XML_ParserCreate_MM(encodingName
, NULL
, tmp
);
551 XML_ParserCreate_MM(const XML_Char
*encodingName
,
552 const XML_Memory_Handling_Suite
*memsuite
,
553 const XML_Char
*nameSep
) {
557 const XML_Char implicitContext
[] = {
558 XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='),
559 XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'),
560 XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'),
561 XML_T('.'), XML_T('w'), XML_T('3'),
562 XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'),
563 XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'),
564 XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'),
565 XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'),
566 XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'),
572 XML_Memory_Handling_Suite
*mtemp
;
573 parser
= memsuite
->malloc_fcn(sizeof(Parser
));
574 mtemp
= &(((Parser
*) parser
)->m_mem
);
575 mtemp
->malloc_fcn
= memsuite
->malloc_fcn
;
576 mtemp
->realloc_fcn
= memsuite
->realloc_fcn
;
577 mtemp
->free_fcn
= memsuite
->free_fcn
;
580 XML_Memory_Handling_Suite
*mtemp
;
581 parser
= malloc(sizeof(Parser
));
582 mtemp
= &(((Parser
*) parser
)->m_mem
);
583 mtemp
->malloc_fcn
= malloc
;
584 mtemp
->realloc_fcn
= realloc
;
585 mtemp
->free_fcn
= free
;
590 processor
= prologInitProcessor
;
591 XmlPrologStateInit(&prologState
);
594 startElementHandler
= 0;
595 endElementHandler
= 0;
596 characterDataHandler
= 0;
597 processingInstructionHandler
= 0;
599 startCdataSectionHandler
= 0;
600 endCdataSectionHandler
= 0;
602 startDoctypeDeclHandler
= 0;
603 endDoctypeDeclHandler
= 0;
604 unparsedEntityDeclHandler
= 0;
605 notationDeclHandler
= 0;
606 startNamespaceDeclHandler
= 0;
607 endNamespaceDeclHandler
= 0;
608 notStandaloneHandler
= 0;
609 externalEntityRefHandler
= 0;
610 externalEntityRefHandlerArg
= parser
;
611 unknownEncodingHandler
= 0;
612 elementDeclHandler
= 0;
613 attlistDeclHandler
= 0;
614 entityDeclHandler
= 0;
619 parseEndByteIndex
= 0;
628 declAttributeType
= 0;
629 declNotationName
= 0;
630 declNotationPublicId
= 0;
631 memset(&position
, 0, sizeof(POSITION
));
632 errorCode
= XML_ERROR_NONE
;
636 openInternalEntities
= 0;
641 inheritedBindings
= 0;
642 attsSize
= INIT_ATTS_SIZE
;
643 atts
= MALLOC(attsSize
* sizeof(ATTRIBUTE
));
645 dataBuf
= MALLOC(INIT_DATA_BUF_SIZE
* sizeof(XML_Char
));
648 hadExternalDoctype
= 0;
649 unknownEncodingMem
= 0;
650 unknownEncodingRelease
= 0;
651 unknownEncodingData
= 0;
652 unknownEncodingHandlerData
= 0;
653 namespaceSeparator
= '!';
656 paramEntityParsing
= XML_PARAM_ENTITY_PARSING_NEVER
;
660 poolInit(&tempPool
, &(((Parser
*) parser
)->m_mem
));
661 poolInit(&temp2Pool
, &(((Parser
*) parser
)->m_mem
));
662 protocolEncodingName
= encodingName
? poolCopyString(&tempPool
, encodingName
) : 0;
664 if (!dtdInit(&dtd
, parser
) || !atts
|| !dataBuf
665 || (encodingName
&& !protocolEncodingName
)) {
666 XML_ParserFree(parser
);
669 dataBufEnd
= dataBuf
+ INIT_DATA_BUF_SIZE
;
672 XmlInitEncodingNS(&initEncoding
, &encoding
, 0);
674 internalEncoding
= XmlGetInternalEncodingNS();
675 namespaceSeparator
= *nameSep
;
677 if (! setContext(parser
, implicitContext
)) {
678 XML_ParserFree(parser
);
683 XmlInitEncoding(&initEncoding
, &encoding
, 0);
684 internalEncoding
= XmlGetInternalEncoding();
688 } /* End XML_ParserCreate_MM */
690 int XML_SetEncoding(XML_Parser parser
, const XML_Char
*encodingName
)
693 protocolEncodingName
= 0;
695 protocolEncodingName
= poolCopyString(&tempPool
, encodingName
);
696 if (!protocolEncodingName
)
702 XML_Parser
XML_ExternalEntityParserCreate(XML_Parser oldParser
,
703 const XML_Char
*context
,
704 const XML_Char
*encodingName
)
706 XML_Parser parser
= oldParser
;
708 XML_StartElementHandler oldStartElementHandler
= startElementHandler
;
709 XML_EndElementHandler oldEndElementHandler
= endElementHandler
;
710 XML_CharacterDataHandler oldCharacterDataHandler
= characterDataHandler
;
711 XML_ProcessingInstructionHandler oldProcessingInstructionHandler
= processingInstructionHandler
;
712 XML_CommentHandler oldCommentHandler
= commentHandler
;
713 XML_StartCdataSectionHandler oldStartCdataSectionHandler
= startCdataSectionHandler
;
714 XML_EndCdataSectionHandler oldEndCdataSectionHandler
= endCdataSectionHandler
;
715 XML_DefaultHandler oldDefaultHandler
= defaultHandler
;
716 XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler
= unparsedEntityDeclHandler
;
717 XML_NotationDeclHandler oldNotationDeclHandler
= notationDeclHandler
;
718 XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler
= startNamespaceDeclHandler
;
719 XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler
= endNamespaceDeclHandler
;
720 XML_NotStandaloneHandler oldNotStandaloneHandler
= notStandaloneHandler
;
721 XML_ExternalEntityRefHandler oldExternalEntityRefHandler
= externalEntityRefHandler
;
722 XML_UnknownEncodingHandler oldUnknownEncodingHandler
= unknownEncodingHandler
;
723 XML_ElementDeclHandler oldElementDeclHandler
= elementDeclHandler
;
724 XML_AttlistDeclHandler oldAttlistDeclHandler
= attlistDeclHandler
;
725 XML_EntityDeclHandler oldEntityDeclHandler
= entityDeclHandler
;
726 XML_XmlDeclHandler oldXmlDeclHandler
= xmlDeclHandler
;
727 ELEMENT_TYPE
* oldDeclElementType
= declElementType
;
729 void *oldUserData
= userData
;
730 void *oldHandlerArg
= handlerArg
;
731 int oldDefaultExpandInternalEntities
= defaultExpandInternalEntities
;
732 void *oldExternalEntityRefHandlerArg
= externalEntityRefHandlerArg
;
734 int oldParamEntityParsing
= paramEntityParsing
;
736 int oldns_triplets
= ns_triplets
;
741 *tmp
= namespaceSeparator
;
742 parser
= XML_ParserCreate_MM(encodingName
, &((Parser
*)parser
)->m_mem
,
746 parser
= XML_ParserCreate_MM(encodingName
, &((Parser
*)parser
)->m_mem
,
753 startElementHandler
= oldStartElementHandler
;
754 endElementHandler
= oldEndElementHandler
;
755 characterDataHandler
= oldCharacterDataHandler
;
756 processingInstructionHandler
= oldProcessingInstructionHandler
;
757 commentHandler
= oldCommentHandler
;
758 startCdataSectionHandler
= oldStartCdataSectionHandler
;
759 endCdataSectionHandler
= oldEndCdataSectionHandler
;
760 defaultHandler
= oldDefaultHandler
;
761 unparsedEntityDeclHandler
= oldUnparsedEntityDeclHandler
;
762 notationDeclHandler
= oldNotationDeclHandler
;
763 startNamespaceDeclHandler
= oldStartNamespaceDeclHandler
;
764 endNamespaceDeclHandler
= oldEndNamespaceDeclHandler
;
765 notStandaloneHandler
= oldNotStandaloneHandler
;
766 externalEntityRefHandler
= oldExternalEntityRefHandler
;
767 unknownEncodingHandler
= oldUnknownEncodingHandler
;
768 elementDeclHandler
= oldElementDeclHandler
;
769 attlistDeclHandler
= oldAttlistDeclHandler
;
770 entityDeclHandler
= oldEntityDeclHandler
;
771 xmlDeclHandler
= oldXmlDeclHandler
;
772 declElementType
= oldDeclElementType
;
773 userData
= oldUserData
;
774 if (oldUserData
== oldHandlerArg
)
775 handlerArg
= userData
;
778 if (oldExternalEntityRefHandlerArg
!= oldParser
)
779 externalEntityRefHandlerArg
= oldExternalEntityRefHandlerArg
;
780 defaultExpandInternalEntities
= oldDefaultExpandInternalEntities
;
781 ns_triplets
= oldns_triplets
;
783 paramEntityParsing
= oldParamEntityParsing
;
786 if (!dtdCopy(&dtd
, oldDtd
, parser
) || !setContext(parser
, context
)) {
787 XML_ParserFree(parser
);
790 processor
= externalEntityInitProcessor
;
794 dtdSwap(&dtd
, oldDtd
);
795 parentParser
= oldParser
;
796 XmlPrologStateInitExternalEntity(&prologState
);
798 hadExternalDoctype
= 1;
805 void destroyBindings(BINDING
*bindings
, XML_Parser parser
)
808 BINDING
*b
= bindings
;
811 bindings
= b
->nextTagBinding
;
817 void XML_ParserFree(XML_Parser parser
)
822 if (freeTagList
== 0)
824 tagStack
= freeTagList
;
828 tagStack
= tagStack
->parent
;
830 destroyBindings(p
->bindings
, parser
);
833 destroyBindings(freeBindingList
, parser
);
834 destroyBindings(inheritedBindings
, parser
);
835 poolDestroy(&tempPool
);
836 poolDestroy(&temp2Pool
);
839 if (hadExternalDoctype
)
841 dtdSwap(&dtd
, &((Parser
*)parentParser
)->m_dtd
);
844 dtdDestroy(&dtd
, parser
);
847 FREE(groupConnector
);
851 if (unknownEncodingMem
)
852 FREE(unknownEncodingMem
);
853 if (unknownEncodingRelease
)
854 unknownEncodingRelease(unknownEncodingData
);
858 void XML_UseParserAsHandlerArg(XML_Parser parser
)
864 XML_SetReturnNSTriplet(XML_Parser parser
, int do_nst
) {
865 ns_triplets
= do_nst
;
868 void XML_SetUserData(XML_Parser parser
, void *p
)
870 if (handlerArg
== userData
)
871 handlerArg
= userData
= p
;
876 int XML_SetBase(XML_Parser parser
, const XML_Char
*p
)
879 p
= poolCopyString(&dtd
.pool
, p
);
889 const XML_Char
*XML_GetBase(XML_Parser parser
)
894 int XML_GetSpecifiedAttributeCount(XML_Parser parser
)
896 return nSpecifiedAtts
;
899 int XML_GetIdAttributeIndex(XML_Parser parser
)
904 void XML_SetElementHandler(XML_Parser parser
,
905 XML_StartElementHandler start
,
906 XML_EndElementHandler end
)
908 startElementHandler
= start
;
909 endElementHandler
= end
;
912 void XML_SetStartElementHandler(XML_Parser parser
,
913 XML_StartElementHandler start
) {
914 startElementHandler
= start
;
917 void XML_SetEndElementHandler(XML_Parser parser
,
918 XML_EndElementHandler end
) {
919 endElementHandler
= end
;
922 void XML_SetCharacterDataHandler(XML_Parser parser
,
923 XML_CharacterDataHandler handler
)
925 characterDataHandler
= handler
;
928 void XML_SetProcessingInstructionHandler(XML_Parser parser
,
929 XML_ProcessingInstructionHandler handler
)
931 processingInstructionHandler
= handler
;
934 void XML_SetCommentHandler(XML_Parser parser
,
935 XML_CommentHandler handler
)
937 commentHandler
= handler
;
940 void XML_SetCdataSectionHandler(XML_Parser parser
,
941 XML_StartCdataSectionHandler start
,
942 XML_EndCdataSectionHandler end
)
944 startCdataSectionHandler
= start
;
945 endCdataSectionHandler
= end
;
948 void XML_SetStartCdataSectionHandler(XML_Parser parser
,
949 XML_StartCdataSectionHandler start
) {
950 startCdataSectionHandler
= start
;
953 void XML_SetEndCdataSectionHandler(XML_Parser parser
,
954 XML_EndCdataSectionHandler end
) {
955 endCdataSectionHandler
= end
;
958 void XML_SetDefaultHandler(XML_Parser parser
,
959 XML_DefaultHandler handler
)
961 defaultHandler
= handler
;
962 defaultExpandInternalEntities
= 0;
965 void XML_SetDefaultHandlerExpand(XML_Parser parser
,
966 XML_DefaultHandler handler
)
968 defaultHandler
= handler
;
969 defaultExpandInternalEntities
= 1;
972 void XML_SetDoctypeDeclHandler(XML_Parser parser
,
973 XML_StartDoctypeDeclHandler start
,
974 XML_EndDoctypeDeclHandler end
)
976 startDoctypeDeclHandler
= start
;
977 endDoctypeDeclHandler
= end
;
980 void XML_SetStartDoctypeDeclHandler(XML_Parser parser
,
981 XML_StartDoctypeDeclHandler start
) {
982 startDoctypeDeclHandler
= start
;
985 void XML_SetEndDoctypeDeclHandler(XML_Parser parser
,
986 XML_EndDoctypeDeclHandler end
) {
987 endDoctypeDeclHandler
= end
;
990 void XML_SetUnparsedEntityDeclHandler(XML_Parser parser
,
991 XML_UnparsedEntityDeclHandler handler
)
993 unparsedEntityDeclHandler
= handler
;
996 void XML_SetNotationDeclHandler(XML_Parser parser
,
997 XML_NotationDeclHandler handler
)
999 notationDeclHandler
= handler
;
1002 void XML_SetNamespaceDeclHandler(XML_Parser parser
,
1003 XML_StartNamespaceDeclHandler start
,
1004 XML_EndNamespaceDeclHandler end
)
1006 startNamespaceDeclHandler
= start
;
1007 endNamespaceDeclHandler
= end
;
1010 void XML_SetStartNamespaceDeclHandler(XML_Parser parser
,
1011 XML_StartNamespaceDeclHandler start
) {
1012 startNamespaceDeclHandler
= start
;
1015 void XML_SetEndNamespaceDeclHandler(XML_Parser parser
,
1016 XML_EndNamespaceDeclHandler end
) {
1017 endNamespaceDeclHandler
= end
;
1021 void XML_SetNotStandaloneHandler(XML_Parser parser
,
1022 XML_NotStandaloneHandler handler
)
1024 notStandaloneHandler
= handler
;
1027 void XML_SetExternalEntityRefHandler(XML_Parser parser
,
1028 XML_ExternalEntityRefHandler handler
)
1030 externalEntityRefHandler
= handler
;
1033 void XML_SetExternalEntityRefHandlerArg(XML_Parser parser
, void *arg
)
1036 externalEntityRefHandlerArg
= arg
;
1038 externalEntityRefHandlerArg
= parser
;
1041 void XML_SetUnknownEncodingHandler(XML_Parser parser
,
1042 XML_UnknownEncodingHandler handler
,
1045 unknownEncodingHandler
= handler
;
1046 unknownEncodingHandlerData
= data
;
1049 void XML_SetElementDeclHandler(XML_Parser parser
,
1050 XML_ElementDeclHandler eldecl
)
1052 elementDeclHandler
= eldecl
;
1055 void XML_SetAttlistDeclHandler(XML_Parser parser
,
1056 XML_AttlistDeclHandler attdecl
)
1058 attlistDeclHandler
= attdecl
;
1061 void XML_SetEntityDeclHandler(XML_Parser parser
,
1062 XML_EntityDeclHandler handler
)
1064 entityDeclHandler
= handler
;
1067 void XML_SetXmlDeclHandler(XML_Parser parser
,
1068 XML_XmlDeclHandler handler
) {
1069 xmlDeclHandler
= handler
;
1072 int XML_SetParamEntityParsing(XML_Parser parser
,
1073 enum XML_ParamEntityParsing parsing
)
1076 paramEntityParsing
= parsing
;
1079 return parsing
== XML_PARAM_ENTITY_PARSING_NEVER
;
1083 int XML_Parse(XML_Parser parser
, const char *s
, int len
, int isFinal
)
1088 positionPtr
= bufferPtr
;
1089 errorCode
= processor(parser
, bufferPtr
, parseEndPtr
= bufferEnd
, 0);
1090 if (errorCode
== XML_ERROR_NONE
)
1092 eventEndPtr
= eventPtr
;
1093 processor
= errorProcessor
;
1096 #ifndef XML_CONTEXT_BYTES
1097 else if (bufferPtr
== bufferEnd
) {
1100 parseEndByteIndex
+= len
;
1103 errorCode
= processor(parser
, s
, parseEndPtr
= s
+ len
, 0);
1104 if (errorCode
== XML_ERROR_NONE
)
1106 eventEndPtr
= eventPtr
;
1107 processor
= errorProcessor
;
1110 errorCode
= processor(parser
, s
, parseEndPtr
= s
+ len
, &end
);
1111 if (errorCode
!= XML_ERROR_NONE
) {
1112 eventEndPtr
= eventPtr
;
1113 processor
= errorProcessor
;
1116 XmlUpdatePosition(encoding
, positionPtr
, end
, &position
);
1117 nLeftOver
= s
+ len
- end
;
1119 if (buffer
== 0 || nLeftOver
> bufferLim
- buffer
) {
1120 /* FIXME avoid integer overflow */
1121 buffer
= buffer
== 0 ? MALLOC(len
* 2) : REALLOC(buffer
, len
* 2);
1122 /* FIXME storage leak if realloc fails */
1124 errorCode
= XML_ERROR_NO_MEMORY
;
1125 eventPtr
= eventEndPtr
= 0;
1126 processor
= errorProcessor
;
1129 bufferLim
= buffer
+ len
* 2;
1131 memcpy(buffer
, end
, nLeftOver
);
1133 bufferEnd
= buffer
+ nLeftOver
;
1137 #endif /* not defined XML_CONTEXT_BYTES */
1139 memcpy(XML_GetBuffer(parser
, len
), s
, len
);
1140 return XML_ParseBuffer(parser
, len
, isFinal
);
1144 int XML_ParseBuffer(XML_Parser parser
, int len
, int isFinal
)
1146 const char *start
= bufferPtr
;
1147 positionPtr
= start
;
1149 parseEndByteIndex
+= len
;
1150 errorCode
= processor(parser
, start
, parseEndPtr
= bufferEnd
,
1151 isFinal
? (const char **)0 : &bufferPtr
);
1152 if (errorCode
== XML_ERROR_NONE
) {
1154 XmlUpdatePosition(encoding
, positionPtr
, bufferPtr
, &position
);
1158 eventEndPtr
= eventPtr
;
1159 processor
= errorProcessor
;
1164 void *XML_GetBuffer(XML_Parser parser
, int len
)
1166 if (len
> bufferLim
- bufferEnd
) {
1167 /* FIXME avoid integer overflow */
1168 int neededSize
= len
+ (bufferEnd
- bufferPtr
);
1169 #ifdef XML_CONTEXT_BYTES
1170 int keep
= bufferPtr
- buffer
;
1172 if (keep
> XML_CONTEXT_BYTES
)
1173 keep
= XML_CONTEXT_BYTES
;
1175 #endif /* defined XML_CONTEXT_BYTES */
1176 if (neededSize
<= bufferLim
- buffer
) {
1177 #ifdef XML_CONTEXT_BYTES
1178 if (keep
< bufferPtr
- buffer
) {
1179 int offset
= (bufferPtr
- buffer
) - keep
;
1180 memmove(buffer
, &buffer
[offset
], bufferEnd
- bufferPtr
+ keep
);
1181 bufferEnd
-= offset
;
1182 bufferPtr
-= offset
;
1185 memmove(buffer
, bufferPtr
, bufferEnd
- bufferPtr
);
1186 bufferEnd
= buffer
+ (bufferEnd
- bufferPtr
);
1188 #endif /* not defined XML_CONTEXT_BYTES */
1192 int bufferSize
= bufferLim
- bufferPtr
;
1193 if (bufferSize
== 0)
1194 bufferSize
= INIT_BUFFER_SIZE
;
1197 } while (bufferSize
< neededSize
);
1198 newBuf
= MALLOC(bufferSize
);
1200 errorCode
= XML_ERROR_NO_MEMORY
;
1203 bufferLim
= newBuf
+ bufferSize
;
1204 #ifdef XML_CONTEXT_BYTES
1206 int keep
= bufferPtr
- buffer
;
1207 if (keep
> XML_CONTEXT_BYTES
)
1208 keep
= XML_CONTEXT_BYTES
;
1209 memcpy(newBuf
, &bufferPtr
[-keep
], bufferEnd
- bufferPtr
+ keep
);
1212 bufferEnd
= buffer
+ (bufferEnd
- bufferPtr
) + keep
;
1213 bufferPtr
= buffer
+ keep
;
1216 bufferEnd
= newBuf
+ (bufferEnd
- bufferPtr
);
1217 bufferPtr
= buffer
= newBuf
;
1221 memcpy(newBuf
, bufferPtr
, bufferEnd
- bufferPtr
);
1224 bufferEnd
= newBuf
+ (bufferEnd
- bufferPtr
);
1225 bufferPtr
= buffer
= newBuf
;
1226 #endif /* not defined XML_CONTEXT_BYTES */
1232 enum XML_Error
XML_GetErrorCode(XML_Parser parser
)
1237 long XML_GetCurrentByteIndex(XML_Parser parser
)
1240 return parseEndByteIndex
- (parseEndPtr
- eventPtr
);
1244 int XML_GetCurrentByteCount(XML_Parser parser
)
1246 if (eventEndPtr
&& eventPtr
)
1247 return eventEndPtr
- eventPtr
;
1251 const char * XML_GetInputContext(XML_Parser parser
, int *offset
, int *size
)
1253 #ifdef XML_CONTEXT_BYTES
1254 if (eventPtr
&& buffer
) {
1255 *offset
= eventPtr
- buffer
;
1256 *size
= bufferEnd
- buffer
;
1259 #endif /* defined XML_CONTEXT_BYTES */
1263 int XML_GetCurrentLineNumber(XML_Parser parser
)
1266 XmlUpdatePosition(encoding
, positionPtr
, eventPtr
, &position
);
1267 positionPtr
= eventPtr
;
1269 return position
.lineNumber
+ 1;
1272 int XML_GetCurrentColumnNumber(XML_Parser parser
)
1275 XmlUpdatePosition(encoding
, positionPtr
, eventPtr
, &position
);
1276 positionPtr
= eventPtr
;
1278 return position
.columnNumber
;
1281 void XML_DefaultCurrent(XML_Parser parser
)
1283 if (defaultHandler
) {
1284 if (openInternalEntities
)
1285 reportDefault(parser
,
1287 openInternalEntities
->internalEventPtr
,
1288 openInternalEntities
->internalEventEndPtr
);
1290 reportDefault(parser
, encoding
, eventPtr
, eventEndPtr
);
1294 const XML_LChar
*XML_ErrorString(int code
)
1296 static const XML_LChar
*message
[] = {
1298 XML_T("out of memory"),
1299 XML_T("syntax error"),
1300 XML_T("no element found"),
1301 XML_T("not well-formed (invalid token)"),
1302 XML_T("unclosed token"),
1303 XML_T("unclosed token"),
1304 XML_T("mismatched tag"),
1305 XML_T("duplicate attribute"),
1306 XML_T("junk after document element"),
1307 XML_T("illegal parameter entity reference"),
1308 XML_T("undefined entity"),
1309 XML_T("recursive entity reference"),
1310 XML_T("asynchronous entity"),
1311 XML_T("reference to invalid character number"),
1312 XML_T("reference to binary entity"),
1313 XML_T("reference to external entity in attribute"),
1314 XML_T("xml processing instruction not at start of external entity"),
1315 XML_T("unknown encoding"),
1316 XML_T("encoding specified in XML declaration is incorrect"),
1317 XML_T("unclosed CDATA section"),
1318 XML_T("error in processing external entity reference"),
1319 XML_T("document is not standalone"),
1320 XML_T("unexpected parser state - please send a bug report")
1322 if (code
> 0 && code
< sizeof(message
)/sizeof(message
[0]))
1323 return message
[code
];
1328 XML_ExpatVersion(void) {
1333 XML_ExpatVersionInfo(void) {
1334 XML_Expat_Version version
;
1336 version
.major
= XML_MAJOR_VERSION
;
1337 version
.minor
= XML_MINOR_VERSION
;
1338 version
.micro
= XML_MICRO_VERSION
;
1344 enum XML_Error
contentProcessor(XML_Parser parser
,
1347 const char **endPtr
)
1349 return doContent(parser
, 0, encoding
, start
, end
, endPtr
);
1353 enum XML_Error
externalEntityInitProcessor(XML_Parser parser
,
1356 const char **endPtr
)
1358 enum XML_Error result
= initializeEncoding(parser
);
1359 if (result
!= XML_ERROR_NONE
)
1361 processor
= externalEntityInitProcessor2
;
1362 return externalEntityInitProcessor2(parser
, start
, end
, endPtr
);
1366 enum XML_Error
externalEntityInitProcessor2(XML_Parser parser
,
1369 const char **endPtr
)
1372 int tok
= XmlContentTok(encoding
, start
, end
, &next
);
1377 case XML_TOK_PARTIAL
:
1380 return XML_ERROR_NONE
;
1383 return XML_ERROR_UNCLOSED_TOKEN
;
1384 case XML_TOK_PARTIAL_CHAR
:
1387 return XML_ERROR_NONE
;
1390 return XML_ERROR_PARTIAL_CHAR
;
1392 processor
= externalEntityInitProcessor3
;
1393 return externalEntityInitProcessor3(parser
, start
, end
, endPtr
);
1397 enum XML_Error
externalEntityInitProcessor3(XML_Parser parser
,
1400 const char **endPtr
)
1403 int tok
= XmlContentTok(encoding
, start
, end
, &next
);
1405 case XML_TOK_XML_DECL
:
1407 enum XML_Error result
= processXmlDecl(parser
, 1, start
, next
);
1408 if (result
!= XML_ERROR_NONE
)
1413 case XML_TOK_PARTIAL
:
1416 return XML_ERROR_NONE
;
1419 return XML_ERROR_UNCLOSED_TOKEN
;
1420 case XML_TOK_PARTIAL_CHAR
:
1423 return XML_ERROR_NONE
;
1426 return XML_ERROR_PARTIAL_CHAR
;
1428 processor
= externalEntityContentProcessor
;
1430 return doContent(parser
, 1, encoding
, start
, end
, endPtr
);
1434 enum XML_Error
externalEntityContentProcessor(XML_Parser parser
,
1437 const char **endPtr
)
1439 return doContent(parser
, 1, encoding
, start
, end
, endPtr
);
1442 static enum XML_Error
1443 doContent(XML_Parser parser
,
1445 const ENCODING
*enc
,
1448 const char **nextPtr
)
1450 const char **eventPP
;
1451 const char **eventEndPP
;
1452 if (enc
== encoding
) {
1453 eventPP
= &eventPtr
;
1454 eventEndPP
= &eventEndPtr
;
1457 eventPP
= &(openInternalEntities
->internalEventPtr
);
1458 eventEndPP
= &(openInternalEntities
->internalEventEndPtr
);
1462 const char *next
= s
; /* XmlContentTok doesn't always set the last arg */
1463 int tok
= XmlContentTok(enc
, s
, end
, &next
);
1466 case XML_TOK_TRAILING_CR
:
1469 return XML_ERROR_NONE
;
1472 if (characterDataHandler
) {
1474 characterDataHandler(handlerArg
, &c
, 1);
1476 else if (defaultHandler
)
1477 reportDefault(parser
, enc
, s
, end
);
1478 if (startTagLevel
== 0)
1479 return XML_ERROR_NO_ELEMENTS
;
1480 if (tagLevel
!= startTagLevel
)
1481 return XML_ERROR_ASYNC_ENTITY
;
1482 return XML_ERROR_NONE
;
1486 return XML_ERROR_NONE
;
1488 if (startTagLevel
> 0) {
1489 if (tagLevel
!= startTagLevel
)
1490 return XML_ERROR_ASYNC_ENTITY
;
1491 return XML_ERROR_NONE
;
1493 return XML_ERROR_NO_ELEMENTS
;
1494 case XML_TOK_INVALID
:
1496 return XML_ERROR_INVALID_TOKEN
;
1497 case XML_TOK_PARTIAL
:
1500 return XML_ERROR_NONE
;
1502 return XML_ERROR_UNCLOSED_TOKEN
;
1503 case XML_TOK_PARTIAL_CHAR
:
1506 return XML_ERROR_NONE
;
1508 return XML_ERROR_PARTIAL_CHAR
;
1509 case XML_TOK_ENTITY_REF
:
1511 const XML_Char
*name
;
1513 XML_Char ch
= XmlPredefinedEntityName(enc
,
1514 s
+ enc
->minBytesPerChar
,
1515 next
- enc
->minBytesPerChar
);
1517 if (characterDataHandler
)
1518 characterDataHandler(handlerArg
, &ch
, 1);
1519 else if (defaultHandler
)
1520 reportDefault(parser
, enc
, s
, next
);
1523 name
= poolStoreString(&dtd
.pool
, enc
,
1524 s
+ enc
->minBytesPerChar
,
1525 next
- enc
->minBytesPerChar
);
1527 return XML_ERROR_NO_MEMORY
;
1528 entity
= (ENTITY
*)lookup(&dtd
.generalEntities
, name
, 0);
1529 poolDiscard(&dtd
.pool
);
1531 if (dtd
.complete
|| dtd
.standalone
)
1532 return XML_ERROR_UNDEFINED_ENTITY
;
1534 reportDefault(parser
, enc
, s
, next
);
1538 return XML_ERROR_RECURSIVE_ENTITY_REF
;
1539 if (entity
->notation
)
1540 return XML_ERROR_BINARY_ENTITY_REF
;
1542 if (entity
->textPtr
) {
1543 enum XML_Error result
;
1544 OPEN_INTERNAL_ENTITY openEntity
;
1545 if (defaultHandler
&& !defaultExpandInternalEntities
) {
1546 reportDefault(parser
, enc
, s
, next
);
1550 openEntity
.next
= openInternalEntities
;
1551 openInternalEntities
= &openEntity
;
1552 openEntity
.entity
= entity
;
1553 openEntity
.internalEventPtr
= 0;
1554 openEntity
.internalEventEndPtr
= 0;
1555 result
= doContent(parser
,
1558 (char *)entity
->textPtr
,
1559 (char *)(entity
->textPtr
+ entity
->textLen
),
1562 openInternalEntities
= openEntity
.next
;
1566 else if (externalEntityRefHandler
) {
1567 const XML_Char
*context
;
1569 context
= getContext(parser
);
1572 return XML_ERROR_NO_MEMORY
;
1573 if (!externalEntityRefHandler(externalEntityRefHandlerArg
,
1578 return XML_ERROR_EXTERNAL_ENTITY_HANDLING
;
1579 poolDiscard(&tempPool
);
1581 else if (defaultHandler
)
1582 reportDefault(parser
, enc
, s
, next
);
1586 case XML_TOK_START_TAG_WITH_ATTS
:
1587 if (!startElementHandler
) {
1588 enum XML_Error result
= storeAtts(parser
, enc
, s
, 0, 0);
1593 case XML_TOK_START_TAG_NO_ATTS
:
1598 freeTagList
= freeTagList
->parent
;
1601 tag
= MALLOC(sizeof(TAG
));
1603 return XML_ERROR_NO_MEMORY
;
1604 tag
->buf
= MALLOC(INIT_TAG_BUF_SIZE
);
1606 return XML_ERROR_NO_MEMORY
;
1607 tag
->bufEnd
= tag
->buf
+ INIT_TAG_BUF_SIZE
;
1610 tag
->parent
= tagStack
;
1612 tag
->name
.localPart
= 0;
1613 tag
->rawName
= s
+ enc
->minBytesPerChar
;
1614 tag
->rawNameLength
= XmlNameLength(enc
, tag
->rawName
);
1616 /* Need to guarantee that:
1617 tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)) <= tag->bufEnd - sizeof(XML_Char) */
1618 if (tag
->rawNameLength
+ (int)(sizeof(XML_Char
) - 1) + (int)sizeof(XML_Char
) > tag
->bufEnd
- tag
->buf
) {
1619 int bufSize
= tag
->rawNameLength
* 4;
1620 bufSize
= ROUND_UP(bufSize
, sizeof(XML_Char
));
1621 tag
->buf
= REALLOC(tag
->buf
, bufSize
);
1623 return XML_ERROR_NO_MEMORY
;
1624 tag
->bufEnd
= tag
->buf
+ bufSize
;
1626 memcpy(tag
->buf
, tag
->rawName
, tag
->rawNameLength
);
1627 tag
->rawName
= tag
->buf
;
1630 if (startElementHandler
) {
1631 enum XML_Error result
;
1634 const char *rawNameEnd
= tag
->rawName
+ tag
->rawNameLength
;
1635 const char *fromPtr
= tag
->rawName
;
1638 toPtr
= (XML_Char
*)(tag
->buf
+ ROUND_UP(tag
->rawNameLength
, sizeof(XML_Char
)));
1640 toPtr
= (XML_Char
*)tag
->buf
;
1641 tag
->name
.str
= toPtr
;
1643 &fromPtr
, rawNameEnd
,
1644 (ICHAR
**)&toPtr
, (ICHAR
*)tag
->bufEnd
- 1);
1645 if (fromPtr
== rawNameEnd
)
1647 bufSize
= (tag
->bufEnd
- tag
->buf
) << 1;
1648 tag
->buf
= REALLOC(tag
->buf
, bufSize
);
1650 return XML_ERROR_NO_MEMORY
;
1651 tag
->bufEnd
= tag
->buf
+ bufSize
;
1653 tag
->rawName
= tag
->buf
;
1655 *toPtr
= XML_T('\0');
1656 result
= storeAtts(parser
, enc
, s
, &(tag
->name
), &(tag
->bindings
));
1659 startElementHandler(handlerArg
, tag
->name
.str
, (const XML_Char
**)atts
);
1660 poolClear(&tempPool
);
1665 reportDefault(parser
, enc
, s
, next
);
1669 case XML_TOK_EMPTY_ELEMENT_WITH_ATTS
:
1670 if (!startElementHandler
) {
1671 enum XML_Error result
= storeAtts(parser
, enc
, s
, 0, 0);
1676 case XML_TOK_EMPTY_ELEMENT_NO_ATTS
:
1677 if (startElementHandler
|| endElementHandler
) {
1678 const char *rawName
= s
+ enc
->minBytesPerChar
;
1679 enum XML_Error result
;
1680 BINDING
*bindings
= 0;
1682 name
.str
= poolStoreString(&tempPool
, enc
, rawName
,
1683 rawName
+ XmlNameLength(enc
, rawName
));
1685 return XML_ERROR_NO_MEMORY
;
1686 poolFinish(&tempPool
);
1687 result
= storeAtts(parser
, enc
, s
, &name
, &bindings
);
1690 poolFinish(&tempPool
);
1691 if (startElementHandler
)
1692 startElementHandler(handlerArg
, name
.str
, (const XML_Char
**)atts
);
1693 if (endElementHandler
) {
1694 if (startElementHandler
)
1695 *eventPP
= *eventEndPP
;
1696 endElementHandler(handlerArg
, name
.str
);
1698 poolClear(&tempPool
);
1700 BINDING
*b
= bindings
;
1701 if (endNamespaceDeclHandler
)
1702 endNamespaceDeclHandler(handlerArg
, b
->prefix
->name
);
1703 bindings
= bindings
->nextTagBinding
;
1704 b
->nextTagBinding
= freeBindingList
;
1705 freeBindingList
= b
;
1706 b
->prefix
->binding
= b
->prevPrefixBinding
;
1709 else if (defaultHandler
)
1710 reportDefault(parser
, enc
, s
, next
);
1712 return epilogProcessor(parser
, next
, end
, nextPtr
);
1714 case XML_TOK_END_TAG
:
1715 if (tagLevel
== startTagLevel
)
1716 return XML_ERROR_ASYNC_ENTITY
;
1719 const char *rawName
;
1720 TAG
*tag
= tagStack
;
1721 tagStack
= tag
->parent
;
1722 tag
->parent
= freeTagList
;
1724 rawName
= s
+ enc
->minBytesPerChar
*2;
1725 len
= XmlNameLength(enc
, rawName
);
1726 if (len
!= tag
->rawNameLength
1727 || memcmp(tag
->rawName
, rawName
, len
) != 0) {
1729 return XML_ERROR_TAG_MISMATCH
;
1732 if (endElementHandler
&& tag
->name
.str
) {
1733 if (tag
->name
.localPart
) {
1734 XML_Char
*to
= (XML_Char
*)tag
->name
.str
+ tag
->name
.uriLen
;
1735 const XML_Char
*from
= tag
->name
.localPart
;
1736 while ((*to
++ = *from
++) != 0)
1739 endElementHandler(handlerArg
, tag
->name
.str
);
1741 else if (defaultHandler
)
1742 reportDefault(parser
, enc
, s
, next
);
1743 while (tag
->bindings
) {
1744 BINDING
*b
= tag
->bindings
;
1745 if (endNamespaceDeclHandler
)
1746 endNamespaceDeclHandler(handlerArg
, b
->prefix
->name
);
1747 tag
->bindings
= tag
->bindings
->nextTagBinding
;
1748 b
->nextTagBinding
= freeBindingList
;
1749 freeBindingList
= b
;
1750 b
->prefix
->binding
= b
->prevPrefixBinding
;
1753 return epilogProcessor(parser
, next
, end
, nextPtr
);
1756 case XML_TOK_CHAR_REF
:
1758 int n
= XmlCharRefNumber(enc
, s
);
1760 return XML_ERROR_BAD_CHAR_REF
;
1761 if (characterDataHandler
) {
1762 XML_Char buf
[XML_ENCODE_MAX
];
1763 characterDataHandler(handlerArg
, buf
, XmlEncode(n
, (ICHAR
*)buf
));
1765 else if (defaultHandler
)
1766 reportDefault(parser
, enc
, s
, next
);
1769 case XML_TOK_XML_DECL
:
1770 return XML_ERROR_MISPLACED_XML_PI
;
1771 case XML_TOK_DATA_NEWLINE
:
1772 if (characterDataHandler
) {
1774 characterDataHandler(handlerArg
, &c
, 1);
1776 else if (defaultHandler
)
1777 reportDefault(parser
, enc
, s
, next
);
1779 case XML_TOK_CDATA_SECT_OPEN
:
1781 enum XML_Error result
;
1782 if (startCdataSectionHandler
)
1783 startCdataSectionHandler(handlerArg
);
1785 /* Suppose you doing a transformation on a document that involves
1786 changing only the character data. You set up a defaultHandler
1787 and a characterDataHandler. The defaultHandler simply copies
1788 characters through. The characterDataHandler does the transformation
1789 and writes the characters out escaping them as necessary. This case
1790 will fail to work if we leave out the following two lines (because &
1791 and < inside CDATA sections will be incorrectly escaped).
1793 However, now we have a start/endCdataSectionHandler, so it seems
1794 easier to let the user deal with this. */
1796 else if (characterDataHandler
)
1797 characterDataHandler(handlerArg
, dataBuf
, 0);
1799 else if (defaultHandler
)
1800 reportDefault(parser
, enc
, s
, next
);
1801 result
= doCdataSection(parser
, enc
, &next
, end
, nextPtr
);
1803 processor
= cdataSectionProcessor
;
1808 case XML_TOK_TRAILING_RSQB
:
1811 return XML_ERROR_NONE
;
1813 if (characterDataHandler
) {
1814 if (MUST_CONVERT(enc
, s
)) {
1815 ICHAR
*dataPtr
= (ICHAR
*)dataBuf
;
1816 XmlConvert(enc
, &s
, end
, &dataPtr
, (ICHAR
*)dataBufEnd
);
1817 characterDataHandler(handlerArg
, dataBuf
, dataPtr
- (ICHAR
*)dataBuf
);
1820 characterDataHandler(handlerArg
,
1822 (XML_Char
*)end
- (XML_Char
*)s
);
1824 else if (defaultHandler
)
1825 reportDefault(parser
, enc
, s
, end
);
1826 if (startTagLevel
== 0) {
1828 return XML_ERROR_NO_ELEMENTS
;
1830 if (tagLevel
!= startTagLevel
) {
1832 return XML_ERROR_ASYNC_ENTITY
;
1834 return XML_ERROR_NONE
;
1835 case XML_TOK_DATA_CHARS
:
1836 if (characterDataHandler
) {
1837 if (MUST_CONVERT(enc
, s
)) {
1839 ICHAR
*dataPtr
= (ICHAR
*)dataBuf
;
1840 XmlConvert(enc
, &s
, next
, &dataPtr
, (ICHAR
*)dataBufEnd
);
1842 characterDataHandler(handlerArg
, dataBuf
, dataPtr
- (ICHAR
*)dataBuf
);
1849 characterDataHandler(handlerArg
,
1851 (XML_Char
*)next
- (XML_Char
*)s
);
1853 else if (defaultHandler
)
1854 reportDefault(parser
, enc
, s
, next
);
1857 if (!reportProcessingInstruction(parser
, enc
, s
, next
))
1858 return XML_ERROR_NO_MEMORY
;
1860 case XML_TOK_COMMENT
:
1861 if (!reportComment(parser
, enc
, s
, next
))
1862 return XML_ERROR_NO_MEMORY
;
1866 reportDefault(parser
, enc
, s
, next
);
1869 *eventPP
= s
= next
;
1874 /* If tagNamePtr is non-null, build a real list of attributes,
1875 otherwise just check the attributes for well-formedness. */
1877 static enum XML_Error
storeAtts(XML_Parser parser
, const ENCODING
*enc
,
1878 const char *attStr
, TAG_NAME
*tagNamePtr
,
1879 BINDING
**bindingsPtr
)
1881 ELEMENT_TYPE
*elementType
= 0;
1882 int nDefaultAtts
= 0;
1883 const XML_Char
**appAtts
; /* the attribute list to pass to the application */
1889 const XML_Char
*localPart
;
1891 /* lookup the element type name */
1893 elementType
= (ELEMENT_TYPE
*)lookup(&dtd
.elementTypes
, tagNamePtr
->str
,0);
1895 tagNamePtr
->str
= poolCopyString(&dtd
.pool
, tagNamePtr
->str
);
1896 if (!tagNamePtr
->str
)
1897 return XML_ERROR_NO_MEMORY
;
1898 elementType
= (ELEMENT_TYPE
*)lookup(&dtd
.elementTypes
, tagNamePtr
->str
, sizeof(ELEMENT_TYPE
));
1900 return XML_ERROR_NO_MEMORY
;
1901 if (ns
&& !setElementTypePrefix(parser
, elementType
))
1902 return XML_ERROR_NO_MEMORY
;
1904 nDefaultAtts
= elementType
->nDefaultAtts
;
1906 /* get the attributes from the tokenizer */
1907 n
= XmlGetAttributes(enc
, attStr
, attsSize
, atts
);
1908 if (n
+ nDefaultAtts
> attsSize
) {
1909 int oldAttsSize
= attsSize
;
1910 attsSize
= n
+ nDefaultAtts
+ INIT_ATTS_SIZE
;
1911 atts
= REALLOC((void *)atts
, attsSize
* sizeof(ATTRIBUTE
));
1913 return XML_ERROR_NO_MEMORY
;
1914 if (n
> oldAttsSize
)
1915 XmlGetAttributes(enc
, attStr
, n
, atts
);
1917 appAtts
= (const XML_Char
**)atts
;
1918 for (i
= 0; i
< n
; i
++) {
1919 /* add the name and value to the attribute list */
1920 ATTRIBUTE_ID
*attId
= getAttributeId(parser
, enc
, atts
[i
].name
,
1922 + XmlNameLength(enc
, atts
[i
].name
));
1924 return XML_ERROR_NO_MEMORY
;
1925 /* detect duplicate attributes */
1926 if ((attId
->name
)[-1]) {
1927 if (enc
== encoding
)
1928 eventPtr
= atts
[i
].name
;
1929 return XML_ERROR_DUPLICATE_ATTRIBUTE
;
1931 (attId
->name
)[-1] = 1;
1932 appAtts
[attIndex
++] = attId
->name
;
1933 if (!atts
[i
].normalized
) {
1934 enum XML_Error result
;
1937 /* figure out whether declared as other than CDATA */
1938 if (attId
->maybeTokenized
) {
1940 for (j
= 0; j
< nDefaultAtts
; j
++) {
1941 if (attId
== elementType
->defaultAtts
[j
].id
) {
1942 isCdata
= elementType
->defaultAtts
[j
].isCdata
;
1948 /* normalize the attribute value */
1949 result
= storeAttributeValue(parser
, enc
, isCdata
,
1950 atts
[i
].valuePtr
, atts
[i
].valueEnd
,
1955 appAtts
[attIndex
] = poolStart(&tempPool
);
1956 poolFinish(&tempPool
);
1959 poolDiscard(&tempPool
);
1961 else if (tagNamePtr
) {
1962 /* the value did not need normalizing */
1963 appAtts
[attIndex
] = poolStoreString(&tempPool
, enc
, atts
[i
].valuePtr
, atts
[i
].valueEnd
);
1964 if (appAtts
[attIndex
] == 0)
1965 return XML_ERROR_NO_MEMORY
;
1966 poolFinish(&tempPool
);
1968 /* handle prefixed attribute names */
1969 if (attId
->prefix
&& tagNamePtr
) {
1971 /* deal with namespace declarations here */
1972 if (!addBinding(parser
, attId
->prefix
, attId
, appAtts
[attIndex
], bindingsPtr
))
1973 return XML_ERROR_NO_MEMORY
;
1977 /* deal with other prefixed names later */
1980 (attId
->name
)[-1] = 2;
1988 nSpecifiedAtts
= attIndex
;
1989 if (elementType
->idAtt
&& (elementType
->idAtt
->name
)[-1]) {
1990 for (i
= 0; i
< attIndex
; i
+= 2)
1991 if (appAtts
[i
] == elementType
->idAtt
->name
) {
1998 /* do attribute defaulting */
1999 for (j
= 0; j
< nDefaultAtts
; j
++) {
2000 const DEFAULT_ATTRIBUTE
*da
= elementType
->defaultAtts
+ j
;
2001 if (!(da
->id
->name
)[-1] && da
->value
) {
2002 if (da
->id
->prefix
) {
2003 if (da
->id
->xmlns
) {
2004 if (!addBinding(parser
, da
->id
->prefix
, da
->id
, da
->value
, bindingsPtr
))
2005 return XML_ERROR_NO_MEMORY
;
2008 (da
->id
->name
)[-1] = 2;
2010 appAtts
[attIndex
++] = da
->id
->name
;
2011 appAtts
[attIndex
++] = da
->value
;
2015 (da
->id
->name
)[-1] = 1;
2016 appAtts
[attIndex
++] = da
->id
->name
;
2017 appAtts
[attIndex
++] = da
->value
;
2021 appAtts
[attIndex
] = 0;
2025 /* expand prefixed attribute names */
2026 for (; i
< attIndex
; i
+= 2) {
2027 if (appAtts
[i
][-1] == 2) {
2029 ((XML_Char
*)(appAtts
[i
]))[-1] = 0;
2030 id
= (ATTRIBUTE_ID
*)lookup(&dtd
.attributeIds
, appAtts
[i
], 0);
2031 if (id
->prefix
->binding
) {
2033 const BINDING
*b
= id
->prefix
->binding
;
2034 const XML_Char
*s
= appAtts
[i
];
2035 for (j
= 0; j
< b
->uriLen
; j
++) {
2036 if (!poolAppendChar(&tempPool
, b
->uri
[j
]))
2037 return XML_ERROR_NO_MEMORY
;
2042 if (!poolAppendChar(&tempPool
, *s
))
2043 return XML_ERROR_NO_MEMORY
;
2046 tempPool
.ptr
[-1] = namespaceSeparator
;
2047 s
= b
->prefix
->name
;
2049 if (!poolAppendChar(&tempPool
, *s
))
2050 return XML_ERROR_NO_MEMORY
;
2054 appAtts
[i
] = poolStart(&tempPool
);
2055 poolFinish(&tempPool
);
2061 ((XML_Char
*)(appAtts
[i
]))[-1] = 0;
2064 /* clear the flags that say whether attributes were specified */
2065 for (; i
< attIndex
; i
+= 2)
2066 ((XML_Char
*)(appAtts
[i
]))[-1] = 0;
2068 return XML_ERROR_NONE
;
2069 for (binding
= *bindingsPtr
; binding
; binding
= binding
->nextTagBinding
)
2070 binding
->attId
->name
[-1] = 0;
2071 /* expand the element type name */
2072 if (elementType
->prefix
) {
2073 binding
= elementType
->prefix
->binding
;
2075 return XML_ERROR_NONE
;
2076 localPart
= tagNamePtr
->str
;
2077 while (*localPart
++ != XML_T(':'))
2080 else if (dtd
.defaultPrefix
.binding
) {
2081 binding
= dtd
.defaultPrefix
.binding
;
2082 localPart
= tagNamePtr
->str
;
2085 return XML_ERROR_NONE
;
2086 tagNamePtr
->localPart
= localPart
;
2087 tagNamePtr
->uriLen
= binding
->uriLen
;
2088 for (i
= 0; localPart
[i
++];)
2090 n
= i
+ binding
->uriLen
;
2091 if (n
> binding
->uriAlloc
) {
2093 XML_Char
*uri
= MALLOC((n
+ EXPAND_SPARE
) * sizeof(XML_Char
));
2095 return XML_ERROR_NO_MEMORY
;
2096 binding
->uriAlloc
= n
+ EXPAND_SPARE
;
2097 memcpy(uri
, binding
->uri
, binding
->uriLen
* sizeof(XML_Char
));
2098 for (p
= tagStack
; p
; p
= p
->parent
)
2099 if (p
->name
.str
== binding
->uri
)
2104 memcpy(binding
->uri
+ binding
->uriLen
, localPart
, i
* sizeof(XML_Char
));
2105 tagNamePtr
->str
= binding
->uri
;
2106 return XML_ERROR_NONE
;
2110 int addBinding(XML_Parser parser
, PREFIX
*prefix
, const ATTRIBUTE_ID
*attId
, const XML_Char
*uri
, BINDING
**bindingsPtr
)
2114 for (len
= 0; uri
[len
]; len
++)
2116 if (namespaceSeparator
)
2118 if (freeBindingList
) {
2119 b
= freeBindingList
;
2120 if (len
> b
->uriAlloc
) {
2121 b
->uri
= REALLOC(b
->uri
, sizeof(XML_Char
) * (len
+ EXPAND_SPARE
));
2124 b
->uriAlloc
= len
+ EXPAND_SPARE
;
2126 freeBindingList
= b
->nextTagBinding
;
2129 b
= MALLOC(sizeof(BINDING
));
2132 b
->uri
= MALLOC(sizeof(XML_Char
) * (len
+ EXPAND_SPARE
));
2137 b
->uriAlloc
= len
+ EXPAND_SPARE
;
2140 memcpy(b
->uri
, uri
, len
* sizeof(XML_Char
));
2141 if (namespaceSeparator
)
2142 b
->uri
[len
- 1] = namespaceSeparator
;
2145 b
->prevPrefixBinding
= prefix
->binding
;
2146 if (*uri
== XML_T('\0') && prefix
== &dtd
.defaultPrefix
)
2147 prefix
->binding
= 0;
2149 prefix
->binding
= b
;
2150 b
->nextTagBinding
= *bindingsPtr
;
2152 if (startNamespaceDeclHandler
)
2153 startNamespaceDeclHandler(handlerArg
, prefix
->name
,
2154 prefix
->binding
? uri
: 0);
2158 /* The idea here is to avoid using stack for each CDATA section when
2159 the whole file is parsed with one call. */
2162 enum XML_Error
cdataSectionProcessor(XML_Parser parser
,
2165 const char **endPtr
)
2167 enum XML_Error result
= doCdataSection(parser
, encoding
, &start
, end
, endPtr
);
2169 processor
= contentProcessor
;
2170 return contentProcessor(parser
, start
, end
, endPtr
);
2175 /* startPtr gets set to non-null is the section is closed, and to null if
2176 the section is not yet closed. */
2179 enum XML_Error
doCdataSection(XML_Parser parser
,
2180 const ENCODING
*enc
,
2181 const char **startPtr
,
2183 const char **nextPtr
)
2185 const char *s
= *startPtr
;
2186 const char **eventPP
;
2187 const char **eventEndPP
;
2188 if (enc
== encoding
) {
2189 eventPP
= &eventPtr
;
2191 eventEndPP
= &eventEndPtr
;
2194 eventPP
= &(openInternalEntities
->internalEventPtr
);
2195 eventEndPP
= &(openInternalEntities
->internalEventEndPtr
);
2201 int tok
= XmlCdataSectionTok(enc
, s
, end
, &next
);
2204 case XML_TOK_CDATA_SECT_CLOSE
:
2205 if (endCdataSectionHandler
)
2206 endCdataSectionHandler(handlerArg
);
2208 /* see comment under XML_TOK_CDATA_SECT_OPEN */
2209 else if (characterDataHandler
)
2210 characterDataHandler(handlerArg
, dataBuf
, 0);
2212 else if (defaultHandler
)
2213 reportDefault(parser
, enc
, s
, next
);
2215 return XML_ERROR_NONE
;
2216 case XML_TOK_DATA_NEWLINE
:
2217 if (characterDataHandler
) {
2219 characterDataHandler(handlerArg
, &c
, 1);
2221 else if (defaultHandler
)
2222 reportDefault(parser
, enc
, s
, next
);
2224 case XML_TOK_DATA_CHARS
:
2225 if (characterDataHandler
) {
2226 if (MUST_CONVERT(enc
, s
)) {
2228 ICHAR
*dataPtr
= (ICHAR
*)dataBuf
;
2229 XmlConvert(enc
, &s
, next
, &dataPtr
, (ICHAR
*)dataBufEnd
);
2231 characterDataHandler(handlerArg
, dataBuf
, dataPtr
- (ICHAR
*)dataBuf
);
2238 characterDataHandler(handlerArg
,
2240 (XML_Char
*)next
- (XML_Char
*)s
);
2242 else if (defaultHandler
)
2243 reportDefault(parser
, enc
, s
, next
);
2245 case XML_TOK_INVALID
:
2247 return XML_ERROR_INVALID_TOKEN
;
2248 case XML_TOK_PARTIAL_CHAR
:
2251 return XML_ERROR_NONE
;
2253 return XML_ERROR_PARTIAL_CHAR
;
2254 case XML_TOK_PARTIAL
:
2258 return XML_ERROR_NONE
;
2260 return XML_ERROR_UNCLOSED_CDATA_SECTION
;
2263 return XML_ERROR_UNEXPECTED_STATE
;
2265 *eventPP
= s
= next
;
2272 /* The idea here is to avoid using stack for each IGNORE section when
2273 the whole file is parsed with one call. */
2276 enum XML_Error
ignoreSectionProcessor(XML_Parser parser
,
2279 const char **endPtr
)
2281 enum XML_Error result
= doIgnoreSection(parser
, encoding
, &start
, end
, endPtr
);
2283 processor
= prologProcessor
;
2284 return prologProcessor(parser
, start
, end
, endPtr
);
2289 /* startPtr gets set to non-null is the section is closed, and to null if
2290 the section is not yet closed. */
2293 enum XML_Error
doIgnoreSection(XML_Parser parser
,
2294 const ENCODING
*enc
,
2295 const char **startPtr
,
2297 const char **nextPtr
)
2301 const char *s
= *startPtr
;
2302 const char **eventPP
;
2303 const char **eventEndPP
;
2304 if (enc
== encoding
) {
2305 eventPP
= &eventPtr
;
2307 eventEndPP
= &eventEndPtr
;
2310 eventPP
= &(openInternalEntities
->internalEventPtr
);
2311 eventEndPP
= &(openInternalEntities
->internalEventEndPtr
);
2315 tok
= XmlIgnoreSectionTok(enc
, s
, end
, &next
);
2318 case XML_TOK_IGNORE_SECT
:
2320 reportDefault(parser
, enc
, s
, next
);
2322 return XML_ERROR_NONE
;
2323 case XML_TOK_INVALID
:
2325 return XML_ERROR_INVALID_TOKEN
;
2326 case XML_TOK_PARTIAL_CHAR
:
2329 return XML_ERROR_NONE
;
2331 return XML_ERROR_PARTIAL_CHAR
;
2332 case XML_TOK_PARTIAL
:
2336 return XML_ERROR_NONE
;
2338 return XML_ERROR_SYNTAX
; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */
2341 return XML_ERROR_UNEXPECTED_STATE
;
2346 #endif /* XML_DTD */
2348 static enum XML_Error
2349 initializeEncoding(XML_Parser parser
)
2353 char encodingBuf
[128];
2354 if (!protocolEncodingName
)
2358 for (i
= 0; protocolEncodingName
[i
]; i
++) {
2359 if (i
== sizeof(encodingBuf
) - 1
2360 || (protocolEncodingName
[i
] & ~0x7f) != 0) {
2361 encodingBuf
[0] = '\0';
2364 encodingBuf
[i
] = (char)protocolEncodingName
[i
];
2366 encodingBuf
[i
] = '\0';
2370 s
= protocolEncodingName
;
2372 if ((ns
? XmlInitEncodingNS
: XmlInitEncoding
)(&initEncoding
, &encoding
, s
))
2373 return XML_ERROR_NONE
;
2374 return handleUnknownEncoding(parser
, protocolEncodingName
);
2377 static enum XML_Error
2378 processXmlDecl(XML_Parser parser
, int isGeneralTextEntity
,
2379 const char *s
, const char *next
)
2381 const char *encodingName
= 0;
2382 const char *storedEncName
= 0;
2383 const ENCODING
*newEncoding
= 0;
2384 const char *version
= 0;
2385 const char *versionend
;
2386 const char *storedversion
= 0;
2387 int standalone
= -1;
2390 : XmlParseXmlDecl
)(isGeneralTextEntity
,
2400 return XML_ERROR_SYNTAX
;
2401 if (!isGeneralTextEntity
&& standalone
== 1) {
2404 if (paramEntityParsing
== XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE
)
2405 paramEntityParsing
= XML_PARAM_ENTITY_PARSING_NEVER
;
2406 #endif /* XML_DTD */
2408 if (xmlDeclHandler
) {
2410 storedEncName
= poolStoreString(&temp2Pool
,
2414 + XmlNameLength(encoding
, encodingName
));
2415 if (! storedEncName
)
2416 return XML_ERROR_NO_MEMORY
;
2417 poolFinish(&temp2Pool
);
2420 storedversion
= poolStoreString(&temp2Pool
,
2423 versionend
- encoding
->minBytesPerChar
);
2424 if (! storedversion
)
2425 return XML_ERROR_NO_MEMORY
;
2427 xmlDeclHandler(handlerArg
, storedversion
, storedEncName
, standalone
);
2429 else if (defaultHandler
)
2430 reportDefault(parser
, encoding
, s
, next
);
2431 if (!protocolEncodingName
) {
2433 if (newEncoding
->minBytesPerChar
!= encoding
->minBytesPerChar
) {
2434 eventPtr
= encodingName
;
2435 return XML_ERROR_INCORRECT_ENCODING
;
2437 encoding
= newEncoding
;
2439 else if (encodingName
) {
2440 enum XML_Error result
;
2441 if (! storedEncName
) {
2442 storedEncName
= poolStoreString(&temp2Pool
,
2446 + XmlNameLength(encoding
, encodingName
));
2447 if (! storedEncName
)
2448 return XML_ERROR_NO_MEMORY
;
2450 result
= handleUnknownEncoding(parser
, storedEncName
);
2451 poolClear(&tempPool
);
2452 if (result
== XML_ERROR_UNKNOWN_ENCODING
)
2453 eventPtr
= encodingName
;
2458 if (storedEncName
|| storedversion
)
2459 poolClear(&temp2Pool
);
2461 return XML_ERROR_NONE
;
2464 static enum XML_Error
2465 handleUnknownEncoding(XML_Parser parser
, const XML_Char
*encodingName
)
2467 if (unknownEncodingHandler
) {
2470 for (i
= 0; i
< 256; i
++)
2475 if (unknownEncodingHandler(unknownEncodingHandlerData
, encodingName
, &info
)) {
2477 unknownEncodingMem
= MALLOC(XmlSizeOfUnknownEncoding());
2478 if (!unknownEncodingMem
) {
2480 info
.release(info
.data
);
2481 return XML_ERROR_NO_MEMORY
;
2484 ? XmlInitUnknownEncodingNS
2485 : XmlInitUnknownEncoding
)(unknownEncodingMem
,
2490 unknownEncodingData
= info
.data
;
2491 unknownEncodingRelease
= info
.release
;
2493 return XML_ERROR_NONE
;
2497 info
.release(info
.data
);
2499 return XML_ERROR_UNKNOWN_ENCODING
;
2502 static enum XML_Error
2503 prologInitProcessor(XML_Parser parser
,
2506 const char **nextPtr
)
2508 enum XML_Error result
= initializeEncoding(parser
);
2509 if (result
!= XML_ERROR_NONE
)
2511 processor
= prologProcessor
;
2512 return prologProcessor(parser
, s
, end
, nextPtr
);
2515 static enum XML_Error
2516 prologProcessor(XML_Parser parser
,
2519 const char **nextPtr
)
2522 int tok
= XmlPrologTok(encoding
, s
, end
, &next
);
2523 return doProlog(parser
, encoding
, s
, end
, tok
, next
, nextPtr
);
2526 static enum XML_Error
2527 doProlog(XML_Parser parser
,
2528 const ENCODING
*enc
,
2533 const char **nextPtr
)
2536 static const XML_Char externalSubsetName
[] = { '#' , '\0' };
2537 #endif /* XML_DTD */
2539 const char **eventPP
;
2540 const char **eventEndPP
;
2541 enum XML_Content_Quant quant
;
2543 if (enc
== encoding
) {
2544 eventPP
= &eventPtr
;
2545 eventEndPP
= &eventEndPtr
;
2548 eventPP
= &(openInternalEntities
->internalEventPtr
);
2549 eventEndPP
= &(openInternalEntities
->internalEventEndPtr
);
2556 if (nextPtr
!= 0 && tok
!= XML_TOK_INVALID
) {
2558 return XML_ERROR_NONE
;
2561 case XML_TOK_INVALID
:
2563 return XML_ERROR_INVALID_TOKEN
;
2564 case XML_TOK_PARTIAL
:
2565 return XML_ERROR_UNCLOSED_TOKEN
;
2566 case XML_TOK_PARTIAL_CHAR
:
2567 return XML_ERROR_PARTIAL_CHAR
;
2570 if (enc
!= encoding
)
2571 return XML_ERROR_NONE
;
2573 if (XmlTokenRole(&prologState
, XML_TOK_NONE
, end
, end
, enc
)
2575 return XML_ERROR_SYNTAX
;
2576 hadExternalDoctype
= 0;
2577 return XML_ERROR_NONE
;
2579 #endif /* XML_DTD */
2580 return XML_ERROR_NO_ELEMENTS
;
2587 role
= XmlTokenRole(&prologState
, tok
, s
, next
, enc
);
2589 case XML_ROLE_XML_DECL
:
2591 enum XML_Error result
= processXmlDecl(parser
, 0, s
, next
);
2592 if (result
!= XML_ERROR_NONE
)
2597 case XML_ROLE_DOCTYPE_NAME
:
2598 if (startDoctypeDeclHandler
) {
2599 doctypeName
= poolStoreString(&tempPool
, enc
, s
, next
);
2601 return XML_ERROR_NO_MEMORY
;
2602 poolFinish(&tempPool
);
2607 case XML_ROLE_DOCTYPE_INTERNAL_SUBSET
:
2608 if (startDoctypeDeclHandler
) {
2609 startDoctypeDeclHandler(handlerArg
, doctypeName
, doctypeSysid
,
2612 poolClear(&tempPool
);
2616 case XML_ROLE_TEXT_DECL
:
2618 enum XML_Error result
= processXmlDecl(parser
, 1, s
, next
);
2619 if (result
!= XML_ERROR_NONE
)
2624 #endif /* XML_DTD */
2625 case XML_ROLE_DOCTYPE_PUBLIC_ID
:
2626 if (startDoctypeDeclHandler
) {
2627 doctypePubid
= poolStoreString(&tempPool
, enc
, s
+ 1, next
- 1);
2629 return XML_ERROR_NO_MEMORY
;
2630 poolFinish(&tempPool
);
2633 declEntity
= (ENTITY
*)lookup(&dtd
.paramEntities
,
2637 return XML_ERROR_NO_MEMORY
;
2638 #endif /* XML_DTD */
2640 case XML_ROLE_ENTITY_PUBLIC_ID
:
2641 if (!XmlIsPublicId(enc
, s
, next
, eventPP
))
2642 return XML_ERROR_SYNTAX
;
2644 XML_Char
*tem
= poolStoreString(&dtd
.pool
,
2646 s
+ enc
->minBytesPerChar
,
2647 next
- enc
->minBytesPerChar
);
2649 return XML_ERROR_NO_MEMORY
;
2650 normalizePublicId(tem
);
2651 declEntity
->publicId
= tem
;
2652 poolFinish(&dtd
.pool
);
2655 case XML_ROLE_DOCTYPE_CLOSE
:
2657 startDoctypeDeclHandler(handlerArg
, doctypeName
,
2658 doctypeSysid
, doctypePubid
, 0);
2659 poolClear(&tempPool
);
2661 if (dtd
.complete
&& hadExternalDoctype
) {
2664 if (paramEntityParsing
&& externalEntityRefHandler
) {
2665 ENTITY
*entity
= (ENTITY
*)lookup(&dtd
.paramEntities
,
2668 if (!externalEntityRefHandler(externalEntityRefHandlerArg
,
2673 return XML_ERROR_EXTERNAL_ENTITY_HANDLING
;
2675 #endif /* XML_DTD */
2678 && notStandaloneHandler
2679 && !notStandaloneHandler(handlerArg
))
2680 return XML_ERROR_NOT_STANDALONE
;
2682 if (endDoctypeDeclHandler
)
2683 endDoctypeDeclHandler(handlerArg
);
2685 case XML_ROLE_INSTANCE_START
:
2686 processor
= contentProcessor
;
2687 return contentProcessor(parser
, s
, end
, nextPtr
);
2688 case XML_ROLE_ATTLIST_ELEMENT_NAME
:
2689 declElementType
= getElementType(parser
, enc
, s
, next
);
2690 if (!declElementType
)
2691 return XML_ERROR_NO_MEMORY
;
2693 case XML_ROLE_ATTRIBUTE_NAME
:
2694 declAttributeId
= getAttributeId(parser
, enc
, s
, next
);
2695 if (!declAttributeId
)
2696 return XML_ERROR_NO_MEMORY
;
2697 declAttributeIsCdata
= 0;
2698 declAttributeType
= 0;
2699 declAttributeIsId
= 0;
2701 case XML_ROLE_ATTRIBUTE_TYPE_CDATA
:
2702 declAttributeIsCdata
= 1;
2703 declAttributeType
= "CDATA";
2705 case XML_ROLE_ATTRIBUTE_TYPE_ID
:
2706 declAttributeIsId
= 1;
2707 declAttributeType
= "ID";
2709 case XML_ROLE_ATTRIBUTE_TYPE_IDREF
:
2710 declAttributeType
= "IDREF";
2712 case XML_ROLE_ATTRIBUTE_TYPE_IDREFS
:
2713 declAttributeType
= "IDREFS";
2715 case XML_ROLE_ATTRIBUTE_TYPE_ENTITY
:
2716 declAttributeType
= "ENTITY";
2718 case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES
:
2719 declAttributeType
= "ENTITIES";
2721 case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN
:
2722 declAttributeType
= "NMTOKEN";
2724 case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS
:
2725 declAttributeType
= "NMTOKENS";
2728 case XML_ROLE_ATTRIBUTE_ENUM_VALUE
:
2729 case XML_ROLE_ATTRIBUTE_NOTATION_VALUE
:
2730 if (attlistDeclHandler
)
2733 if (declAttributeType
) {
2737 prefix
= (role
== XML_ROLE_ATTRIBUTE_NOTATION_VALUE
2741 if (! poolAppendString(&tempPool
, prefix
))
2742 return XML_ERROR_NO_MEMORY
;
2743 if (! poolAppend(&tempPool
, enc
, s
, next
))
2744 return XML_ERROR_NO_MEMORY
;
2745 declAttributeType
= tempPool
.start
;
2748 case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE
:
2749 case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE
:
2751 && !defineAttribute(declElementType
, declAttributeId
,
2752 declAttributeIsCdata
, declAttributeIsId
, 0,
2754 return XML_ERROR_NO_MEMORY
;
2755 if (attlistDeclHandler
&& declAttributeType
) {
2756 if (*declAttributeType
== '('
2757 || (*declAttributeType
== 'N' && declAttributeType
[1] == 'O')) {
2758 /* Enumerated or Notation type */
2759 if (! poolAppendChar(&tempPool
, ')')
2760 || ! poolAppendChar(&tempPool
, '\0'))
2761 return XML_ERROR_NO_MEMORY
;
2762 declAttributeType
= tempPool
.start
;
2763 poolFinish(&tempPool
);
2766 attlistDeclHandler(handlerArg
, declElementType
->name
,
2767 declAttributeId
->name
, declAttributeType
,
2768 0, role
== XML_ROLE_REQUIRED_ATTRIBUTE_VALUE
);
2769 poolClear(&tempPool
);
2772 case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE
:
2773 case XML_ROLE_FIXED_ATTRIBUTE_VALUE
:
2775 const XML_Char
*attVal
;
2776 enum XML_Error result
2777 = storeAttributeValue(parser
, enc
, declAttributeIsCdata
,
2778 s
+ enc
->minBytesPerChar
,
2779 next
- enc
->minBytesPerChar
,
2783 attVal
= poolStart(&dtd
.pool
);
2784 poolFinish(&dtd
.pool
);
2786 /* ID attributes aren't allowed to have a default */
2787 && !defineAttribute(declElementType
, declAttributeId
, declAttributeIsCdata
, 0, attVal
, parser
))
2788 return XML_ERROR_NO_MEMORY
;
2789 if (attlistDeclHandler
&& declAttributeType
) {
2790 if (*declAttributeType
== '('
2791 || (*declAttributeType
== 'N' && declAttributeType
[1] == 'O')) {
2792 /* Enumerated or Notation type */
2793 if (! poolAppendChar(&tempPool
, ')')
2794 || ! poolAppendChar(&tempPool
, '\0'))
2795 return XML_ERROR_NO_MEMORY
;
2796 declAttributeType
= tempPool
.start
;
2797 poolFinish(&tempPool
);
2800 attlistDeclHandler(handlerArg
, declElementType
->name
,
2801 declAttributeId
->name
, declAttributeType
,
2803 role
== XML_ROLE_FIXED_ATTRIBUTE_VALUE
);
2804 poolClear(&tempPool
);
2808 case XML_ROLE_ENTITY_VALUE
:
2810 enum XML_Error result
= storeEntityValue(parser
, enc
,
2811 s
+ enc
->minBytesPerChar
,
2812 next
- enc
->minBytesPerChar
);
2814 declEntity
->textPtr
= poolStart(&dtd
.pool
);
2815 declEntity
->textLen
= poolLength(&dtd
.pool
);
2816 poolFinish(&dtd
.pool
);
2817 if (entityDeclHandler
) {
2819 entityDeclHandler(handlerArg
,
2821 declEntity
->is_param
,
2822 declEntity
->textPtr
,
2823 declEntity
->textLen
,
2828 poolDiscard(&dtd
.pool
);
2829 if (result
!= XML_ERROR_NONE
)
2833 case XML_ROLE_DOCTYPE_SYSTEM_ID
:
2834 if (startDoctypeDeclHandler
) {
2835 doctypeSysid
= poolStoreString(&tempPool
, enc
, s
+ 1, next
- 1);
2837 return XML_ERROR_NO_MEMORY
;
2838 poolFinish(&tempPool
);
2842 && !paramEntityParsing
2843 #endif /* XML_DTD */
2844 && notStandaloneHandler
2845 && !notStandaloneHandler(handlerArg
))
2846 return XML_ERROR_NOT_STANDALONE
;
2847 hadExternalDoctype
= 1;
2852 declEntity
= (ENTITY
*)lookup(&dtd
.paramEntities
,
2855 declEntity
->publicId
= 0;
2857 return XML_ERROR_NO_MEMORY
;
2860 #endif /* XML_DTD */
2861 case XML_ROLE_ENTITY_SYSTEM_ID
:
2863 declEntity
->systemId
= poolStoreString(&dtd
.pool
, enc
,
2864 s
+ enc
->minBytesPerChar
,
2865 next
- enc
->minBytesPerChar
);
2866 if (!declEntity
->systemId
)
2867 return XML_ERROR_NO_MEMORY
;
2868 declEntity
->base
= curBase
;
2869 poolFinish(&dtd
.pool
);
2872 case XML_ROLE_ENTITY_COMPLETE
:
2873 if (declEntity
&& entityDeclHandler
) {
2875 entityDeclHandler(handlerArg
,
2879 declEntity
->systemId
,
2880 declEntity
->publicId
,
2884 case XML_ROLE_ENTITY_NOTATION_NAME
:
2886 declEntity
->notation
= poolStoreString(&dtd
.pool
, enc
, s
, next
);
2887 if (!declEntity
->notation
)
2888 return XML_ERROR_NO_MEMORY
;
2889 poolFinish(&dtd
.pool
);
2890 if (unparsedEntityDeclHandler
) {
2892 unparsedEntityDeclHandler(handlerArg
,
2895 declEntity
->systemId
,
2896 declEntity
->publicId
,
2897 declEntity
->notation
);
2899 else if (entityDeclHandler
) {
2901 entityDeclHandler(handlerArg
,
2905 declEntity
->systemId
,
2906 declEntity
->publicId
,
2907 declEntity
->notation
);
2911 case XML_ROLE_GENERAL_ENTITY_NAME
:
2913 const XML_Char
*name
;
2914 if (XmlPredefinedEntityName(enc
, s
, next
)) {
2918 name
= poolStoreString(&dtd
.pool
, enc
, s
, next
);
2920 return XML_ERROR_NO_MEMORY
;
2922 declEntity
= (ENTITY
*)lookup(&dtd
.generalEntities
, name
, sizeof(ENTITY
));
2924 return XML_ERROR_NO_MEMORY
;
2925 if (declEntity
->name
!= name
) {
2926 poolDiscard(&dtd
.pool
);
2930 poolFinish(&dtd
.pool
);
2931 declEntity
->publicId
= 0;
2932 declEntity
->is_param
= 0;
2936 poolDiscard(&dtd
.pool
);
2941 case XML_ROLE_PARAM_ENTITY_NAME
:
2944 const XML_Char
*name
= poolStoreString(&dtd
.pool
, enc
, s
, next
);
2946 return XML_ERROR_NO_MEMORY
;
2947 declEntity
= (ENTITY
*)lookup(&dtd
.paramEntities
,
2948 name
, sizeof(ENTITY
));
2950 return XML_ERROR_NO_MEMORY
;
2951 if (declEntity
->name
!= name
) {
2952 poolDiscard(&dtd
.pool
);
2956 poolFinish(&dtd
.pool
);
2957 declEntity
->publicId
= 0;
2958 declEntity
->is_param
= 1;
2961 #else /* not XML_DTD */
2963 #endif /* not XML_DTD */
2965 case XML_ROLE_NOTATION_NAME
:
2966 declNotationPublicId
= 0;
2967 declNotationName
= 0;
2968 if (notationDeclHandler
) {
2969 declNotationName
= poolStoreString(&tempPool
, enc
, s
, next
);
2970 if (!declNotationName
)
2971 return XML_ERROR_NO_MEMORY
;
2972 poolFinish(&tempPool
);
2975 case XML_ROLE_NOTATION_PUBLIC_ID
:
2976 if (!XmlIsPublicId(enc
, s
, next
, eventPP
))
2977 return XML_ERROR_SYNTAX
;
2978 if (declNotationName
) {
2979 XML_Char
*tem
= poolStoreString(&tempPool
,
2981 s
+ enc
->minBytesPerChar
,
2982 next
- enc
->minBytesPerChar
);
2984 return XML_ERROR_NO_MEMORY
;
2985 normalizePublicId(tem
);
2986 declNotationPublicId
= tem
;
2987 poolFinish(&tempPool
);
2990 case XML_ROLE_NOTATION_SYSTEM_ID
:
2991 if (declNotationName
&& notationDeclHandler
) {
2992 const XML_Char
*systemId
2993 = poolStoreString(&tempPool
, enc
,
2994 s
+ enc
->minBytesPerChar
,
2995 next
- enc
->minBytesPerChar
);
2997 return XML_ERROR_NO_MEMORY
;
2999 notationDeclHandler(handlerArg
,
3003 declNotationPublicId
);
3005 poolClear(&tempPool
);
3007 case XML_ROLE_NOTATION_NO_SYSTEM_ID
:
3008 if (declNotationPublicId
&& notationDeclHandler
) {
3010 notationDeclHandler(handlerArg
,
3014 declNotationPublicId
);
3016 poolClear(&tempPool
);
3018 case XML_ROLE_ERROR
:
3020 case XML_TOK_PARAM_ENTITY_REF
:
3021 return XML_ERROR_PARAM_ENTITY_REF
;
3022 case XML_TOK_XML_DECL
:
3023 return XML_ERROR_MISPLACED_XML_PI
;
3025 return XML_ERROR_SYNTAX
;
3028 case XML_ROLE_IGNORE_SECT
:
3030 enum XML_Error result
;
3032 reportDefault(parser
, enc
, s
, next
);
3033 result
= doIgnoreSection(parser
, enc
, &next
, end
, nextPtr
);
3035 processor
= ignoreSectionProcessor
;
3040 #endif /* XML_DTD */
3041 case XML_ROLE_GROUP_OPEN
:
3042 if (prologState
.level
>= groupSize
) {
3044 groupConnector
= REALLOC(groupConnector
, groupSize
*= 2);
3046 dtd
.scaffIndex
= REALLOC(dtd
.scaffIndex
, groupSize
* sizeof(int));
3049 groupConnector
= MALLOC(groupSize
= 32);
3050 if (!groupConnector
)
3051 return XML_ERROR_NO_MEMORY
;
3053 groupConnector
[prologState
.level
] = 0;
3054 if (dtd
.in_eldecl
) {
3055 int myindex
= nextScaffoldPart(parser
);
3057 return XML_ERROR_NO_MEMORY
;
3058 dtd
.scaffIndex
[dtd
.scaffLevel
] = myindex
;
3060 dtd
.scaffold
[myindex
].type
= XML_CTYPE_SEQ
;
3063 case XML_ROLE_GROUP_SEQUENCE
:
3064 if (groupConnector
[prologState
.level
] == '|')
3065 return XML_ERROR_SYNTAX
;
3066 groupConnector
[prologState
.level
] = ',';
3068 case XML_ROLE_GROUP_CHOICE
:
3069 if (groupConnector
[prologState
.level
] == ',')
3070 return XML_ERROR_SYNTAX
;
3072 && ! groupConnector
[prologState
.level
]
3073 && dtd
.scaffold
[dtd
.scaffIndex
[dtd
.scaffLevel
- 1]].type
!= XML_CTYPE_MIXED
3075 dtd
.scaffold
[dtd
.scaffIndex
[dtd
.scaffLevel
- 1]].type
= XML_CTYPE_CHOICE
;
3077 groupConnector
[prologState
.level
] = '|';
3079 case XML_ROLE_PARAM_ENTITY_REF
:
3081 case XML_ROLE_INNER_PARAM_ENTITY_REF
:
3082 if (paramEntityParsing
3083 && (dtd
.complete
|| role
== XML_ROLE_INNER_PARAM_ENTITY_REF
)) {
3084 const XML_Char
*name
;
3086 name
= poolStoreString(&dtd
.pool
, enc
,
3087 s
+ enc
->minBytesPerChar
,
3088 next
- enc
->minBytesPerChar
);
3090 return XML_ERROR_NO_MEMORY
;
3091 entity
= (ENTITY
*)lookup(&dtd
.paramEntities
, name
, 0);
3092 poolDiscard(&dtd
.pool
);
3094 /* FIXME what to do if !dtd.complete? */
3095 return XML_ERROR_UNDEFINED_ENTITY
;
3098 return XML_ERROR_RECURSIVE_ENTITY_REF
;
3099 if (entity
->textPtr
) {
3100 enum XML_Error result
;
3101 result
= processInternalParamEntity(parser
, entity
);
3102 if (result
!= XML_ERROR_NONE
)
3106 if (role
== XML_ROLE_INNER_PARAM_ENTITY_REF
)
3107 return XML_ERROR_PARAM_ENTITY_REF
;
3108 if (externalEntityRefHandler
) {
3111 if (!externalEntityRefHandler(externalEntityRefHandlerArg
,
3115 entity
->publicId
)) {
3117 return XML_ERROR_EXTERNAL_ENTITY_HANDLING
;
3124 #endif /* XML_DTD */
3126 && notStandaloneHandler
3127 && !notStandaloneHandler(handlerArg
))
3128 return XML_ERROR_NOT_STANDALONE
;
3131 reportDefault(parser
, enc
, s
, next
);
3134 /* Element declaration stuff */
3136 case XML_ROLE_ELEMENT_NAME
:
3137 if (elementDeclHandler
) {
3138 declElementType
= getElementType(parser
, enc
, s
, next
);
3139 if (! declElementType
)
3140 return XML_ERROR_NO_MEMORY
;
3147 case XML_ROLE_CONTENT_ANY
:
3148 case XML_ROLE_CONTENT_EMPTY
:
3149 if (dtd
.in_eldecl
) {
3150 if (elementDeclHandler
) {
3151 XML_Content
* content
= (XML_Content
*) MALLOC(sizeof(XML_Content
));
3153 return XML_ERROR_NO_MEMORY
;
3154 content
->quant
= XML_CQUANT_NONE
;
3156 content
->numchildren
= 0;
3157 content
->children
= 0;
3158 content
->type
= ((role
== XML_ROLE_CONTENT_ANY
) ?
3162 elementDeclHandler(handlerArg
, declElementType
->name
, content
);
3168 case XML_ROLE_CONTENT_PCDATA
:
3169 if (dtd
.in_eldecl
) {
3170 dtd
.scaffold
[dtd
.scaffIndex
[dtd
.scaffLevel
- 1]].type
= XML_CTYPE_MIXED
;
3174 case XML_ROLE_CONTENT_ELEMENT
:
3175 quant
= XML_CQUANT_NONE
;
3176 goto elementContent
;
3177 case XML_ROLE_CONTENT_ELEMENT_OPT
:
3178 quant
= XML_CQUANT_OPT
;
3179 goto elementContent
;
3180 case XML_ROLE_CONTENT_ELEMENT_REP
:
3181 quant
= XML_CQUANT_REP
;
3182 goto elementContent
;
3183 case XML_ROLE_CONTENT_ELEMENT_PLUS
:
3184 quant
= XML_CQUANT_PLUS
;
3189 const char *nxt
= quant
== XML_CQUANT_NONE
? next
: next
- 1;
3190 int myindex
= nextScaffoldPart(parser
);
3192 return XML_ERROR_NO_MEMORY
;
3193 dtd
.scaffold
[myindex
].type
= XML_CTYPE_NAME
;
3194 dtd
.scaffold
[myindex
].quant
= quant
;
3195 el
= getElementType(parser
, enc
, s
, nxt
);
3197 return XML_ERROR_NO_MEMORY
;
3198 dtd
.scaffold
[myindex
].name
= el
->name
;
3199 dtd
.contentStringLen
+= nxt
- s
+ 1;
3203 case XML_ROLE_GROUP_CLOSE
:
3204 quant
= XML_CQUANT_NONE
;
3206 case XML_ROLE_GROUP_CLOSE_OPT
:
3207 quant
= XML_CQUANT_OPT
;
3209 case XML_ROLE_GROUP_CLOSE_REP
:
3210 quant
= XML_CQUANT_REP
;
3212 case XML_ROLE_GROUP_CLOSE_PLUS
:
3213 quant
= XML_CQUANT_PLUS
;
3215 if (dtd
.in_eldecl
) {
3217 dtd
.scaffold
[dtd
.scaffIndex
[dtd
.scaffLevel
]].quant
= quant
;
3218 if (dtd
.scaffLevel
== 0) {
3219 if (elementDeclHandler
) {
3220 XML_Content
*model
= build_model(parser
);
3222 return XML_ERROR_NO_MEMORY
;
3224 elementDeclHandler(handlerArg
, declElementType
->name
, model
);
3227 dtd
.contentStringLen
= 0;
3231 /* End element declaration stuff */
3236 if (!reportProcessingInstruction(parser
, enc
, s
, next
))
3237 return XML_ERROR_NO_MEMORY
;
3239 case XML_TOK_COMMENT
:
3240 if (!reportComment(parser
, enc
, s
, next
))
3241 return XML_ERROR_NO_MEMORY
;
3246 if (defaultHandler
) {
3249 case XML_TOK_COMMENT
:
3251 case XML_TOK_XML_DECL
:
3253 case XML_TOK_IGNORE_SECT
:
3254 #endif /* XML_DTD */
3255 case XML_TOK_PARAM_ENTITY_REF
:
3259 if (role
!= XML_ROLE_IGNORE_SECT
)
3260 #endif /* XML_DTD */
3261 reportDefault(parser
, enc
, s
, next
);
3265 tok
= XmlPrologTok(enc
, s
, end
, &next
);
3271 enum XML_Error
epilogProcessor(XML_Parser parser
,
3274 const char **nextPtr
)
3276 processor
= epilogProcessor
;
3280 int tok
= XmlPrologTok(encoding
, s
, end
, &next
);
3283 case -XML_TOK_PROLOG_S
:
3284 if (defaultHandler
) {
3286 reportDefault(parser
, encoding
, s
, end
);
3292 return XML_ERROR_NONE
;
3293 case XML_TOK_PROLOG_S
:
3295 reportDefault(parser
, encoding
, s
, next
);
3298 if (!reportProcessingInstruction(parser
, encoding
, s
, next
))
3299 return XML_ERROR_NO_MEMORY
;
3301 case XML_TOK_COMMENT
:
3302 if (!reportComment(parser
, encoding
, s
, next
))
3303 return XML_ERROR_NO_MEMORY
;
3305 case XML_TOK_INVALID
:
3307 return XML_ERROR_INVALID_TOKEN
;
3308 case XML_TOK_PARTIAL
:
3311 return XML_ERROR_NONE
;
3313 return XML_ERROR_UNCLOSED_TOKEN
;
3314 case XML_TOK_PARTIAL_CHAR
:
3317 return XML_ERROR_NONE
;
3319 return XML_ERROR_PARTIAL_CHAR
;
3321 return XML_ERROR_JUNK_AFTER_DOC_ELEMENT
;
3323 eventPtr
= s
= next
;
3329 static enum XML_Error
3330 processInternalParamEntity(XML_Parser parser
, ENTITY
*entity
)
3332 const char *s
, *end
, *next
;
3334 enum XML_Error result
;
3335 OPEN_INTERNAL_ENTITY openEntity
;
3337 openEntity
.next
= openInternalEntities
;
3338 openInternalEntities
= &openEntity
;
3339 openEntity
.entity
= entity
;
3340 openEntity
.internalEventPtr
= 0;
3341 openEntity
.internalEventEndPtr
= 0;
3342 s
= (char *)entity
->textPtr
;
3343 end
= (char *)(entity
->textPtr
+ entity
->textLen
);
3344 tok
= XmlPrologTok(internalEncoding
, s
, end
, &next
);
3345 result
= doProlog(parser
, internalEncoding
, s
, end
, tok
, next
, 0);
3347 openInternalEntities
= openEntity
.next
;
3351 #endif /* XML_DTD */
3354 enum XML_Error
errorProcessor(XML_Parser parser
,
3357 const char **nextPtr
)
3362 static enum XML_Error
3363 storeAttributeValue(XML_Parser parser
, const ENCODING
*enc
, int isCdata
,
3364 const char *ptr
, const char *end
,
3367 enum XML_Error result
= appendAttributeValue(parser
, enc
, isCdata
, ptr
, end
, pool
);
3370 if (!isCdata
&& poolLength(pool
) && poolLastChar(pool
) == 0x20)
3372 if (!poolAppendChar(pool
, XML_T('\0')))
3373 return XML_ERROR_NO_MEMORY
;
3374 return XML_ERROR_NONE
;
3377 static enum XML_Error
3378 appendAttributeValue(XML_Parser parser
, const ENCODING
*enc
, int isCdata
,
3379 const char *ptr
, const char *end
,
3384 int tok
= XmlAttributeValueTok(enc
, ptr
, end
, &next
);
3387 return XML_ERROR_NONE
;
3388 case XML_TOK_INVALID
:
3389 if (enc
== encoding
)
3391 return XML_ERROR_INVALID_TOKEN
;
3392 case XML_TOK_PARTIAL
:
3393 if (enc
== encoding
)
3395 return XML_ERROR_INVALID_TOKEN
;
3396 case XML_TOK_CHAR_REF
:
3398 XML_Char buf
[XML_ENCODE_MAX
];
3400 int n
= XmlCharRefNumber(enc
, ptr
);
3402 if (enc
== encoding
)
3404 return XML_ERROR_BAD_CHAR_REF
;
3407 && n
== 0x20 /* space */
3408 && (poolLength(pool
) == 0 || poolLastChar(pool
) == 0x20))
3410 n
= XmlEncode(n
, (ICHAR
*)buf
);
3412 if (enc
== encoding
)
3414 return XML_ERROR_BAD_CHAR_REF
;
3416 for (i
= 0; i
< n
; i
++) {
3417 if (!poolAppendChar(pool
, buf
[i
]))
3418 return XML_ERROR_NO_MEMORY
;
3422 case XML_TOK_DATA_CHARS
:
3423 if (!poolAppend(pool
, enc
, ptr
, next
))
3424 return XML_ERROR_NO_MEMORY
;
3427 case XML_TOK_TRAILING_CR
:
3428 next
= ptr
+ enc
->minBytesPerChar
;
3430 case XML_TOK_ATTRIBUTE_VALUE_S
:
3431 case XML_TOK_DATA_NEWLINE
:
3432 if (!isCdata
&& (poolLength(pool
) == 0 || poolLastChar(pool
) == 0x20))
3434 if (!poolAppendChar(pool
, 0x20))
3435 return XML_ERROR_NO_MEMORY
;
3437 case XML_TOK_ENTITY_REF
:
3439 const XML_Char
*name
;
3441 XML_Char ch
= XmlPredefinedEntityName(enc
,
3442 ptr
+ enc
->minBytesPerChar
,
3443 next
- enc
->minBytesPerChar
);
3445 if (!poolAppendChar(pool
, ch
))
3446 return XML_ERROR_NO_MEMORY
;
3449 name
= poolStoreString(&temp2Pool
, enc
,
3450 ptr
+ enc
->minBytesPerChar
,
3451 next
- enc
->minBytesPerChar
);
3453 return XML_ERROR_NO_MEMORY
;
3454 entity
= (ENTITY
*)lookup(&dtd
.generalEntities
, name
, 0);
3455 poolDiscard(&temp2Pool
);
3458 if (enc
== encoding
)
3460 return XML_ERROR_UNDEFINED_ENTITY
;
3463 else if (entity
->open
) {
3464 if (enc
== encoding
)
3466 return XML_ERROR_RECURSIVE_ENTITY_REF
;
3468 else if (entity
->notation
) {
3469 if (enc
== encoding
)
3471 return XML_ERROR_BINARY_ENTITY_REF
;
3473 else if (!entity
->textPtr
) {
3474 if (enc
== encoding
)
3476 return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF
;
3479 enum XML_Error result
;
3480 const XML_Char
*textEnd
= entity
->textPtr
+ entity
->textLen
;
3482 result
= appendAttributeValue(parser
, internalEncoding
, isCdata
, (char *)entity
->textPtr
, (char *)textEnd
, pool
);
3490 if (enc
== encoding
)
3492 return XML_ERROR_UNEXPECTED_STATE
;
3500 enum XML_Error
storeEntityValue(XML_Parser parser
,
3501 const ENCODING
*enc
,
3502 const char *entityTextPtr
,
3503 const char *entityTextEnd
)
3505 STRING_POOL
*pool
= &(dtd
.pool
);
3508 int tok
= XmlEntityValueTok(enc
, entityTextPtr
, entityTextEnd
, &next
);
3510 case XML_TOK_PARAM_ENTITY_REF
:
3512 if (parentParser
|| enc
!= encoding
) {
3513 enum XML_Error result
;
3514 const XML_Char
*name
;
3516 name
= poolStoreString(&tempPool
, enc
,
3517 entityTextPtr
+ enc
->minBytesPerChar
,
3518 next
- enc
->minBytesPerChar
);
3520 return XML_ERROR_NO_MEMORY
;
3521 entity
= (ENTITY
*)lookup(&dtd
.paramEntities
, name
, 0);
3522 poolDiscard(&tempPool
);
3524 if (enc
== encoding
)
3525 eventPtr
= entityTextPtr
;
3526 return XML_ERROR_UNDEFINED_ENTITY
;
3529 if (enc
== encoding
)
3530 eventPtr
= entityTextPtr
;
3531 return XML_ERROR_RECURSIVE_ENTITY_REF
;
3533 if (entity
->systemId
) {
3534 if (enc
== encoding
)
3535 eventPtr
= entityTextPtr
;
3536 return XML_ERROR_PARAM_ENTITY_REF
;
3539 result
= storeEntityValue(parser
,
3541 (char *)entity
->textPtr
,
3542 (char *)(entity
->textPtr
+ entity
->textLen
));
3548 #endif /* XML_DTD */
3549 eventPtr
= entityTextPtr
;
3550 return XML_ERROR_SYNTAX
;
3552 return XML_ERROR_NONE
;
3553 case XML_TOK_ENTITY_REF
:
3554 case XML_TOK_DATA_CHARS
:
3555 if (!poolAppend(pool
, enc
, entityTextPtr
, next
))
3556 return XML_ERROR_NO_MEMORY
;
3558 case XML_TOK_TRAILING_CR
:
3559 next
= entityTextPtr
+ enc
->minBytesPerChar
;
3561 case XML_TOK_DATA_NEWLINE
:
3562 if (pool
->end
== pool
->ptr
&& !poolGrow(pool
))
3563 return XML_ERROR_NO_MEMORY
;
3564 *(pool
->ptr
)++ = 0xA;
3566 case XML_TOK_CHAR_REF
:
3568 XML_Char buf
[XML_ENCODE_MAX
];
3570 int n
= XmlCharRefNumber(enc
, entityTextPtr
);
3572 if (enc
== encoding
)
3573 eventPtr
= entityTextPtr
;
3574 return XML_ERROR_BAD_CHAR_REF
;
3576 n
= XmlEncode(n
, (ICHAR
*)buf
);
3578 if (enc
== encoding
)
3579 eventPtr
= entityTextPtr
;
3580 return XML_ERROR_BAD_CHAR_REF
;
3582 for (i
= 0; i
< n
; i
++) {
3583 if (pool
->end
== pool
->ptr
&& !poolGrow(pool
))
3584 return XML_ERROR_NO_MEMORY
;
3585 *(pool
->ptr
)++ = buf
[i
];
3589 case XML_TOK_PARTIAL
:
3590 if (enc
== encoding
)
3591 eventPtr
= entityTextPtr
;
3592 return XML_ERROR_INVALID_TOKEN
;
3593 case XML_TOK_INVALID
:
3594 if (enc
== encoding
)
3596 return XML_ERROR_INVALID_TOKEN
;
3598 if (enc
== encoding
)
3599 eventPtr
= entityTextPtr
;
3600 return XML_ERROR_UNEXPECTED_STATE
;
3602 entityTextPtr
= next
;
3608 normalizeLines(XML_Char
*s
)
3612 if (*s
== XML_T('\0'))
3631 reportProcessingInstruction(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
)
3633 const XML_Char
*target
;
3636 if (!processingInstructionHandler
) {
3638 reportDefault(parser
, enc
, start
, end
);
3641 start
+= enc
->minBytesPerChar
* 2;
3642 tem
= start
+ XmlNameLength(enc
, start
);
3643 target
= poolStoreString(&tempPool
, enc
, start
, tem
);
3646 poolFinish(&tempPool
);
3647 data
= poolStoreString(&tempPool
, enc
,
3649 end
- enc
->minBytesPerChar
*2);
3652 normalizeLines(data
);
3653 processingInstructionHandler(handlerArg
, target
, data
);
3654 poolClear(&tempPool
);
3659 reportComment(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
)
3662 if (!commentHandler
) {
3664 reportDefault(parser
, enc
, start
, end
);
3667 data
= poolStoreString(&tempPool
,
3669 start
+ enc
->minBytesPerChar
* 4,
3670 end
- enc
->minBytesPerChar
* 3);
3673 normalizeLines(data
);
3674 commentHandler(handlerArg
, data
);
3675 poolClear(&tempPool
);
3680 reportDefault(XML_Parser parser
, const ENCODING
*enc
, const char *s
, const char *end
)
3682 if (MUST_CONVERT(enc
, s
)) {
3683 const char **eventPP
;
3684 const char **eventEndPP
;
3685 if (enc
== encoding
) {
3686 eventPP
= &eventPtr
;
3687 eventEndPP
= &eventEndPtr
;
3690 eventPP
= &(openInternalEntities
->internalEventPtr
);
3691 eventEndPP
= &(openInternalEntities
->internalEventEndPtr
);
3694 ICHAR
*dataPtr
= (ICHAR
*)dataBuf
;
3695 XmlConvert(enc
, &s
, end
, &dataPtr
, (ICHAR
*)dataBufEnd
);
3697 defaultHandler(handlerArg
, dataBuf
, dataPtr
- (ICHAR
*)dataBuf
);
3702 defaultHandler(handlerArg
, (XML_Char
*)s
, (XML_Char
*)end
- (XML_Char
*)s
);
3707 defineAttribute(ELEMENT_TYPE
*type
, ATTRIBUTE_ID
*attId
, int isCdata
,
3708 int isId
, const XML_Char
*value
, XML_Parser parser
)
3710 DEFAULT_ATTRIBUTE
*att
;
3711 if (value
|| isId
) {
3712 /* The handling of default attributes gets messed up if we have
3713 a default which duplicates a non-default. */
3715 for (i
= 0; i
< type
->nDefaultAtts
; i
++)
3716 if (attId
== type
->defaultAtts
[i
].id
)
3718 if (isId
&& !type
->idAtt
&& !attId
->xmlns
)
3719 type
->idAtt
= attId
;
3721 if (type
->nDefaultAtts
== type
->allocDefaultAtts
) {
3722 if (type
->allocDefaultAtts
== 0) {
3723 type
->allocDefaultAtts
= 8;
3724 type
->defaultAtts
= MALLOC(type
->allocDefaultAtts
*sizeof(DEFAULT_ATTRIBUTE
));
3727 type
->allocDefaultAtts
*= 2;
3728 type
->defaultAtts
= REALLOC(type
->defaultAtts
,
3729 type
->allocDefaultAtts
*sizeof(DEFAULT_ATTRIBUTE
));
3731 if (!type
->defaultAtts
)
3734 att
= type
->defaultAtts
+ type
->nDefaultAtts
;
3737 att
->isCdata
= isCdata
;
3739 attId
->maybeTokenized
= 1;
3740 type
->nDefaultAtts
+= 1;
3744 static int setElementTypePrefix(XML_Parser parser
, ELEMENT_TYPE
*elementType
)
3746 const XML_Char
*name
;
3747 for (name
= elementType
->name
; *name
; name
++) {
3748 if (*name
== XML_T(':')) {
3751 for (s
= elementType
->name
; s
!= name
; s
++) {
3752 if (!poolAppendChar(&dtd
.pool
, *s
))
3755 if (!poolAppendChar(&dtd
.pool
, XML_T('\0')))
3757 prefix
= (PREFIX
*)lookup(&dtd
.prefixes
, poolStart(&dtd
.pool
), sizeof(PREFIX
));
3760 if (prefix
->name
== poolStart(&dtd
.pool
))
3761 poolFinish(&dtd
.pool
);
3763 poolDiscard(&dtd
.pool
);
3764 elementType
->prefix
= prefix
;
3771 static ATTRIBUTE_ID
*
3772 getAttributeId(XML_Parser parser
, const ENCODING
*enc
, const char *start
, const char *end
)
3775 const XML_Char
*name
;
3776 if (!poolAppendChar(&dtd
.pool
, XML_T('\0')))
3778 name
= poolStoreString(&dtd
.pool
, enc
, start
, end
);
3782 id
= (ATTRIBUTE_ID
*)lookup(&dtd
.attributeIds
, name
, sizeof(ATTRIBUTE_ID
));
3785 if (id
->name
!= name
)
3786 poolDiscard(&dtd
.pool
);
3788 poolFinish(&dtd
.pool
);
3791 else if (name
[0] == 'x'
3796 && (name
[5] == XML_T('\0') || name
[5] == XML_T(':'))) {
3797 if (name
[5] == '\0')
3798 id
->prefix
= &dtd
.defaultPrefix
;
3800 id
->prefix
= (PREFIX
*)lookup(&dtd
.prefixes
, name
+ 6, sizeof(PREFIX
));
3805 for (i
= 0; name
[i
]; i
++) {
3806 if (name
[i
] == XML_T(':')) {
3808 for (j
= 0; j
< i
; j
++) {
3809 if (!poolAppendChar(&dtd
.pool
, name
[j
]))
3812 if (!poolAppendChar(&dtd
.pool
, XML_T('\0')))
3814 id
->prefix
= (PREFIX
*)lookup(&dtd
.prefixes
, poolStart(&dtd
.pool
), sizeof(PREFIX
));
3815 if (id
->prefix
->name
== poolStart(&dtd
.pool
))
3816 poolFinish(&dtd
.pool
);
3818 poolDiscard(&dtd
.pool
);
3827 #define CONTEXT_SEP XML_T('\f')
3830 const XML_Char
*getContext(XML_Parser parser
)
3832 HASH_TABLE_ITER iter
;
3835 if (dtd
.defaultPrefix
.binding
) {
3838 if (!poolAppendChar(&tempPool
, XML_T('=')))
3840 len
= dtd
.defaultPrefix
.binding
->uriLen
;
3841 if (namespaceSeparator
!= XML_T('\0'))
3843 for (i
= 0; i
< len
; i
++)
3844 if (!poolAppendChar(&tempPool
, dtd
.defaultPrefix
.binding
->uri
[i
]))
3849 hashTableIterInit(&iter
, &(dtd
.prefixes
));
3854 PREFIX
*prefix
= (PREFIX
*)hashTableIterNext(&iter
);
3857 if (!prefix
->binding
)
3859 if (needSep
&& !poolAppendChar(&tempPool
, CONTEXT_SEP
))
3861 for (s
= prefix
->name
; *s
; s
++)
3862 if (!poolAppendChar(&tempPool
, *s
))
3864 if (!poolAppendChar(&tempPool
, XML_T('=')))
3866 len
= prefix
->binding
->uriLen
;
3867 if (namespaceSeparator
!= XML_T('\0'))
3869 for (i
= 0; i
< len
; i
++)
3870 if (!poolAppendChar(&tempPool
, prefix
->binding
->uri
[i
]))
3876 hashTableIterInit(&iter
, &(dtd
.generalEntities
));
3879 ENTITY
*e
= (ENTITY
*)hashTableIterNext(&iter
);
3884 if (needSep
&& !poolAppendChar(&tempPool
, CONTEXT_SEP
))
3886 for (s
= e
->name
; *s
; s
++)
3887 if (!poolAppendChar(&tempPool
, *s
))
3892 if (!poolAppendChar(&tempPool
, XML_T('\0')))
3894 return tempPool
.start
;
3898 int setContext(XML_Parser parser
, const XML_Char
*context
)
3900 const XML_Char
*s
= context
;
3902 while (*context
!= XML_T('\0')) {
3903 if (*s
== CONTEXT_SEP
|| *s
== XML_T('\0')) {
3905 if (!poolAppendChar(&tempPool
, XML_T('\0')))
3907 e
= (ENTITY
*)lookup(&dtd
.generalEntities
, poolStart(&tempPool
), 0);
3910 if (*s
!= XML_T('\0'))
3913 poolDiscard(&tempPool
);
3915 else if (*s
== '=') {
3917 if (poolLength(&tempPool
) == 0)
3918 prefix
= &dtd
.defaultPrefix
;
3920 if (!poolAppendChar(&tempPool
, XML_T('\0')))
3922 prefix
= (PREFIX
*)lookup(&dtd
.prefixes
, poolStart(&tempPool
), sizeof(PREFIX
));
3925 if (prefix
->name
== poolStart(&tempPool
)) {
3926 prefix
->name
= poolCopyString(&dtd
.pool
, prefix
->name
);
3930 poolDiscard(&tempPool
);
3932 for (context
= s
+ 1; *context
!= CONTEXT_SEP
&& *context
!= XML_T('\0'); context
++)
3933 if (!poolAppendChar(&tempPool
, *context
))
3935 if (!poolAppendChar(&tempPool
, XML_T('\0')))
3937 if (!addBinding(parser
, prefix
, 0, poolStart(&tempPool
), &inheritedBindings
))
3939 poolDiscard(&tempPool
);
3940 if (*context
!= XML_T('\0'))
3945 if (!poolAppendChar(&tempPool
, *s
))
3955 void normalizePublicId(XML_Char
*publicId
)
3957 XML_Char
*p
= publicId
;
3959 for (s
= publicId
; *s
; s
++) {
3964 if (p
!= publicId
&& p
[-1] != 0x20)
3971 if (p
!= publicId
&& p
[-1] == 0x20)
3976 static int dtdInit(DTD
*p
, XML_Parser parser
)
3978 XML_Memory_Handling_Suite
*ms
= &((Parser
*) parser
)->m_mem
;
3979 poolInit(&(p
->pool
), ms
);
3980 hashTableInit(&(p
->generalEntities
), ms
);
3981 hashTableInit(&(p
->elementTypes
), ms
);
3982 hashTableInit(&(p
->attributeIds
), ms
);
3983 hashTableInit(&(p
->prefixes
), ms
);
3987 hashTableInit(&(p
->paramEntities
), ms
);
3988 #endif /* XML_DTD */
3989 p
->defaultPrefix
.name
= 0;
3990 p
->defaultPrefix
.binding
= 0;
3996 p
->contentStringLen
= 0;
4005 static void dtdSwap(DTD
*p1
, DTD
*p2
)
4008 memcpy(&tem
, p1
, sizeof(DTD
));
4009 memcpy(p1
, p2
, sizeof(DTD
));
4010 memcpy(p2
, &tem
, sizeof(DTD
));
4013 #endif /* XML_DTD */
4015 static void dtdDestroy(DTD
*p
, XML_Parser parser
)
4017 HASH_TABLE_ITER iter
;
4018 hashTableIterInit(&iter
, &(p
->elementTypes
));
4020 ELEMENT_TYPE
*e
= (ELEMENT_TYPE
*)hashTableIterNext(&iter
);
4023 if (e
->allocDefaultAtts
!= 0)
4024 FREE(e
->defaultAtts
);
4026 hashTableDestroy(&(p
->generalEntities
));
4028 hashTableDestroy(&(p
->paramEntities
));
4029 #endif /* XML_DTD */
4030 hashTableDestroy(&(p
->elementTypes
));
4031 hashTableDestroy(&(p
->attributeIds
));
4032 hashTableDestroy(&(p
->prefixes
));
4033 poolDestroy(&(p
->pool
));
4035 FREE(p
->scaffIndex
);
4040 /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise.
4041 The new DTD has already been initialized. */
4043 static int dtdCopy(DTD
*newDtd
, const DTD
*oldDtd
, XML_Parser parser
)
4045 HASH_TABLE_ITER iter
;
4047 /* Copy the prefix table. */
4049 hashTableIterInit(&iter
, &(oldDtd
->prefixes
));
4051 const XML_Char
*name
;
4052 const PREFIX
*oldP
= (PREFIX
*)hashTableIterNext(&iter
);
4055 name
= poolCopyString(&(newDtd
->pool
), oldP
->name
);
4058 if (!lookup(&(newDtd
->prefixes
), name
, sizeof(PREFIX
)))
4062 hashTableIterInit(&iter
, &(oldDtd
->attributeIds
));
4064 /* Copy the attribute id table. */
4068 const XML_Char
*name
;
4069 const ATTRIBUTE_ID
*oldA
= (ATTRIBUTE_ID
*)hashTableIterNext(&iter
);
4073 /* Remember to allocate the scratch byte before the name. */
4074 if (!poolAppendChar(&(newDtd
->pool
), XML_T('\0')))
4076 name
= poolCopyString(&(newDtd
->pool
), oldA
->name
);
4080 newA
= (ATTRIBUTE_ID
*)lookup(&(newDtd
->attributeIds
), name
, sizeof(ATTRIBUTE_ID
));
4083 newA
->maybeTokenized
= oldA
->maybeTokenized
;
4085 newA
->xmlns
= oldA
->xmlns
;
4086 if (oldA
->prefix
== &oldDtd
->defaultPrefix
)
4087 newA
->prefix
= &newDtd
->defaultPrefix
;
4089 newA
->prefix
= (PREFIX
*)lookup(&(newDtd
->prefixes
), oldA
->prefix
->name
, 0);
4093 /* Copy the element type table. */
4095 hashTableIterInit(&iter
, &(oldDtd
->elementTypes
));
4100 const XML_Char
*name
;
4101 const ELEMENT_TYPE
*oldE
= (ELEMENT_TYPE
*)hashTableIterNext(&iter
);
4104 name
= poolCopyString(&(newDtd
->pool
), oldE
->name
);
4107 newE
= (ELEMENT_TYPE
*)lookup(&(newDtd
->elementTypes
), name
, sizeof(ELEMENT_TYPE
));
4110 if (oldE
->nDefaultAtts
) {
4111 newE
->defaultAtts
= (DEFAULT_ATTRIBUTE
*)MALLOC(oldE
->nDefaultAtts
* sizeof(DEFAULT_ATTRIBUTE
));
4112 if (!newE
->defaultAtts
)
4116 newE
->idAtt
= (ATTRIBUTE_ID
*)lookup(&(newDtd
->attributeIds
), oldE
->idAtt
->name
, 0);
4117 newE
->allocDefaultAtts
= newE
->nDefaultAtts
= oldE
->nDefaultAtts
;
4119 newE
->prefix
= (PREFIX
*)lookup(&(newDtd
->prefixes
), oldE
->prefix
->name
, 0);
4120 for (i
= 0; i
< newE
->nDefaultAtts
; i
++) {
4121 newE
->defaultAtts
[i
].id
= (ATTRIBUTE_ID
*)lookup(&(newDtd
->attributeIds
), oldE
->defaultAtts
[i
].id
->name
, 0);
4122 newE
->defaultAtts
[i
].isCdata
= oldE
->defaultAtts
[i
].isCdata
;
4123 if (oldE
->defaultAtts
[i
].value
) {
4124 newE
->defaultAtts
[i
].value
= poolCopyString(&(newDtd
->pool
), oldE
->defaultAtts
[i
].value
);
4125 if (!newE
->defaultAtts
[i
].value
)
4129 newE
->defaultAtts
[i
].value
= 0;
4133 /* Copy the entity tables. */
4134 if (!copyEntityTable(&(newDtd
->generalEntities
),
4136 &(oldDtd
->generalEntities
), parser
))
4140 if (!copyEntityTable(&(newDtd
->paramEntities
),
4142 &(oldDtd
->paramEntities
), parser
))
4144 #endif /* XML_DTD */
4146 newDtd
->complete
= oldDtd
->complete
;
4147 newDtd
->standalone
= oldDtd
->standalone
;
4149 /* Don't want deep copying for scaffolding */
4150 newDtd
->in_eldecl
= oldDtd
->in_eldecl
;
4151 newDtd
->scaffold
= oldDtd
->scaffold
;
4152 newDtd
->contentStringLen
= oldDtd
->contentStringLen
;
4153 newDtd
->scaffSize
= oldDtd
->scaffSize
;
4154 newDtd
->scaffLevel
= oldDtd
->scaffLevel
;
4155 newDtd
->scaffIndex
= oldDtd
->scaffIndex
;
4160 static int copyEntityTable(HASH_TABLE
*newTable
,
4161 STRING_POOL
*newPool
,
4162 const HASH_TABLE
*oldTable
,
4165 HASH_TABLE_ITER iter
;
4166 const XML_Char
*cachedOldBase
= 0;
4167 const XML_Char
*cachedNewBase
= 0;
4169 hashTableIterInit(&iter
, oldTable
);
4173 const XML_Char
*name
;
4174 const ENTITY
*oldE
= (ENTITY
*)hashTableIterNext(&iter
);
4177 name
= poolCopyString(newPool
, oldE
->name
);
4180 newE
= (ENTITY
*)lookup(newTable
, name
, sizeof(ENTITY
));
4183 if (oldE
->systemId
) {
4184 const XML_Char
*tem
= poolCopyString(newPool
, oldE
->systemId
);
4187 newE
->systemId
= tem
;
4189 if (oldE
->base
== cachedOldBase
)
4190 newE
->base
= cachedNewBase
;
4192 cachedOldBase
= oldE
->base
;
4193 tem
= poolCopyString(newPool
, cachedOldBase
);
4196 cachedNewBase
= newE
->base
= tem
;
4201 const XML_Char
*tem
= poolCopyStringN(newPool
, oldE
->textPtr
, oldE
->textLen
);
4204 newE
->textPtr
= tem
;
4205 newE
->textLen
= oldE
->textLen
;
4207 if (oldE
->notation
) {
4208 const XML_Char
*tem
= poolCopyString(newPool
, oldE
->notation
);
4211 newE
->notation
= tem
;
4217 #define INIT_SIZE 64
4220 int keyeq(KEY s1
, KEY s2
)
4222 for (; *s1
== *s2
; s1
++, s2
++)
4229 unsigned long hash(KEY s
)
4231 unsigned long h
= 0;
4233 h
= (h
<< 5) + h
+ (unsigned char)*s
++;
4238 NAMED
*lookup(HASH_TABLE
*table
, KEY name
, size_t createSize
)
4241 if (table
->size
== 0) {
4246 tsize
= INIT_SIZE
* sizeof(NAMED
*);
4247 table
->v
= table
->mem
->malloc_fcn(tsize
);
4250 memset(table
->v
, 0, tsize
);
4251 table
->size
= INIT_SIZE
;
4252 table
->usedLim
= INIT_SIZE
/ 2;
4253 i
= hash(name
) & (table
->size
- 1);
4256 unsigned long h
= hash(name
);
4257 for (i
= h
& (table
->size
- 1);
4259 i
== 0 ? i
= table
->size
- 1 : --i
) {
4260 if (keyeq(name
, table
->v
[i
]->name
))
4265 if (table
->used
== table
->usedLim
) {
4266 /* check for overflow */
4267 size_t newSize
= table
->size
* 2;
4268 size_t tsize
= newSize
* sizeof(NAMED
*);
4269 NAMED
**newV
= table
->mem
->malloc_fcn(tsize
);
4272 memset(newV
, 0, tsize
);
4273 for (i
= 0; i
< table
->size
; i
++)
4276 for (j
= hash(table
->v
[i
]->name
) & (newSize
- 1);
4278 j
== 0 ? j
= newSize
- 1 : --j
)
4280 newV
[j
] = table
->v
[i
];
4282 table
->mem
->free_fcn(table
->v
);
4284 table
->size
= newSize
;
4285 table
->usedLim
= newSize
/2;
4286 for (i
= h
& (table
->size
- 1);
4288 i
== 0 ? i
= table
->size
- 1 : --i
)
4292 table
->v
[i
] = table
->mem
->malloc_fcn(createSize
);
4295 memset(table
->v
[i
], 0, createSize
);
4296 table
->v
[i
]->name
= name
;
4302 void hashTableDestroy(HASH_TABLE
*table
)
4305 for (i
= 0; i
< table
->size
; i
++) {
4306 NAMED
*p
= table
->v
[i
];
4308 table
->mem
->free_fcn(p
);
4311 table
->mem
->free_fcn(table
->v
);
4315 void hashTableInit(HASH_TABLE
*p
, XML_Memory_Handling_Suite
*ms
)
4325 void hashTableIterInit(HASH_TABLE_ITER
*iter
, const HASH_TABLE
*table
)
4328 iter
->end
= iter
->p
+ table
->size
;
4332 NAMED
*hashTableIterNext(HASH_TABLE_ITER
*iter
)
4334 while (iter
->p
!= iter
->end
) {
4335 NAMED
*tem
= *(iter
->p
)++;
4344 void poolInit(STRING_POOL
*pool
, XML_Memory_Handling_Suite
*ms
)
4347 pool
->freeBlocks
= 0;
4355 void poolClear(STRING_POOL
*pool
)
4357 if (!pool
->freeBlocks
)
4358 pool
->freeBlocks
= pool
->blocks
;
4360 BLOCK
*p
= pool
->blocks
;
4362 BLOCK
*tem
= p
->next
;
4363 p
->next
= pool
->freeBlocks
;
4364 pool
->freeBlocks
= p
;
4375 void poolDestroy(STRING_POOL
*pool
)
4377 BLOCK
*p
= pool
->blocks
;
4379 BLOCK
*tem
= p
->next
;
4380 pool
->mem
->free_fcn(p
);
4384 p
= pool
->freeBlocks
;
4386 BLOCK
*tem
= p
->next
;
4387 pool
->mem
->free_fcn(p
);
4390 pool
->freeBlocks
= 0;
4397 XML_Char
*poolAppend(STRING_POOL
*pool
, const ENCODING
*enc
,
4398 const char *ptr
, const char *end
)
4400 if (!pool
->ptr
&& !poolGrow(pool
))
4403 XmlConvert(enc
, &ptr
, end
, (ICHAR
**)&(pool
->ptr
), (ICHAR
*)pool
->end
);
4406 if (!poolGrow(pool
))
4412 static const XML_Char
*poolCopyString(STRING_POOL
*pool
, const XML_Char
*s
)
4415 if (!poolAppendChar(pool
, *s
))
4423 static const XML_Char
*poolCopyStringN(STRING_POOL
*pool
, const XML_Char
*s
, int n
)
4425 if (!pool
->ptr
&& !poolGrow(pool
))
4427 for (; n
> 0; --n
, s
++) {
4428 if (!poolAppendChar(pool
, *s
))
4438 const XML_Char
*poolAppendString(STRING_POOL
*pool
, const XML_Char
*s
)
4441 if (!poolAppendChar(pool
, *s
))
4446 } /* End poolAppendString */
4449 XML_Char
*poolStoreString(STRING_POOL
*pool
, const ENCODING
*enc
,
4450 const char *ptr
, const char *end
)
4452 if (!poolAppend(pool
, enc
, ptr
, end
))
4454 if (pool
->ptr
== pool
->end
&& !poolGrow(pool
))
4461 int poolGrow(STRING_POOL
*pool
)
4463 if (pool
->freeBlocks
) {
4464 if (pool
->start
== 0) {
4465 pool
->blocks
= pool
->freeBlocks
;
4466 pool
->freeBlocks
= pool
->freeBlocks
->next
;
4467 pool
->blocks
->next
= 0;
4468 pool
->start
= pool
->blocks
->s
;
4469 pool
->end
= pool
->start
+ pool
->blocks
->size
;
4470 pool
->ptr
= pool
->start
;
4473 if (pool
->end
- pool
->start
< pool
->freeBlocks
->size
) {
4474 BLOCK
*tem
= pool
->freeBlocks
->next
;
4475 pool
->freeBlocks
->next
= pool
->blocks
;
4476 pool
->blocks
= pool
->freeBlocks
;
4477 pool
->freeBlocks
= tem
;
4478 memcpy(pool
->blocks
->s
, pool
->start
, (pool
->end
- pool
->start
) * sizeof(XML_Char
));
4479 pool
->ptr
= pool
->blocks
->s
+ (pool
->ptr
- pool
->start
);
4480 pool
->start
= pool
->blocks
->s
;
4481 pool
->end
= pool
->start
+ pool
->blocks
->size
;
4485 if (pool
->blocks
&& pool
->start
== pool
->blocks
->s
) {
4486 int blockSize
= (pool
->end
- pool
->start
)*2;
4487 pool
->blocks
= pool
->mem
->realloc_fcn(pool
->blocks
, offsetof(BLOCK
, s
) + blockSize
* sizeof(XML_Char
));
4490 pool
->blocks
->size
= blockSize
;
4491 pool
->ptr
= pool
->blocks
->s
+ (pool
->ptr
- pool
->start
);
4492 pool
->start
= pool
->blocks
->s
;
4493 pool
->end
= pool
->start
+ blockSize
;
4497 int blockSize
= pool
->end
- pool
->start
;
4498 if (blockSize
< INIT_BLOCK_SIZE
)
4499 blockSize
= INIT_BLOCK_SIZE
;
4502 tem
= pool
->mem
->malloc_fcn(offsetof(BLOCK
, s
) + blockSize
* sizeof(XML_Char
));
4505 tem
->size
= blockSize
;
4506 tem
->next
= pool
->blocks
;
4508 if (pool
->ptr
!= pool
->start
)
4509 memcpy(tem
->s
, pool
->start
, (pool
->ptr
- pool
->start
) * sizeof(XML_Char
));
4510 pool
->ptr
= tem
->s
+ (pool
->ptr
- pool
->start
);
4511 pool
->start
= tem
->s
;
4512 pool
->end
= tem
->s
+ blockSize
;
4518 nextScaffoldPart(XML_Parser parser
)
4520 CONTENT_SCAFFOLD
* me
;
4523 if (! dtd
.scaffIndex
) {
4524 dtd
.scaffIndex
= MALLOC(groupSize
* sizeof(int));
4525 if (! dtd
.scaffIndex
)
4527 dtd
.scaffIndex
[0] = 0;
4530 if (dtd
.scaffCount
>= dtd
.scaffSize
) {
4533 dtd
.scaffold
= (CONTENT_SCAFFOLD
*) REALLOC(dtd
.scaffold
,
4534 dtd
.scaffSize
* sizeof(CONTENT_SCAFFOLD
));
4538 dtd
.scaffold
= (CONTENT_SCAFFOLD
*) MALLOC(dtd
.scaffSize
* sizeof(CONTENT_SCAFFOLD
));
4543 next
= dtd
.scaffCount
++;
4544 me
= &dtd
.scaffold
[next
];
4545 if (dtd
.scaffLevel
) {
4546 CONTENT_SCAFFOLD
*parent
= &dtd
.scaffold
[dtd
.scaffIndex
[dtd
.scaffLevel
- 1]];
4547 if (parent
->lastchild
) {
4548 dtd
.scaffold
[parent
->lastchild
].nextsib
= next
;
4550 if (! parent
->childcnt
)
4551 parent
->firstchild
= next
;
4552 parent
->lastchild
= next
;
4555 me
->firstchild
= me
->lastchild
= me
->childcnt
= me
->nextsib
= 0;
4557 } /* End nextScaffoldPart */
4560 build_node (XML_Parser parser
,
4563 XML_Content
**contpos
,
4566 dest
->type
= dtd
.scaffold
[src_node
].type
;
4567 dest
->quant
= dtd
.scaffold
[src_node
].quant
;
4568 if (dest
->type
== XML_CTYPE_NAME
) {
4570 dest
->name
= *strpos
;
4571 src
= dtd
.scaffold
[src_node
].name
;
4573 *(*strpos
)++ = *src
;
4578 dest
->numchildren
= 0;
4584 dest
->numchildren
= dtd
.scaffold
[src_node
].childcnt
;
4585 dest
->children
= *contpos
;
4586 *contpos
+= dest
->numchildren
;
4587 for (i
= 0, cn
= dtd
.scaffold
[src_node
].firstchild
;
4588 i
< dest
->numchildren
;
4589 i
++, cn
= dtd
.scaffold
[cn
].nextsib
) {
4590 build_node(parser
, cn
, &(dest
->children
[i
]), contpos
, strpos
);
4594 } /* End build_node */
4596 static XML_Content
*
4597 build_model (XML_Parser parser
)
4602 int allocsize
= dtd
.scaffCount
* sizeof(XML_Content
) + dtd
.contentStringLen
;
4604 ret
= MALLOC(allocsize
);
4608 str
= (char *) (&ret
[dtd
.scaffCount
]);
4611 build_node(parser
, 0, ret
, &cpos
, &str
);
4613 } /* End build_model */
4615 static ELEMENT_TYPE
*
4616 getElementType(XML_Parser parser
,
4617 const ENCODING
*enc
,
4621 const XML_Char
*name
= poolStoreString(&dtd
.pool
, enc
, ptr
, end
);
4626 ret
= (ELEMENT_TYPE
*) lookup(&dtd
.elementTypes
, name
, sizeof(ELEMENT_TYPE
));
4629 if (ret
->name
!= name
)
4630 poolDiscard(&dtd
.pool
);
4632 poolFinish(&dtd
.pool
);
4633 if (!setElementTypePrefix(parser
, ret
))
4637 } /* End getElementType */