[Faxpp-devel] SF.net SVN: faxpp: [46] trunk/faxpp/src
Status: Beta
Brought to you by:
jpcs
From: <jp...@us...> - 2008-03-18 13:36:22
|
Revision: 46 http://faxpp.svn.sourceforge.net/faxpp/?rev=46&view=rev Author: jpcs Date: 2008-03-18 06:35:36 -0700 (Tue, 18 Mar 2008) Log Message: ----------- Fixed various bugs shown up by the XML conformance tests. Modified Paths: -------------- trunk/faxpp/src/reference.c trunk/faxpp/src/tokenizer_states.c trunk/faxpp/src/tokenizer_states.h trunk/faxpp/src/xml_parser.c trunk/faxpp/src/xml_parser.h Modified: trunk/faxpp/src/reference.c =================================================================== --- trunk/faxpp/src/reference.c 2008-03-17 10:41:03 UTC (rev 45) +++ trunk/faxpp/src/reference.c 2008-03-18 13:35:36 UTC (rev 46) @@ -334,6 +334,25 @@ FAXPP_Error parameter_entity_reference_state(FAXPP_TokenizerEnv *env) { + read_char(env); + + env->state = parameter_entity_reference_state2; + + switch(env->current_char) { + LINE_ENDINGS + default: + next_char(env); + if((FAXPP_char_flags(env->current_char) & env->ncname_start_char) == 0) + return INVALID_CHAR_IN_ENTITY_REFERENCE; + break; + } + + return NO_ERROR; +} + +FAXPP_Error +parameter_entity_reference_state2(FAXPP_TokenizerEnv *env) +{ while(1) { read_char(env); @@ -361,6 +380,25 @@ FAXPP_Error parameter_entity_reference_in_markup_state(FAXPP_TokenizerEnv *env) { + read_char(env); + + env->state = parameter_entity_reference_in_markup_state2; + + switch(env->current_char) { + LINE_ENDINGS + default: + next_char(env); + if((FAXPP_char_flags(env->current_char) & env->ncname_start_char) == 0) + return INVALID_CHAR_IN_ENTITY_REFERENCE; + break; + } + + return NO_ERROR; +} + +FAXPP_Error +parameter_entity_reference_in_markup_state2(FAXPP_TokenizerEnv *env) +{ while(1) { read_char(env); Modified: trunk/faxpp/src/tokenizer_states.c =================================================================== --- trunk/faxpp/src/tokenizer_states.c 2008-03-17 10:41:03 UTC (rev 45) +++ trunk/faxpp/src/tokenizer_states.c 2008-03-18 13:35:36 UTC (rev 46) @@ -256,8 +256,12 @@ return "entity_reference_state"; else if(state == parameter_entity_reference_state) return "parameter_entity_reference_state"; + else if(state == parameter_entity_reference_state2) + return "parameter_entity_reference_state2"; else if(state == parameter_entity_reference_in_markup_state) return "parameter_entity_reference_in_markup_state"; + else if(state == parameter_entity_reference_in_markup_state2) + return "parameter_entity_reference_in_markup_state2"; else if(state == char_reference_state) return "char_reference_state"; else if(state == dec_char_reference_state) Modified: trunk/faxpp/src/tokenizer_states.h =================================================================== --- trunk/faxpp/src/tokenizer_states.h 2008-03-17 10:41:03 UTC (rev 45) +++ trunk/faxpp/src/tokenizer_states.h 2008-03-18 13:35:36 UTC (rev 46) @@ -172,7 +172,9 @@ FAXPP_Error quot_entity_reference_state4(FAXPP_TokenizerEnv *env); FAXPP_Error entity_reference_state(FAXPP_TokenizerEnv *env); FAXPP_Error parameter_entity_reference_state(FAXPP_TokenizerEnv *env); +FAXPP_Error parameter_entity_reference_state2(FAXPP_TokenizerEnv *env); FAXPP_Error parameter_entity_reference_in_markup_state(FAXPP_TokenizerEnv *env); +FAXPP_Error parameter_entity_reference_in_markup_state2(FAXPP_TokenizerEnv *env); FAXPP_Error char_reference_state(FAXPP_TokenizerEnv *env); FAXPP_Error dec_char_reference_state(FAXPP_TokenizerEnv *env); FAXPP_Error hex_char_reference_state1(FAXPP_TokenizerEnv *env); Modified: trunk/faxpp/src/xml_parser.c =================================================================== --- trunk/faxpp/src/xml_parser.c 2008-03-17 10:41:03 UTC (rev 45) +++ trunk/faxpp/src/xml_parser.c 2008-03-18 13:35:36 UTC (rev 46) @@ -272,6 +272,9 @@ env->current_attlist = 0; env->current_notation = 0; + env->standalone = 0; + env->xml_version = XML_VERSION_NOT_KNOWN; + // Put the element info objects back in the pool while(env->element_info_stack) { el = env->element_info_stack; @@ -1044,12 +1047,31 @@ p_reset_event(env); p_copy_text_from_token(&env->event.version, env, /*useTokenBuffer*/0); p_set_event_location_from_token(env); + + if(p_case_insensitive_equals("1.1", env->tenv->transcoder.encode, &env->event.version)) { + if(env->xml_version == XML_VERSION_NOT_KNOWN) { + env->xml_version = XML_VERSION_1_1; + } + else if(env->xml_version == XML_VERSION_1_0) { + err = UNKNOWN_XML_VERSION; + goto error; + } + } + else { + if(env->xml_version == XML_VERSION_NOT_KNOWN) { + env->xml_version = XML_VERSION_1_0; + } + } break; case XML_DECL_ENCODING_TOKEN: p_copy_text_from_token(&env->event.encoding, env, /*useTokenBuffer*/0); break; case XML_DECL_STANDALONE_TOKEN: p_copy_text_from_token(&env->event.standalone, env, /*useTokenBuffer*/0); + + if(p_case_insensitive_equals("YES", env->tenv->transcoder.encode, &env->event.standalone)) { + env->standalone = 1; + } break; case XML_DECL_END_TOKEN: env->next_event = nc_unsupported_encoding_next_event; @@ -1116,6 +1138,7 @@ default: env->tenv->buffered_token = 1; p_reset_event(env); + if(env->tenv->external_subset || env->tenv->external_in_markup_entity) { // TBD event for start of external subset - jpcs env->next_event = nc_dtd_next_event; @@ -1128,6 +1151,11 @@ env->event.type = START_DOCUMENT_EVENT; env->next_event = env->main_next_event; } + + if(env->xml_version == XML_VERSION_NOT_KNOWN) { + env->xml_version = XML_VERSION_1_0; + } + return NO_ERROR; } } @@ -1163,6 +1191,8 @@ p_force_copy_text_from_token(&ent->name, env, &env->entity_buffer); p_set_location_from_token(ent, env); + ent->from_internal_subset = env->tenv->internal_subset; + return NO_ERROR; } @@ -1196,6 +1226,8 @@ return list; } +static FAXPP_Error p_parse_entity_impl(FAXPP_ParserEnv *env, FAXPP_EntityInfo *ent, FAXPP_EntityParseState state, FAXPP_EntityInfo **initial_entity); + static FAXPP_Error p_parse_internal_entity(FAXPP_ParserEnv *env, FAXPP_EntityInfo *ent, FAXPP_EntityParseState state, FAXPP_EntityInfo **initial_entity) { FAXPP_EntityValue *entv; @@ -1205,7 +1237,7 @@ entv = ent->value; while(entv) { if(entv->entity_ref) { - err = p_parse_internal_entity(env, entv->entity_ref, state, initial_entity); + err = p_parse_entity_impl(env, entv->entity_ref, state, initial_entity); if(err) return err; } else { @@ -1256,6 +1288,40 @@ return err; } +static FAXPP_Error p_parse_entity_impl(FAXPP_ParserEnv *env, FAXPP_EntityInfo *ent, FAXPP_EntityParseState state, FAXPP_EntityInfo **initial_entity) +{ + FAXPP_Error err; + + if(ent->external) { + switch(state) { + case ELEMENT_CONTENT_ENTITY: state = EXTERNAL_PARSED_ENTITY; break; + case INTERNAL_DTD_ENTITY: state = EXTERNAL_SUBSET_ENTITY; break; + case EXTERNAL_DTD_ENTITY: state = EXTERNAL_SUBSET_ENTITY; break; + case IN_MARKUP_ENTITY: state = EXTERNAL_IN_MARKUP_ENTITY; break; + default: break; + } + + err = p_parse_external_entity(env, ent, state); + if(err) return err; + + // Set the entity on the first new tokenizer + if(*initial_entity) { + env->tenv->start_of_entity = 1; + env->tenv->entity = *initial_entity; + *initial_entity = 0; + } + else { + env->tenv->start_of_entity = 0; + } + } + else { + err = p_parse_internal_entity(env, ent, state, initial_entity); + if(err) return err; + } + + return NO_ERROR; +} + static const char single_space[] = {' '}; static FAXPP_Error p_parse_entity(FAXPP_ParserEnv *env, FAXPP_EntityInfo *ent, FAXPP_EntityParseState state) @@ -1264,6 +1330,7 @@ FAXPP_EntityInfo *tmp; // Check for a recursive entity + // TBD Need a better method for doing this - jpcs FAXPP_TokenizerEnv *tokenizer = env->tenv; while(tokenizer) { if(tokenizer->entity == ent) @@ -1517,6 +1584,10 @@ err = UNDEFINED_ENTITY; goto error; } + if(env->standalone && !ent->from_internal_subset) { + err = UNDEFINED_ENTITY; + goto error; + } // [WFC: Parsed Entity] if(ent->unparsed) { err = REFERENCE_TO_UNPARSED_ENTITY; @@ -1952,6 +2023,10 @@ err = UNDEFINED_ENTITY; goto error; } + if(env->standalone && !ent->from_internal_subset) { + err = UNDEFINED_ENTITY; + goto error; + } // [WFC: Parsed Entity] if(ent->unparsed) { err = REFERENCE_TO_UNPARSED_ENTITY; Modified: trunk/faxpp/src/xml_parser.h =================================================================== --- trunk/faxpp/src/xml_parser.h 2008-03-17 10:41:03 UTC (rev 45) +++ trunk/faxpp/src/xml_parser.h 2008-03-18 13:35:36 UTC (rev 46) @@ -68,6 +68,7 @@ unsigned int external:1; unsigned int unparsed:1; + unsigned int from_internal_subset:1; unsigned int line; unsigned int column; @@ -116,6 +117,14 @@ unsigned int current_attlist:1; unsigned int current_notation:1; + unsigned int standalone:1; + + enum { + XML_VERSION_NOT_KNOWN = 0, + XML_VERSION_1_0, + XML_VERSION_1_1 + } xml_version; + FAXPP_AttrValue *av_ptr; FAXPP_AttrValue *av_dealloc; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |