summaryrefslogtreecommitdiff
path: root/src/xine-utils/xmlparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xine-utils/xmlparser.c')
-rw-r--r--src/xine-utils/xmlparser.c29
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) {