diff options
| -rw-r--r-- | src/xine-utils/xmllexer.c | 15 | ||||
| -rw-r--r-- | src/xine-utils/xmllexer.h | 2 | ||||
| -rw-r--r-- | src/xine-utils/xmlparser.c | 52 | 
3 files changed, 60 insertions, 9 deletions
| diff --git a/src/xine-utils/xmllexer.c b/src/xine-utils/xmllexer.c index 047dbb1a6..a77d6654a 100644 --- a/src/xine-utils/xmllexer.c +++ b/src/xine-utils/xmllexer.c @@ -123,7 +123,10 @@ void lexer_init(const char * buf, int size) {    lprintf("buffer length %d\n", size);  } -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;    int state = 0;    char c; @@ -455,7 +458,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/xmllexer.h b/src/xine-utils/xmllexer.h index 1e646f9b5..bf9948d2d 100644 --- a/src/xine-utils/xmllexer.h +++ b/src/xine-utils/xmllexer.h @@ -51,7 +51,7 @@  /* public functions */  void lexer_init(const char * buf, int size) XINE_PROTECTED; -int lexer_get_token(char * tok, int tok_size) XINE_PROTECTED; +int lexer_get_token(char ** tok, int * tok_size) XINE_PROTECTED;  char *lexer_decode_entities (const char *tok) XINE_PROTECTED;  #endif diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c index a5d8212d2..3cc9bc3c2 100644 --- a/src/xine-utils/xmlparser.c +++ b/src/xine-utils/xmlparser.c @@ -153,10 +153,15 @@ void xml_parser_free_tree(xml_node_t *current_node) {  #define STATE_NODE    1  #define STATE_COMMENT 7 -static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec) { -  char tok[TOKEN_SIZE]; -  char property_name[TOKEN_SIZE]; -  char node_name[TOKEN_SIZE]; +static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec); + +static int _xml_parser_get_node (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_name, int rec) { +  char *tok = *token_buffer; +  char *property_name = *pname_buffer; +  char *node_name = *nname_buffer;    int state = STATE_IDLE;    int res = 0;    int parse_res; @@ -168,9 +173,10 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r    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); @@ -225,6 +231,12 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r  	  if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) {  	    strtoupper(tok);  	  } +      /* make sure the buffer for the node name is big enough */ +      if (token_buffer_size > nname_buffer_size) { +        *nname_buffer_size = *token_buffer_size; +        *nname_buffer = realloc (*nname_buffer, *nname_buffer_size); +        node_name = *nname_buffer; +      }  	  strcpy(node_name, tok);  	  state = 2;  	  lprintf("info: current node name \"%s\"\n", node_name); @@ -291,6 +303,12 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r  	  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 = 5;  	  lprintf("info: current property name \"%s\"\n", property_name); @@ -452,6 +470,28 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r    }  } +static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec) +{ +  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); + +  res = _xml_parser_get_node(&token_buffer, &token_buffer_size, +                             &pname_buffer, &pname_buffer_size, +                             &nname_buffer, &nname_buffer_size, +                             current_node, root_name, rec); + +  free (token_buffer); +  free (pname_buffer); +  free (nname_buffer); + +  return res; +} +  int xml_parser_build_tree(xml_node_t **root_node) {    xml_node_t *tmp_node;    int res; | 
