summaryrefslogtreecommitdiff
path: root/apps/gui/wps_parser.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2008-03-22 00:31:22 +0000
committerDave Chapman <dave@dchapman.com>2008-03-22 00:31:22 +0000
commit45b2d8802d1e8fcc47fd1148adb7b1173ad5b311 (patch)
tree849eea4153daaf7dfafd571ca6b93b6f985b1ff9 /apps/gui/wps_parser.c
parent7ee63e22c58f4a7017136871e7b55dd702c5f460 (diff)
downloadrockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.tar.gz
rockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.zip
Reduce the shocking amount of RAM my viewports implementation was using. The first version stored an array of lines for each of the 16 possible viewports (MAX_VIEWPORTS * the number of lines on the LCD with a 5-pixel high font). This version reverts back to a single global array of lines, with each viewport specifying the first and last lines as indexes into that array. This also turns out to be simpler, reducing binsize a little as well.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16735 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/wps_parser.c')
-rw-r--r--apps/gui/wps_parser.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c
index c641f2c247..be3d2fb882 100644
--- a/apps/gui/wps_parser.c
+++ b/apps/gui/wps_parser.c
@@ -338,11 +338,9 @@ static int skip_end_of_line(const char *wps_bufptr)
338/* Starts a new subline in the current line during parsing */ 338/* Starts a new subline in the current line during parsing */
339static void wps_start_new_subline(struct wps_data *data) 339static void wps_start_new_subline(struct wps_data *data)
340{ 340{
341 struct wps_viewport* vp = &data->viewports[data->num_viewports];
342
343 data->num_sublines++; 341 data->num_sublines++;
344 data->sublines[data->num_sublines].first_token_idx = data->num_tokens; 342 data->sublines[data->num_sublines].first_token_idx = data->num_tokens;
345 vp->lines[vp->num_lines].num_sublines++; 343 data->lines[data->num_lines].num_sublines++;
346} 344}
347 345
348#ifdef HAVE_LCD_BITMAP 346#ifdef HAVE_LCD_BITMAP
@@ -585,12 +583,14 @@ static int parse_viewport(const char *wps_bufptr,
585 } 583 }
586 } 584 }
587#endif 585#endif
588 586
589 wps_data->viewports[wps_data->num_viewports].num_lines = 0; 587 wps_data->viewports[wps_data->num_viewports-1].last_line = wps_data->num_lines - 1;
588
589 wps_data->viewports[wps_data->num_viewports].first_line = wps_data->num_lines;
590 590
591 if (wps_data->num_sublines < WPS_MAX_SUBLINES) 591 if (wps_data->num_sublines < WPS_MAX_SUBLINES)
592 { 592 {
593 wps_data->viewports[wps_data->num_viewports].lines[0].first_subline_idx = 593 wps_data->lines[wps_data->num_lines].first_subline_idx =
594 wps_data->num_sublines; 594 wps_data->num_sublines;
595 595
596 wps_data->sublines[wps_data->num_sublines].first_token_idx = 596 wps_data->sublines[wps_data->num_sublines].first_token_idx =
@@ -599,7 +599,7 @@ static int parse_viewport(const char *wps_bufptr,
599 599
600 /* Skip the rest of the line */ 600 /* Skip the rest of the line */
601 return skip_end_of_line(wps_bufptr); 601 return skip_end_of_line(wps_bufptr);
602 } 602}
603 603
604 604
605static int parse_image_special(const char *wps_bufptr, 605static int parse_image_special(const char *wps_bufptr,
@@ -1072,7 +1072,7 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
1072 1072
1073 while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1 1073 while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1
1074 && data->num_viewports < WPS_MAX_VIEWPORTS 1074 && data->num_viewports < WPS_MAX_VIEWPORTS
1075 && data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES) 1075 && data->num_lines < WPS_MAX_LINES)
1076 { 1076 {
1077 switch(*wps_bufptr++) 1077 switch(*wps_bufptr++)
1078 { 1078 {
@@ -1180,12 +1180,12 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
1180 1180
1181 line++; 1181 line++;
1182 wps_start_new_subline(data); 1182 wps_start_new_subline(data);
1183 data->viewports[data->num_viewports].num_lines++; /* Start a new line */ 1183 data->num_lines++; /* Start a new line */
1184 1184
1185 if ((data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES) && 1185 if ((data->num_lines < WPS_MAX_LINES) &&
1186 (data->num_sublines < WPS_MAX_SUBLINES)) 1186 (data->num_sublines < WPS_MAX_SUBLINES))
1187 { 1187 {
1188 data->viewports[data->num_viewports].lines[data->viewports[data->num_viewports].num_lines].first_subline_idx = 1188 data->lines[data->num_lines].first_subline_idx =
1189 data->num_sublines; 1189 data->num_sublines;
1190 1190
1191 data->sublines[data->num_sublines].first_token_idx = 1191 data->sublines[data->num_sublines].first_token_idx =
@@ -1262,6 +1262,8 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
1262 if (!fail && level >= 0) /* there are unclosed conditionals */ 1262 if (!fail && level >= 0) /* there are unclosed conditionals */
1263 fail = PARSE_FAIL_UNCLOSED_COND; 1263 fail = PARSE_FAIL_UNCLOSED_COND;
1264 1264
1265 data->viewports[data->num_viewports].last_line = data->num_lines - 1;
1266
1265 /* We have finished with the last viewport, so increment count */ 1267 /* We have finished with the last viewport, so increment count */
1266 data->num_viewports++; 1268 data->num_viewports++;
1267 1269
@@ -1512,20 +1514,20 @@ bool wps_data_load(struct wps_data *wps_data,
1512 } 1514 }
1513} 1515}
1514 1516
1515int wps_subline_index(struct wps_data *data, int v, int line, int subline) 1517int wps_subline_index(struct wps_data *data, int line, int subline)
1516{ 1518{
1517 return data->viewports[v].lines[line].first_subline_idx + subline; 1519 return data->lines[line].first_subline_idx + subline;
1518} 1520}
1519 1521
1520int wps_first_token_index(struct wps_data *data, int v, int line, int subline) 1522int wps_first_token_index(struct wps_data *data, int line, int subline)
1521{ 1523{
1522 int first_subline_idx = data->viewports[v].lines[line].first_subline_idx; 1524 int first_subline_idx = data->lines[line].first_subline_idx;
1523 return data->sublines[first_subline_idx + subline].first_token_idx; 1525 return data->sublines[first_subline_idx + subline].first_token_idx;
1524} 1526}
1525 1527
1526int wps_last_token_index(struct wps_data *data, int v, int line, int subline) 1528int wps_last_token_index(struct wps_data *data, int line, int subline)
1527{ 1529{
1528 int first_subline_idx = data->viewports[v].lines[line].first_subline_idx; 1530 int first_subline_idx = data->lines[line].first_subline_idx;
1529 int idx = first_subline_idx + subline; 1531 int idx = first_subline_idx + subline;
1530 if (idx < data->num_sublines - 1) 1532 if (idx < data->num_sublines - 1)
1531 { 1533 {