[Faxpp-devel] SF.net SVN: faxpp: [18] trunk/faxpp
Status: Beta
Brought to you by:
jpcs
From: <jp...@us...> - 2007-08-15 00:33:20
|
Revision: 18 http://faxpp.svn.sourceforge.net/faxpp/?rev=18&view=rev Author: jpcs Date: 2007-08-14 17:33:19 -0700 (Tue, 14 Aug 2007) Log Message: ----------- Implemented attribute value normalization, and added a parser option to enable/disable it. Namespace URIs are now always normalized. Refactored the FAXPP_Buffer object so that it now contains it's own FAXPP_BufferResizeCallback and user data, instead of needing them as parameters. Fixed a bug in entity output in the examples. Modified Paths: -------------- trunk/faxpp/TODO trunk/faxpp/examples/parser_example.c trunk/faxpp/include/faxpp/parser.h trunk/faxpp/src/buffer.c trunk/faxpp/src/buffer.h trunk/faxpp/src/tokenizer_states.c trunk/faxpp/src/tokenizer_states.h trunk/faxpp/src/xml_parser.c trunk/faxpp/src/xml_parser.h trunk/faxpp/src/xml_tokenizer.c trunk/faxpp/tests/xmlconf_runner.c Modified: trunk/faxpp/TODO =================================================================== --- trunk/faxpp/TODO 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/TODO 2007-08-15 00:33:19 UTC (rev 18) @@ -1,8 +1,17 @@ -Attribute value normalization (especially needed for namespace resolution) +Small tasks +----------- + +Normalize whitespace in attribute values +Normalize line endings in element character content / PI values / comment values +Accept XML 1.1 line endings as whitespace Handle "xml" namespace properly xml:space value checking Error for redefining "xml" namespace Error for defining "xmlns" namespace + +Large tasks +----------- + Entity expansion framework DTD internal subset parsing DTD external subset parsing Modified: trunk/faxpp/examples/parser_example.c =================================================================== --- trunk/faxpp/examples/parser_example.c 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/examples/parser_example.c 2007-08-15 00:33:19 UTC (rev 18) @@ -110,17 +110,17 @@ break; case ENTITY_REFERENCE_EVENT: fprintf(stream, "&"); - output_text(&atval->value, stream); + output_text(&atval->name, stream); fprintf(stream, ";"); break; case DEC_CHAR_REFERENCE_EVENT: fprintf(stream, "&#"); - output_text(&atval->value, stream); + output_text(&atval->name, stream); fprintf(stream, ";"); break; case HEX_CHAR_REFERENCE_EVENT: fprintf(stream, "&#x"); - output_text(&atval->value, stream); + output_text(&atval->name, stream); fprintf(stream, ";"); break; default: Modified: trunk/faxpp/include/faxpp/parser.h =================================================================== --- trunk/faxpp/include/faxpp/parser.h 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/include/faxpp/parser.h 2007-08-15 00:33:19 UTC (rev 18) @@ -142,6 +142,28 @@ void FAXPP_set_null_terminate(FAXPP_Parser *parser, unsigned int boolean); /** + * Sets whether the parser will normalize attributes values into a single string. + * This option is off by default for NO_CHECKS_PARSE_MODE, and on for other parser + * modes. + * + * The XML specification requires conformant parsers to normalize attribute values + * by expanding entity references and turning all whitespace to &#x20; characters. + * This option will have no effect on a parser in NO_CHECKS_PARSE_MODE, since this + * mode will never normalize attribute values. + * + * Setting this parameter whilst a parse is in progress has undefined results. + * + * Normalizing attribute values will involve copying the strings, and so + * will be slower where copying strings was not otherwise necessary. + * + * \param parser + * \param boolean Whether to normalize attribute values + * + * \relatesalso FAXPP_Parser + */ +void FAXPP_set_normalize_attrs(FAXPP_Parser *parser, unsigned int boolean); + +/** * Sets the encoding that the parser will use when encoding event values. * * Setting this parameter whilst a parse is in progress has undefined results. Modified: trunk/faxpp/src/buffer.c =================================================================== --- trunk/faxpp/src/buffer.c 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/buffer.c 2007-08-15 00:33:19 UTC (rev 18) @@ -19,12 +19,15 @@ #include "buffer.h" -FAXPP_Error FAXPP_init_buffer(FAXPP_Buffer *buffer, unsigned int initialSize) +FAXPP_Error FAXPP_init_buffer(FAXPP_Buffer *buffer, unsigned int initialSize, + FAXPP_BufferResizeCallback callback, void *userData) { buffer->buffer = malloc(initialSize); if(!buffer->buffer) return OUT_OF_MEMORY; buffer->length = initialSize; buffer->cursor = buffer->buffer; + buffer->callback = callback; + buffer->userData = userData; return NO_ERROR; } @@ -33,7 +36,7 @@ if(buffer->buffer) free(buffer->buffer); } -FAXPP_Error FAXPP_resize_buffer(FAXPP_Buffer *buffer, unsigned int minSize, FAXPP_BufferResizeCallback callback, void *userData) +FAXPP_Error FAXPP_resize_buffer(FAXPP_Buffer *buffer, unsigned int minSize) { unsigned int newLength = buffer->length << 1; while(newLength < minSize) { @@ -44,7 +47,7 @@ if(!newFAXPP_Buffer) return OUT_OF_MEMORY; if(newFAXPP_Buffer != buffer->buffer) { - if(callback) callback(userData, buffer, newFAXPP_Buffer); + if(buffer->callback) buffer->callback(buffer->userData, buffer, newFAXPP_Buffer); buffer->cursor += newFAXPP_Buffer - buffer->buffer; buffer->buffer = newFAXPP_Buffer; } @@ -54,12 +57,11 @@ return NO_ERROR; } -FAXPP_Error FAXPP_buffer_append(FAXPP_Buffer *buffer, void *ptr, unsigned int len, - FAXPP_BufferResizeCallback callback, void *userData) +FAXPP_Error FAXPP_buffer_append(FAXPP_Buffer *buffer, void *ptr, unsigned int len) { FAXPP_Error err; if(buffer->cursor + len > buffer->buffer + buffer->length) { - err = FAXPP_resize_buffer(buffer, (buffer->cursor + len) - buffer->buffer, callback, userData); + err = FAXPP_resize_buffer(buffer, (buffer->cursor + len) - buffer->buffer); if(err != 0) return err; } @@ -69,14 +71,13 @@ return NO_ERROR; } -FAXPP_Error FAXPP_buffer_append_ch(FAXPP_Buffer *buffer, FAXPP_EncodeFunction encode, Char32 ch, - FAXPP_BufferResizeCallback callback, void *userData) +FAXPP_Error FAXPP_buffer_append_ch(FAXPP_Buffer *buffer, FAXPP_EncodeFunction encode, Char32 ch) { FAXPP_Error err; unsigned int len; while((len = encode(buffer->cursor, buffer->buffer + buffer->length, ch)) == TRANSCODE_PREMATURE_END_OF_BUFFER) { - err = FAXPP_resize_buffer(buffer, 0, callback, userData); + err = FAXPP_resize_buffer(buffer, 0); if(err != 0) return err; } Modified: trunk/faxpp/src/buffer.h =================================================================== --- trunk/faxpp/src/buffer.h 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/buffer.h 2007-08-15 00:33:19 UTC (rev 18) @@ -20,25 +20,27 @@ #include <faxpp/error.h> #include <faxpp/transcode.h> +typedef struct FAXPP_Buffer_s FAXPP_Buffer; +typedef void (*FAXPP_BufferResizeCallback)(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer); + /// Implementation of a resizing buffer -typedef struct FAXPP_Buffer_s { +struct FAXPP_Buffer_s { void *buffer; unsigned int length; void *cursor; -} FAXPP_Buffer; -typedef void (*FAXPP_BufferResizeCallback)(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer); + FAXPP_BufferResizeCallback callback; + void *userData; +}; -FAXPP_Error FAXPP_init_buffer(FAXPP_Buffer *buffer, unsigned int initialSize); +FAXPP_Error FAXPP_init_buffer(FAXPP_Buffer *buffer, unsigned int initialSize, + FAXPP_BufferResizeCallback callback, void *userData); void FAXPP_free_buffer(FAXPP_Buffer *buffer); #define FAXPP_reset_buffer(buf) (buf)->cursor = (buf)->buffer -FAXPP_Error FAXPP_resize_buffer(FAXPP_Buffer *buffer, unsigned int minSize, - FAXPP_BufferResizeCallback callback, void *userData); -FAXPP_Error FAXPP_buffer_append(FAXPP_Buffer *buffer, void *ptr, unsigned int len, - FAXPP_BufferResizeCallback callback, void *userData); -FAXPP_Error FAXPP_buffer_append_ch(FAXPP_Buffer *buffer, FAXPP_EncodeFunction encode, Char32 ch, - FAXPP_BufferResizeCallback callback, void *userData); +FAXPP_Error FAXPP_resize_buffer(FAXPP_Buffer *buffer, unsigned int minSize); +FAXPP_Error FAXPP_buffer_append(FAXPP_Buffer *buffer, void *ptr, unsigned int len); +FAXPP_Error FAXPP_buffer_append_ch(FAXPP_Buffer *buffer, FAXPP_EncodeFunction encode, Char32 ch); #endif Modified: trunk/faxpp/src/tokenizer_states.c =================================================================== --- trunk/faxpp/src/tokenizer_states.c 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/tokenizer_states.c 2007-08-15 00:33:19 UTC (rev 18) @@ -389,16 +389,6 @@ } #endif -void change_token_buffer(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer) -{ - FAXPP_TokenizerEnv *env = (FAXPP_TokenizerEnv*)userData; - - env->token_position1 += newFAXPP_Buffer - buffer->buffer; - env->token_position2 += newFAXPP_Buffer - buffer->buffer; - - env->token.value.ptr = newFAXPP_Buffer; -} - /********************* * * Tokenizer State Functions Modified: trunk/faxpp/src/tokenizer_states.h =================================================================== --- trunk/faxpp/src/tokenizer_states.h 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/tokenizer_states.h 2007-08-15 00:33:19 UTC (rev 18) @@ -250,8 +250,6 @@ const char *state_to_string(FAXPP_StateFunction state); #endif -void change_token_buffer(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer); - #define read_char_no_check(env) \ { \ (env)->char_len = \ @@ -280,11 +278,9 @@ if((env)->token_buffer.cursor) { \ FAXPP_Error err; \ if((env)->encode) { \ - err = FAXPP_buffer_append_ch(&(env)->token_buffer, (env)->encode, (env)->current_char, \ - change_token_buffer, (env)); \ + err = FAXPP_buffer_append_ch(&(env)->token_buffer, (env)->encode, (env)->current_char); \ } else { \ - err = FAXPP_buffer_append(&(env)->token_buffer, (env)->position, (env)->char_len, \ - change_token_buffer, (env)); \ + err = FAXPP_buffer_append(&(env)->token_buffer, (env)->position, (env)->char_len); \ } \ if(err != 0) return err; \ } \ Modified: trunk/faxpp/src/xml_parser.c =================================================================== --- trunk/faxpp/src/xml_parser.c 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/xml_parser.c 2007-08-15 00:33:19 UTC (rev 18) @@ -40,6 +40,9 @@ static FAXPP_Error wf_next_event(FAXPP_ParserEnv *env); +static void p_change_event_buffer(void *userData, FAXPP_Buffer *buffer, void *newBuffer); +static void p_change_stack_buffer(void *userData, FAXPP_Buffer *buffer, void *newBuffer); + FAXPP_Parser *FAXPP_create_parser(FAXPP_ParseMode mode, FAXPP_EncodeFunction encode) { FAXPP_ParserEnv *env = malloc(sizeof(FAXPP_ParserEnv)); @@ -50,9 +53,11 @@ switch(mode) { case NO_CHECKS_PARSE_MODE: env->main_next_event = nc_next_event; + env->normalize_attrs = 0; break; case WELL_FORMED_PARSE_MODE: env->main_next_event = wf_next_event; + env->normalize_attrs = 1; break; } @@ -65,12 +70,12 @@ return 0; } - if(FAXPP_init_buffer(&env->event_buffer, INITIAL_EVENT_BUFFER_SIZE) == OUT_OF_MEMORY) { + if(FAXPP_init_buffer(&env->event_buffer, INITIAL_EVENT_BUFFER_SIZE, p_change_event_buffer, env) == OUT_OF_MEMORY) { FAXPP_free_parser(env); return 0; } - if(FAXPP_init_buffer(&env->stack_buffer, INITIAL_STACK_BUFFER_SIZE) == OUT_OF_MEMORY) { + if(FAXPP_init_buffer(&env->stack_buffer, INITIAL_STACK_BUFFER_SIZE, p_change_stack_buffer, env) == OUT_OF_MEMORY) { FAXPP_free_parser(env); return 0; } @@ -135,6 +140,11 @@ parser->null_terminate = boolean != 0; } +void FAXPP_set_normalize_attrs(FAXPP_Parser *parser, unsigned int boolean) +{ + parser->normalize_attrs = boolean != 0; +} + void FAXPP_set_encode(FAXPP_Parser *parser, FAXPP_EncodeFunction encode) { parser->encode = encode; @@ -242,60 +252,60 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// -static void p_text_change_buffer(FAXPP_Buffer *buffer, void *newFAXPP_Buffer, FAXPP_Text *text) +static void p_text_change_buffer(FAXPP_Buffer *buffer, void *newBuffer, FAXPP_Text *text) { if(text->ptr >= buffer->buffer && text->ptr < (buffer->buffer + buffer->length)) { - text->ptr += newFAXPP_Buffer - buffer->buffer; + text->ptr += newBuffer - buffer->buffer; } } -static void p_change_event_buffer(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer) +static void p_change_event_buffer(void *userData, FAXPP_Buffer *buffer, void *newBuffer) { unsigned int i; FAXPP_AttrValue *atval; FAXPP_ParserEnv *env = (FAXPP_ParserEnv*)userData; - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.prefix); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.uri); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.name); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.value); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.version); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.encoding); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.standalone); + p_text_change_buffer(buffer, newBuffer, &env->event.prefix); + p_text_change_buffer(buffer, newBuffer, &env->event.uri); + p_text_change_buffer(buffer, newBuffer, &env->event.name); + p_text_change_buffer(buffer, newBuffer, &env->event.value); + p_text_change_buffer(buffer, newBuffer, &env->event.version); + p_text_change_buffer(buffer, newBuffer, &env->event.encoding); + p_text_change_buffer(buffer, newBuffer, &env->event.standalone); for(i = 0; i < env->event.attr_count; ++i) { - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.attrs[i].prefix); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.attrs[i].uri); - p_text_change_buffer(buffer, newFAXPP_Buffer, &env->event.attrs[i].name); + p_text_change_buffer(buffer, newBuffer, &env->event.attrs[i].prefix); + p_text_change_buffer(buffer, newBuffer, &env->event.attrs[i].uri); + p_text_change_buffer(buffer, newBuffer, &env->event.attrs[i].name); atval = &env->event.attrs[i].value; while(atval) { - p_text_change_buffer(buffer, newFAXPP_Buffer, &atval->value); + p_text_change_buffer(buffer, newBuffer, &atval->value); atval = atval->next; } } } -static void p_change_stack_buffer(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer) +static void p_change_stack_buffer(void *userData, FAXPP_Buffer *buffer, void *newBuffer) { FAXPP_ParserEnv *env = (FAXPP_ParserEnv*)userData; FAXPP_ElementInfo *el = env->element_info_stack; while(el) { - p_text_change_buffer(buffer, newFAXPP_Buffer, &el->prefix); - p_text_change_buffer(buffer, newFAXPP_Buffer, &el->uri); - p_text_change_buffer(buffer, newFAXPP_Buffer, &el->name); + p_text_change_buffer(buffer, newBuffer, &el->prefix); + p_text_change_buffer(buffer, newBuffer, &el->uri); + p_text_change_buffer(buffer, newBuffer, &el->name); - el->prev_stack_cursor += newFAXPP_Buffer - buffer->buffer; + el->prev_stack_cursor += newBuffer - buffer->buffer; el = el->prev; } FAXPP_NamespaceInfo *ns = env->namespace_stack; while(ns) { - p_text_change_buffer(buffer, newFAXPP_Buffer, &ns->prefix); - p_text_change_buffer(buffer, newFAXPP_Buffer, &ns->uri); + p_text_change_buffer(buffer, newBuffer, &ns->prefix); + p_text_change_buffer(buffer, newBuffer, &ns->uri); ns = ns->prev; } @@ -305,9 +315,9 @@ { \ if((text)->ptr >= (env)->tenv.buffer && (text)->ptr < (env)->tenv.buffer_end) { \ void *newPtr = (env)->event_buffer.cursor; \ - FAXPP_Error err = FAXPP_buffer_append(&(env)->event_buffer, (text)->ptr, (text)->len, p_change_event_buffer, (env)); \ + FAXPP_Error err = FAXPP_buffer_append(&(env)->event_buffer, (text)->ptr, (text)->len); \ if((env)->null_terminate && err == 0) \ - err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, 0, p_change_event_buffer, (env)); \ + err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, 0); \ if(err != 0) return err; \ (text)->ptr = newPtr; \ } \ @@ -443,16 +453,46 @@ /* (env)->null_terminate) { */ \ (text)->ptr = (env)->stack_buffer.cursor; \ (text)->len = (o)->len; \ - FAXPP_Error err = FAXPP_buffer_append(&(env)->stack_buffer, (o)->ptr, (o)->len, \ - p_change_stack_buffer, (env)); \ + FAXPP_Error err = FAXPP_buffer_append(&(env)->stack_buffer, (o)->ptr, (o)->len); \ if((env)->null_terminate && err == 0) \ - err = FAXPP_buffer_append_ch(&(env)->stack_buffer, (env)->encode, 0, p_change_stack_buffer, (env)); \ + err = FAXPP_buffer_append_ch(&(env)->stack_buffer, (env)->encode, 0); \ if(err != 0) return err; \ /* } else { */ \ /* p_set_text_from_text((text), (o)); */ \ /* } */ \ } +#define p_copy_text_from_attr_value(text, attrval, env) \ +{ \ + if((attrval)->next == 0) { \ + p_copy_text_from_event((text), &(attrval)->value, (env)); \ + } \ + else { \ + FAXPP_Error err = p_normalize_attr_value((text), &(env)->stack_buffer, (attrval), (env)); \ + if(err != NO_ERROR) return err; \ + } \ +} + +FAXPP_Error p_normalize_attr_value(FAXPP_Text *text, FAXPP_Buffer *buffer, const FAXPP_AttrValue *value, const FAXPP_ParserEnv *env) +{ + FAXPP_Error err; + + text->ptr = buffer->cursor; + + while(value) { + err = FAXPP_buffer_append(buffer, value->value.ptr, value->value.len); + if(err != NO_ERROR) return err; + value = value->next; + } + + text->len = buffer->cursor - text->ptr; + + if(env->null_terminate) + return FAXPP_buffer_append_ch(buffer, env->encode, 0); + + return NO_ERROR; +} + #define p_copy_text_from_token(text, env, useTokenBuffer) \ { \ /* TBD null terminate in tokenizer - jpcs */ \ @@ -461,10 +501,9 @@ (text)->ptr = (env)->tenv.result_token.value.ptr; \ } else { \ (text)->ptr = (env)->event_buffer.cursor; \ - FAXPP_Error err = FAXPP_buffer_append(&(env)->event_buffer, (env)->tenv.result_token.value.ptr, (env)->tenv.result_token.value.len, \ - p_change_event_buffer, (env)); \ + FAXPP_Error err = FAXPP_buffer_append(&(env)->event_buffer, (env)->tenv.result_token.value.ptr, (env)->tenv.result_token.value.len); \ if((env)->null_terminate && err == 0) \ - err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, 0, p_change_event_buffer, (env)); \ + err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, 0); \ if(err != 0) return err; \ } \ } @@ -549,10 +588,10 @@ #define p_set_text_to_char(text, env, ch) \ { \ (text)->ptr = (env)->event_buffer.cursor; \ - FAXPP_Error err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, (ch), p_change_event_buffer, (env)); \ + FAXPP_Error err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, (ch)); \ (text)->len = (env)->event_buffer.cursor - (text)->ptr; \ if((env)->null_terminate && err == 0) \ - err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, 0, p_change_event_buffer, (env)); \ + err = FAXPP_buffer_append_ch(&(env)->event_buffer, (env)->encode, 0); \ if(err != 0) return err; \ } @@ -1010,8 +1049,7 @@ nsinfo->prev = env->namespace_stack; env->namespace_stack = nsinfo; - // TBD deal with entities in attribute values - jpcs - p_copy_text_from_event(&nsinfo->uri, &(attr->value.value), env); + p_copy_text_from_attr_value(&nsinfo->uri, &attr->value, env); if(attr->prefix.len != 0) { p_copy_text_from_event(&nsinfo->prefix, &attr->name, env); @@ -1145,6 +1183,7 @@ int i, j; FAXPP_Attribute *attr, *attr2; FAXPP_AttrValue *attrVal; + FAXPP_Text tmpText; Char32 ch; FAXPP_Error err = nc_next_event(env); @@ -1169,8 +1208,6 @@ for(i = 0; i < env->event.attr_count; ++i) { attr = &env->event.attrs[i]; - // TBD Normalize the attribute values - jpcs - /* Check that the character references are valid */ for(attrVal = &attr->value; attrVal != 0; attrVal = attrVal->next) { switch(attrVal->type) { @@ -1194,11 +1231,11 @@ } attrVal->value.ptr = env->event_buffer.cursor; - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch, p_change_event_buffer, env); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch); attrVal->value.len = env->event_buffer.cursor - attrVal->value.ptr; if(env->null_terminate && err == 0) - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0, p_change_event_buffer, env); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0); if(err != 0) return err; break; case HEX_CHAR_REFERENCE_EVENT: @@ -1210,17 +1247,30 @@ } attrVal->value.ptr = env->event_buffer.cursor; - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch, p_change_event_buffer, env); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch); attrVal->value.len = env->event_buffer.cursor - attrVal->value.ptr; if(env->null_terminate && err == 0) - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0, p_change_event_buffer, env); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0); if(err != 0) return err; break; default: break; } } + /* Normalize the attribute values if required */ + if(env->normalize_attrs && attr->value.next != 0) { + err = p_normalize_attr_value(&tmpText, &env->event_buffer, &attr->value, env); + if(err != 0) return err; + + attr->value.type = CHARACTERS_EVENT; + attr->value.name.ptr = 0; + attr->value.name.len = 0; + attr->value.value.ptr = tmpText.ptr; + attr->value.value.len = tmpText.len; + attr->value.next = 0; + } + /* Check for namespace attributes */ if(attr->xmlns_attr) { err = p_add_ns_info(env, attr); @@ -1317,11 +1367,11 @@ } env->event.value.ptr = env->event_buffer.cursor; - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch, p_change_event_buffer, (env)); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch); env->event.value.len = env->event_buffer.cursor - env->event.value.ptr; if(env->null_terminate && err == 0) - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0, p_change_event_buffer, (env)); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0); if(err != 0) return err; break; @@ -1334,11 +1384,11 @@ } env->event.value.ptr = env->event_buffer.cursor; - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch, p_change_event_buffer, (env)); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, ch); env->event.value.len = env->event_buffer.cursor - env->event.value.ptr; if(env->null_terminate && err == 0) - err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0, p_change_event_buffer, (env)); + err = FAXPP_buffer_append_ch(&env->event_buffer, env->encode, 0); if(err != 0) return err; break; Modified: trunk/faxpp/src/xml_parser.h =================================================================== --- trunk/faxpp/src/xml_parser.h 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/xml_parser.h 2007-08-15 00:33:19 UTC (rev 18) @@ -65,6 +65,7 @@ FAXPP_TokenizerEnv tenv; unsigned int null_terminate:1; + unsigned int normalize_attrs:1; unsigned int err_line; unsigned int err_column; Modified: trunk/faxpp/src/xml_tokenizer.c =================================================================== --- trunk/faxpp/src/xml_tokenizer.c 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/src/xml_tokenizer.c 2007-08-15 00:33:19 UTC (rev 18) @@ -319,11 +319,21 @@ } } +void change_token_buffer(void *userData, FAXPP_Buffer *buffer, void *newBuffer) +{ + FAXPP_TokenizerEnv *env = (FAXPP_TokenizerEnv*)userData; + + env->token_position1 += newBuffer - buffer->buffer; + env->token_position2 += newBuffer - buffer->buffer; + + env->token.value.ptr = newBuffer; +} + FAXPP_Error init_tokenizer_internal(FAXPP_TokenizerEnv *env) { memset(env, 0, sizeof(FAXPP_TokenizerEnv)); - return FAXPP_init_buffer(&env->token_buffer, INITIAL_TOKEN_BUFFER_SIZE); + return FAXPP_init_buffer(&env->token_buffer, INITIAL_TOKEN_BUFFER_SIZE, change_token_buffer, env); } void @@ -418,8 +428,7 @@ tokenizer->token.value.ptr = tokenizer->token_buffer.cursor; tokenizer->token.value.len = token_length; - return FAXPP_buffer_append(&tokenizer->token_buffer, token_start, token_length, - change_token_buffer, tokenizer); + return FAXPP_buffer_append(&tokenizer->token_buffer, token_start, token_length); } return NO_ERROR; Modified: trunk/faxpp/tests/xmlconf_runner.c =================================================================== --- trunk/faxpp/tests/xmlconf_runner.c 2007-08-14 09:49:37 UTC (rev 17) +++ trunk/faxpp/tests/xmlconf_runner.c 2007-08-15 00:33:19 UTC (rev 18) @@ -41,17 +41,17 @@ break; case ENTITY_REFERENCE_EVENT: fprintf(stream, "&"); - output_text(&atval->value, stream); + output_text(&atval->name, stream); fprintf(stream, ";"); break; case DEC_CHAR_REFERENCE_EVENT: fprintf(stream, "&#"); - output_text(&atval->value, stream); + output_text(&atval->name, stream); fprintf(stream, ";"); break; case HEX_CHAR_REFERENCE_EVENT: fprintf(stream, "&#x"); - output_text(&atval->value, stream); + output_text(&atval->name, stream); fprintf(stream, ";"); break; default: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |