[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.
|