| OLD | NEW |
| 1 /* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd | 1 /* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd |
| 2 See the file COPYING for copying permission. | 2 See the file COPYING for copying permission. |
| 3 */ | 3 */ |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <string.h> /* memset(), memcpy() */ | 6 #include <string.h> /* memset(), memcpy() */ |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #include <limits.h> /* UINT_MAX */ |
| 9 #include <time.h> /* time() */ |
| 8 | 10 |
| 9 #define XML_BUILDING_EXPAT 1 | 11 #define XML_BUILDING_EXPAT 1 |
| 10 | 12 |
| 11 #ifdef COMPILED_FROM_DSP | 13 #ifdef COMPILED_FROM_DSP |
| 12 #include "winconfig.h" | 14 #include "winconfig.h" |
| 13 #elif defined(MACOS_CLASSIC) | 15 #elif defined(MACOS_CLASSIC) |
| 14 #include "macconfig.h" | 16 #include "macconfig.h" |
| 15 #elif defined(__amigaos4__) | 17 #elif defined(__amigaos__) |
| 16 #include "amigaconfig.h" | 18 #include "amigaconfig.h" |
| 17 #elif defined(__WATCOMC__) | 19 #elif defined(__WATCOMC__) |
| 18 #include "watcomconfig.h" | 20 #include "watcomconfig.h" |
| 19 #elif defined(HAVE_EXPAT_CONFIG_H) | 21 #elif defined(HAVE_EXPAT_CONFIG_H) |
| 20 #include <expat_config.h> | 22 #include <expat_config.h> |
| 21 #endif /* ndef COMPILED_FROM_DSP */ | 23 #endif /* ndef COMPILED_FROM_DSP */ |
| 22 | 24 |
| 23 #include "ascii.h" | 25 #include "ascii.h" |
| 24 #include "expat.h" | 26 #include "expat.h" |
| 25 | 27 |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 static Processor internalEntityProcessor; | 322 static Processor internalEntityProcessor; |
| 321 | 323 |
| 322 static enum XML_Error | 324 static enum XML_Error |
| 323 handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); | 325 handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); |
| 324 static enum XML_Error | 326 static enum XML_Error |
| 325 processXmlDecl(XML_Parser parser, int isGeneralTextEntity, | 327 processXmlDecl(XML_Parser parser, int isGeneralTextEntity, |
| 326 const char *s, const char *next); | 328 const char *s, const char *next); |
| 327 static enum XML_Error | 329 static enum XML_Error |
| 328 initializeEncoding(XML_Parser parser); | 330 initializeEncoding(XML_Parser parser); |
| 329 static enum XML_Error | 331 static enum XML_Error |
| 330 doProlog(XML_Parser parser, const ENCODING *enc, const char *s, | 332 doProlog(XML_Parser parser, const ENCODING *enc, const char *s, |
| 331 const char *end, int tok, const char *next, const char **nextPtr, | 333 const char *end, int tok, const char *next, const char **nextPtr, |
| 332 XML_Bool haveMore); | 334 XML_Bool haveMore); |
| 333 static enum XML_Error | 335 static enum XML_Error |
| 334 processInternalEntity(XML_Parser parser, ENTITY *entity, | 336 processInternalEntity(XML_Parser parser, ENTITY *entity, |
| 335 XML_Bool betweenDecl); | 337 XML_Bool betweenDecl); |
| 336 static enum XML_Error | 338 static enum XML_Error |
| 337 doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, | 339 doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, |
| 338 const char *start, const char *end, const char **endPtr, | 340 const char *start, const char *end, const char **endPtr, |
| 339 XML_Bool haveMore); | 341 XML_Bool haveMore); |
| 340 static enum XML_Error | 342 static enum XML_Error |
| 341 doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, | 343 doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, |
| 342 const char *end, const char **nextPtr, XML_Bool haveMore); | 344 const char *end, const char **nextPtr, XML_Bool haveMore); |
| 343 #ifdef XML_DTD | 345 #ifdef XML_DTD |
| 344 static enum XML_Error | 346 static enum XML_Error |
| 345 doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, | 347 doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, |
| 346 const char *end, const char **nextPtr, XML_Bool haveMore); | 348 const char *end, const char **nextPtr, XML_Bool haveMore); |
| 347 #endif /* XML_DTD */ | 349 #endif /* XML_DTD */ |
| 348 | 350 |
| 349 static enum XML_Error | 351 static enum XML_Error |
| 350 storeAtts(XML_Parser parser, const ENCODING *, const char *s, | 352 storeAtts(XML_Parser parser, const ENCODING *, const char *s, |
| 351 TAG_NAME *tagNamePtr, BINDING **bindingsPtr); | 353 TAG_NAME *tagNamePtr, BINDING **bindingsPtr); |
| 352 static enum XML_Error | 354 static enum XML_Error |
| 353 addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, | 355 addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, |
| 354 const XML_Char *uri, BINDING **bindingsPtr); | 356 const XML_Char *uri, BINDING **bindingsPtr); |
| 355 static int | 357 static int |
| 356 defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, | 358 defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, |
| 357 XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); | 359 XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); |
| 358 static enum XML_Error | 360 static enum XML_Error |
| 359 storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, | 361 storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, |
| 360 const char *, const char *, STRING_POOL *); | 362 const char *, const char *, STRING_POOL *); |
| 361 static enum XML_Error | 363 static enum XML_Error |
| 362 appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, | 364 appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, |
| 363 const char *, const char *, STRING_POOL *); | 365 const char *, const char *, STRING_POOL *); |
| 364 static ATTRIBUTE_ID * | 366 static ATTRIBUTE_ID * |
| 365 getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, | 367 getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, |
| 366 const char *end); | 368 const char *end); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 384 setContext(XML_Parser parser, const XML_Char *context); | 386 setContext(XML_Parser parser, const XML_Char *context); |
| 385 | 387 |
| 386 static void FASTCALL normalizePublicId(XML_Char *s); | 388 static void FASTCALL normalizePublicId(XML_Char *s); |
| 387 | 389 |
| 388 static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); | 390 static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); |
| 389 /* do not call if parentParser != NULL */ | 391 /* do not call if parentParser != NULL */ |
| 390 static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); | 392 static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); |
| 391 static void | 393 static void |
| 392 dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); | 394 dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); |
| 393 static int | 395 static int |
| 394 dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); | 396 dtdCopy(XML_Parser oldParser, |
| 397 DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); |
| 395 static int | 398 static int |
| 396 copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); | 399 copyEntityTable(XML_Parser oldParser, |
| 397 | 400 HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); |
| 398 static NAMED * | 401 static NAMED * |
| 399 lookup(HASH_TABLE *table, KEY name, size_t createSize); | 402 lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); |
| 400 static void FASTCALL | 403 static void FASTCALL |
| 401 hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); | 404 hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); |
| 402 static void FASTCALL hashTableClear(HASH_TABLE *); | 405 static void FASTCALL hashTableClear(HASH_TABLE *); |
| 403 static void FASTCALL hashTableDestroy(HASH_TABLE *); | 406 static void FASTCALL hashTableDestroy(HASH_TABLE *); |
| 404 static void FASTCALL | 407 static void FASTCALL |
| 405 hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); | 408 hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); |
| 406 static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); | 409 static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); |
| 407 | 410 |
| 408 static void FASTCALL | 411 static void FASTCALL |
| 409 poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); | 412 poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 422 poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); | 425 poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); |
| 423 static const XML_Char * FASTCALL | 426 static const XML_Char * FASTCALL |
| 424 poolAppendString(STRING_POOL *pool, const XML_Char *s); | 427 poolAppendString(STRING_POOL *pool, const XML_Char *s); |
| 425 | 428 |
| 426 static int FASTCALL nextScaffoldPart(XML_Parser parser); | 429 static int FASTCALL nextScaffoldPart(XML_Parser parser); |
| 427 static XML_Content * build_model(XML_Parser parser); | 430 static XML_Content * build_model(XML_Parser parser); |
| 428 static ELEMENT_TYPE * | 431 static ELEMENT_TYPE * |
| 429 getElementType(XML_Parser parser, const ENCODING *enc, | 432 getElementType(XML_Parser parser, const ENCODING *enc, |
| 430 const char *ptr, const char *end); | 433 const char *ptr, const char *end); |
| 431 | 434 |
| 435 static unsigned long generate_hash_secret_salt(void); |
| 436 static XML_Bool startParsing(XML_Parser parser); |
| 437 |
| 432 static XML_Parser | 438 static XML_Parser |
| 433 parserCreate(const XML_Char *encodingName, | 439 parserCreate(const XML_Char *encodingName, |
| 434 const XML_Memory_Handling_Suite *memsuite, | 440 const XML_Memory_Handling_Suite *memsuite, |
| 435 const XML_Char *nameSep, | 441 const XML_Char *nameSep, |
| 436 DTD *dtd); | 442 DTD *dtd); |
| 443 |
| 437 static void | 444 static void |
| 438 parserInit(XML_Parser parser, const XML_Char *encodingName); | 445 parserInit(XML_Parser parser, const XML_Char *encodingName); |
| 439 | 446 |
| 440 #define poolStart(pool) ((pool)->start) | 447 #define poolStart(pool) ((pool)->start) |
| 441 #define poolEnd(pool) ((pool)->ptr) | 448 #define poolEnd(pool) ((pool)->ptr) |
| 442 #define poolLength(pool) ((pool)->ptr - (pool)->start) | 449 #define poolLength(pool) ((pool)->ptr - (pool)->start) |
| 443 #define poolChop(pool) ((void)--(pool->ptr)) | 450 #define poolChop(pool) ((void)--(pool->ptr)) |
| 444 #define poolLastChar(pool) (((pool)->ptr)[-1]) | 451 #define poolLastChar(pool) (((pool)->ptr)[-1]) |
| 445 #define poolDiscard(pool) ((pool)->ptr = (pool)->start) | 452 #define poolDiscard(pool) ((pool)->ptr = (pool)->start) |
| 446 #define poolFinish(pool) ((pool)->start = (pool)->ptr) | 453 #define poolFinish(pool) ((pool)->start = (pool)->ptr) |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 TAG *m_freeTagList; | 533 TAG *m_freeTagList; |
| 527 BINDING *m_inheritedBindings; | 534 BINDING *m_inheritedBindings; |
| 528 BINDING *m_freeBindingList; | 535 BINDING *m_freeBindingList; |
| 529 int m_attsSize; | 536 int m_attsSize; |
| 530 int m_nSpecifiedAtts; | 537 int m_nSpecifiedAtts; |
| 531 int m_idAttIndex; | 538 int m_idAttIndex; |
| 532 ATTRIBUTE *m_atts; | 539 ATTRIBUTE *m_atts; |
| 533 NS_ATT *m_nsAtts; | 540 NS_ATT *m_nsAtts; |
| 534 unsigned long m_nsAttsVersion; | 541 unsigned long m_nsAttsVersion; |
| 535 unsigned char m_nsAttsPower; | 542 unsigned char m_nsAttsPower; |
| 543 #ifdef XML_ATTR_INFO |
| 544 XML_AttrInfo *m_attInfo; |
| 545 #endif |
| 536 POSITION m_position; | 546 POSITION m_position; |
| 537 STRING_POOL m_tempPool; | 547 STRING_POOL m_tempPool; |
| 538 STRING_POOL m_temp2Pool; | 548 STRING_POOL m_temp2Pool; |
| 539 char *m_groupConnector; | 549 char *m_groupConnector; |
| 540 unsigned int m_groupSize; | 550 unsigned int m_groupSize; |
| 541 XML_Char m_namespaceSeparator; | 551 XML_Char m_namespaceSeparator; |
| 542 XML_Parser m_parentParser; | 552 XML_Parser m_parentParser; |
| 543 XML_ParsingStatus m_parsingStatus; | 553 XML_ParsingStatus m_parsingStatus; |
| 544 #ifdef XML_DTD | 554 #ifdef XML_DTD |
| 545 XML_Bool m_isParamEntity; | 555 XML_Bool m_isParamEntity; |
| 546 XML_Bool m_useForeignDTD; | 556 XML_Bool m_useForeignDTD; |
| 547 enum XML_ParamEntityParsing m_paramEntityParsing; | 557 enum XML_ParamEntityParsing m_paramEntityParsing; |
| 548 #endif | 558 #endif |
| 559 unsigned long m_hash_secret_salt; |
| 549 }; | 560 }; |
| 550 | 561 |
| 551 #define MALLOC(s) (parser->m_mem.malloc_fcn((s))) | 562 #define MALLOC(s) (parser->m_mem.malloc_fcn((s))) |
| 552 #define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) | 563 #define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) |
| 553 #define FREE(p) (parser->m_mem.free_fcn((p))) | 564 #define FREE(p) (parser->m_mem.free_fcn((p))) |
| 554 | 565 |
| 555 #define userData (parser->m_userData) | 566 #define userData (parser->m_userData) |
| 556 #define handlerArg (parser->m_handlerArg) | 567 #define handlerArg (parser->m_handlerArg) |
| 557 #define startElementHandler (parser->m_startElementHandler) | 568 #define startElementHandler (parser->m_startElementHandler) |
| 558 #define endElementHandler (parser->m_endElementHandler) | 569 #define endElementHandler (parser->m_endElementHandler) |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 #define freeBindingList (parser->m_freeBindingList) | 644 #define freeBindingList (parser->m_freeBindingList) |
| 634 #define inheritedBindings (parser->m_inheritedBindings) | 645 #define inheritedBindings (parser->m_inheritedBindings) |
| 635 #define tagStack (parser->m_tagStack) | 646 #define tagStack (parser->m_tagStack) |
| 636 #define atts (parser->m_atts) | 647 #define atts (parser->m_atts) |
| 637 #define attsSize (parser->m_attsSize) | 648 #define attsSize (parser->m_attsSize) |
| 638 #define nSpecifiedAtts (parser->m_nSpecifiedAtts) | 649 #define nSpecifiedAtts (parser->m_nSpecifiedAtts) |
| 639 #define idAttIndex (parser->m_idAttIndex) | 650 #define idAttIndex (parser->m_idAttIndex) |
| 640 #define nsAtts (parser->m_nsAtts) | 651 #define nsAtts (parser->m_nsAtts) |
| 641 #define nsAttsVersion (parser->m_nsAttsVersion) | 652 #define nsAttsVersion (parser->m_nsAttsVersion) |
| 642 #define nsAttsPower (parser->m_nsAttsPower) | 653 #define nsAttsPower (parser->m_nsAttsPower) |
| 654 #define attInfo (parser->m_attInfo) |
| 643 #define tempPool (parser->m_tempPool) | 655 #define tempPool (parser->m_tempPool) |
| 644 #define temp2Pool (parser->m_temp2Pool) | 656 #define temp2Pool (parser->m_temp2Pool) |
| 645 #define groupConnector (parser->m_groupConnector) | 657 #define groupConnector (parser->m_groupConnector) |
| 646 #define groupSize (parser->m_groupSize) | 658 #define groupSize (parser->m_groupSize) |
| 647 #define namespaceSeparator (parser->m_namespaceSeparator) | 659 #define namespaceSeparator (parser->m_namespaceSeparator) |
| 648 #define parentParser (parser->m_parentParser) | 660 #define parentParser (parser->m_parentParser) |
| 649 #define ps_parsing (parser->m_parsingStatus.parsing) | 661 #define ps_parsing (parser->m_parsingStatus.parsing) |
| 650 #define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) | 662 #define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) |
| 651 #ifdef XML_DTD | 663 #ifdef XML_DTD |
| 652 #define isParamEntity (parser->m_isParamEntity) | 664 #define isParamEntity (parser->m_isParamEntity) |
| 653 #define useForeignDTD (parser->m_useForeignDTD) | 665 #define useForeignDTD (parser->m_useForeignDTD) |
| 654 #define paramEntityParsing (parser->m_paramEntityParsing) | 666 #define paramEntityParsing (parser->m_paramEntityParsing) |
| 655 #endif /* XML_DTD */ | 667 #endif /* XML_DTD */ |
| 668 #define hash_secret_salt (parser->m_hash_secret_salt) |
| 656 | 669 |
| 657 XML_Parser XMLCALL | 670 XML_Parser XMLCALL |
| 658 XML_ParserCreate(const XML_Char *encodingName) | 671 XML_ParserCreate(const XML_Char *encodingName) |
| 659 { | 672 { |
| 660 return XML_ParserCreate_MM(encodingName, NULL, NULL); | 673 return XML_ParserCreate_MM(encodingName, NULL, NULL); |
| 661 } | 674 } |
| 662 | 675 |
| 663 XML_Parser XMLCALL | 676 XML_Parser XMLCALL |
| 664 XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) | 677 XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) |
| 665 { | 678 { |
| 666 XML_Char tmp[2]; | 679 XML_Char tmp[2]; |
| 667 *tmp = nsSep; | 680 *tmp = nsSep; |
| 668 return XML_ParserCreate_MM(encodingName, NULL, tmp); | 681 return XML_ParserCreate_MM(encodingName, NULL, tmp); |
| 669 } | 682 } |
| 670 | 683 |
| 671 static const XML_Char implicitContext[] = { | 684 static const XML_Char implicitContext[] = { |
| 672 ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, | 685 ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, |
| 673 ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, | 686 ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, |
| 674 ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, | 687 ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, |
| 675 ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, | 688 ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, |
| 676 ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, | 689 ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, |
| 677 ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' | 690 ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' |
| 678 }; | 691 }; |
| 679 | 692 |
| 693 static unsigned long |
| 694 generate_hash_secret_salt(void) |
| 695 { |
| 696 unsigned int seed = time(NULL) % UINT_MAX; |
| 697 srand(seed); |
| 698 return rand(); |
| 699 } |
| 700 |
| 701 static XML_Bool /* only valid for root parser */ |
| 702 startParsing(XML_Parser parser) |
| 703 { |
| 704 /* hash functions must be initialized before setContext() is called */ |
| 705 if (hash_secret_salt == 0) |
| 706 hash_secret_salt = generate_hash_secret_salt(); |
| 707 if (ns) { |
| 708 /* implicit context only set for root parser, since child |
| 709 parsers (i.e. external entity parsers) will inherit it |
| 710 */ |
| 711 return setContext(parser, implicitContext); |
| 712 } |
| 713 return XML_TRUE; |
| 714 } |
| 715 |
| 680 XML_Parser XMLCALL | 716 XML_Parser XMLCALL |
| 681 XML_ParserCreate_MM(const XML_Char *encodingName, | 717 XML_ParserCreate_MM(const XML_Char *encodingName, |
| 682 const XML_Memory_Handling_Suite *memsuite, | 718 const XML_Memory_Handling_Suite *memsuite, |
| 683 const XML_Char *nameSep) | 719 const XML_Char *nameSep) |
| 684 { | 720 { |
| 685 XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); | 721 return parserCreate(encodingName, memsuite, nameSep, NULL); |
| 686 if (parser != NULL && ns) { | |
| 687 /* implicit context only set for root parser, since child | |
| 688 parsers (i.e. external entity parsers) will inherit it | |
| 689 */ | |
| 690 if (!setContext(parser, implicitContext)) { | |
| 691 XML_ParserFree(parser); | |
| 692 return NULL; | |
| 693 } | |
| 694 } | |
| 695 return parser; | |
| 696 } | 722 } |
| 697 | 723 |
| 698 static XML_Parser | 724 static XML_Parser |
| 699 parserCreate(const XML_Char *encodingName, | 725 parserCreate(const XML_Char *encodingName, |
| 700 const XML_Memory_Handling_Suite *memsuite, | 726 const XML_Memory_Handling_Suite *memsuite, |
| 701 const XML_Char *nameSep, | 727 const XML_Char *nameSep, |
| 702 DTD *dtd) | 728 DTD *dtd) |
| 703 { | 729 { |
| 704 XML_Parser parser; | 730 XML_Parser parser; |
| 705 | 731 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 730 | 756 |
| 731 buffer = NULL; | 757 buffer = NULL; |
| 732 bufferLim = NULL; | 758 bufferLim = NULL; |
| 733 | 759 |
| 734 attsSize = INIT_ATTS_SIZE; | 760 attsSize = INIT_ATTS_SIZE; |
| 735 atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); | 761 atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); |
| 736 if (atts == NULL) { | 762 if (atts == NULL) { |
| 737 FREE(parser); | 763 FREE(parser); |
| 738 return NULL; | 764 return NULL; |
| 739 } | 765 } |
| 740 dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); | 766 #ifdef XML_ATTR_INFO |
| 741 if (dataBuf == NULL) { | 767 attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo)); |
| 768 if (attInfo == NULL) { |
| 742 FREE(atts); | 769 FREE(atts); |
| 743 FREE(parser); | 770 FREE(parser); |
| 744 return NULL; | 771 return NULL; |
| 745 } | 772 } |
| 773 #endif |
| 774 dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); |
| 775 if (dataBuf == NULL) { |
| 776 FREE(atts); |
| 777 #ifdef XML_ATTR_INFO |
| 778 FREE(attInfo); |
| 779 #endif |
| 780 FREE(parser); |
| 781 return NULL; |
| 782 } |
| 746 dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; | 783 dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; |
| 747 | 784 |
| 748 if (dtd) | 785 if (dtd) |
| 749 _dtd = dtd; | 786 _dtd = dtd; |
| 750 else { | 787 else { |
| 751 _dtd = dtdCreate(&parser->m_mem); | 788 _dtd = dtdCreate(&parser->m_mem); |
| 752 if (_dtd == NULL) { | 789 if (_dtd == NULL) { |
| 753 FREE(dataBuf); | 790 FREE(dataBuf); |
| 754 FREE(atts); | 791 FREE(atts); |
| 792 #ifdef XML_ATTR_INFO |
| 793 FREE(attInfo); |
| 794 #endif |
| 755 FREE(parser); | 795 FREE(parser); |
| 756 return NULL; | 796 return NULL; |
| 757 } | 797 } |
| 758 } | 798 } |
| 759 | 799 |
| 760 freeBindingList = NULL; | 800 freeBindingList = NULL; |
| 761 freeTagList = NULL; | 801 freeTagList = NULL; |
| 762 freeInternalEntities = NULL; | 802 freeInternalEntities = NULL; |
| 763 | 803 |
| 764 groupSize = 0; | 804 groupSize = 0; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 unknownEncodingMem = NULL; | 899 unknownEncodingMem = NULL; |
| 860 unknownEncodingRelease = NULL; | 900 unknownEncodingRelease = NULL; |
| 861 unknownEncodingData = NULL; | 901 unknownEncodingData = NULL; |
| 862 parentParser = NULL; | 902 parentParser = NULL; |
| 863 ps_parsing = XML_INITIALIZED; | 903 ps_parsing = XML_INITIALIZED; |
| 864 #ifdef XML_DTD | 904 #ifdef XML_DTD |
| 865 isParamEntity = XML_FALSE; | 905 isParamEntity = XML_FALSE; |
| 866 useForeignDTD = XML_FALSE; | 906 useForeignDTD = XML_FALSE; |
| 867 paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; | 907 paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; |
| 868 #endif | 908 #endif |
| 909 hash_secret_salt = 0; |
| 869 } | 910 } |
| 870 | 911 |
| 871 /* moves list of bindings to freeBindingList */ | 912 /* moves list of bindings to freeBindingList */ |
| 872 static void FASTCALL | 913 static void FASTCALL |
| 873 moveToFreeBindingList(XML_Parser parser, BINDING *bindings) | 914 moveToFreeBindingList(XML_Parser parser, BINDING *bindings) |
| 874 { | 915 { |
| 875 while (bindings) { | 916 while (bindings) { |
| 876 BINDING *b = bindings; | 917 BINDING *b = bindings; |
| 877 bindings = bindings->nextTagBinding; | 918 bindings = bindings->nextTagBinding; |
| 878 b->nextTagBinding = freeBindingList; | 919 b->nextTagBinding = freeBindingList; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 906 freeInternalEntities = openEntity; | 947 freeInternalEntities = openEntity; |
| 907 } | 948 } |
| 908 moveToFreeBindingList(parser, inheritedBindings); | 949 moveToFreeBindingList(parser, inheritedBindings); |
| 909 FREE(unknownEncodingMem); | 950 FREE(unknownEncodingMem); |
| 910 if (unknownEncodingRelease) | 951 if (unknownEncodingRelease) |
| 911 unknownEncodingRelease(unknownEncodingData); | 952 unknownEncodingRelease(unknownEncodingData); |
| 912 poolClear(&tempPool); | 953 poolClear(&tempPool); |
| 913 poolClear(&temp2Pool); | 954 poolClear(&temp2Pool); |
| 914 parserInit(parser, encodingName); | 955 parserInit(parser, encodingName); |
| 915 dtdReset(_dtd, &parser->m_mem); | 956 dtdReset(_dtd, &parser->m_mem); |
| 916 return setContext(parser, implicitContext); | 957 return XML_TRUE; |
| 917 } | 958 } |
| 918 | 959 |
| 919 enum XML_Status XMLCALL | 960 enum XML_Status XMLCALL |
| 920 XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) | 961 XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) |
| 921 { | 962 { |
| 922 /* Block after XML_Parse()/XML_ParseBuffer() has been called. | 963 /* Block after XML_Parse()/XML_ParseBuffer() has been called. |
| 923 XXX There's no way for the caller to determine which of the | 964 XXX There's no way for the caller to determine which of the |
| 924 XXX possible error cases caused the XML_STATUS_ERROR return. | 965 XXX possible error cases caused the XML_STATUS_ERROR return. |
| 925 */ | 966 */ |
| 926 if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) | 967 if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 | 1016 |
| 976 void *oldUserData = userData; | 1017 void *oldUserData = userData; |
| 977 void *oldHandlerArg = handlerArg; | 1018 void *oldHandlerArg = handlerArg; |
| 978 XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; | 1019 XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; |
| 979 XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; | 1020 XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; |
| 980 #ifdef XML_DTD | 1021 #ifdef XML_DTD |
| 981 enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; | 1022 enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; |
| 982 int oldInEntityValue = prologState.inEntityValue; | 1023 int oldInEntityValue = prologState.inEntityValue; |
| 983 #endif | 1024 #endif |
| 984 XML_Bool oldns_triplets = ns_triplets; | 1025 XML_Bool oldns_triplets = ns_triplets; |
| 1026 /* Note that the new parser shares the same hash secret as the old |
| 1027 parser, so that dtdCopy and copyEntityTable can lookup values |
| 1028 from hash tables associated with either parser without us having |
| 1029 to worry which hash secrets each table has. |
| 1030 */ |
| 1031 unsigned long oldhash_secret_salt = hash_secret_salt; |
| 985 | 1032 |
| 986 #ifdef XML_DTD | 1033 #ifdef XML_DTD |
| 987 if (!context) | 1034 if (!context) |
| 988 newDtd = oldDtd; | 1035 newDtd = oldDtd; |
| 989 #endif /* XML_DTD */ | 1036 #endif /* XML_DTD */ |
| 990 | 1037 |
| 991 /* Note that the magical uses of the pre-processor to make field | 1038 /* Note that the magical uses of the pre-processor to make field |
| 992 access look more like C++ require that `parser' be overwritten | 1039 access look more like C++ require that `parser' be overwritten |
| 993 here. This makes this function more painful to follow than it | 1040 here. This makes this function more painful to follow than it |
| 994 would be otherwise. | 1041 would be otherwise. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 declElementType = oldDeclElementType; | 1075 declElementType = oldDeclElementType; |
| 1029 userData = oldUserData; | 1076 userData = oldUserData; |
| 1030 if (oldUserData == oldHandlerArg) | 1077 if (oldUserData == oldHandlerArg) |
| 1031 handlerArg = userData; | 1078 handlerArg = userData; |
| 1032 else | 1079 else |
| 1033 handlerArg = parser; | 1080 handlerArg = parser; |
| 1034 if (oldExternalEntityRefHandlerArg != oldParser) | 1081 if (oldExternalEntityRefHandlerArg != oldParser) |
| 1035 externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; | 1082 externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; |
| 1036 defaultExpandInternalEntities = oldDefaultExpandInternalEntities; | 1083 defaultExpandInternalEntities = oldDefaultExpandInternalEntities; |
| 1037 ns_triplets = oldns_triplets; | 1084 ns_triplets = oldns_triplets; |
| 1085 hash_secret_salt = oldhash_secret_salt; |
| 1038 parentParser = oldParser; | 1086 parentParser = oldParser; |
| 1039 #ifdef XML_DTD | 1087 #ifdef XML_DTD |
| 1040 paramEntityParsing = oldParamEntityParsing; | 1088 paramEntityParsing = oldParamEntityParsing; |
| 1041 prologState.inEntityValue = oldInEntityValue; | 1089 prologState.inEntityValue = oldInEntityValue; |
| 1042 if (context) { | 1090 if (context) { |
| 1043 #endif /* XML_DTD */ | 1091 #endif /* XML_DTD */ |
| 1044 if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) | 1092 if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem) |
| 1045 || !setContext(parser, context)) { | 1093 || !setContext(parser, context)) { |
| 1046 XML_ParserFree(parser); | 1094 XML_ParserFree(parser); |
| 1047 return NULL; | 1095 return NULL; |
| 1048 } | 1096 } |
| 1049 processor = externalEntityInitProcessor; | 1097 processor = externalEntityInitProcessor; |
| 1050 #ifdef XML_DTD | 1098 #ifdef XML_DTD |
| 1051 } | 1099 } |
| 1052 else { | 1100 else { |
| 1053 /* The DTD instance referenced by _dtd is shared between the document's | 1101 /* The DTD instance referenced by _dtd is shared between the document's |
| 1054 root parser and external PE parsers, therefore one does not need to | 1102 root parser and external PE parsers, therefore one does not need to |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 #ifdef XML_DTD | 1171 #ifdef XML_DTD |
| 1124 /* external parameter entity parsers share the DTD structure | 1172 /* external parameter entity parsers share the DTD structure |
| 1125 parser->m_dtd with the root parser, so we must not destroy it | 1173 parser->m_dtd with the root parser, so we must not destroy it |
| 1126 */ | 1174 */ |
| 1127 if (!isParamEntity && _dtd) | 1175 if (!isParamEntity && _dtd) |
| 1128 #else | 1176 #else |
| 1129 if (_dtd) | 1177 if (_dtd) |
| 1130 #endif /* XML_DTD */ | 1178 #endif /* XML_DTD */ |
| 1131 dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); | 1179 dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); |
| 1132 FREE((void *)atts); | 1180 FREE((void *)atts); |
| 1181 #ifdef XML_ATTR_INFO |
| 1182 FREE((void *)attInfo); |
| 1183 #endif |
| 1133 FREE(groupConnector); | 1184 FREE(groupConnector); |
| 1134 FREE(buffer); | 1185 FREE(buffer); |
| 1135 FREE(dataBuf); | 1186 FREE(dataBuf); |
| 1136 FREE(nsAtts); | 1187 FREE(nsAtts); |
| 1137 FREE(unknownEncodingMem); | 1188 FREE(unknownEncodingMem); |
| 1138 if (unknownEncodingRelease) | 1189 if (unknownEncodingRelease) |
| 1139 unknownEncodingRelease(unknownEncodingData); | 1190 unknownEncodingRelease(unknownEncodingData); |
| 1140 FREE(parser); | 1191 FREE(parser); |
| 1141 } | 1192 } |
| 1142 | 1193 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1203 { | 1254 { |
| 1204 return nSpecifiedAtts; | 1255 return nSpecifiedAtts; |
| 1205 } | 1256 } |
| 1206 | 1257 |
| 1207 int XMLCALL | 1258 int XMLCALL |
| 1208 XML_GetIdAttributeIndex(XML_Parser parser) | 1259 XML_GetIdAttributeIndex(XML_Parser parser) |
| 1209 { | 1260 { |
| 1210 return idAttIndex; | 1261 return idAttIndex; |
| 1211 } | 1262 } |
| 1212 | 1263 |
| 1264 #ifdef XML_ATTR_INFO |
| 1265 const XML_AttrInfo * XMLCALL |
| 1266 XML_GetAttributeInfo(XML_Parser parser) |
| 1267 { |
| 1268 return attInfo; |
| 1269 } |
| 1270 #endif |
| 1271 |
| 1213 void XMLCALL | 1272 void XMLCALL |
| 1214 XML_SetElementHandler(XML_Parser parser, | 1273 XML_SetElementHandler(XML_Parser parser, |
| 1215 XML_StartElementHandler start, | 1274 XML_StartElementHandler start, |
| 1216 XML_EndElementHandler end) | 1275 XML_EndElementHandler end) |
| 1217 { | 1276 { |
| 1218 startElementHandler = start; | 1277 startElementHandler = start; |
| 1219 endElementHandler = end; | 1278 endElementHandler = end; |
| 1220 } | 1279 } |
| 1221 | 1280 |
| 1222 void XMLCALL | 1281 void XMLCALL |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1419 if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) | 1478 if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) |
| 1420 return 0; | 1479 return 0; |
| 1421 #ifdef XML_DTD | 1480 #ifdef XML_DTD |
| 1422 paramEntityParsing = peParsing; | 1481 paramEntityParsing = peParsing; |
| 1423 return 1; | 1482 return 1; |
| 1424 #else | 1483 #else |
| 1425 return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; | 1484 return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; |
| 1426 #endif | 1485 #endif |
| 1427 } | 1486 } |
| 1428 | 1487 |
| 1488 int XMLCALL |
| 1489 XML_SetHashSalt(XML_Parser parser, |
| 1490 unsigned long hash_salt) |
| 1491 { |
| 1492 /* block after XML_Parse()/XML_ParseBuffer() has been called */ |
| 1493 if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) |
| 1494 return 0; |
| 1495 hash_secret_salt = hash_salt; |
| 1496 return 1; |
| 1497 } |
| 1498 |
| 1429 enum XML_Status XMLCALL | 1499 enum XML_Status XMLCALL |
| 1430 XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) | 1500 XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) |
| 1431 { | 1501 { |
| 1432 switch (ps_parsing) { | 1502 switch (ps_parsing) { |
| 1433 case XML_SUSPENDED: | 1503 case XML_SUSPENDED: |
| 1434 errorCode = XML_ERROR_SUSPENDED; | 1504 errorCode = XML_ERROR_SUSPENDED; |
| 1435 return XML_STATUS_ERROR; | 1505 return XML_STATUS_ERROR; |
| 1436 case XML_FINISHED: | 1506 case XML_FINISHED: |
| 1437 errorCode = XML_ERROR_FINISHED; | 1507 errorCode = XML_ERROR_FINISHED; |
| 1438 return XML_STATUS_ERROR; | 1508 return XML_STATUS_ERROR; |
| 1509 case XML_INITIALIZED: |
| 1510 if (parentParser == NULL && !startParsing(parser)) { |
| 1511 errorCode = XML_ERROR_NO_MEMORY; |
| 1512 return XML_STATUS_ERROR; |
| 1513 } |
| 1439 default: | 1514 default: |
| 1440 ps_parsing = XML_PARSING; | 1515 ps_parsing = XML_PARSING; |
| 1441 } | 1516 } |
| 1442 | 1517 |
| 1443 if (len == 0) { | 1518 if (len == 0) { |
| 1444 ps_finalBuffer = (XML_Bool)isFinal; | 1519 ps_finalBuffer = (XML_Bool)isFinal; |
| 1445 if (!isFinal) | 1520 if (!isFinal) |
| 1446 return XML_STATUS_OK; | 1521 return XML_STATUS_OK; |
| 1447 positionPtr = bufferPtr; | 1522 positionPtr = bufferPtr; |
| 1448 parseEndPtr = bufferEnd; | 1523 parseEndPtr = bufferEnd; |
| 1449 | 1524 |
| 1450 /* If data are left over from last buffer, and we now know that these | 1525 /* If data are left over from last buffer, and we now know that these |
| 1451 data are the final chunk of input, then we have to check them again | 1526 data are the final chunk of input, then we have to check them again |
| 1452 to detect errors based on that fact. | 1527 to detect errors based on that fact. |
| 1453 */ | 1528 */ |
| 1454 errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); | 1529 errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); |
| 1455 | 1530 |
| 1456 if (errorCode == XML_ERROR_NONE) { | 1531 if (errorCode == XML_ERROR_NONE) { |
| 1457 switch (ps_parsing) { | 1532 switch (ps_parsing) { |
| 1458 case XML_SUSPENDED: | 1533 case XML_SUSPENDED: |
| 1459 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); | 1534 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); |
| 1460 positionPtr = bufferPtr; | 1535 positionPtr = bufferPtr; |
| 1461 return XML_STATUS_SUSPENDED; | 1536 return XML_STATUS_SUSPENDED; |
| 1462 case XML_INITIALIZED: | 1537 case XML_INITIALIZED: |
| 1463 case XML_PARSING: | 1538 case XML_PARSING: |
| 1464 ps_parsing = XML_FINISHED; | 1539 ps_parsing = XML_FINISHED; |
| 1465 /* fall through */ | 1540 /* fall through */ |
| 1466 default: | 1541 default: |
| 1467 return XML_STATUS_OK; | 1542 return XML_STATUS_OK; |
| 1468 } | 1543 } |
| 1469 } | 1544 } |
| 1470 eventEndPtr = eventPtr; | 1545 eventEndPtr = eventPtr; |
| 1471 processor = errorProcessor; | 1546 processor = errorProcessor; |
| 1472 return XML_STATUS_ERROR; | 1547 return XML_STATUS_ERROR; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1487 processor = errorProcessor; | 1562 processor = errorProcessor; |
| 1488 return XML_STATUS_ERROR; | 1563 return XML_STATUS_ERROR; |
| 1489 } | 1564 } |
| 1490 else { | 1565 else { |
| 1491 switch (ps_parsing) { | 1566 switch (ps_parsing) { |
| 1492 case XML_SUSPENDED: | 1567 case XML_SUSPENDED: |
| 1493 result = XML_STATUS_SUSPENDED; | 1568 result = XML_STATUS_SUSPENDED; |
| 1494 break; | 1569 break; |
| 1495 case XML_INITIALIZED: | 1570 case XML_INITIALIZED: |
| 1496 case XML_PARSING: | 1571 case XML_PARSING: |
| 1497 result = XML_STATUS_OK; | |
| 1498 if (isFinal) { | 1572 if (isFinal) { |
| 1499 ps_parsing = XML_FINISHED; | 1573 ps_parsing = XML_FINISHED; |
| 1500 return result; | 1574 return XML_STATUS_OK; |
| 1501 } | 1575 } |
| 1576 /* fall through */ |
| 1577 default: |
| 1578 result = XML_STATUS_OK; |
| 1502 } | 1579 } |
| 1503 } | 1580 } |
| 1504 | 1581 |
| 1505 XmlUpdatePosition(encoding, positionPtr, end, &position); | 1582 XmlUpdatePosition(encoding, positionPtr, end, &position); |
| 1506 nLeftOver = s + len - end; | 1583 nLeftOver = s + len - end; |
| 1507 if (nLeftOver) { | 1584 if (nLeftOver) { |
| 1508 if (buffer == NULL || nLeftOver > bufferLim - buffer) { | 1585 if (buffer == NULL || nLeftOver > bufferLim - buffer) { |
| 1509 /* FIXME avoid integer overflow */ | 1586 /* FIXME avoid integer overflow */ |
| 1510 char *temp; | 1587 char *temp; |
| 1511 temp = (buffer == NULL | 1588 temp = (buffer == NULL |
| 1512 ? (char *)MALLOC(len * 2) | 1589 ? (char *)MALLOC(len * 2) |
| 1513 : (char *)REALLOC(buffer, len * 2)); | 1590 : (char *)REALLOC(buffer, len * 2)); |
| 1514 if (temp == NULL) { | 1591 if (temp == NULL) { |
| 1515 errorCode = XML_ERROR_NO_MEMORY; | 1592 errorCode = XML_ERROR_NO_MEMORY; |
| 1516 return XML_STATUS_ERROR; | |
| 1517 } | |
| 1518 buffer = temp; | |
| 1519 if (!buffer) { | |
| 1520 errorCode = XML_ERROR_NO_MEMORY; | |
| 1521 eventPtr = eventEndPtr = NULL; | 1593 eventPtr = eventEndPtr = NULL; |
| 1522 processor = errorProcessor; | 1594 processor = errorProcessor; |
| 1523 return XML_STATUS_ERROR; | 1595 return XML_STATUS_ERROR; |
| 1524 } | 1596 } |
| 1597 buffer = temp; |
| 1525 bufferLim = buffer + len * 2; | 1598 bufferLim = buffer + len * 2; |
| 1526 } | 1599 } |
| 1527 memcpy(buffer, end, nLeftOver); | 1600 memcpy(buffer, end, nLeftOver); |
| 1528 } | 1601 } |
| 1529 bufferPtr = buffer; | 1602 bufferPtr = buffer; |
| 1530 bufferEnd = buffer + nLeftOver; | 1603 bufferEnd = buffer + nLeftOver; |
| 1531 positionPtr = bufferPtr; | 1604 positionPtr = bufferPtr; |
| 1532 parseEndPtr = bufferEnd; | 1605 parseEndPtr = bufferEnd; |
| 1533 eventPtr = bufferPtr; | 1606 eventPtr = bufferPtr; |
| 1534 eventEndPtr = bufferPtr; | 1607 eventEndPtr = bufferPtr; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1552 const char *start; | 1625 const char *start; |
| 1553 enum XML_Status result = XML_STATUS_OK; | 1626 enum XML_Status result = XML_STATUS_OK; |
| 1554 | 1627 |
| 1555 switch (ps_parsing) { | 1628 switch (ps_parsing) { |
| 1556 case XML_SUSPENDED: | 1629 case XML_SUSPENDED: |
| 1557 errorCode = XML_ERROR_SUSPENDED; | 1630 errorCode = XML_ERROR_SUSPENDED; |
| 1558 return XML_STATUS_ERROR; | 1631 return XML_STATUS_ERROR; |
| 1559 case XML_FINISHED: | 1632 case XML_FINISHED: |
| 1560 errorCode = XML_ERROR_FINISHED; | 1633 errorCode = XML_ERROR_FINISHED; |
| 1561 return XML_STATUS_ERROR; | 1634 return XML_STATUS_ERROR; |
| 1635 case XML_INITIALIZED: |
| 1636 if (parentParser == NULL && !startParsing(parser)) { |
| 1637 errorCode = XML_ERROR_NO_MEMORY; |
| 1638 return XML_STATUS_ERROR; |
| 1639 } |
| 1562 default: | 1640 default: |
| 1563 ps_parsing = XML_PARSING; | 1641 ps_parsing = XML_PARSING; |
| 1564 } | 1642 } |
| 1565 | 1643 |
| 1566 start = bufferPtr; | 1644 start = bufferPtr; |
| 1567 positionPtr = start; | 1645 positionPtr = start; |
| 1568 bufferEnd += len; | 1646 bufferEnd += len; |
| 1569 parseEndPtr = bufferEnd; | 1647 parseEndPtr = bufferEnd; |
| 1570 parseEndByteIndex += len; | 1648 parseEndByteIndex += len; |
| 1571 ps_finalBuffer = (XML_Bool)isFinal; | 1649 ps_finalBuffer = (XML_Bool)isFinal; |
| 1572 | 1650 |
| 1573 errorCode = processor(parser, start, parseEndPtr, &bufferPtr); | 1651 errorCode = processor(parser, start, parseEndPtr, &bufferPtr); |
| 1574 | 1652 |
| 1575 if (errorCode != XML_ERROR_NONE) { | 1653 if (errorCode != XML_ERROR_NONE) { |
| 1576 eventEndPtr = eventPtr; | 1654 eventEndPtr = eventPtr; |
| 1577 processor = errorProcessor; | 1655 processor = errorProcessor; |
| 1578 return XML_STATUS_ERROR; | 1656 return XML_STATUS_ERROR; |
| 1579 } | 1657 } |
| 1580 else { | 1658 else { |
| 1581 switch (ps_parsing) { | 1659 switch (ps_parsing) { |
| 1582 case XML_SUSPENDED: | 1660 case XML_SUSPENDED: |
| 1583 result = XML_STATUS_SUSPENDED; | 1661 result = XML_STATUS_SUSPENDED; |
| 1584 break; | 1662 break; |
| 1585 case XML_INITIALIZED: | 1663 case XML_INITIALIZED: |
| 1586 case XML_PARSING: | 1664 case XML_PARSING: |
| 1587 if (isFinal) { | 1665 if (isFinal) { |
| 1588 ps_parsing = XML_FINISHED; | 1666 ps_parsing = XML_FINISHED; |
| 1589 return result; | 1667 return result; |
| 1590 } | 1668 } |
| 1591 default: ; /* should not happen */ | 1669 default: ; /* should not happen */ |
| 1592 } | 1670 } |
| 1593 } | 1671 } |
| 1594 | 1672 |
| 1595 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); | 1673 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 } | 1743 } |
| 1666 #else | 1744 #else |
| 1667 if (bufferPtr) { | 1745 if (bufferPtr) { |
| 1668 memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); | 1746 memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); |
| 1669 FREE(buffer); | 1747 FREE(buffer); |
| 1670 } | 1748 } |
| 1671 bufferEnd = newBuf + (bufferEnd - bufferPtr); | 1749 bufferEnd = newBuf + (bufferEnd - bufferPtr); |
| 1672 bufferPtr = buffer = newBuf; | 1750 bufferPtr = buffer = newBuf; |
| 1673 #endif /* not defined XML_CONTEXT_BYTES */ | 1751 #endif /* not defined XML_CONTEXT_BYTES */ |
| 1674 } | 1752 } |
| 1753 eventPtr = eventEndPtr = NULL; |
| 1754 positionPtr = NULL; |
| 1675 } | 1755 } |
| 1676 return bufferEnd; | 1756 return bufferEnd; |
| 1677 } | 1757 } |
| 1678 | 1758 |
| 1679 enum XML_Status XMLCALL | 1759 enum XML_Status XMLCALL |
| 1680 XML_StopParser(XML_Parser parser, XML_Bool resumable) | 1760 XML_StopParser(XML_Parser parser, XML_Bool resumable) |
| 1681 { | 1761 { |
| 1682 switch (ps_parsing) { | 1762 switch (ps_parsing) { |
| 1683 case XML_SUSPENDED: | 1763 case XML_SUSPENDED: |
| 1684 if (resumable) { | 1764 if (resumable) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 if (errorCode != XML_ERROR_NONE) { | 1802 if (errorCode != XML_ERROR_NONE) { |
| 1723 eventEndPtr = eventPtr; | 1803 eventEndPtr = eventPtr; |
| 1724 processor = errorProcessor; | 1804 processor = errorProcessor; |
| 1725 return XML_STATUS_ERROR; | 1805 return XML_STATUS_ERROR; |
| 1726 } | 1806 } |
| 1727 else { | 1807 else { |
| 1728 switch (ps_parsing) { | 1808 switch (ps_parsing) { |
| 1729 case XML_SUSPENDED: | 1809 case XML_SUSPENDED: |
| 1730 result = XML_STATUS_SUSPENDED; | 1810 result = XML_STATUS_SUSPENDED; |
| 1731 break; | 1811 break; |
| 1732 case XML_INITIALIZED: | 1812 case XML_INITIALIZED: |
| 1733 case XML_PARSING: | 1813 case XML_PARSING: |
| 1734 if (ps_finalBuffer) { | 1814 if (ps_finalBuffer) { |
| 1735 ps_parsing = XML_FINISHED; | 1815 ps_parsing = XML_FINISHED; |
| 1736 return result; | 1816 return result; |
| 1737 } | 1817 } |
| 1738 default: ; | 1818 default: ; |
| 1739 } | 1819 } |
| 1740 } | 1820 } |
| 1741 | 1821 |
| 1742 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); | 1822 XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1949 XML_CONTEXT_BYTES}, | 2029 XML_CONTEXT_BYTES}, |
| 1950 #endif | 2030 #endif |
| 1951 #ifdef XML_MIN_SIZE | 2031 #ifdef XML_MIN_SIZE |
| 1952 {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, | 2032 {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, |
| 1953 #endif | 2033 #endif |
| 1954 #ifdef XML_NS | 2034 #ifdef XML_NS |
| 1955 {XML_FEATURE_NS, XML_L("XML_NS"), 0}, | 2035 {XML_FEATURE_NS, XML_L("XML_NS"), 0}, |
| 1956 #endif | 2036 #endif |
| 1957 #ifdef XML_LARGE_SIZE | 2037 #ifdef XML_LARGE_SIZE |
| 1958 {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, | 2038 {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, |
| 1959 #endif | 2039 #endif |
| 2040 #ifdef XML_ATTR_INFO |
| 2041 {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, |
| 2042 #endif |
| 1960 {XML_FEATURE_END, NULL, 0} | 2043 {XML_FEATURE_END, NULL, 0} |
| 1961 }; | 2044 }; |
| 1962 | 2045 |
| 1963 return features; | 2046 return features; |
| 1964 } | 2047 } |
| 1965 | 2048 |
| 1966 /* Initially tag->rawName always points into the parse buffer; | 2049 /* Initially tag->rawName always points into the parse buffer; |
| 1967 for those TAG instances opened while the current parse buffer was | 2050 for those TAG instances opened while the current parse buffer was |
| 1968 processed, and not yet closed, we need to store tag->rawName in a more | 2051 processed, and not yet closed, we need to store tag->rawName in a more |
| 1969 permanent location, since the parse buffer is about to be discarded. | 2052 permanent location, since the parse buffer is about to be discarded. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2012 } | 2095 } |
| 2013 return XML_TRUE; | 2096 return XML_TRUE; |
| 2014 } | 2097 } |
| 2015 | 2098 |
| 2016 static enum XML_Error PTRCALL | 2099 static enum XML_Error PTRCALL |
| 2017 contentProcessor(XML_Parser parser, | 2100 contentProcessor(XML_Parser parser, |
| 2018 const char *start, | 2101 const char *start, |
| 2019 const char *end, | 2102 const char *end, |
| 2020 const char **endPtr) | 2103 const char **endPtr) |
| 2021 { | 2104 { |
| 2022 enum XML_Error result = doContent(parser, 0, encoding, start, end, | 2105 enum XML_Error result = doContent(parser, 0, encoding, start, end, |
| 2023 endPtr, (XML_Bool)!ps_finalBuffer); | 2106 endPtr, (XML_Bool)!ps_finalBuffer); |
| 2024 if (result == XML_ERROR_NONE) { | 2107 if (result == XML_ERROR_NONE) { |
| 2025 if (!storeRawNames(parser)) | 2108 if (!storeRawNames(parser)) |
| 2026 return XML_ERROR_NO_MEMORY; | 2109 return XML_ERROR_NO_MEMORY; |
| 2027 } | 2110 } |
| 2028 return result; | 2111 return result; |
| 2029 } | 2112 } |
| 2030 | 2113 |
| 2031 static enum XML_Error PTRCALL | 2114 static enum XML_Error PTRCALL |
| 2032 externalEntityInitProcessor(XML_Parser parser, | 2115 externalEntityInitProcessor(XML_Parser parser, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2094 eventEndPtr = next; | 2177 eventEndPtr = next; |
| 2095 | 2178 |
| 2096 switch (tok) { | 2179 switch (tok) { |
| 2097 case XML_TOK_XML_DECL: | 2180 case XML_TOK_XML_DECL: |
| 2098 { | 2181 { |
| 2099 enum XML_Error result; | 2182 enum XML_Error result; |
| 2100 result = processXmlDecl(parser, 1, start, next); | 2183 result = processXmlDecl(parser, 1, start, next); |
| 2101 if (result != XML_ERROR_NONE) | 2184 if (result != XML_ERROR_NONE) |
| 2102 return result; | 2185 return result; |
| 2103 switch (ps_parsing) { | 2186 switch (ps_parsing) { |
| 2104 case XML_SUSPENDED: | 2187 case XML_SUSPENDED: |
| 2105 *endPtr = next; | 2188 *endPtr = next; |
| 2106 return XML_ERROR_NONE; | 2189 return XML_ERROR_NONE; |
| 2107 case XML_FINISHED: | 2190 case XML_FINISHED: |
| 2108 return XML_ERROR_ABORTED; | 2191 return XML_ERROR_ABORTED; |
| 2109 default: | 2192 default: |
| 2110 start = next; | 2193 start = next; |
| 2111 } | 2194 } |
| 2112 } | 2195 } |
| 2113 break; | 2196 break; |
| 2114 case XML_TOK_PARTIAL: | 2197 case XML_TOK_PARTIAL: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2128 tagLevel = 1; | 2211 tagLevel = 1; |
| 2129 return externalEntityContentProcessor(parser, start, end, endPtr); | 2212 return externalEntityContentProcessor(parser, start, end, endPtr); |
| 2130 } | 2213 } |
| 2131 | 2214 |
| 2132 static enum XML_Error PTRCALL | 2215 static enum XML_Error PTRCALL |
| 2133 externalEntityContentProcessor(XML_Parser parser, | 2216 externalEntityContentProcessor(XML_Parser parser, |
| 2134 const char *start, | 2217 const char *start, |
| 2135 const char *end, | 2218 const char *end, |
| 2136 const char **endPtr) | 2219 const char **endPtr) |
| 2137 { | 2220 { |
| 2138 enum XML_Error result = doContent(parser, 1, encoding, start, end, | 2221 enum XML_Error result = doContent(parser, 1, encoding, start, end, |
| 2139 endPtr, (XML_Bool)!ps_finalBuffer); | 2222 endPtr, (XML_Bool)!ps_finalBuffer); |
| 2140 if (result == XML_ERROR_NONE) { | 2223 if (result == XML_ERROR_NONE) { |
| 2141 if (!storeRawNames(parser)) | 2224 if (!storeRawNames(parser)) |
| 2142 return XML_ERROR_NO_MEMORY; | 2225 return XML_ERROR_NO_MEMORY; |
| 2143 } | 2226 } |
| 2144 return result; | 2227 return result; |
| 2145 } | 2228 } |
| 2146 | 2229 |
| 2147 static enum XML_Error | 2230 static enum XML_Error |
| 2148 doContent(XML_Parser parser, | 2231 doContent(XML_Parser parser, |
| 2149 int startTagLevel, | 2232 int startTagLevel, |
| 2150 const ENCODING *enc, | 2233 const ENCODING *enc, |
| 2151 const char *s, | 2234 const char *s, |
| 2152 const char *end, | 2235 const char *end, |
| 2153 const char **nextPtr, | 2236 const char **nextPtr, |
| 2154 XML_Bool haveMore) | 2237 XML_Bool haveMore) |
| 2155 { | 2238 { |
| 2156 /* save one level of indirection */ | 2239 /* save one level of indirection */ |
| 2157 DTD * const dtd = _dtd; | 2240 DTD * const dtd = _dtd; |
| 2158 | 2241 |
| 2159 const char **eventPP; | 2242 const char **eventPP; |
| 2160 const char **eventEndPP; | 2243 const char **eventEndPP; |
| 2161 if (enc == encoding) { | 2244 if (enc == encoding) { |
| 2162 eventPP = &eventPtr; | 2245 eventPP = &eventPtr; |
| 2163 eventEndPP = &eventEndPtr; | 2246 eventEndPP = &eventEndPtr; |
| 2164 } | 2247 } |
| 2165 else { | 2248 else { |
| 2166 eventPP = &(openInternalEntities->internalEventPtr); | 2249 eventPP = &(openInternalEntities->internalEventPtr); |
| 2167 eventEndPP = &(openInternalEntities->internalEventEndPtr); | 2250 eventEndPP = &(openInternalEntities->internalEventEndPtr); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2178 *nextPtr = s; | 2261 *nextPtr = s; |
| 2179 return XML_ERROR_NONE; | 2262 return XML_ERROR_NONE; |
| 2180 } | 2263 } |
| 2181 *eventEndPP = end; | 2264 *eventEndPP = end; |
| 2182 if (characterDataHandler) { | 2265 if (characterDataHandler) { |
| 2183 XML_Char c = 0xA; | 2266 XML_Char c = 0xA; |
| 2184 characterDataHandler(handlerArg, &c, 1); | 2267 characterDataHandler(handlerArg, &c, 1); |
| 2185 } | 2268 } |
| 2186 else if (defaultHandler) | 2269 else if (defaultHandler) |
| 2187 reportDefault(parser, enc, s, end); | 2270 reportDefault(parser, enc, s, end); |
| 2188 /* We are at the end of the final buffer, should we check for | 2271 /* We are at the end of the final buffer, should we check for |
| 2189 XML_SUSPENDED, XML_FINISHED? | 2272 XML_SUSPENDED, XML_FINISHED? |
| 2190 */ | 2273 */ |
| 2191 if (startTagLevel == 0) | 2274 if (startTagLevel == 0) |
| 2192 return XML_ERROR_NO_ELEMENTS; | 2275 return XML_ERROR_NO_ELEMENTS; |
| 2193 if (tagLevel != startTagLevel) | 2276 if (tagLevel != startTagLevel) |
| 2194 return XML_ERROR_ASYNC_ENTITY; | 2277 return XML_ERROR_ASYNC_ENTITY; |
| 2195 *nextPtr = end; | 2278 *nextPtr = end; |
| 2196 return XML_ERROR_NONE; | 2279 return XML_ERROR_NONE; |
| 2197 case XML_TOK_NONE: | 2280 case XML_TOK_NONE: |
| 2198 if (haveMore) { | 2281 if (haveMore) { |
| 2199 *nextPtr = s; | 2282 *nextPtr = s; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2233 characterDataHandler(handlerArg, &ch, 1); | 2316 characterDataHandler(handlerArg, &ch, 1); |
| 2234 else if (defaultHandler) | 2317 else if (defaultHandler) |
| 2235 reportDefault(parser, enc, s, next); | 2318 reportDefault(parser, enc, s, next); |
| 2236 break; | 2319 break; |
| 2237 } | 2320 } |
| 2238 name = poolStoreString(&dtd->pool, enc, | 2321 name = poolStoreString(&dtd->pool, enc, |
| 2239 s + enc->minBytesPerChar, | 2322 s + enc->minBytesPerChar, |
| 2240 next - enc->minBytesPerChar); | 2323 next - enc->minBytesPerChar); |
| 2241 if (!name) | 2324 if (!name) |
| 2242 return XML_ERROR_NO_MEMORY; | 2325 return XML_ERROR_NO_MEMORY; |
| 2243 entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); | 2326 entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); |
| 2244 poolDiscard(&dtd->pool); | 2327 poolDiscard(&dtd->pool); |
| 2245 /* First, determine if a check for an existing declaration is needed; | 2328 /* First, determine if a check for an existing declaration is needed; |
| 2246 if yes, check that the entity exists, and that it is internal, | 2329 if yes, check that the entity exists, and that it is internal, |
| 2247 otherwise call the skipped entity or default handler. | 2330 otherwise call the skipped entity or default handler. |
| 2248 */ | 2331 */ |
| 2249 if (!dtd->hasParamEntityRefs || dtd->standalone) { | 2332 if (!dtd->hasParamEntityRefs || dtd->standalone) { |
| 2250 if (!entity) | 2333 if (!entity) |
| 2251 return XML_ERROR_UNDEFINED_ENTITY; | 2334 return XML_ERROR_UNDEFINED_ENTITY; |
| 2252 else if (!entity->is_internal) | 2335 else if (!entity->is_internal) |
| 2253 return XML_ERROR_ENTITY_DECLARED_IN_PE; | 2336 return XML_ERROR_ENTITY_DECLARED_IN_PE; |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2530 characterDataHandler(handlerArg, dataBuf, | 2613 characterDataHandler(handlerArg, dataBuf, |
| 2531 (int)(dataPtr - (ICHAR *)dataBuf)); | 2614 (int)(dataPtr - (ICHAR *)dataBuf)); |
| 2532 } | 2615 } |
| 2533 else | 2616 else |
| 2534 characterDataHandler(handlerArg, | 2617 characterDataHandler(handlerArg, |
| 2535 (XML_Char *)s, | 2618 (XML_Char *)s, |
| 2536 (int)((XML_Char *)end - (XML_Char *)s)); | 2619 (int)((XML_Char *)end - (XML_Char *)s)); |
| 2537 } | 2620 } |
| 2538 else if (defaultHandler) | 2621 else if (defaultHandler) |
| 2539 reportDefault(parser, enc, s, end); | 2622 reportDefault(parser, enc, s, end); |
| 2540 /* We are at the end of the final buffer, should we check for | 2623 /* We are at the end of the final buffer, should we check for |
| 2541 XML_SUSPENDED, XML_FINISHED? | 2624 XML_SUSPENDED, XML_FINISHED? |
| 2542 */ | 2625 */ |
| 2543 if (startTagLevel == 0) { | 2626 if (startTagLevel == 0) { |
| 2544 *eventPP = end; | 2627 *eventPP = end; |
| 2545 return XML_ERROR_NO_ELEMENTS; | 2628 return XML_ERROR_NO_ELEMENTS; |
| 2546 } | 2629 } |
| 2547 if (tagLevel != startTagLevel) { | 2630 if (tagLevel != startTagLevel) { |
| 2548 *eventPP = end; | 2631 *eventPP = end; |
| 2549 return XML_ERROR_ASYNC_ENTITY; | 2632 return XML_ERROR_ASYNC_ENTITY; |
| 2550 } | 2633 } |
| 2551 *nextPtr = end; | 2634 *nextPtr = end; |
| 2552 return XML_ERROR_NONE; | 2635 return XML_ERROR_NONE; |
| 2553 case XML_TOK_DATA_CHARS: | 2636 case XML_TOK_DATA_CHARS: |
| 2554 { | 2637 { |
| 2555 XML_CharacterDataHandler charDataHandler = characterDataHandler; | 2638 XML_CharacterDataHandler charDataHandler = characterDataHandler; |
| 2556 if (charDataHandler) { | 2639 if (charDataHandler) { |
| 2557 if (MUST_CONVERT(enc, s)) { | 2640 if (MUST_CONVERT(enc, s)) { |
| 2558 for (;;) { | 2641 for (;;) { |
| 2559 ICHAR *dataPtr = (ICHAR *)dataBuf; | 2642 ICHAR *dataPtr = (ICHAR *)dataBuf; |
| 2560 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); | 2643 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); |
| 2561 *eventEndPP = s; | 2644 *eventEndPP = s; |
| 2562 charDataHandler(handlerArg, dataBuf, | 2645 charDataHandler(handlerArg, dataBuf, |
| 2563 (int)(dataPtr - (ICHAR *)dataBuf)); | 2646 (int)(dataPtr - (ICHAR *)dataBuf)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2583 if (!reportComment(parser, enc, s, next)) | 2666 if (!reportComment(parser, enc, s, next)) |
| 2584 return XML_ERROR_NO_MEMORY; | 2667 return XML_ERROR_NO_MEMORY; |
| 2585 break; | 2668 break; |
| 2586 default: | 2669 default: |
| 2587 if (defaultHandler) | 2670 if (defaultHandler) |
| 2588 reportDefault(parser, enc, s, next); | 2671 reportDefault(parser, enc, s, next); |
| 2589 break; | 2672 break; |
| 2590 } | 2673 } |
| 2591 *eventPP = s = next; | 2674 *eventPP = s = next; |
| 2592 switch (ps_parsing) { | 2675 switch (ps_parsing) { |
| 2593 case XML_SUSPENDED: | 2676 case XML_SUSPENDED: |
| 2594 *nextPtr = next; | 2677 *nextPtr = next; |
| 2595 return XML_ERROR_NONE; | 2678 return XML_ERROR_NONE; |
| 2596 case XML_FINISHED: | 2679 case XML_FINISHED: |
| 2597 return XML_ERROR_ABORTED; | 2680 return XML_ERROR_ABORTED; |
| 2598 default: ; | 2681 default: ; |
| 2599 } | 2682 } |
| 2600 } | 2683 } |
| 2601 /* not reached */ | 2684 /* not reached */ |
| 2602 } | 2685 } |
| 2603 | 2686 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2623 int attIndex = 0; | 2706 int attIndex = 0; |
| 2624 int prefixLen; | 2707 int prefixLen; |
| 2625 int i; | 2708 int i; |
| 2626 int n; | 2709 int n; |
| 2627 XML_Char *uri; | 2710 XML_Char *uri; |
| 2628 int nPrefixes = 0; | 2711 int nPrefixes = 0; |
| 2629 BINDING *binding; | 2712 BINDING *binding; |
| 2630 const XML_Char *localPart; | 2713 const XML_Char *localPart; |
| 2631 | 2714 |
| 2632 /* lookup the element type name */ | 2715 /* lookup the element type name */ |
| 2633 elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); | 2716 elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->s
tr,0); |
| 2634 if (!elementType) { | 2717 if (!elementType) { |
| 2635 const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); | 2718 const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); |
| 2636 if (!name) | 2719 if (!name) |
| 2637 return XML_ERROR_NO_MEMORY; | 2720 return XML_ERROR_NO_MEMORY; |
| 2638 elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, | 2721 elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, |
| 2639 sizeof(ELEMENT_TYPE)); | 2722 sizeof(ELEMENT_TYPE)); |
| 2640 if (!elementType) | 2723 if (!elementType) |
| 2641 return XML_ERROR_NO_MEMORY; | 2724 return XML_ERROR_NO_MEMORY; |
| 2642 if (ns && !setElementTypePrefix(parser, elementType)) | 2725 if (ns && !setElementTypePrefix(parser, elementType)) |
| 2643 return XML_ERROR_NO_MEMORY; | 2726 return XML_ERROR_NO_MEMORY; |
| 2644 } | 2727 } |
| 2645 nDefaultAtts = elementType->nDefaultAtts; | 2728 nDefaultAtts = elementType->nDefaultAtts; |
| 2646 | 2729 |
| 2647 /* get the attributes from the tokenizer */ | 2730 /* get the attributes from the tokenizer */ |
| 2648 n = XmlGetAttributes(enc, attStr, attsSize, atts); | 2731 n = XmlGetAttributes(enc, attStr, attsSize, atts); |
| 2649 if (n + nDefaultAtts > attsSize) { | 2732 if (n + nDefaultAtts > attsSize) { |
| 2650 int oldAttsSize = attsSize; | 2733 int oldAttsSize = attsSize; |
| 2651 ATTRIBUTE *temp; | 2734 ATTRIBUTE *temp; |
| 2735 #ifdef XML_ATTR_INFO |
| 2736 XML_AttrInfo *temp2; |
| 2737 #endif |
| 2652 attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; | 2738 attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; |
| 2653 temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); | 2739 temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); |
| 2654 if (temp == NULL) | 2740 if (temp == NULL) |
| 2655 return XML_ERROR_NO_MEMORY; | 2741 return XML_ERROR_NO_MEMORY; |
| 2656 atts = temp; | 2742 atts = temp; |
| 2743 #ifdef XML_ATTR_INFO |
| 2744 temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrI
nfo)); |
| 2745 if (temp2 == NULL) |
| 2746 return XML_ERROR_NO_MEMORY; |
| 2747 attInfo = temp2; |
| 2748 #endif |
| 2657 if (n > oldAttsSize) | 2749 if (n > oldAttsSize) |
| 2658 XmlGetAttributes(enc, attStr, n, atts); | 2750 XmlGetAttributes(enc, attStr, n, atts); |
| 2659 } | 2751 } |
| 2660 | 2752 |
| 2661 appAtts = (const XML_Char **)atts; | 2753 appAtts = (const XML_Char **)atts; |
| 2662 for (i = 0; i < n; i++) { | 2754 for (i = 0; i < n; i++) { |
| 2755 ATTRIBUTE *currAtt = &atts[i]; |
| 2756 #ifdef XML_ATTR_INFO |
| 2757 XML_AttrInfo *currAttInfo = &attInfo[i]; |
| 2758 #endif |
| 2663 /* add the name and value to the attribute list */ | 2759 /* add the name and value to the attribute list */ |
| 2664 ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, | 2760 ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, |
| 2665 atts[i].name | 2761 currAtt->name |
| 2666 + XmlNameLength(enc, atts[i].name)); | 2762 + XmlNameLength(enc, currAtt->name)); |
| 2667 if (!attId) | 2763 if (!attId) |
| 2668 return XML_ERROR_NO_MEMORY; | 2764 return XML_ERROR_NO_MEMORY; |
| 2765 #ifdef XML_ATTR_INFO |
| 2766 currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name); |
| 2767 currAttInfo->nameEnd = currAttInfo->nameStart + |
| 2768 XmlNameLength(enc, currAtt->name); |
| 2769 currAttInfo->valueStart = parseEndByteIndex - |
| 2770 (parseEndPtr - currAtt->valuePtr); |
| 2771 currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd
); |
| 2772 #endif |
| 2669 /* Detect duplicate attributes by their QNames. This does not work when | 2773 /* Detect duplicate attributes by their QNames. This does not work when |
| 2670 namespace processing is turned on and different prefixes for the same | 2774 namespace processing is turned on and different prefixes for the same |
| 2671 namespace are used. For this case we have a check further down. | 2775 namespace are used. For this case we have a check further down. |
| 2672 */ | 2776 */ |
| 2673 if ((attId->name)[-1]) { | 2777 if ((attId->name)[-1]) { |
| 2674 if (enc == encoding) | 2778 if (enc == encoding) |
| 2675 eventPtr = atts[i].name; | 2779 eventPtr = atts[i].name; |
| 2676 return XML_ERROR_DUPLICATE_ATTRIBUTE; | 2780 return XML_ERROR_DUPLICATE_ATTRIBUTE; |
| 2677 } | 2781 } |
| 2678 (attId->name)[-1] = 1; | 2782 (attId->name)[-1] = 1; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2797 nsAtts[--j].version = version; | 2901 nsAtts[--j].version = version; |
| 2798 } | 2902 } |
| 2799 nsAttsVersion = --version; | 2903 nsAttsVersion = --version; |
| 2800 | 2904 |
| 2801 /* expand prefixed names and check for duplicates */ | 2905 /* expand prefixed names and check for duplicates */ |
| 2802 for (; i < attIndex; i += 2) { | 2906 for (; i < attIndex; i += 2) { |
| 2803 const XML_Char *s = appAtts[i]; | 2907 const XML_Char *s = appAtts[i]; |
| 2804 if (s[-1] == 2) { /* prefixed */ | 2908 if (s[-1] == 2) { /* prefixed */ |
| 2805 ATTRIBUTE_ID *id; | 2909 ATTRIBUTE_ID *id; |
| 2806 const BINDING *b; | 2910 const BINDING *b; |
| 2807 unsigned long uriHash = 0; | 2911 unsigned long uriHash = hash_secret_salt; |
| 2808 ((XML_Char *)s)[-1] = 0; /* clear flag */ | 2912 ((XML_Char *)s)[-1] = 0; /* clear flag */ |
| 2809 id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); | 2913 id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); |
| 2810 b = id->prefix->binding; | 2914 b = id->prefix->binding; |
| 2811 if (!b) | 2915 if (!b) |
| 2812 return XML_ERROR_UNBOUND_PREFIX; | 2916 return XML_ERROR_UNBOUND_PREFIX; |
| 2813 | 2917 |
| 2814 /* as we expand the name we also calculate its hash value */ | 2918 /* as we expand the name we also calculate its hash value */ |
| 2815 for (j = 0; j < b->uriLen; j++) { | 2919 for (j = 0; j < b->uriLen; j++) { |
| 2816 const XML_Char c = b->uri[j]; | 2920 const XML_Char c = b->uri[j]; |
| 2817 if (!poolAppendChar(&tempPool, c)) | 2921 if (!poolAppendChar(&tempPool, c)) |
| 2818 return XML_ERROR_NO_MEMORY; | 2922 return XML_ERROR_NO_MEMORY; |
| 2819 uriHash = CHAR_HASH(uriHash, c); | 2923 uriHash = CHAR_HASH(uriHash, c); |
| 2820 } | 2924 } |
| 2821 while (*s++ != XML_T(ASCII_COLON)) | 2925 while (*s++ != XML_T(ASCII_COLON)) |
| 2822 ; | 2926 ; |
| 2823 do { /* copies null terminator */ | 2927 do { /* copies null terminator */ |
| 2824 const XML_Char c = *s; | 2928 const XML_Char c = *s; |
| 2825 if (!poolAppendChar(&tempPool, *s)) | 2929 if (!poolAppendChar(&tempPool, *s)) |
| 2826 return XML_ERROR_NO_MEMORY; | 2930 return XML_ERROR_NO_MEMORY; |
| 2827 uriHash = CHAR_HASH(uriHash, c); | 2931 uriHash = CHAR_HASH(uriHash, c); |
| 2828 } while (*s++); | 2932 } while (*s++); |
| 2829 | 2933 |
| 2830 { /* Check hash table for duplicate of expanded name (uriName). | 2934 { /* Check hash table for duplicate of expanded name (uriName). |
| 2831 Derived from code in lookup(HASH_TABLE *table, ...). | 2935 Derived from code in lookup(parser, HASH_TABLE *table, ...). |
| 2832 */ | 2936 */ |
| 2833 unsigned char step = 0; | 2937 unsigned char step = 0; |
| 2834 unsigned long mask = nsAttsSize - 1; | 2938 unsigned long mask = nsAttsSize - 1; |
| 2835 j = uriHash & mask; /* index into hash table */ | 2939 j = uriHash & mask; /* index into hash table */ |
| 2836 while (nsAtts[j].version == version) { | 2940 while (nsAtts[j].version == version) { |
| 2837 /* for speed we compare stored hash values first */ | 2941 /* for speed we compare stored hash values first */ |
| 2838 if (uriHash == nsAtts[j].hash) { | 2942 if (uriHash == nsAtts[j].hash) { |
| 2839 const XML_Char *s1 = poolStart(&tempPool); | 2943 const XML_Char *s1 = poolStart(&tempPool); |
| 2840 const XML_Char *s2 = nsAtts[j].uriName; | 2944 const XML_Char *s2 = nsAtts[j].uriName; |
| 2841 /* s1 is null terminated, but not s2 */ | 2945 /* s1 is null terminated, but not s2 */ |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2942 /* addBinding() overwrites the value of prefix->binding without checking. | 3046 /* addBinding() overwrites the value of prefix->binding without checking. |
| 2943 Therefore one must keep track of the old value outside of addBinding(). | 3047 Therefore one must keep track of the old value outside of addBinding(). |
| 2944 */ | 3048 */ |
| 2945 static enum XML_Error | 3049 static enum XML_Error |
| 2946 addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, | 3050 addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, |
| 2947 const XML_Char *uri, BINDING **bindingsPtr) | 3051 const XML_Char *uri, BINDING **bindingsPtr) |
| 2948 { | 3052 { |
| 2949 static const XML_Char xmlNamespace[] = { | 3053 static const XML_Char xmlNamespace[] = { |
| 2950 ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, | 3054 ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, |
| 2951 ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, | 3055 ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, |
| 2952 ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, | 3056 ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, |
| 2953 ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, | 3057 ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, |
| 2954 ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, | 3058 ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, |
| 2955 ASCII_e, '\0' | 3059 ASCII_e, '\0' |
| 2956 }; | 3060 }; |
| 2957 static const int xmlLen = | 3061 static const int xmlLen = |
| 2958 (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; | 3062 (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; |
| 2959 static const XML_Char xmlnsNamespace[] = { | 3063 static const XML_Char xmlnsNamespace[] = { |
| 2960 ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, | 3064 ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, |
| 2961 ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, | 3065 ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, |
| 2962 ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, | 3066 ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, |
| 2963 ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, | 3067 ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, |
| 2964 ASCII_SLASH, '\0' | 3068 ASCII_SLASH, '\0' |
| 2965 }; | 3069 }; |
| 2966 static const int xmlnsLen = | 3070 static const int xmlnsLen = |
| 2967 (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; | 3071 (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; |
| 2968 | 3072 |
| 2969 XML_Bool mustBeXML = XML_FALSE; | 3073 XML_Bool mustBeXML = XML_FALSE; |
| 2970 XML_Bool isXML = XML_TRUE; | 3074 XML_Bool isXML = XML_TRUE; |
| 2971 XML_Bool isXMLNS = XML_TRUE; | 3075 XML_Bool isXMLNS = XML_TRUE; |
| 2972 | 3076 |
| 2973 BINDING *b; | 3077 BINDING *b; |
| 2974 int len; | 3078 int len; |
| 2975 | 3079 |
| 2976 /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ | 3080 /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ |
| 2977 if (*uri == XML_T('\0') && prefix->name) | 3081 if (*uri == XML_T('\0') && prefix->name) |
| 2978 return XML_ERROR_UNDECLARING_PREFIX; | 3082 return XML_ERROR_UNDECLARING_PREFIX; |
| 2979 | 3083 |
| 2980 if (prefix->name | 3084 if (prefix->name |
| 2981 && prefix->name[0] == XML_T(ASCII_x) | 3085 && prefix->name[0] == XML_T(ASCII_x) |
| 2982 && prefix->name[1] == XML_T(ASCII_m) | 3086 && prefix->name[1] == XML_T(ASCII_m) |
| 2983 && prefix->name[2] == XML_T(ASCII_l)) { | 3087 && prefix->name[2] == XML_T(ASCII_l)) { |
| 2984 | 3088 |
| 2985 /* Not allowed to bind xmlns */ | 3089 /* Not allowed to bind xmlns */ |
| 2986 if (prefix->name[3] == XML_T(ASCII_n) | 3090 if (prefix->name[3] == XML_T(ASCII_n) |
| 2987 && prefix->name[4] == XML_T(ASCII_s) | 3091 && prefix->name[4] == XML_T(ASCII_s) |
| 2988 && prefix->name[5] == XML_T('\0')) | 3092 && prefix->name[5] == XML_T('\0')) |
| 2989 return XML_ERROR_RESERVED_PREFIX_XMLNS; | 3093 return XML_ERROR_RESERVED_PREFIX_XMLNS; |
| 2990 | 3094 |
| 2991 if (prefix->name[3] == XML_T('\0')) | 3095 if (prefix->name[3] == XML_T('\0')) |
| 2992 mustBeXML = XML_TRUE; | 3096 mustBeXML = XML_TRUE; |
| 2993 } | 3097 } |
| 2994 | 3098 |
| 2995 for (len = 0; uri[len]; len++) { | 3099 for (len = 0; uri[len]; len++) { |
| 2996 if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) | 3100 if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) |
| 2997 isXML = XML_FALSE; | 3101 isXML = XML_FALSE; |
| 2998 | 3102 |
| 2999 if (!mustBeXML && isXMLNS | 3103 if (!mustBeXML && isXMLNS |
| 3000 && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) | 3104 && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) |
| 3001 isXMLNS = XML_FALSE; | 3105 isXMLNS = XML_FALSE; |
| 3002 } | 3106 } |
| 3003 isXML = isXML && len == xmlLen; | 3107 isXML = isXML && len == xmlLen; |
| 3004 isXMLNS = isXMLNS && len == xmlnsLen; | 3108 isXMLNS = isXMLNS && len == xmlnsLen; |
| 3005 | 3109 |
| 3006 if (mustBeXML != isXML) | 3110 if (mustBeXML != isXML) |
| 3007 return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML | 3111 return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML |
| 3008 : XML_ERROR_RESERVED_NAMESPACE_URI; | 3112 : XML_ERROR_RESERVED_NAMESPACE_URI; |
| 3009 | 3113 |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3200 | 3304 |
| 3201 /* The idea here is to avoid using stack for each IGNORE section when | 3305 /* The idea here is to avoid using stack for each IGNORE section when |
| 3202 the whole file is parsed with one call. | 3306 the whole file is parsed with one call. |
| 3203 */ | 3307 */ |
| 3204 static enum XML_Error PTRCALL | 3308 static enum XML_Error PTRCALL |
| 3205 ignoreSectionProcessor(XML_Parser parser, | 3309 ignoreSectionProcessor(XML_Parser parser, |
| 3206 const char *start, | 3310 const char *start, |
| 3207 const char *end, | 3311 const char *end, |
| 3208 const char **endPtr) | 3312 const char **endPtr) |
| 3209 { | 3313 { |
| 3210 enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, | 3314 enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, |
| 3211 endPtr, (XML_Bool)!ps_finalBuffer); | 3315 endPtr, (XML_Bool)!ps_finalBuffer); |
| 3212 if (result != XML_ERROR_NONE) | 3316 if (result != XML_ERROR_NONE) |
| 3213 return result; | 3317 return result; |
| 3214 if (start) { | 3318 if (start) { |
| 3215 processor = prologProcessor; | 3319 processor = prologProcessor; |
| 3216 return prologProcessor(parser, start, end, endPtr); | 3320 return prologProcessor(parser, start, end, endPtr); |
| 3217 } | 3321 } |
| 3218 return result; | 3322 return result; |
| 3219 } | 3323 } |
| 3220 | 3324 |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3482 entityValueInitProcessor(XML_Parser parser, | 3586 entityValueInitProcessor(XML_Parser parser, |
| 3483 const char *s, | 3587 const char *s, |
| 3484 const char *end, | 3588 const char *end, |
| 3485 const char **nextPtr) | 3589 const char **nextPtr) |
| 3486 { | 3590 { |
| 3487 int tok; | 3591 int tok; |
| 3488 const char *start = s; | 3592 const char *start = s; |
| 3489 const char *next = start; | 3593 const char *next = start; |
| 3490 eventPtr = start; | 3594 eventPtr = start; |
| 3491 | 3595 |
| 3492 for (;;) { | 3596 for (;;) { |
| 3493 tok = XmlPrologTok(encoding, start, end, &next); | 3597 tok = XmlPrologTok(encoding, start, end, &next); |
| 3494 eventEndPtr = next; | 3598 eventEndPtr = next; |
| 3495 if (tok <= 0) { | 3599 if (tok <= 0) { |
| 3496 if (!ps_finalBuffer && tok != XML_TOK_INVALID) { | 3600 if (!ps_finalBuffer && tok != XML_TOK_INVALID) { |
| 3497 *nextPtr = s; | 3601 *nextPtr = s; |
| 3498 return XML_ERROR_NONE; | 3602 return XML_ERROR_NONE; |
| 3499 } | 3603 } |
| 3500 switch (tok) { | 3604 switch (tok) { |
| 3501 case XML_TOK_INVALID: | 3605 case XML_TOK_INVALID: |
| 3502 return XML_ERROR_INVALID_TOKEN; | 3606 return XML_ERROR_INVALID_TOKEN; |
| 3503 case XML_TOK_PARTIAL: | 3607 case XML_TOK_PARTIAL: |
| 3504 return XML_ERROR_UNCLOSED_TOKEN; | 3608 return XML_ERROR_UNCLOSED_TOKEN; |
| 3505 case XML_TOK_PARTIAL_CHAR: | 3609 case XML_TOK_PARTIAL_CHAR: |
| 3506 return XML_ERROR_PARTIAL_CHAR; | 3610 return XML_ERROR_PARTIAL_CHAR; |
| 3507 case XML_TOK_NONE: /* start == end */ | 3611 case XML_TOK_NONE: /* start == end */ |
| 3508 default: | 3612 default: |
| 3509 break; | 3613 break; |
| 3510 } | 3614 } |
| 3511 /* found end of entity value - can store it now */ | 3615 /* found end of entity value - can store it now */ |
| 3512 return storeEntityValue(parser, encoding, s, end); | 3616 return storeEntityValue(parser, encoding, s, end); |
| 3513 } | 3617 } |
| 3514 else if (tok == XML_TOK_XML_DECL) { | 3618 else if (tok == XML_TOK_XML_DECL) { |
| 3515 enum XML_Error result; | 3619 enum XML_Error result; |
| 3516 result = processXmlDecl(parser, 0, start, next); | 3620 result = processXmlDecl(parser, 0, start, next); |
| 3517 if (result != XML_ERROR_NONE) | 3621 if (result != XML_ERROR_NONE) |
| 3518 return result; | 3622 return result; |
| 3519 switch (ps_parsing) { | 3623 switch (ps_parsing) { |
| 3520 case XML_SUSPENDED: | 3624 case XML_SUSPENDED: |
| 3521 *nextPtr = next; | 3625 *nextPtr = next; |
| 3522 return XML_ERROR_NONE; | 3626 return XML_ERROR_NONE; |
| 3523 case XML_FINISHED: | 3627 case XML_FINISHED: |
| 3524 return XML_ERROR_ABORTED; | 3628 return XML_ERROR_ABORTED; |
| 3525 default: | 3629 default: |
| 3526 *nextPtr = next; | 3630 *nextPtr = next; |
| 3527 } | 3631 } |
| 3528 /* stop scanning for text declaration - we found one */ | 3632 /* stop scanning for text declaration - we found one */ |
| 3529 processor = entityValueProcessor; | 3633 processor = entityValueProcessor; |
| 3530 return entityValueProcessor(parser, next, end, nextPtr); | 3634 return entityValueProcessor(parser, next, end, nextPtr); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3575 /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. | 3679 /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. |
| 3576 However, when parsing an external subset, doProlog will not accept a BOM | 3680 However, when parsing an external subset, doProlog will not accept a BOM |
| 3577 as valid, and report a syntax error, so we have to skip the BOM | 3681 as valid, and report a syntax error, so we have to skip the BOM |
| 3578 */ | 3682 */ |
| 3579 else if (tok == XML_TOK_BOM) { | 3683 else if (tok == XML_TOK_BOM) { |
| 3580 s = next; | 3684 s = next; |
| 3581 tok = XmlPrologTok(encoding, s, end, &next); | 3685 tok = XmlPrologTok(encoding, s, end, &next); |
| 3582 } | 3686 } |
| 3583 | 3687 |
| 3584 processor = prologProcessor; | 3688 processor = prologProcessor; |
| 3585 return doProlog(parser, encoding, s, end, tok, next, | 3689 return doProlog(parser, encoding, s, end, tok, next, |
| 3586 nextPtr, (XML_Bool)!ps_finalBuffer); | 3690 nextPtr, (XML_Bool)!ps_finalBuffer); |
| 3587 } | 3691 } |
| 3588 | 3692 |
| 3589 static enum XML_Error PTRCALL | 3693 static enum XML_Error PTRCALL |
| 3590 entityValueProcessor(XML_Parser parser, | 3694 entityValueProcessor(XML_Parser parser, |
| 3591 const char *s, | 3695 const char *s, |
| 3592 const char *end, | 3696 const char *end, |
| 3593 const char **nextPtr) | 3697 const char **nextPtr) |
| 3594 { | 3698 { |
| 3595 const char *start = s; | 3699 const char *start = s; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3625 #endif /* XML_DTD */ | 3729 #endif /* XML_DTD */ |
| 3626 | 3730 |
| 3627 static enum XML_Error PTRCALL | 3731 static enum XML_Error PTRCALL |
| 3628 prologProcessor(XML_Parser parser, | 3732 prologProcessor(XML_Parser parser, |
| 3629 const char *s, | 3733 const char *s, |
| 3630 const char *end, | 3734 const char *end, |
| 3631 const char **nextPtr) | 3735 const char **nextPtr) |
| 3632 { | 3736 { |
| 3633 const char *next = s; | 3737 const char *next = s; |
| 3634 int tok = XmlPrologTok(encoding, s, end, &next); | 3738 int tok = XmlPrologTok(encoding, s, end, &next); |
| 3635 return doProlog(parser, encoding, s, end, tok, next, | 3739 return doProlog(parser, encoding, s, end, tok, next, |
| 3636 nextPtr, (XML_Bool)!ps_finalBuffer); | 3740 nextPtr, (XML_Bool)!ps_finalBuffer); |
| 3637 } | 3741 } |
| 3638 | 3742 |
| 3639 static enum XML_Error | 3743 static enum XML_Error |
| 3640 doProlog(XML_Parser parser, | 3744 doProlog(XML_Parser parser, |
| 3641 const ENCODING *enc, | 3745 const ENCODING *enc, |
| 3642 const char *s, | 3746 const char *s, |
| 3643 const char *end, | 3747 const char *end, |
| 3644 int tok, | 3748 int tok, |
| 3645 const char *next, | 3749 const char *next, |
| 3646 const char **nextPtr, | 3750 const char **nextPtr, |
| 3647 XML_Bool haveMore) | 3751 XML_Bool haveMore) |
| 3648 { | 3752 { |
| 3649 #ifdef XML_DTD | 3753 #ifdef XML_DTD |
| 3650 static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; | 3754 static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; |
| 3651 #endif /* XML_DTD */ | 3755 #endif /* XML_DTD */ |
| 3652 static const XML_Char atypeCDATA[] = | 3756 static const XML_Char atypeCDATA[] = |
| 3653 { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; | 3757 { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; |
| 3654 static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; | 3758 static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; |
| 3655 static const XML_Char atypeIDREF[] = | 3759 static const XML_Char atypeIDREF[] = |
| 3656 { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; | 3760 { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; |
| 3657 static const XML_Char atypeIDREFS[] = | 3761 static const XML_Char atypeIDREFS[] = |
| 3658 { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; | 3762 { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; |
| 3659 static const XML_Char atypeENTITY[] = | 3763 static const XML_Char atypeENTITY[] = |
| 3660 { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; | 3764 { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; |
| 3661 static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, | 3765 static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, |
| 3662 ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; | 3766 ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; |
| 3663 static const XML_Char atypeNMTOKEN[] = { | 3767 static const XML_Char atypeNMTOKEN[] = { |
| 3664 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; | 3768 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; |
| 3665 static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, | 3769 static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, |
| 3666 ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; | 3770 ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; |
| 3667 static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, | 3771 static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, |
| 3668 ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; | 3772 ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; |
| 3669 static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; | 3773 static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; |
| 3670 static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; | 3774 static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; |
| 3671 | 3775 |
| 3672 /* save one level of indirection */ | 3776 /* save one level of indirection */ |
| 3673 DTD * const dtd = _dtd; | 3777 DTD * const dtd = _dtd; |
| 3674 | 3778 |
| 3675 const char **eventPP; | 3779 const char **eventPP; |
| 3676 const char **eventEndPP; | 3780 const char **eventEndPP; |
| 3677 enum XML_Content_Quant quant; | 3781 enum XML_Content_Quant quant; |
| 3678 | 3782 |
| 3679 if (enc == encoding) { | 3783 if (enc == encoding) { |
| 3680 eventPP = &eventPtr; | 3784 eventPP = &eventPtr; |
| 3681 eventEndPP = &eventEndPtr; | 3785 eventEndPP = &eventEndPtr; |
| 3682 } | 3786 } |
| 3683 else { | 3787 else { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3696 return XML_ERROR_NONE; | 3800 return XML_ERROR_NONE; |
| 3697 } | 3801 } |
| 3698 switch (tok) { | 3802 switch (tok) { |
| 3699 case XML_TOK_INVALID: | 3803 case XML_TOK_INVALID: |
| 3700 *eventPP = next; | 3804 *eventPP = next; |
| 3701 return XML_ERROR_INVALID_TOKEN; | 3805 return XML_ERROR_INVALID_TOKEN; |
| 3702 case XML_TOK_PARTIAL: | 3806 case XML_TOK_PARTIAL: |
| 3703 return XML_ERROR_UNCLOSED_TOKEN; | 3807 return XML_ERROR_UNCLOSED_TOKEN; |
| 3704 case XML_TOK_PARTIAL_CHAR: | 3808 case XML_TOK_PARTIAL_CHAR: |
| 3705 return XML_ERROR_PARTIAL_CHAR; | 3809 return XML_ERROR_PARTIAL_CHAR; |
| 3810 case -XML_TOK_PROLOG_S: |
| 3811 tok = -tok; |
| 3812 break; |
| 3706 case XML_TOK_NONE: | 3813 case XML_TOK_NONE: |
| 3707 #ifdef XML_DTD | 3814 #ifdef XML_DTD |
| 3708 /* for internal PE NOT referenced between declarations */ | 3815 /* for internal PE NOT referenced between declarations */ |
| 3709 if (enc != encoding && !openInternalEntities->betweenDecl) { | 3816 if (enc != encoding && !openInternalEntities->betweenDecl) { |
| 3710 *nextPtr = s; | 3817 *nextPtr = s; |
| 3711 return XML_ERROR_NONE; | 3818 return XML_ERROR_NONE; |
| 3712 } | 3819 } |
| 3713 /* WFC: PE Between Declarations - must check that PE contains | 3820 /* WFC: PE Between Declarations - must check that PE contains |
| 3714 complete markup, not only for external PEs, but also for | 3821 complete markup, not only for external PEs, but also for |
| 3715 internal PEs if the reference occurs between declarations. | 3822 internal PEs if the reference occurs between declarations. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3767 if (result != XML_ERROR_NONE) | 3874 if (result != XML_ERROR_NONE) |
| 3768 return result; | 3875 return result; |
| 3769 enc = encoding; | 3876 enc = encoding; |
| 3770 handleDefault = XML_FALSE; | 3877 handleDefault = XML_FALSE; |
| 3771 } | 3878 } |
| 3772 break; | 3879 break; |
| 3773 #endif /* XML_DTD */ | 3880 #endif /* XML_DTD */ |
| 3774 case XML_ROLE_DOCTYPE_PUBLIC_ID: | 3881 case XML_ROLE_DOCTYPE_PUBLIC_ID: |
| 3775 #ifdef XML_DTD | 3882 #ifdef XML_DTD |
| 3776 useForeignDTD = XML_FALSE; | 3883 useForeignDTD = XML_FALSE; |
| 3777 declEntity = (ENTITY *)lookup(&dtd->paramEntities, | 3884 declEntity = (ENTITY *)lookup(parser, |
| 3885 &dtd->paramEntities, |
| 3778 externalSubsetName, | 3886 externalSubsetName, |
| 3779 sizeof(ENTITY)); | 3887 sizeof(ENTITY)); |
| 3780 if (!declEntity) | 3888 if (!declEntity) |
| 3781 return XML_ERROR_NO_MEMORY; | 3889 return XML_ERROR_NO_MEMORY; |
| 3782 #endif /* XML_DTD */ | 3890 #endif /* XML_DTD */ |
| 3783 dtd->hasParamEntityRefs = XML_TRUE; | 3891 dtd->hasParamEntityRefs = XML_TRUE; |
| 3784 if (startDoctypeDeclHandler) { | 3892 if (startDoctypeDeclHandler) { |
| 3893 XML_Char *pubId; |
| 3785 if (!XmlIsPublicId(enc, s, next, eventPP)) | 3894 if (!XmlIsPublicId(enc, s, next, eventPP)) |
| 3786 return XML_ERROR_PUBLICID; | 3895 return XML_ERROR_PUBLICID; |
| 3787 doctypePubid = poolStoreString(&tempPool, enc, | 3896 pubId = poolStoreString(&tempPool, enc, |
| 3788 s + enc->minBytesPerChar, | 3897 s + enc->minBytesPerChar, |
| 3789 next - enc->minBytesPerChar); | 3898 next - enc->minBytesPerChar); |
| 3790 if (!doctypePubid) | 3899 if (!pubId) |
| 3791 return XML_ERROR_NO_MEMORY; | 3900 return XML_ERROR_NO_MEMORY; |
| 3792 normalizePublicId((XML_Char *)doctypePubid); | 3901 normalizePublicId(pubId); |
| 3793 poolFinish(&tempPool); | 3902 poolFinish(&tempPool); |
| 3903 doctypePubid = pubId; |
| 3794 handleDefault = XML_FALSE; | 3904 handleDefault = XML_FALSE; |
| 3795 goto alreadyChecked; | 3905 goto alreadyChecked; |
| 3796 } | 3906 } |
| 3797 /* fall through */ | 3907 /* fall through */ |
| 3798 case XML_ROLE_ENTITY_PUBLIC_ID: | 3908 case XML_ROLE_ENTITY_PUBLIC_ID: |
| 3799 if (!XmlIsPublicId(enc, s, next, eventPP)) | 3909 if (!XmlIsPublicId(enc, s, next, eventPP)) |
| 3800 return XML_ERROR_PUBLICID; | 3910 return XML_ERROR_PUBLICID; |
| 3801 alreadyChecked: | 3911 alreadyChecked: |
| 3802 if (dtd->keepProcessing && declEntity) { | 3912 if (dtd->keepProcessing && declEntity) { |
| 3803 XML_Char *tem = poolStoreString(&dtd->pool, | 3913 XML_Char *tem = poolStoreString(&dtd->pool, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3822 } | 3932 } |
| 3823 /* doctypeSysid will be non-NULL in the case of a previous | 3933 /* doctypeSysid will be non-NULL in the case of a previous |
| 3824 XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler | 3934 XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler |
| 3825 was not set, indicating an external subset | 3935 was not set, indicating an external subset |
| 3826 */ | 3936 */ |
| 3827 #ifdef XML_DTD | 3937 #ifdef XML_DTD |
| 3828 if (doctypeSysid || useForeignDTD) { | 3938 if (doctypeSysid || useForeignDTD) { |
| 3829 XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; | 3939 XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; |
| 3830 dtd->hasParamEntityRefs = XML_TRUE; | 3940 dtd->hasParamEntityRefs = XML_TRUE; |
| 3831 if (paramEntityParsing && externalEntityRefHandler) { | 3941 if (paramEntityParsing && externalEntityRefHandler) { |
| 3832 ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, | 3942 ENTITY *entity = (ENTITY *)lookup(parser, |
| 3943 &dtd->paramEntities, |
| 3833 externalSubsetName, | 3944 externalSubsetName, |
| 3834 sizeof(ENTITY)); | 3945 sizeof(ENTITY)); |
| 3835 if (!entity) | 3946 if (!entity) |
| 3836 return XML_ERROR_NO_MEMORY; | 3947 return XML_ERROR_NO_MEMORY; |
| 3837 if (useForeignDTD) | 3948 if (useForeignDTD) |
| 3838 entity->base = curBase; | 3949 entity->base = curBase; |
| 3839 dtd->paramEntityRead = XML_FALSE; | 3950 dtd->paramEntityRead = XML_FALSE; |
| 3840 if (!externalEntityRefHandler(externalEntityRefHandlerArg, | 3951 if (!externalEntityRefHandler(externalEntityRefHandlerArg, |
| 3841 0, | 3952 0, |
| 3842 entity->base, | 3953 entity->base, |
| 3843 entity->systemId, | 3954 entity->systemId, |
| 3844 entity->publicId)) | 3955 entity->publicId)) |
| 3845 return XML_ERROR_EXTERNAL_ENTITY_HANDLING; | 3956 return XML_ERROR_EXTERNAL_ENTITY_HANDLING; |
| 3846 if (dtd->paramEntityRead) { | 3957 if (dtd->paramEntityRead) { |
| 3847 if (!dtd->standalone && | 3958 if (!dtd->standalone && |
| 3848 notStandaloneHandler && | 3959 notStandaloneHandler && |
| 3849 !notStandaloneHandler(handlerArg)) | 3960 !notStandaloneHandler(handlerArg)) |
| 3850 return XML_ERROR_NOT_STANDALONE; | 3961 return XML_ERROR_NOT_STANDALONE; |
| 3851 } | 3962 } |
| 3852 /* if we didn't read the foreign DTD then this means that there | 3963 /* if we didn't read the foreign DTD then this means that there |
| 3853 is no external subset and we must reset dtd->hasParamEntityRefs | 3964 is no external subset and we must reset dtd->hasParamEntityRefs |
| 3854 */ | 3965 */ |
| 3855 else if (!doctypeSysid) | 3966 else if (!doctypeSysid) |
| 3856 dtd->hasParamEntityRefs = hadParamEntityRefs; | 3967 dtd->hasParamEntityRefs = hadParamEntityRefs; |
| 3857 /* end of DTD - no need to update dtd->keepProcessing */ | 3968 /* end of DTD - no need to update dtd->keepProcessing */ |
| 3858 } | 3969 } |
| 3859 useForeignDTD = XML_FALSE; | 3970 useForeignDTD = XML_FALSE; |
| 3860 } | 3971 } |
| 3861 #endif /* XML_DTD */ | 3972 #endif /* XML_DTD */ |
| 3862 if (endDoctypeDeclHandler) { | 3973 if (endDoctypeDeclHandler) { |
| 3863 endDoctypeDeclHandler(handlerArg); | 3974 endDoctypeDeclHandler(handlerArg); |
| 3864 handleDefault = XML_FALSE; | 3975 handleDefault = XML_FALSE; |
| 3865 } | 3976 } |
| 3866 break; | 3977 break; |
| 3867 case XML_ROLE_INSTANCE_START: | 3978 case XML_ROLE_INSTANCE_START: |
| 3868 #ifdef XML_DTD | 3979 #ifdef XML_DTD |
| 3869 /* if there is no DOCTYPE declaration then now is the | 3980 /* if there is no DOCTYPE declaration then now is the |
| 3870 last chance to read the foreign DTD | 3981 last chance to read the foreign DTD |
| 3871 */ | 3982 */ |
| 3872 if (useForeignDTD) { | 3983 if (useForeignDTD) { |
| 3873 XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; | 3984 XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; |
| 3874 dtd->hasParamEntityRefs = XML_TRUE; | 3985 dtd->hasParamEntityRefs = XML_TRUE; |
| 3875 if (paramEntityParsing && externalEntityRefHandler) { | 3986 if (paramEntityParsing && externalEntityRefHandler) { |
| 3876 ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, | 3987 ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, |
| 3877 externalSubsetName, | 3988 externalSubsetName, |
| 3878 sizeof(ENTITY)); | 3989 sizeof(ENTITY)); |
| 3879 if (!entity) | 3990 if (!entity) |
| 3880 return XML_ERROR_NO_MEMORY; | 3991 return XML_ERROR_NO_MEMORY; |
| 3881 entity->base = curBase; | 3992 entity->base = curBase; |
| 3882 dtd->paramEntityRead = XML_FALSE; | 3993 dtd->paramEntityRead = XML_FALSE; |
| 3883 if (!externalEntityRefHandler(externalEntityRefHandlerArg, | 3994 if (!externalEntityRefHandler(externalEntityRefHandlerArg, |
| 3884 0, | 3995 0, |
| 3885 entity->base, | 3996 entity->base, |
| 3886 entity->systemId, | 3997 entity->systemId, |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4080 #ifdef XML_DTD | 4191 #ifdef XML_DTD |
| 4081 && !paramEntityParsing | 4192 && !paramEntityParsing |
| 4082 #endif /* XML_DTD */ | 4193 #endif /* XML_DTD */ |
| 4083 && notStandaloneHandler | 4194 && notStandaloneHandler |
| 4084 && !notStandaloneHandler(handlerArg)) | 4195 && !notStandaloneHandler(handlerArg)) |
| 4085 return XML_ERROR_NOT_STANDALONE; | 4196 return XML_ERROR_NOT_STANDALONE; |
| 4086 #ifndef XML_DTD | 4197 #ifndef XML_DTD |
| 4087 break; | 4198 break; |
| 4088 #else /* XML_DTD */ | 4199 #else /* XML_DTD */ |
| 4089 if (!declEntity) { | 4200 if (!declEntity) { |
| 4090 declEntity = (ENTITY *)lookup(&dtd->paramEntities, | 4201 declEntity = (ENTITY *)lookup(parser, |
| 4202 &dtd->paramEntities, |
| 4091 externalSubsetName, | 4203 externalSubsetName, |
| 4092 sizeof(ENTITY)); | 4204 sizeof(ENTITY)); |
| 4093 if (!declEntity) | 4205 if (!declEntity) |
| 4094 return XML_ERROR_NO_MEMORY; | 4206 return XML_ERROR_NO_MEMORY; |
| 4095 declEntity->publicId = NULL; | 4207 declEntity->publicId = NULL; |
| 4096 } | 4208 } |
| 4097 /* fall through */ | 4209 /* fall through */ |
| 4098 #endif /* XML_DTD */ | 4210 #endif /* XML_DTD */ |
| 4099 case XML_ROLE_ENTITY_SYSTEM_ID: | 4211 case XML_ROLE_ENTITY_SYSTEM_ID: |
| 4100 if (dtd->keepProcessing && declEntity) { | 4212 if (dtd->keepProcessing && declEntity) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4155 case XML_ROLE_GENERAL_ENTITY_NAME: | 4267 case XML_ROLE_GENERAL_ENTITY_NAME: |
| 4156 { | 4268 { |
| 4157 if (XmlPredefinedEntityName(enc, s, next)) { | 4269 if (XmlPredefinedEntityName(enc, s, next)) { |
| 4158 declEntity = NULL; | 4270 declEntity = NULL; |
| 4159 break; | 4271 break; |
| 4160 } | 4272 } |
| 4161 if (dtd->keepProcessing) { | 4273 if (dtd->keepProcessing) { |
| 4162 const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); | 4274 const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); |
| 4163 if (!name) | 4275 if (!name) |
| 4164 return XML_ERROR_NO_MEMORY; | 4276 return XML_ERROR_NO_MEMORY; |
| 4165 declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, | 4277 declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, |
| 4166 sizeof(ENTITY)); | 4278 sizeof(ENTITY)); |
| 4167 if (!declEntity) | 4279 if (!declEntity) |
| 4168 return XML_ERROR_NO_MEMORY; | 4280 return XML_ERROR_NO_MEMORY; |
| 4169 if (declEntity->name != name) { | 4281 if (declEntity->name != name) { |
| 4170 poolDiscard(&dtd->pool); | 4282 poolDiscard(&dtd->pool); |
| 4171 declEntity = NULL; | 4283 declEntity = NULL; |
| 4172 } | 4284 } |
| 4173 else { | 4285 else { |
| 4174 poolFinish(&dtd->pool); | 4286 poolFinish(&dtd->pool); |
| 4175 declEntity->publicId = NULL; | 4287 declEntity->publicId = NULL; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4187 declEntity = NULL; | 4299 declEntity = NULL; |
| 4188 } | 4300 } |
| 4189 } | 4301 } |
| 4190 break; | 4302 break; |
| 4191 case XML_ROLE_PARAM_ENTITY_NAME: | 4303 case XML_ROLE_PARAM_ENTITY_NAME: |
| 4192 #ifdef XML_DTD | 4304 #ifdef XML_DTD |
| 4193 if (dtd->keepProcessing) { | 4305 if (dtd->keepProcessing) { |
| 4194 const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); | 4306 const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); |
| 4195 if (!name) | 4307 if (!name) |
| 4196 return XML_ERROR_NO_MEMORY; | 4308 return XML_ERROR_NO_MEMORY; |
| 4197 declEntity = (ENTITY *)lookup(&dtd->paramEntities, | 4309 declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, |
| 4198 name, sizeof(ENTITY)); | 4310 name, sizeof(ENTITY)); |
| 4199 if (!declEntity) | 4311 if (!declEntity) |
| 4200 return XML_ERROR_NO_MEMORY; | 4312 return XML_ERROR_NO_MEMORY; |
| 4201 if (declEntity->name != name) { | 4313 if (declEntity->name != name) { |
| 4202 poolDiscard(&dtd->pool); | 4314 poolDiscard(&dtd->pool); |
| 4203 declEntity = NULL; | 4315 declEntity = NULL; |
| 4204 } | 4316 } |
| 4205 else { | 4317 else { |
| 4206 poolFinish(&dtd->pool); | 4318 poolFinish(&dtd->pool); |
| 4207 declEntity->publicId = NULL; | 4319 declEntity->publicId = NULL; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4276 0, | 4388 0, |
| 4277 declNotationPublicId); | 4389 declNotationPublicId); |
| 4278 handleDefault = XML_FALSE; | 4390 handleDefault = XML_FALSE; |
| 4279 } | 4391 } |
| 4280 poolClear(&tempPool); | 4392 poolClear(&tempPool); |
| 4281 break; | 4393 break; |
| 4282 case XML_ROLE_ERROR: | 4394 case XML_ROLE_ERROR: |
| 4283 switch (tok) { | 4395 switch (tok) { |
| 4284 case XML_TOK_PARAM_ENTITY_REF: | 4396 case XML_TOK_PARAM_ENTITY_REF: |
| 4285 /* PE references in internal subset are | 4397 /* PE references in internal subset are |
| 4286 not allowed within declarations. */ | 4398 not allowed within declarations. */ |
| 4287 return XML_ERROR_PARAM_ENTITY_REF; | 4399 return XML_ERROR_PARAM_ENTITY_REF; |
| 4288 case XML_TOK_XML_DECL: | 4400 case XML_TOK_XML_DECL: |
| 4289 return XML_ERROR_MISPLACED_XML_PI; | 4401 return XML_ERROR_MISPLACED_XML_PI; |
| 4290 default: | 4402 default: |
| 4291 return XML_ERROR_SYNTAX; | 4403 return XML_ERROR_SYNTAX; |
| 4292 } | 4404 } |
| 4293 #ifdef XML_DTD | 4405 #ifdef XML_DTD |
| 4294 case XML_ROLE_IGNORE_SECT: | 4406 case XML_ROLE_IGNORE_SECT: |
| 4295 { | 4407 { |
| 4296 enum XML_Error result; | 4408 enum XML_Error result; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4369 if (!paramEntityParsing) | 4481 if (!paramEntityParsing) |
| 4370 dtd->keepProcessing = dtd->standalone; | 4482 dtd->keepProcessing = dtd->standalone; |
| 4371 else { | 4483 else { |
| 4372 const XML_Char *name; | 4484 const XML_Char *name; |
| 4373 ENTITY *entity; | 4485 ENTITY *entity; |
| 4374 name = poolStoreString(&dtd->pool, enc, | 4486 name = poolStoreString(&dtd->pool, enc, |
| 4375 s + enc->minBytesPerChar, | 4487 s + enc->minBytesPerChar, |
| 4376 next - enc->minBytesPerChar); | 4488 next - enc->minBytesPerChar); |
| 4377 if (!name) | 4489 if (!name) |
| 4378 return XML_ERROR_NO_MEMORY; | 4490 return XML_ERROR_NO_MEMORY; |
| 4379 entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); | 4491 entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); |
| 4380 poolDiscard(&dtd->pool); | 4492 poolDiscard(&dtd->pool); |
| 4381 /* first, determine if a check for an existing declaration is needed; | 4493 /* first, determine if a check for an existing declaration is needed; |
| 4382 if yes, check that the entity exists, and that it is internal, | 4494 if yes, check that the entity exists, and that it is internal, |
| 4383 otherwise call the skipped entity handler | 4495 otherwise call the skipped entity handler |
| 4384 */ | 4496 */ |
| 4385 if (prologState.documentEntity && | 4497 if (prologState.documentEntity && |
| 4386 (dtd->standalone | 4498 (dtd->standalone |
| 4387 ? !openInternalEntities | 4499 ? !openInternalEntities |
| 4388 : !dtd->hasParamEntityRefs)) { | 4500 : !dtd->hasParamEntityRefs)) { |
| 4389 if (!entity) | 4501 if (!entity) |
| 4390 return XML_ERROR_UNDEFINED_ENTITY; | 4502 return XML_ERROR_UNDEFINED_ENTITY; |
| 4391 else if (!entity->is_internal) | 4503 else if (!entity->is_internal) |
| 4392 return XML_ERROR_ENTITY_DECLARED_IN_PE; | 4504 return XML_ERROR_ENTITY_DECLARED_IN_PE; |
| 4393 } | 4505 } |
| 4394 else if (!entity) { | 4506 else if (!entity) { |
| 4395 dtd->keepProcessing = dtd->standalone; | 4507 dtd->keepProcessing = dtd->standalone; |
| 4396 /* cannot report skipped entities in declarations */ | 4508 /* cannot report skipped entities in declarations */ |
| 4397 if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { | 4509 if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { |
| 4398 skippedEntityHandler(handlerArg, name, 1); | 4510 skippedEntityHandler(handlerArg, name, 1); |
| 4399 handleDefault = XML_FALSE; | 4511 handleDefault = XML_FALSE; |
| 4400 } | 4512 } |
| 4401 break; | 4513 break; |
| 4402 } | 4514 } |
| 4403 if (entity->open) | 4515 if (entity->open) |
| 4404 return XML_ERROR_RECURSIVE_ENTITY_REF; | 4516 return XML_ERROR_RECURSIVE_ENTITY_REF; |
| 4405 if (entity->textPtr) { | 4517 if (entity->textPtr) { |
| 4406 enum XML_Error result; | 4518 enum XML_Error result; |
| 4407 XML_Bool betweenDecl = | 4519 XML_Bool betweenDecl = |
| 4408 (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); | 4520 (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); |
| 4409 result = processInternalEntity(parser, entity, betweenDecl); | 4521 result = processInternalEntity(parser, entity, betweenDecl); |
| 4410 if (result != XML_ERROR_NONE) | 4522 if (result != XML_ERROR_NONE) |
| 4411 return result; | 4523 return result; |
| 4412 handleDefault = XML_FALSE; | 4524 handleDefault = XML_FALSE; |
| 4413 break; | 4525 break; |
| 4414 } | 4526 } |
| 4415 if (externalEntityRefHandler) { | 4527 if (externalEntityRefHandler) { |
| 4416 dtd->paramEntityRead = XML_FALSE; | 4528 dtd->paramEntityRead = XML_FALSE; |
| 4417 entity->open = XML_TRUE; | 4529 entity->open = XML_TRUE; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4592 case XML_ROLE_ELEMENT_NONE: | 4704 case XML_ROLE_ELEMENT_NONE: |
| 4593 if (elementDeclHandler) | 4705 if (elementDeclHandler) |
| 4594 handleDefault = XML_FALSE; | 4706 handleDefault = XML_FALSE; |
| 4595 break; | 4707 break; |
| 4596 } /* end of big switch */ | 4708 } /* end of big switch */ |
| 4597 | 4709 |
| 4598 if (handleDefault && defaultHandler) | 4710 if (handleDefault && defaultHandler) |
| 4599 reportDefault(parser, enc, s, next); | 4711 reportDefault(parser, enc, s, next); |
| 4600 | 4712 |
| 4601 switch (ps_parsing) { | 4713 switch (ps_parsing) { |
| 4602 case XML_SUSPENDED: | 4714 case XML_SUSPENDED: |
| 4603 *nextPtr = next; | 4715 *nextPtr = next; |
| 4604 return XML_ERROR_NONE; | 4716 return XML_ERROR_NONE; |
| 4605 case XML_FINISHED: | 4717 case XML_FINISHED: |
| 4606 return XML_ERROR_ABORTED; | 4718 return XML_ERROR_ABORTED; |
| 4607 default: | 4719 default: |
| 4608 s = next; | 4720 s = next; |
| 4609 tok = XmlPrologTok(enc, s, end, &next); | 4721 tok = XmlPrologTok(enc, s, end, &next); |
| 4610 } | 4722 } |
| 4611 } | 4723 } |
| 4612 /* not reached */ | 4724 /* not reached */ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4662 if (!ps_finalBuffer) { | 4774 if (!ps_finalBuffer) { |
| 4663 *nextPtr = s; | 4775 *nextPtr = s; |
| 4664 return XML_ERROR_NONE; | 4776 return XML_ERROR_NONE; |
| 4665 } | 4777 } |
| 4666 return XML_ERROR_PARTIAL_CHAR; | 4778 return XML_ERROR_PARTIAL_CHAR; |
| 4667 default: | 4779 default: |
| 4668 return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; | 4780 return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; |
| 4669 } | 4781 } |
| 4670 eventPtr = s = next; | 4782 eventPtr = s = next; |
| 4671 switch (ps_parsing) { | 4783 switch (ps_parsing) { |
| 4672 case XML_SUSPENDED: | 4784 case XML_SUSPENDED: |
| 4673 *nextPtr = next; | 4785 *nextPtr = next; |
| 4674 return XML_ERROR_NONE; | 4786 return XML_ERROR_NONE; |
| 4675 case XML_FINISHED: | 4787 case XML_FINISHED: |
| 4676 return XML_ERROR_ABORTED; | 4788 return XML_ERROR_ABORTED; |
| 4677 default: ; | 4789 default: ; |
| 4678 } | 4790 } |
| 4679 } | 4791 } |
| 4680 } | 4792 } |
| 4681 | 4793 |
| 4682 static enum XML_Error | 4794 static enum XML_Error |
| (...skipping 22 matching lines...) Expand all Loading... |
| 4705 openEntity->startTagLevel = tagLevel; | 4817 openEntity->startTagLevel = tagLevel; |
| 4706 openEntity->betweenDecl = betweenDecl; | 4818 openEntity->betweenDecl = betweenDecl; |
| 4707 openEntity->internalEventPtr = NULL; | 4819 openEntity->internalEventPtr = NULL; |
| 4708 openEntity->internalEventEndPtr = NULL; | 4820 openEntity->internalEventEndPtr = NULL; |
| 4709 textStart = (char *)entity->textPtr; | 4821 textStart = (char *)entity->textPtr; |
| 4710 textEnd = (char *)(entity->textPtr + entity->textLen); | 4822 textEnd = (char *)(entity->textPtr + entity->textLen); |
| 4711 | 4823 |
| 4712 #ifdef XML_DTD | 4824 #ifdef XML_DTD |
| 4713 if (entity->is_param) { | 4825 if (entity->is_param) { |
| 4714 int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); | 4826 int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); |
| 4715 result = doProlog(parser, internalEncoding, textStart, textEnd, tok, | 4827 result = doProlog(parser, internalEncoding, textStart, textEnd, tok, |
| 4716 next, &next, XML_FALSE); | 4828 next, &next, XML_FALSE); |
| 4717 } | 4829 } |
| 4718 else | 4830 else |
| 4719 #endif /* XML_DTD */ | 4831 #endif /* XML_DTD */ |
| 4720 result = doContent(parser, tagLevel, internalEncoding, textStart, | 4832 result = doContent(parser, tagLevel, internalEncoding, textStart, |
| 4721 textEnd, &next, XML_FALSE); | 4833 textEnd, &next, XML_FALSE); |
| 4722 | 4834 |
| 4723 if (result == XML_ERROR_NONE) { | 4835 if (result == XML_ERROR_NONE) { |
| 4724 if (textEnd != next && ps_parsing == XML_SUSPENDED) { | 4836 if (textEnd != next && ps_parsing == XML_SUSPENDED) { |
| 4725 entity->processed = (int)(next - textStart); | 4837 entity->processed = (int)(next - textStart); |
| 4726 processor = internalEntityProcessor; | 4838 processor = internalEntityProcessor; |
| 4727 } | 4839 } |
| 4728 else { | 4840 else { |
| 4729 entity->open = XML_FALSE; | 4841 entity->open = XML_FALSE; |
| 4730 openInternalEntities = openEntity->next; | 4842 openInternalEntities = openEntity->next; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4750 if (!openEntity) | 4862 if (!openEntity) |
| 4751 return XML_ERROR_UNEXPECTED_STATE; | 4863 return XML_ERROR_UNEXPECTED_STATE; |
| 4752 | 4864 |
| 4753 entity = openEntity->entity; | 4865 entity = openEntity->entity; |
| 4754 textStart = ((char *)entity->textPtr) + entity->processed; | 4866 textStart = ((char *)entity->textPtr) + entity->processed; |
| 4755 textEnd = (char *)(entity->textPtr + entity->textLen); | 4867 textEnd = (char *)(entity->textPtr + entity->textLen); |
| 4756 | 4868 |
| 4757 #ifdef XML_DTD | 4869 #ifdef XML_DTD |
| 4758 if (entity->is_param) { | 4870 if (entity->is_param) { |
| 4759 int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); | 4871 int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); |
| 4760 result = doProlog(parser, internalEncoding, textStart, textEnd, tok, | 4872 result = doProlog(parser, internalEncoding, textStart, textEnd, tok, |
| 4761 next, &next, XML_FALSE); | 4873 next, &next, XML_FALSE); |
| 4762 } | 4874 } |
| 4763 else | 4875 else |
| 4764 #endif /* XML_DTD */ | 4876 #endif /* XML_DTD */ |
| 4765 result = doContent(parser, openEntity->startTagLevel, internalEncoding, | 4877 result = doContent(parser, openEntity->startTagLevel, internalEncoding, |
| 4766 textStart, textEnd, &next, XML_FALSE); | 4878 textStart, textEnd, &next, XML_FALSE); |
| 4767 | 4879 |
| 4768 if (result != XML_ERROR_NONE) | 4880 if (result != XML_ERROR_NONE) |
| 4769 return result; | 4881 return result; |
| 4770 else if (textEnd != next && ps_parsing == XML_SUSPENDED) { | 4882 else if (textEnd != next && ps_parsing == XML_SUSPENDED) { |
| 4771 entity->processed = (int)(next - (char *)entity->textPtr); | 4883 entity->processed = (int)(next - (char *)entity->textPtr); |
| 4772 return result; | 4884 return result; |
| 4773 } | 4885 } |
| 4774 else { | 4886 else { |
| 4775 entity->open = XML_FALSE; | 4887 entity->open = XML_FALSE; |
| 4776 openInternalEntities = openEntity->next; | 4888 openInternalEntities = openEntity->next; |
| 4777 /* put openEntity back in list of free instances */ | 4889 /* put openEntity back in list of free instances */ |
| 4778 openEntity->next = freeInternalEntities; | 4890 openEntity->next = freeInternalEntities; |
| 4779 freeInternalEntities = openEntity; | 4891 freeInternalEntities = openEntity; |
| 4780 } | 4892 } |
| 4781 | 4893 |
| 4782 #ifdef XML_DTD | 4894 #ifdef XML_DTD |
| 4783 if (entity->is_param) { | 4895 if (entity->is_param) { |
| 4784 int tok; | 4896 int tok; |
| 4785 processor = prologProcessor; | 4897 processor = prologProcessor; |
| 4786 tok = XmlPrologTok(encoding, s, end, &next); | 4898 tok = XmlPrologTok(encoding, s, end, &next); |
| 4787 return doProlog(parser, encoding, s, end, tok, next, nextPtr, | 4899 return doProlog(parser, encoding, s, end, tok, next, nextPtr, |
| 4788 (XML_Bool)!ps_finalBuffer); | 4900 (XML_Bool)!ps_finalBuffer); |
| 4789 } | 4901 } |
| 4790 else | 4902 else |
| 4791 #endif /* XML_DTD */ | 4903 #endif /* XML_DTD */ |
| 4792 { | 4904 { |
| 4793 processor = contentProcessor; | 4905 processor = contentProcessor; |
| 4794 /* see externalEntityContentProcessor vs contentProcessor */ | 4906 /* see externalEntityContentProcessor vs contentProcessor */ |
| 4795 return doContent(parser, parentParser ? 1 : 0, encoding, s, end, | 4907 return doContent(parser, parentParser ? 1 : 0, encoding, s, end, |
| 4796 nextPtr, (XML_Bool)!ps_finalBuffer); | 4908 nextPtr, (XML_Bool)!ps_finalBuffer); |
| 4797 } | 4909 } |
| 4798 } | 4910 } |
| 4799 | 4911 |
| 4800 static enum XML_Error PTRCALL | 4912 static enum XML_Error PTRCALL |
| 4801 errorProcessor(XML_Parser parser, | 4913 errorProcessor(XML_Parser parser, |
| 4802 const char *s, | 4914 const char *s, |
| 4803 const char *end, | 4915 const char *end, |
| 4804 const char **nextPtr) | 4916 const char **nextPtr) |
| 4805 { | 4917 { |
| 4806 return errorCode; | 4918 return errorCode; |
| 4807 } | 4919 } |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4893 if (ch) { | 5005 if (ch) { |
| 4894 if (!poolAppendChar(pool, ch)) | 5006 if (!poolAppendChar(pool, ch)) |
| 4895 return XML_ERROR_NO_MEMORY; | 5007 return XML_ERROR_NO_MEMORY; |
| 4896 break; | 5008 break; |
| 4897 } | 5009 } |
| 4898 name = poolStoreString(&temp2Pool, enc, | 5010 name = poolStoreString(&temp2Pool, enc, |
| 4899 ptr + enc->minBytesPerChar, | 5011 ptr + enc->minBytesPerChar, |
| 4900 next - enc->minBytesPerChar); | 5012 next - enc->minBytesPerChar); |
| 4901 if (!name) | 5013 if (!name) |
| 4902 return XML_ERROR_NO_MEMORY; | 5014 return XML_ERROR_NO_MEMORY; |
| 4903 entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); | 5015 entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); |
| 4904 poolDiscard(&temp2Pool); | 5016 poolDiscard(&temp2Pool); |
| 4905 /* First, determine if a check for an existing declaration is needed; | 5017 /* First, determine if a check for an existing declaration is needed; |
| 4906 if yes, check that the entity exists, and that it is internal. | 5018 if yes, check that the entity exists, and that it is internal. |
| 4907 */ | 5019 */ |
| 4908 if (pool == &dtd->pool) /* are we called from prolog? */ | 5020 if (pool == &dtd->pool) /* are we called from prolog? */ |
| 4909 checkEntityDecl = | 5021 checkEntityDecl = |
| 4910 #ifdef XML_DTD | 5022 #ifdef XML_DTD |
| 4911 prologState.documentEntity && | 5023 prologState.documentEntity && |
| 4912 #endif /* XML_DTD */ | 5024 #endif /* XML_DTD */ |
| 4913 (dtd->standalone | 5025 (dtd->standalone |
| (...skipping 26 matching lines...) Expand all Loading... |
| 4940 return XML_ERROR_RECURSIVE_ENTITY_REF; | 5052 return XML_ERROR_RECURSIVE_ENTITY_REF; |
| 4941 } | 5053 } |
| 4942 if (entity->notation) { | 5054 if (entity->notation) { |
| 4943 if (enc == encoding) | 5055 if (enc == encoding) |
| 4944 eventPtr = ptr; | 5056 eventPtr = ptr; |
| 4945 return XML_ERROR_BINARY_ENTITY_REF; | 5057 return XML_ERROR_BINARY_ENTITY_REF; |
| 4946 } | 5058 } |
| 4947 if (!entity->textPtr) { | 5059 if (!entity->textPtr) { |
| 4948 if (enc == encoding) | 5060 if (enc == encoding) |
| 4949 eventPtr = ptr; | 5061 eventPtr = ptr; |
| 4950 return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; | 5062 return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; |
| 4951 } | 5063 } |
| 4952 else { | 5064 else { |
| 4953 enum XML_Error result; | 5065 enum XML_Error result; |
| 4954 const XML_Char *textEnd = entity->textPtr + entity->textLen; | 5066 const XML_Char *textEnd = entity->textPtr + entity->textLen; |
| 4955 entity->open = XML_TRUE; | 5067 entity->open = XML_TRUE; |
| 4956 result = appendAttributeValue(parser, internalEncoding, isCdata, | 5068 result = appendAttributeValue(parser, internalEncoding, isCdata, |
| 4957 (char *)entity->textPtr, | 5069 (char *)entity->textPtr, |
| 4958 (char *)textEnd, pool); | 5070 (char *)textEnd, pool); |
| 4959 entity->open = XML_FALSE; | 5071 entity->open = XML_FALSE; |
| 4960 if (result) | 5072 if (result) |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5002 if (isParamEntity || enc != encoding) { | 5114 if (isParamEntity || enc != encoding) { |
| 5003 const XML_Char *name; | 5115 const XML_Char *name; |
| 5004 ENTITY *entity; | 5116 ENTITY *entity; |
| 5005 name = poolStoreString(&tempPool, enc, | 5117 name = poolStoreString(&tempPool, enc, |
| 5006 entityTextPtr + enc->minBytesPerChar, | 5118 entityTextPtr + enc->minBytesPerChar, |
| 5007 next - enc->minBytesPerChar); | 5119 next - enc->minBytesPerChar); |
| 5008 if (!name) { | 5120 if (!name) { |
| 5009 result = XML_ERROR_NO_MEMORY; | 5121 result = XML_ERROR_NO_MEMORY; |
| 5010 goto endEntityValue; | 5122 goto endEntityValue; |
| 5011 } | 5123 } |
| 5012 entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); | 5124 entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); |
| 5013 poolDiscard(&tempPool); | 5125 poolDiscard(&tempPool); |
| 5014 if (!entity) { | 5126 if (!entity) { |
| 5015 /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ | 5127 /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ |
| 5016 /* cannot report skipped entity here - see comments on | 5128 /* cannot report skipped entity here - see comments on |
| 5017 skippedEntityHandler | 5129 skippedEntityHandler |
| 5018 if (skippedEntityHandler) | 5130 if (skippedEntityHandler) |
| 5019 skippedEntityHandler(handlerArg, name, 0); | 5131 skippedEntityHandler(handlerArg, name, 0); |
| 5020 */ | 5132 */ |
| 5021 dtd->keepProcessing = dtd->standalone; | 5133 dtd->keepProcessing = dtd->standalone; |
| 5022 goto endEntityValue; | 5134 goto endEntityValue; |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5292 for (name = elementType->name; *name; name++) { | 5404 for (name = elementType->name; *name; name++) { |
| 5293 if (*name == XML_T(ASCII_COLON)) { | 5405 if (*name == XML_T(ASCII_COLON)) { |
| 5294 PREFIX *prefix; | 5406 PREFIX *prefix; |
| 5295 const XML_Char *s; | 5407 const XML_Char *s; |
| 5296 for (s = elementType->name; s != name; s++) { | 5408 for (s = elementType->name; s != name; s++) { |
| 5297 if (!poolAppendChar(&dtd->pool, *s)) | 5409 if (!poolAppendChar(&dtd->pool, *s)) |
| 5298 return 0; | 5410 return 0; |
| 5299 } | 5411 } |
| 5300 if (!poolAppendChar(&dtd->pool, XML_T('\0'))) | 5412 if (!poolAppendChar(&dtd->pool, XML_T('\0'))) |
| 5301 return 0; | 5413 return 0; |
| 5302 prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), | 5414 prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), |
| 5303 sizeof(PREFIX)); | 5415 sizeof(PREFIX)); |
| 5304 if (!prefix) | 5416 if (!prefix) |
| 5305 return 0; | 5417 return 0; |
| 5306 if (prefix->name == poolStart(&dtd->pool)) | 5418 if (prefix->name == poolStart(&dtd->pool)) |
| 5307 poolFinish(&dtd->pool); | 5419 poolFinish(&dtd->pool); |
| 5308 else | 5420 else |
| 5309 poolDiscard(&dtd->pool); | 5421 poolDiscard(&dtd->pool); |
| 5310 elementType->prefix = prefix; | 5422 elementType->prefix = prefix; |
| 5311 | 5423 |
| 5312 } | 5424 } |
| 5313 } | 5425 } |
| 5314 return 1; | 5426 return 1; |
| 5315 } | 5427 } |
| 5316 | 5428 |
| 5317 static ATTRIBUTE_ID * | 5429 static ATTRIBUTE_ID * |
| 5318 getAttributeId(XML_Parser parser, const ENCODING *enc, | 5430 getAttributeId(XML_Parser parser, const ENCODING *enc, |
| 5319 const char *start, const char *end) | 5431 const char *start, const char *end) |
| 5320 { | 5432 { |
| 5321 DTD * const dtd = _dtd; /* save one level of indirection */ | 5433 DTD * const dtd = _dtd; /* save one level of indirection */ |
| 5322 ATTRIBUTE_ID *id; | 5434 ATTRIBUTE_ID *id; |
| 5323 const XML_Char *name; | 5435 const XML_Char *name; |
| 5324 if (!poolAppendChar(&dtd->pool, XML_T('\0'))) | 5436 if (!poolAppendChar(&dtd->pool, XML_T('\0'))) |
| 5325 return NULL; | 5437 return NULL; |
| 5326 name = poolStoreString(&dtd->pool, enc, start, end); | 5438 name = poolStoreString(&dtd->pool, enc, start, end); |
| 5327 if (!name) | 5439 if (!name) |
| 5328 return NULL; | 5440 return NULL; |
| 5329 /* skip quotation mark - its storage will be re-used (like in name[-1]) */ | 5441 /* skip quotation mark - its storage will be re-used (like in name[-1]) */ |
| 5330 ++name; | 5442 ++name; |
| 5331 id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); | 5443 id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE
_ID)); |
| 5332 if (!id) | 5444 if (!id) |
| 5333 return NULL; | 5445 return NULL; |
| 5334 if (id->name != name) | 5446 if (id->name != name) |
| 5335 poolDiscard(&dtd->pool); | 5447 poolDiscard(&dtd->pool); |
| 5336 else { | 5448 else { |
| 5337 poolFinish(&dtd->pool); | 5449 poolFinish(&dtd->pool); |
| 5338 if (!ns) | 5450 if (!ns) |
| 5339 ; | 5451 ; |
| 5340 else if (name[0] == XML_T(ASCII_x) | 5452 else if (name[0] == XML_T(ASCII_x) |
| 5341 && name[1] == XML_T(ASCII_m) | 5453 && name[1] == XML_T(ASCII_m) |
| 5342 && name[2] == XML_T(ASCII_l) | 5454 && name[2] == XML_T(ASCII_l) |
| 5343 && name[3] == XML_T(ASCII_n) | 5455 && name[3] == XML_T(ASCII_n) |
| 5344 && name[4] == XML_T(ASCII_s) | 5456 && name[4] == XML_T(ASCII_s) |
| 5345 && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { | 5457 && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { |
| 5346 if (name[5] == XML_T('\0')) | 5458 if (name[5] == XML_T('\0')) |
| 5347 id->prefix = &dtd->defaultPrefix; | 5459 id->prefix = &dtd->defaultPrefix; |
| 5348 else | 5460 else |
| 5349 id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); | 5461 id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(P
REFIX)); |
| 5350 id->xmlns = XML_TRUE; | 5462 id->xmlns = XML_TRUE; |
| 5351 } | 5463 } |
| 5352 else { | 5464 else { |
| 5353 int i; | 5465 int i; |
| 5354 for (i = 0; name[i]; i++) { | 5466 for (i = 0; name[i]; i++) { |
| 5355 /* attributes without prefix are *not* in the default namespace */ | 5467 /* attributes without prefix are *not* in the default namespace */ |
| 5356 if (name[i] == XML_T(ASCII_COLON)) { | 5468 if (name[i] == XML_T(ASCII_COLON)) { |
| 5357 int j; | 5469 int j; |
| 5358 for (j = 0; j < i; j++) { | 5470 for (j = 0; j < i; j++) { |
| 5359 if (!poolAppendChar(&dtd->pool, name[j])) | 5471 if (!poolAppendChar(&dtd->pool, name[j])) |
| 5360 return NULL; | 5472 return NULL; |
| 5361 } | 5473 } |
| 5362 if (!poolAppendChar(&dtd->pool, XML_T('\0'))) | 5474 if (!poolAppendChar(&dtd->pool, XML_T('\0'))) |
| 5363 return NULL; | 5475 return NULL; |
| 5364 id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), | 5476 id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->
pool), |
| 5365 sizeof(PREFIX)); | 5477 sizeof(PREFIX)); |
| 5366 if (id->prefix->name == poolStart(&dtd->pool)) | 5478 if (id->prefix->name == poolStart(&dtd->pool)) |
| 5367 poolFinish(&dtd->pool); | 5479 poolFinish(&dtd->pool); |
| 5368 else | 5480 else |
| 5369 poolDiscard(&dtd->pool); | 5481 poolDiscard(&dtd->pool); |
| 5370 break; | 5482 break; |
| 5371 } | 5483 } |
| 5372 } | 5484 } |
| 5373 } | 5485 } |
| 5374 } | 5486 } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5450 setContext(XML_Parser parser, const XML_Char *context) | 5562 setContext(XML_Parser parser, const XML_Char *context) |
| 5451 { | 5563 { |
| 5452 DTD * const dtd = _dtd; /* save one level of indirection */ | 5564 DTD * const dtd = _dtd; /* save one level of indirection */ |
| 5453 const XML_Char *s = context; | 5565 const XML_Char *s = context; |
| 5454 | 5566 |
| 5455 while (*context != XML_T('\0')) { | 5567 while (*context != XML_T('\0')) { |
| 5456 if (*s == CONTEXT_SEP || *s == XML_T('\0')) { | 5568 if (*s == CONTEXT_SEP || *s == XML_T('\0')) { |
| 5457 ENTITY *e; | 5569 ENTITY *e; |
| 5458 if (!poolAppendChar(&tempPool, XML_T('\0'))) | 5570 if (!poolAppendChar(&tempPool, XML_T('\0'))) |
| 5459 return XML_FALSE; | 5571 return XML_FALSE; |
| 5460 e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); | 5572 e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool),
0); |
| 5461 if (e) | 5573 if (e) |
| 5462 e->open = XML_TRUE; | 5574 e->open = XML_TRUE; |
| 5463 if (*s != XML_T('\0')) | 5575 if (*s != XML_T('\0')) |
| 5464 s++; | 5576 s++; |
| 5465 context = s; | 5577 context = s; |
| 5466 poolDiscard(&tempPool); | 5578 poolDiscard(&tempPool); |
| 5467 } | 5579 } |
| 5468 else if (*s == XML_T(ASCII_EQUALS)) { | 5580 else if (*s == XML_T(ASCII_EQUALS)) { |
| 5469 PREFIX *prefix; | 5581 PREFIX *prefix; |
| 5470 if (poolLength(&tempPool) == 0) | 5582 if (poolLength(&tempPool) == 0) |
| 5471 prefix = &dtd->defaultPrefix; | 5583 prefix = &dtd->defaultPrefix; |
| 5472 else { | 5584 else { |
| 5473 if (!poolAppendChar(&tempPool, XML_T('\0'))) | 5585 if (!poolAppendChar(&tempPool, XML_T('\0'))) |
| 5474 return XML_FALSE; | 5586 return XML_FALSE; |
| 5475 prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), | 5587 prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool), |
| 5476 sizeof(PREFIX)); | 5588 sizeof(PREFIX)); |
| 5477 if (!prefix) | 5589 if (!prefix) |
| 5478 return XML_FALSE; | 5590 return XML_FALSE; |
| 5479 if (prefix->name == poolStart(&tempPool)) { | 5591 if (prefix->name == poolStart(&tempPool)) { |
| 5480 prefix->name = poolCopyString(&dtd->pool, prefix->name); | 5592 prefix->name = poolCopyString(&dtd->pool, prefix->name); |
| 5481 if (!prefix->name) | 5593 if (!prefix->name) |
| 5482 return XML_FALSE; | 5594 return XML_FALSE; |
| 5483 } | 5595 } |
| 5484 poolDiscard(&tempPool); | 5596 poolDiscard(&tempPool); |
| 5485 } | 5597 } |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5629 ms->free_fcn(p->scaffIndex); | 5741 ms->free_fcn(p->scaffIndex); |
| 5630 ms->free_fcn(p->scaffold); | 5742 ms->free_fcn(p->scaffold); |
| 5631 } | 5743 } |
| 5632 ms->free_fcn(p); | 5744 ms->free_fcn(p); |
| 5633 } | 5745 } |
| 5634 | 5746 |
| 5635 /* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. | 5747 /* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. |
| 5636 The new DTD has already been initialized. | 5748 The new DTD has already been initialized. |
| 5637 */ | 5749 */ |
| 5638 static int | 5750 static int |
| 5639 dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) | 5751 dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_H
andling_Suite *ms) |
| 5640 { | 5752 { |
| 5641 HASH_TABLE_ITER iter; | 5753 HASH_TABLE_ITER iter; |
| 5642 | 5754 |
| 5643 /* Copy the prefix table. */ | 5755 /* Copy the prefix table. */ |
| 5644 | 5756 |
| 5645 hashTableIterInit(&iter, &(oldDtd->prefixes)); | 5757 hashTableIterInit(&iter, &(oldDtd->prefixes)); |
| 5646 for (;;) { | 5758 for (;;) { |
| 5647 const XML_Char *name; | 5759 const XML_Char *name; |
| 5648 const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); | 5760 const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); |
| 5649 if (!oldP) | 5761 if (!oldP) |
| 5650 break; | 5762 break; |
| 5651 name = poolCopyString(&(newDtd->pool), oldP->name); | 5763 name = poolCopyString(&(newDtd->pool), oldP->name); |
| 5652 if (!name) | 5764 if (!name) |
| 5653 return 0; | 5765 return 0; |
| 5654 if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) | 5766 if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) |
| 5655 return 0; | 5767 return 0; |
| 5656 } | 5768 } |
| 5657 | 5769 |
| 5658 hashTableIterInit(&iter, &(oldDtd->attributeIds)); | 5770 hashTableIterInit(&iter, &(oldDtd->attributeIds)); |
| 5659 | 5771 |
| 5660 /* Copy the attribute id table. */ | 5772 /* Copy the attribute id table. */ |
| 5661 | 5773 |
| 5662 for (;;) { | 5774 for (;;) { |
| 5663 ATTRIBUTE_ID *newA; | 5775 ATTRIBUTE_ID *newA; |
| 5664 const XML_Char *name; | 5776 const XML_Char *name; |
| 5665 const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); | 5777 const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); |
| 5666 | 5778 |
| 5667 if (!oldA) | 5779 if (!oldA) |
| 5668 break; | 5780 break; |
| 5669 /* Remember to allocate the scratch byte before the name. */ | 5781 /* Remember to allocate the scratch byte before the name. */ |
| 5670 if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) | 5782 if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) |
| 5671 return 0; | 5783 return 0; |
| 5672 name = poolCopyString(&(newDtd->pool), oldA->name); | 5784 name = poolCopyString(&(newDtd->pool), oldA->name); |
| 5673 if (!name) | 5785 if (!name) |
| 5674 return 0; | 5786 return 0; |
| 5675 ++name; | 5787 ++name; |
| 5676 newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, | 5788 newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, |
| 5677 sizeof(ATTRIBUTE_ID)); | 5789 sizeof(ATTRIBUTE_ID)); |
| 5678 if (!newA) | 5790 if (!newA) |
| 5679 return 0; | 5791 return 0; |
| 5680 newA->maybeTokenized = oldA->maybeTokenized; | 5792 newA->maybeTokenized = oldA->maybeTokenized; |
| 5681 if (oldA->prefix) { | 5793 if (oldA->prefix) { |
| 5682 newA->xmlns = oldA->xmlns; | 5794 newA->xmlns = oldA->xmlns; |
| 5683 if (oldA->prefix == &oldDtd->defaultPrefix) | 5795 if (oldA->prefix == &oldDtd->defaultPrefix) |
| 5684 newA->prefix = &newDtd->defaultPrefix; | 5796 newA->prefix = &newDtd->defaultPrefix; |
| 5685 else | 5797 else |
| 5686 newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), | 5798 newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), |
| 5687 oldA->prefix->name, 0); | 5799 oldA->prefix->name, 0); |
| 5688 } | 5800 } |
| 5689 } | 5801 } |
| 5690 | 5802 |
| 5691 /* Copy the element type table. */ | 5803 /* Copy the element type table. */ |
| 5692 | 5804 |
| 5693 hashTableIterInit(&iter, &(oldDtd->elementTypes)); | 5805 hashTableIterInit(&iter, &(oldDtd->elementTypes)); |
| 5694 | 5806 |
| 5695 for (;;) { | 5807 for (;;) { |
| 5696 int i; | 5808 int i; |
| 5697 ELEMENT_TYPE *newE; | 5809 ELEMENT_TYPE *newE; |
| 5698 const XML_Char *name; | 5810 const XML_Char *name; |
| 5699 const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); | 5811 const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); |
| 5700 if (!oldE) | 5812 if (!oldE) |
| 5701 break; | 5813 break; |
| 5702 name = poolCopyString(&(newDtd->pool), oldE->name); | 5814 name = poolCopyString(&(newDtd->pool), oldE->name); |
| 5703 if (!name) | 5815 if (!name) |
| 5704 return 0; | 5816 return 0; |
| 5705 newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, | 5817 newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, |
| 5706 sizeof(ELEMENT_TYPE)); | 5818 sizeof(ELEMENT_TYPE)); |
| 5707 if (!newE) | 5819 if (!newE) |
| 5708 return 0; | 5820 return 0; |
| 5709 if (oldE->nDefaultAtts) { | 5821 if (oldE->nDefaultAtts) { |
| 5710 newE->defaultAtts = (DEFAULT_ATTRIBUTE *) | 5822 newE->defaultAtts = (DEFAULT_ATTRIBUTE *) |
| 5711 ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); | 5823 ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); |
| 5712 if (!newE->defaultAtts) { | 5824 if (!newE->defaultAtts) { |
| 5713 ms->free_fcn(newE); | 5825 ms->free_fcn(newE); |
| 5714 return 0; | 5826 return 0; |
| 5715 } | 5827 } |
| 5716 } | 5828 } |
| 5717 if (oldE->idAtt) | 5829 if (oldE->idAtt) |
| 5718 newE->idAtt = (ATTRIBUTE_ID *) | 5830 newE->idAtt = (ATTRIBUTE_ID *) |
| 5719 lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); | 5831 lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); |
| 5720 newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; | 5832 newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; |
| 5721 if (oldE->prefix) | 5833 if (oldE->prefix) |
| 5722 newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), | 5834 newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), |
| 5723 oldE->prefix->name, 0); | 5835 oldE->prefix->name, 0); |
| 5724 for (i = 0; i < newE->nDefaultAtts; i++) { | 5836 for (i = 0; i < newE->nDefaultAtts; i++) { |
| 5725 newE->defaultAtts[i].id = (ATTRIBUTE_ID *) | 5837 newE->defaultAtts[i].id = (ATTRIBUTE_ID *) |
| 5726 lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); | 5838 lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->na
me, 0); |
| 5727 newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; | 5839 newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; |
| 5728 if (oldE->defaultAtts[i].value) { | 5840 if (oldE->defaultAtts[i].value) { |
| 5729 newE->defaultAtts[i].value | 5841 newE->defaultAtts[i].value |
| 5730 = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); | 5842 = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); |
| 5731 if (!newE->defaultAtts[i].value) | 5843 if (!newE->defaultAtts[i].value) |
| 5732 return 0; | 5844 return 0; |
| 5733 } | 5845 } |
| 5734 else | 5846 else |
| 5735 newE->defaultAtts[i].value = NULL; | 5847 newE->defaultAtts[i].value = NULL; |
| 5736 } | 5848 } |
| 5737 } | 5849 } |
| 5738 | 5850 |
| 5739 /* Copy the entity tables. */ | 5851 /* Copy the entity tables. */ |
| 5740 if (!copyEntityTable(&(newDtd->generalEntities), | 5852 if (!copyEntityTable(oldParser, |
| 5853 &(newDtd->generalEntities), |
| 5741 &(newDtd->pool), | 5854 &(newDtd->pool), |
| 5742 &(oldDtd->generalEntities))) | 5855 &(oldDtd->generalEntities))) |
| 5743 return 0; | 5856 return 0; |
| 5744 | 5857 |
| 5745 #ifdef XML_DTD | 5858 #ifdef XML_DTD |
| 5746 if (!copyEntityTable(&(newDtd->paramEntities), | 5859 if (!copyEntityTable(oldParser, |
| 5860 &(newDtd->paramEntities), |
| 5747 &(newDtd->pool), | 5861 &(newDtd->pool), |
| 5748 &(oldDtd->paramEntities))) | 5862 &(oldDtd->paramEntities))) |
| 5749 return 0; | 5863 return 0; |
| 5750 newDtd->paramEntityRead = oldDtd->paramEntityRead; | 5864 newDtd->paramEntityRead = oldDtd->paramEntityRead; |
| 5751 #endif /* XML_DTD */ | 5865 #endif /* XML_DTD */ |
| 5752 | 5866 |
| 5753 newDtd->keepProcessing = oldDtd->keepProcessing; | 5867 newDtd->keepProcessing = oldDtd->keepProcessing; |
| 5754 newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; | 5868 newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; |
| 5755 newDtd->standalone = oldDtd->standalone; | 5869 newDtd->standalone = oldDtd->standalone; |
| 5756 | 5870 |
| 5757 /* Don't want deep copying for scaffolding */ | 5871 /* Don't want deep copying for scaffolding */ |
| 5758 newDtd->in_eldecl = oldDtd->in_eldecl; | 5872 newDtd->in_eldecl = oldDtd->in_eldecl; |
| 5759 newDtd->scaffold = oldDtd->scaffold; | 5873 newDtd->scaffold = oldDtd->scaffold; |
| 5760 newDtd->contentStringLen = oldDtd->contentStringLen; | 5874 newDtd->contentStringLen = oldDtd->contentStringLen; |
| 5761 newDtd->scaffSize = oldDtd->scaffSize; | 5875 newDtd->scaffSize = oldDtd->scaffSize; |
| 5762 newDtd->scaffLevel = oldDtd->scaffLevel; | 5876 newDtd->scaffLevel = oldDtd->scaffLevel; |
| 5763 newDtd->scaffIndex = oldDtd->scaffIndex; | 5877 newDtd->scaffIndex = oldDtd->scaffIndex; |
| 5764 | 5878 |
| 5765 return 1; | 5879 return 1; |
| 5766 } /* End dtdCopy */ | 5880 } /* End dtdCopy */ |
| 5767 | 5881 |
| 5768 static int | 5882 static int |
| 5769 copyEntityTable(HASH_TABLE *newTable, | 5883 copyEntityTable(XML_Parser oldParser, |
| 5884 HASH_TABLE *newTable, |
| 5770 STRING_POOL *newPool, | 5885 STRING_POOL *newPool, |
| 5771 const HASH_TABLE *oldTable) | 5886 const HASH_TABLE *oldTable) |
| 5772 { | 5887 { |
| 5773 HASH_TABLE_ITER iter; | 5888 HASH_TABLE_ITER iter; |
| 5774 const XML_Char *cachedOldBase = NULL; | 5889 const XML_Char *cachedOldBase = NULL; |
| 5775 const XML_Char *cachedNewBase = NULL; | 5890 const XML_Char *cachedNewBase = NULL; |
| 5776 | 5891 |
| 5777 hashTableIterInit(&iter, oldTable); | 5892 hashTableIterInit(&iter, oldTable); |
| 5778 | 5893 |
| 5779 for (;;) { | 5894 for (;;) { |
| 5780 ENTITY *newE; | 5895 ENTITY *newE; |
| 5781 const XML_Char *name; | 5896 const XML_Char *name; |
| 5782 const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); | 5897 const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); |
| 5783 if (!oldE) | 5898 if (!oldE) |
| 5784 break; | 5899 break; |
| 5785 name = poolCopyString(newPool, oldE->name); | 5900 name = poolCopyString(newPool, oldE->name); |
| 5786 if (!name) | 5901 if (!name) |
| 5787 return 0; | 5902 return 0; |
| 5788 newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); | 5903 newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); |
| 5789 if (!newE) | 5904 if (!newE) |
| 5790 return 0; | 5905 return 0; |
| 5791 if (oldE->systemId) { | 5906 if (oldE->systemId) { |
| 5792 const XML_Char *tem = poolCopyString(newPool, oldE->systemId); | 5907 const XML_Char *tem = poolCopyString(newPool, oldE->systemId); |
| 5793 if (!tem) | 5908 if (!tem) |
| 5794 return 0; | 5909 return 0; |
| 5795 newE->systemId = tem; | 5910 newE->systemId = tem; |
| 5796 if (oldE->base) { | 5911 if (oldE->base) { |
| 5797 if (oldE->base == cachedOldBase) | 5912 if (oldE->base == cachedOldBase) |
| 5798 newE->base = cachedNewBase; | 5913 newE->base = cachedNewBase; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5836 static XML_Bool FASTCALL | 5951 static XML_Bool FASTCALL |
| 5837 keyeq(KEY s1, KEY s2) | 5952 keyeq(KEY s1, KEY s2) |
| 5838 { | 5953 { |
| 5839 for (; *s1 == *s2; s1++, s2++) | 5954 for (; *s1 == *s2; s1++, s2++) |
| 5840 if (*s1 == 0) | 5955 if (*s1 == 0) |
| 5841 return XML_TRUE; | 5956 return XML_TRUE; |
| 5842 return XML_FALSE; | 5957 return XML_FALSE; |
| 5843 } | 5958 } |
| 5844 | 5959 |
| 5845 static unsigned long FASTCALL | 5960 static unsigned long FASTCALL |
| 5846 hash(KEY s) | 5961 hash(XML_Parser parser, KEY s) |
| 5847 { | 5962 { |
| 5848 unsigned long h = 0; | 5963 unsigned long h = hash_secret_salt; |
| 5849 while (*s) | 5964 while (*s) |
| 5850 h = CHAR_HASH(h, *s++); | 5965 h = CHAR_HASH(h, *s++); |
| 5851 return h; | 5966 return h; |
| 5852 } | 5967 } |
| 5853 | 5968 |
| 5854 static NAMED * | 5969 static NAMED * |
| 5855 lookup(HASH_TABLE *table, KEY name, size_t createSize) | 5970 lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) |
| 5856 { | 5971 { |
| 5857 size_t i; | 5972 size_t i; |
| 5858 if (table->size == 0) { | 5973 if (table->size == 0) { |
| 5859 size_t tsize; | 5974 size_t tsize; |
| 5860 if (!createSize) | 5975 if (!createSize) |
| 5861 return NULL; | 5976 return NULL; |
| 5862 table->power = INIT_POWER; | 5977 table->power = INIT_POWER; |
| 5863 /* table->size is a power of 2 */ | 5978 /* table->size is a power of 2 */ |
| 5864 table->size = (size_t)1 << INIT_POWER; | 5979 table->size = (size_t)1 << INIT_POWER; |
| 5865 tsize = table->size * sizeof(NAMED *); | 5980 tsize = table->size * sizeof(NAMED *); |
| 5866 table->v = (NAMED **)table->mem->malloc_fcn(tsize); | 5981 table->v = (NAMED **)table->mem->malloc_fcn(tsize); |
| 5867 if (!table->v) { | 5982 if (!table->v) { |
| 5868 table->size = 0; | 5983 table->size = 0; |
| 5869 return NULL; | 5984 return NULL; |
| 5870 } | 5985 } |
| 5871 memset(table->v, 0, tsize); | 5986 memset(table->v, 0, tsize); |
| 5872 i = hash(name) & ((unsigned long)table->size - 1); | 5987 i = hash(parser, name) & ((unsigned long)table->size - 1); |
| 5873 } | 5988 } |
| 5874 else { | 5989 else { |
| 5875 unsigned long h = hash(name); | 5990 unsigned long h = hash(parser, name); |
| 5876 unsigned long mask = (unsigned long)table->size - 1; | 5991 unsigned long mask = (unsigned long)table->size - 1; |
| 5877 unsigned char step = 0; | 5992 unsigned char step = 0; |
| 5878 i = h & mask; | 5993 i = h & mask; |
| 5879 while (table->v[i]) { | 5994 while (table->v[i]) { |
| 5880 if (keyeq(name, table->v[i]->name)) | 5995 if (keyeq(name, table->v[i]->name)) |
| 5881 return table->v[i]; | 5996 return table->v[i]; |
| 5882 if (!step) | 5997 if (!step) |
| 5883 step = PROBE_STEP(h, mask, table->power); | 5998 step = PROBE_STEP(h, mask, table->power); |
| 5884 i < step ? (i += table->size - step) : (i -= step); | 5999 i < step ? (i += table->size - step) : (i -= step); |
| 5885 } | 6000 } |
| 5886 if (!createSize) | 6001 if (!createSize) |
| 5887 return NULL; | 6002 return NULL; |
| 5888 | 6003 |
| 5889 /* check for overflow (table is half full) */ | 6004 /* check for overflow (table is half full) */ |
| 5890 if (table->used >> (table->power - 1)) { | 6005 if (table->used >> (table->power - 1)) { |
| 5891 unsigned char newPower = table->power + 1; | 6006 unsigned char newPower = table->power + 1; |
| 5892 size_t newSize = (size_t)1 << newPower; | 6007 size_t newSize = (size_t)1 << newPower; |
| 5893 unsigned long newMask = (unsigned long)newSize - 1; | 6008 unsigned long newMask = (unsigned long)newSize - 1; |
| 5894 size_t tsize = newSize * sizeof(NAMED *); | 6009 size_t tsize = newSize * sizeof(NAMED *); |
| 5895 NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); | 6010 NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); |
| 5896 if (!newV) | 6011 if (!newV) |
| 5897 return NULL; | 6012 return NULL; |
| 5898 memset(newV, 0, tsize); | 6013 memset(newV, 0, tsize); |
| 5899 for (i = 0; i < table->size; i++) | 6014 for (i = 0; i < table->size; i++) |
| 5900 if (table->v[i]) { | 6015 if (table->v[i]) { |
| 5901 unsigned long newHash = hash(table->v[i]->name); | 6016 unsigned long newHash = hash(parser, table->v[i]->name); |
| 5902 size_t j = newHash & newMask; | 6017 size_t j = newHash & newMask; |
| 5903 step = 0; | 6018 step = 0; |
| 5904 while (newV[j]) { | 6019 while (newV[j]) { |
| 5905 if (!step) | 6020 if (!step) |
| 5906 step = PROBE_STEP(newHash, newMask, newPower); | 6021 step = PROBE_STEP(newHash, newMask, newPower); |
| 5907 j < step ? (j += newSize - step) : (j -= step); | 6022 j < step ? (j += newSize - step) : (j -= step); |
| 5908 } | 6023 } |
| 5909 newV[j] = table->v[i]; | 6024 newV[j] = table->v[i]; |
| 5910 } | 6025 } |
| 5911 table->mem->free_fcn(table->v); | 6026 table->mem->free_fcn(table->v); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6112 memcpy(pool->blocks->s, pool->start, | 6227 memcpy(pool->blocks->s, pool->start, |
| 6113 (pool->end - pool->start) * sizeof(XML_Char)); | 6228 (pool->end - pool->start) * sizeof(XML_Char)); |
| 6114 pool->ptr = pool->blocks->s + (pool->ptr - pool->start); | 6229 pool->ptr = pool->blocks->s + (pool->ptr - pool->start); |
| 6115 pool->start = pool->blocks->s; | 6230 pool->start = pool->blocks->s; |
| 6116 pool->end = pool->start + pool->blocks->size; | 6231 pool->end = pool->start + pool->blocks->size; |
| 6117 return XML_TRUE; | 6232 return XML_TRUE; |
| 6118 } | 6233 } |
| 6119 } | 6234 } |
| 6120 if (pool->blocks && pool->start == pool->blocks->s) { | 6235 if (pool->blocks && pool->start == pool->blocks->s) { |
| 6121 int blockSize = (int)(pool->end - pool->start)*2; | 6236 int blockSize = (int)(pool->end - pool->start)*2; |
| 6122 pool->blocks = (BLOCK *) | 6237 BLOCK *temp = (BLOCK *) |
| 6123 pool->mem->realloc_fcn(pool->blocks, | 6238 pool->mem->realloc_fcn(pool->blocks, |
| 6124 (offsetof(BLOCK, s) | 6239 (offsetof(BLOCK, s) |
| 6125 + blockSize * sizeof(XML_Char))); | 6240 + blockSize * sizeof(XML_Char))); |
| 6126 if (pool->blocks == NULL) | 6241 if (temp == NULL) |
| 6127 return XML_FALSE; | 6242 return XML_FALSE; |
| 6243 pool->blocks = temp; |
| 6128 pool->blocks->size = blockSize; | 6244 pool->blocks->size = blockSize; |
| 6129 pool->ptr = pool->blocks->s + (pool->ptr - pool->start); | 6245 pool->ptr = pool->blocks->s + (pool->ptr - pool->start); |
| 6130 pool->start = pool->blocks->s; | 6246 pool->start = pool->blocks->s; |
| 6131 pool->end = pool->start + blockSize; | 6247 pool->end = pool->start + blockSize; |
| 6132 } | 6248 } |
| 6133 else { | 6249 else { |
| 6134 BLOCK *tem; | 6250 BLOCK *tem; |
| 6135 int blockSize = (int)(pool->end - pool->start); | 6251 int blockSize = (int)(pool->end - pool->start); |
| 6136 if (blockSize < INIT_BLOCK_SIZE) | 6252 if (blockSize < INIT_BLOCK_SIZE) |
| 6137 blockSize = INIT_BLOCK_SIZE; | 6253 blockSize = INIT_BLOCK_SIZE; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6266 const ENCODING *enc, | 6382 const ENCODING *enc, |
| 6267 const char *ptr, | 6383 const char *ptr, |
| 6268 const char *end) | 6384 const char *end) |
| 6269 { | 6385 { |
| 6270 DTD * const dtd = _dtd; /* save one level of indirection */ | 6386 DTD * const dtd = _dtd; /* save one level of indirection */ |
| 6271 const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); | 6387 const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); |
| 6272 ELEMENT_TYPE *ret; | 6388 ELEMENT_TYPE *ret; |
| 6273 | 6389 |
| 6274 if (!name) | 6390 if (!name) |
| 6275 return NULL; | 6391 return NULL; |
| 6276 ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); | 6392 ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT
_TYPE)); |
| 6277 if (!ret) | 6393 if (!ret) |
| 6278 return NULL; | 6394 return NULL; |
| 6279 if (ret->name != name) | 6395 if (ret->name != name) |
| 6280 poolDiscard(&dtd->pool); | 6396 poolDiscard(&dtd->pool); |
| 6281 else { | 6397 else { |
| 6282 poolFinish(&dtd->pool); | 6398 poolFinish(&dtd->pool); |
| 6283 if (!setElementTypePrefix(parser, ret)) | 6399 if (!setElementTypePrefix(parser, ret)) |
| 6284 return NULL; | 6400 return NULL; |
| 6285 } | 6401 } |
| 6286 return ret; | 6402 return ret; |
| 6287 } | 6403 } |
| OLD | NEW |