forked from len0rd/rockbox
make -vvv display the parse tree in checkwps. Fix a potential bug in the parser where recursive tags (the playlist viewier) would share params with its parant which meant bad things
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27677 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
d42fd744e6
commit
1e0a01063d
4 changed files with 16 additions and 6 deletions
|
|
@ -120,7 +120,7 @@ void skin_clear_errors()
|
||||||
error_message = NULL;
|
error_message = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ROCKBOX
|
#if !defined(ROCKBOX) || defined(__PCTOOL__)
|
||||||
void skin_debug_tree(struct skin_element* root)
|
void skin_debug_tree(struct skin_element* root)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -227,6 +227,7 @@ void skin_debug_tree(struct skin_element* root)
|
||||||
printf("[ Logical line on line %d\n", current->line);
|
printf("[ Logical line on line %d\n", current->line);
|
||||||
|
|
||||||
debug_indent_level++;
|
debug_indent_level++;
|
||||||
|
if (current->children)
|
||||||
skin_debug_tree(current->children[0]);
|
skin_debug_tree(current->children[0]);
|
||||||
debug_indent_level--;
|
debug_indent_level--;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ int skin_line = 0;
|
||||||
char* skin_start = 0;
|
char* skin_start = 0;
|
||||||
int viewport_line = 0;
|
int viewport_line = 0;
|
||||||
|
|
||||||
|
static int tag_recursion_level = 0;
|
||||||
|
|
||||||
#ifdef ROCKBOX
|
#ifdef ROCKBOX
|
||||||
static skin_callback callback = NULL;
|
static skin_callback callback = NULL;
|
||||||
static void* callback_data;
|
static void* callback_data;
|
||||||
|
|
@ -122,6 +124,8 @@ static struct skin_element* skin_parse_viewport(const char** document)
|
||||||
struct skin_element* last = NULL;
|
struct skin_element* last = NULL;
|
||||||
struct skin_element* retval = NULL;
|
struct skin_element* retval = NULL;
|
||||||
|
|
||||||
|
tag_recursion_level = 0;
|
||||||
|
|
||||||
retval = skin_alloc_element();
|
retval = skin_alloc_element();
|
||||||
if (!retval)
|
if (!retval)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -467,6 +471,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
|
||||||
int req_args; /* To mark when we enter optional arguments */
|
int req_args; /* To mark when we enter optional arguments */
|
||||||
|
|
||||||
int optional = 0;
|
int optional = 0;
|
||||||
|
tag_recursion_level++;
|
||||||
|
|
||||||
/* Checking the tag name */
|
/* Checking the tag name */
|
||||||
tag_name[0] = cursor[0];
|
tag_name[0] = cursor[0];
|
||||||
|
|
@ -567,7 +572,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
|
||||||
|
|
||||||
cursor = bookmark; /* Restoring the cursor */
|
cursor = bookmark; /* Restoring the cursor */
|
||||||
element->params_count = num_args;
|
element->params_count = num_args;
|
||||||
element->params = skin_alloc_params(num_args);
|
element->params = skin_alloc_params(num_args, tag_recursion_level<=1);
|
||||||
if (!element->params)
|
if (!element->params)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -712,6 +717,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
*document = cursor;
|
*document = cursor;
|
||||||
|
tag_recursion_level--;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -1014,11 +1020,11 @@ struct skin_element* skin_alloc_element()
|
||||||
* enough for any tag. params should be used straight away by the callback
|
* enough for any tag. params should be used straight away by the callback
|
||||||
* so this is safe.
|
* so this is safe.
|
||||||
*/
|
*/
|
||||||
struct skin_tag_parameter* skin_alloc_params(int count)
|
struct skin_tag_parameter* skin_alloc_params(int count, bool use_shared_params)
|
||||||
{
|
{
|
||||||
#ifdef ROCKBOX
|
#ifdef ROCKBOX
|
||||||
static struct skin_tag_parameter params[MAX_TAG_PARAMS];
|
static struct skin_tag_parameter params[MAX_TAG_PARAMS];
|
||||||
if (count <= MAX_TAG_PARAMS)
|
if (use_shared_params && count <= MAX_TAG_PARAMS)
|
||||||
{
|
{
|
||||||
memset(params, 0, sizeof(params));
|
memset(params, 0, sizeof(params));
|
||||||
return params;
|
return params;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
****** Data Structures *********************************************
|
****** Data Structures *********************************************
|
||||||
|
|
@ -139,7 +140,7 @@ struct skin_element* skin_parse(const char* document);
|
||||||
/* Memory management functions */
|
/* Memory management functions */
|
||||||
struct skin_element* skin_alloc_element(void);
|
struct skin_element* skin_alloc_element(void);
|
||||||
struct skin_element** skin_alloc_children(int count);
|
struct skin_element** skin_alloc_children(int count);
|
||||||
struct skin_tag_parameter* skin_alloc_params(int count);
|
struct skin_tag_parameter* skin_alloc_params(int count, bool use_shared_params);
|
||||||
char* skin_alloc_string(int length);
|
char* skin_alloc_string(int length);
|
||||||
|
|
||||||
void skin_free_tree(struct skin_element* root);
|
void skin_free_tree(struct skin_element* root);
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,8 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("WPS parsed OK\n\n");
|
printf("WPS parsed OK\n\n");
|
||||||
|
if (wps_verbose_level>2)
|
||||||
|
skin_debug_tree(wps.tree);
|
||||||
filearg++;
|
filearg++;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue