diff options
Diffstat (limited to 'src/xine-utils/xmlparser.c')
-rw-r--r-- | src/xine-utils/xmlparser.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c index a9fa940db..326e21997 100644 --- a/src/xine-utils/xmlparser.c +++ b/src/xine-utils/xmlparser.c @@ -42,7 +42,7 @@ #ifdef XINE_COMPILE #include "xineutils.h" #else -#define lprintf(...) +#define lprintf printf #define xine_xmalloc malloc #endif #include "xmllexer.h" @@ -177,6 +177,7 @@ typedef enum { /* Others */ STATE_COMMENT, STATE_DOCTYPE, + STATE_CDATA, } parser_state_t; #define Q_STATE(CURRENT,NEW) (STATE_##NEW + state - STATE_##CURRENT) @@ -227,6 +228,9 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na case (T_DOCTYPE_START): state = STATE_DOCTYPE; break; + case (T_CDATA_START): + state = STATE_CDATA; + break; case (T_DATA): /* current data */ if (current_node->data) { @@ -538,6 +542,29 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na } break; + /* ]]> expected */ + case STATE_CDATA: + switch (res) { + case (T_CDATA_STOP): + if (current_node->data) { + /* Append to existing text. FIXME - should use a child node */ + char *data; + asprintf (&data, "%s%s", current_node->data, tok); + free (current_node->data); + current_node->data = data; + } + else + current_node->data = strdup (tok); + lprintf("info: node cdata : %s\n", current_node->data); + state = STATE_IDLE; + break; + default: + lprintf("error: unexpected token \"%s\", state %d\n", tok, state); + return -1; + break; + } + break; + /* > expected (following unmatched "</...") */ case STATE_TAG_TERM_IGNORE: switch (res) { |