summaryrefslogtreecommitdiff
path: root/src/xine-utils
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2007-12-30 18:37:29 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2007-12-30 18:37:29 +0000
commitcb2f69533fd5771c386d1b994b2179e76c4ded54 (patch)
tree98f4f9bff7afd6e9f0ce2c50b01d1e5ad55ec539 /src/xine-utils
parent6dbb05a4cba3cdc811308762058d722f11464683 (diff)
parentaa3d3aacdb991ad989933d71734e300535c7d350 (diff)
downloadxine-lib-cb2f69533fd5771c386d1b994b2179e76c4ded54.tar.gz
xine-lib-cb2f69533fd5771c386d1b994b2179e76c4ded54.tar.bz2
Merge from 1.1 (except po/*; translators needed for this).
--HG-- rename : src/video_out/vidix/drivers/mga_vid.c => contrib/vidix/drivers/mga_vid.c rename : src/video_out/vidix/drivers/nvidia_vid.c => contrib/vidix/drivers/nvidia_vid.c rename : src/video_out/vidix/drivers/savage_vid.c => contrib/vidix/drivers/savage_vid.c rename : src/xine-engine/video_out.h => include/xine/video_out.h rename : src/xine-utils/xmllexer.h => include/xine/xmllexer.h rename : po/libxine1.pot => po/libxine2.pot rename : src/libsputext/xine_sputext_decoder.c => src/spu_dec/sputext_decoder.c rename : src/libsputext/demux_sputext.c => src/spu_dec/sputext_demuxer.c
Diffstat (limited to 'src/xine-utils')
-rw-r--r--src/xine-utils/xmllexer.c14
-rw-r--r--src/xine-utils/xmlparser.c57
2 files changed, 58 insertions, 13 deletions
diff --git a/src/xine-utils/xmllexer.c b/src/xine-utils/xmllexer.c
index e276beef0..df483e9db 100644
--- a/src/xine-utils/xmllexer.c
+++ b/src/xine-utils/xmllexer.c
@@ -144,7 +144,9 @@ typedef enum {
STATE_IDENT /* must be last */
} lexer_state_t;
-int lexer_get_token(char * tok, int tok_size) {
+int lexer_get_token(char ** _tok, int * _tok_size) {
+ char *tok = *_tok;
+ int tok_size = *_tok_size;
int tok_pos = 0;
lexer_state_t state = STATE_IDLE;
char c;
@@ -513,7 +515,15 @@ int lexer_get_token(char * tok, int tok_size) {
/* pb */
if (tok_pos >= tok_size) {
- lprintf("token buffer is too little\n");
+ *_tok_size *= 2;
+ *_tok = realloc (*_tok, *_tok_size);
+ lprintf("token buffer is too small\n");
+ lprintf("increasing buffer size to %d bytes\n", *_tok_size);
+ if (*_tok) {
+ return lexer_get_token (_tok, _tok_size);
+ } else {
+ return T_ERROR;
+ }
} else {
if (lexbuf_pos >= lexbuf_size) {
/* Terminate the current token */
diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c
index 1213072f3..feeb5de65 100644
--- a/src/xine-utils/xmlparser.c
+++ b/src/xine-utils/xmlparser.c
@@ -219,11 +219,14 @@ static xml_node_t *xml_parser_append_text (xml_node_t *node, xml_node_t *subnode
#define Q_STATE(CURRENT,NEW) (STATE_##NEW + state - STATE_##CURRENT)
-static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_names[], int rec, int flags)
+static int xml_parser_get_node_internal (char ** token_buffer, int * token_buffer_size,
+ char ** pname_buffer, int * pname_buffer_size,
+ char ** nname_buffer, int * nname_buffer_size,
+ xml_node_t *current_node, char *root_names[], int rec, int flags)
{
- char tok[TOKEN_SIZE];
- char property_name[TOKEN_SIZE];
- char node_name[TOKEN_SIZE];
+ char *tok = *token_buffer;
+ char *property_name = *pname_buffer;
+ char *node_name = *nname_buffer;
parser_state_t state = STATE_IDLE;
int res = 0;
int parse_res;
@@ -236,9 +239,10 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na
if (rec < MAX_RECURSION) {
- memset (tok, 0, TOKEN_SIZE);
+ memset (tok, 0, *token_buffer_size);
- while ((bypass_get_token) || (res = lexer_get_token(tok, TOKEN_SIZE)) != T_ERROR) {
+ while ((bypass_get_token) || (res = lexer_get_token(token_buffer, token_buffer_size)) != T_ERROR) {
+ tok = *token_buffer;
bypass_get_token = 0;
lprintf("info: %d - %d : '%s'\n", state, res, tok);
@@ -298,10 +302,15 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na
strtoupper(tok);
}
if (state == STATE_Q_NODE) {
- snprintf (node_name, TOKEN_SIZE, "?%s", tok);
+ asprintf (&node_name, "?%s", tok);
+ free (*nname_buffer);
+ *nname_buffer = node_name;
+ *nname_buffer_size = strlen (node_name) + 1;
state = STATE_Q_ATTRIBUTE;
} else {
- strcpy(node_name, tok);
+ free (*nname_buffer);
+ *nname_buffer = node_name = strdup (tok);
+ *nname_buffer_size = strlen (node_name) + 1;
state = STATE_ATTRIBUTE;
}
lprintf("info: current node name \"%s\"\n", node_name);
@@ -329,8 +338,12 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na
/* set node propertys */
subtree->props = properties;
lprintf("info: rec %d new subtree %s\n", rec, node_name);
- root_names[rec + 1] = node_name;
- parse_res = xml_parser_get_node_internal(subtree, root_names, rec + 1, flags);
+ root_names[rec + 1] = strdup (node_name);
+ parse_res = xml_parser_get_node_internal (token_buffer, token_buffer_size,
+ pname_buffer, pname_buffer_size,
+ nname_buffer, nname_buffer_size,
+ subtree, root_names, rec + 1, flags);
+ free (root_names[rec + 1]);
if (parse_res == -1 || parse_res > 0) {
return parse_res;
}
@@ -376,6 +389,12 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na
if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) {
strtoupper(tok);
}
+ /* make sure the buffer for the property name is big enough */
+ if (*token_buffer_size > *pname_buffer_size) {
+ *pname_buffer_size = *token_buffer_size;
+ *pname_buffer = realloc (*pname_buffer, *pname_buffer_size);
+ property_name = *pname_buffer;
+ }
strcpy(property_name, tok);
state = Q_STATE(ATTRIBUTE, ATTRIBUTE_EQUALS);
lprintf("info: current property name \"%s\"\n", property_name);
@@ -622,9 +641,25 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na
static int xml_parser_get_node (xml_node_t *current_node, int flags)
{
+ int res = 0;
+ int token_buffer_size = TOKEN_SIZE;
+ int pname_buffer_size = TOKEN_SIZE;
+ int nname_buffer_size = TOKEN_SIZE;
+ char *token_buffer = xine_xmalloc (token_buffer_size);
+ char *pname_buffer = xine_xmalloc (pname_buffer_size);
+ char *nname_buffer = xine_xmalloc (nname_buffer_size);
char *root_names[MAX_RECURSION + 1];
root_names[0] = "";
- return xml_parser_get_node_internal (current_node, root_names, 0, flags);
+ res = xml_parser_get_node_internal (&token_buffer, &token_buffer_size,
+ &pname_buffer, &pname_buffer_size,
+ &nname_buffer, &nname_buffer_size,
+ current_node, root_names, 0, flags);
+
+ free (token_buffer);
+ free (pname_buffer);
+ free (nname_buffer);
+
+ return res;
}
int xml_parser_build_tree_with_options(xml_node_t **root_node, int flags) {