forked from len0rd/rockbox
Better handling of strings in the WPS parser by detecting duplicates to avoid having two copies of the same string in the string buffer.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13295 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
3a7760c3e2
commit
7e6af1532b
2 changed files with 40 additions and 15 deletions
|
@ -43,6 +43,7 @@ static void dump_wps_tokens(struct wps_data *data)
|
||||||
int indent = 0;
|
int indent = 0;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
bool next;
|
bool next;
|
||||||
|
int num_string_tokens = 0;
|
||||||
|
|
||||||
if (data->num_tokens > WPS_MAX_TOKENS) {
|
if (data->num_tokens > WPS_MAX_TOKENS) {
|
||||||
DEBUGF("Number of tokens is too high (%d)!!!\n", data->num_tokens);
|
DEBUGF("Number of tokens is too high (%d)!!!\n", data->num_tokens);
|
||||||
|
@ -65,6 +66,7 @@ static void dump_wps_tokens(struct wps_data *data)
|
||||||
case WPS_TOKEN_STRING:
|
case WPS_TOKEN_STRING:
|
||||||
snprintf(buf, sizeof(buf), "String '%s'",
|
snprintf(buf, sizeof(buf), "String '%s'",
|
||||||
data->strings[token->value.i]);
|
data->strings[token->value.i]);
|
||||||
|
num_string_tokens++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
@ -364,6 +366,9 @@ static void dump_wps_tokens(struct wps_data *data)
|
||||||
DEBUGF("[%3d] = (%2d) %s\n", i, token->type, buf);
|
DEBUGF("[%3d] = (%2d) %s\n", i, token->type, buf);
|
||||||
}
|
}
|
||||||
DEBUGF("\n");
|
DEBUGF("\n");
|
||||||
|
|
||||||
|
DEBUGF("Number of string tokens: %d\n", num_string_tokens);
|
||||||
|
DEBUGF("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_line_info(struct wps_data *data)
|
static void print_line_info(struct wps_data *data)
|
||||||
|
@ -416,7 +421,8 @@ static void print_wps_strings(struct wps_data *data)
|
||||||
DEBUGF("%2d: (%2d) '%s'\n", i, len, data->strings[i]);
|
DEBUGF("%2d: (%2d) '%s'\n", i, len, data->strings[i]);
|
||||||
}
|
}
|
||||||
DEBUGF("\n");
|
DEBUGF("\n");
|
||||||
DEBUGF("Total string length: %d\n", len);
|
DEBUGF("Number of strings: %d out of an allowed %d\n", data->num_strings, WPS_MAX_STRINGS);
|
||||||
|
DEBUGF("Total string length: %d\n", total_len);
|
||||||
DEBUGF("String buffer used: %d out of %d bytes\n", buf_used, STRING_BUFFER_SIZE);
|
DEBUGF("String buffer used: %d out of %d bytes\n", buf_used, STRING_BUFFER_SIZE);
|
||||||
DEBUGF("\n");
|
DEBUGF("\n");
|
||||||
}
|
}
|
||||||
|
@ -441,8 +447,8 @@ void print_debug_info(struct wps_data *data, int fail, int line)
|
||||||
if (debug_wps)
|
if (debug_wps)
|
||||||
{
|
{
|
||||||
dump_wps_tokens(data);
|
dump_wps_tokens(data);
|
||||||
print_line_info(data);
|
|
||||||
print_wps_strings(data);
|
print_wps_strings(data);
|
||||||
|
print_line_info(data);
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
print_img_cond_indexes(data);
|
print_img_cond_indexes(data);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -653,7 +653,7 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
|
||||||
if (!data || !wps_bufptr || !*wps_bufptr)
|
if (!data || !wps_bufptr || !*wps_bufptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char *current_string = data->string_buffer;
|
char *stringbuf = data->string_buffer;
|
||||||
int stringbuf_used = 0;
|
int stringbuf_used = 0;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
line = 1;
|
line = 1;
|
||||||
|
@ -770,13 +770,9 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
|
||||||
&& stringbuf_used < STRING_BUFFER_SIZE - 1)
|
&& stringbuf_used < STRING_BUFFER_SIZE - 1)
|
||||||
{
|
{
|
||||||
data->tokens[data->num_tokens].type = WPS_TOKEN_STRING;
|
data->tokens[data->num_tokens].type = WPS_TOKEN_STRING;
|
||||||
data->strings[data->num_strings] = current_string;
|
|
||||||
data->tokens[data->num_tokens].value.i = data->num_strings;
|
|
||||||
data->num_tokens++;
|
|
||||||
|
|
||||||
/* Copy the first byte */
|
unsigned int len = 1;
|
||||||
*current_string++ = *(wps_bufptr - 1);
|
const char *string_start = wps_bufptr - 1;
|
||||||
stringbuf_used++;
|
|
||||||
|
|
||||||
/* continue until we hit something that ends the string
|
/* continue until we hit something that ends the string
|
||||||
or we run out of memory */
|
or we run out of memory */
|
||||||
|
@ -786,15 +782,38 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
|
||||||
*wps_bufptr != '|' && *wps_bufptr != '\n' &&
|
*wps_bufptr != '|' && *wps_bufptr != '\n' &&
|
||||||
stringbuf_used < STRING_BUFFER_SIZE - 1)
|
stringbuf_used < STRING_BUFFER_SIZE - 1)
|
||||||
{
|
{
|
||||||
*current_string++ = *wps_bufptr++;
|
wps_bufptr++;
|
||||||
stringbuf_used++;
|
len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* null terminate the string */
|
/* look if we already have that string */
|
||||||
*current_string++ = '\0';
|
char **str;
|
||||||
stringbuf_used++;
|
int i;
|
||||||
|
bool found;
|
||||||
|
for (i = 0, str = data->strings, found = false;
|
||||||
|
i < data->num_strings
|
||||||
|
&& !(found = (strlen(*str) == len && strncmp(string_start, *str, len) == 0));
|
||||||
|
i++, str++) ;
|
||||||
|
/* If a matching string is found, found is true and i is the
|
||||||
|
index of the string. If not, found is false */
|
||||||
|
|
||||||
data->num_strings++;
|
if (!found)
|
||||||
|
{
|
||||||
|
/* new string */
|
||||||
|
strncpy(stringbuf, string_start, len);
|
||||||
|
data->strings[data->num_strings] = stringbuf;
|
||||||
|
stringbuf += len + 1;
|
||||||
|
stringbuf_used += len + 1;
|
||||||
|
data->tokens[data->num_tokens].value.i = data->num_strings;
|
||||||
|
data->num_strings++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* another ocurrence of an existing string */
|
||||||
|
data->tokens[data->num_tokens].value.i = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->num_tokens++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue