summaryrefslogtreecommitdiffstats
path: root/apps/tagtree.c
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2011-05-31 19:44:21 +0000
committerNils Wallménius <nils@rockbox.org>2011-05-31 19:44:21 +0000
commitf42a305b5764764db816000c572327930eeee9e6 (patch)
tree9a38e5ed396d2bb769031f0c6a687937b8eb9f97 /apps/tagtree.c
parent8f4202db285b2139cfee6269b838733d6d2a2306 (diff)
downloadrockbox-f42a305b5764764db816000c572327930eeee9e6.tar.gz
rockbox-f42a305b5764764db816000c572327930eeee9e6.tar.bz2
rockbox-f42a305b5764764db816000c572327930eeee9e6.zip
Accept FS#12136: Save some binsize in tagtree.c. Thanks to sideral for testing.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29937 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/tagtree.c')
-rw-r--r--apps/tagtree.c159
1 files changed, 91 insertions, 68 deletions
diff --git a/apps/tagtree.c b/apps/tagtree.c
index e7f703154c..d28928dbd5 100644
--- a/apps/tagtree.c
+++ b/apps/tagtree.c
@@ -156,6 +156,12 @@ struct menu_root {
struct menu_entry *items[TAGMENU_MAX_ITEMS];
};
+struct match
+{
+ const char* str;
+ int symbol;
+};
+
/* Statusbar text of the current view. */
static char current_title[MAX_TAGS][128];
@@ -193,16 +199,48 @@ static int get_token_str(char *buf, int size)
return 0;
}
-#define MATCH(tag,str1,str2,settag) \
- if (!strcasecmp(str1, str2)) { \
- *tag = settag; \
- return 1; \
- }
-
static int get_tag(int *tag)
{
+ static const struct match get_tag_match[] =
+ {
+ {"album", tag_album},
+ {"artist", tag_artist},
+ {"bitrate", tag_bitrate},
+ {"composer", tag_composer},
+ {"comment", tag_comment},
+ {"albumartist", tag_albumartist},
+ {"ensemble", tag_albumartist},
+ {"grouping", tag_grouping},
+ {"genre", tag_genre},
+ {"length", tag_length},
+ {"Lm", tag_virt_length_min},
+ {"Ls", tag_virt_length_sec},
+ {"Pm", tag_virt_playtime_min},
+ {"Ps", tag_virt_playtime_sec},
+ {"title", tag_title},
+ {"filename", tag_filename},
+ {"tracknum", tag_tracknumber},
+ {"discnum", tag_discnumber},
+ {"year", tag_year},
+ {"playcount", tag_playcount},
+ {"rating", tag_rating},
+ {"lastplayed", tag_lastplayed},
+ {"lastoffset", tag_lastoffset},
+ {"commitid", tag_commitid},
+ {"entryage", tag_virt_entryage},
+ {"autoscore", tag_virt_autoscore},
+ {"%sort", var_sorttype},
+ {"%limit", var_limit},
+ {"%strip", var_strip},
+ {"%menu_start", var_menu_start},
+ {"%include", var_include},
+ {"%root_menu", var_rootmenu},
+ {"%format", var_format},
+ {"->", menu_next},
+ {"==>", menu_load}
+ };
char buf[128];
- int i;
+ unsigned int i;
/* Find the start. */
while ((*strp == ' ' || *strp == '>') && *strp != '\0')
@@ -210,8 +248,8 @@ static int get_tag(int *tag)
if (*strp == '\0' || *strp == '?')
return 0;
-
- for (i = 0; i < (int)sizeof(buf)-1; i++)
+
+ for (i = 0; i < sizeof(buf)-1; i++)
{
if (*strp == '\0' || *strp == ' ')
break ;
@@ -219,63 +257,54 @@ static int get_tag(int *tag)
strp++;
}
buf[i] = '\0';
-
- MATCH(tag, buf, "album", tag_album);
- MATCH(tag, buf, "artist", tag_artist);
- MATCH(tag, buf, "bitrate", tag_bitrate);
- MATCH(tag, buf, "composer", tag_composer);
- MATCH(tag, buf, "comment", tag_comment);
- MATCH(tag, buf, "albumartist", tag_albumartist);
- MATCH(tag, buf, "ensemble", tag_albumartist);
- MATCH(tag, buf, "grouping", tag_grouping);
- MATCH(tag, buf, "genre", tag_genre);
- MATCH(tag, buf, "length", tag_length);
- MATCH(tag, buf, "Lm", tag_virt_length_min);
- MATCH(tag, buf, "Ls", tag_virt_length_sec);
- MATCH(tag, buf, "Pm", tag_virt_playtime_min);
- MATCH(tag, buf, "Ps", tag_virt_playtime_sec);
- MATCH(tag, buf, "title", tag_title);
- MATCH(tag, buf, "filename", tag_filename);
- MATCH(tag, buf, "tracknum", tag_tracknumber);
- MATCH(tag, buf, "discnum", tag_discnumber);
- MATCH(tag, buf, "year", tag_year);
- MATCH(tag, buf, "playcount", tag_playcount);
- MATCH(tag, buf, "rating", tag_rating);
- MATCH(tag, buf, "lastplayed", tag_lastplayed);
- MATCH(tag, buf, "lastoffset", tag_lastoffset);
- MATCH(tag, buf, "commitid", tag_commitid);
- MATCH(tag, buf, "entryage", tag_virt_entryage);
- MATCH(tag, buf, "autoscore", tag_virt_autoscore);
- MATCH(tag, buf, "%sort", var_sorttype);
- MATCH(tag, buf, "%limit", var_limit);
- MATCH(tag, buf, "%strip", var_strip);
- MATCH(tag, buf, "%menu_start", var_menu_start);
- MATCH(tag, buf, "%include", var_include);
- MATCH(tag, buf, "%root_menu", var_rootmenu);
- MATCH(tag, buf, "%format", var_format);
- MATCH(tag, buf, "->", menu_next);
- MATCH(tag, buf, "==>", menu_load);
-
+
+ for (i = 0; i < ARRAYLEN(get_tag_match); i++)
+ {
+ if (!strcasecmp(buf, get_tag_match[i].str))
+ {
+ *tag = get_tag_match[i].symbol;
+ return 1;
+ }
+ }
+
logf("NO MATCH: %s\n", buf);
if (buf[0] == '?')
return 0;
-
+
return -1;
}
static int get_clause(int *condition)
{
+ static const struct match get_clause_match[] =
+ {
+ {"=", clause_is},
+ {"==", clause_is},
+ {"!=", clause_is_not},
+ {">", clause_gt},
+ {">=", clause_gteq},
+ {"<", clause_lt},
+ {"<=", clause_lteq},
+ {"~", clause_contains},
+ {"!~", clause_not_contains},
+ {"^", clause_begins_with},
+ {"!^", clause_not_begins_with},
+ {"$", clause_ends_with},
+ {"!$", clause_not_ends_with},
+ {"@", clause_oneof}
+ };
+
char buf[4];
- int i;
-
+ unsigned int i;
+
/* Find the start. */
while (*strp == ' ' && *strp != '\0')
strp++;
-
+
if (*strp == '\0')
return 0;
-
- for (i = 0; i < (int)sizeof(buf)-1; i++)
+
+ for (i = 0; i < sizeof(buf)-1; i++)
{
if (*strp == '\0' || *strp == ' ')
break ;
@@ -283,22 +312,16 @@ static int get_clause(int *condition)
strp++;
}
buf[i] = '\0';
-
- MATCH(condition, buf, "=", clause_is);
- MATCH(condition, buf, "==", clause_is);
- MATCH(condition, buf, "!=", clause_is_not);
- MATCH(condition, buf, ">", clause_gt);
- MATCH(condition, buf, ">=", clause_gteq);
- MATCH(condition, buf, "<", clause_lt);
- MATCH(condition, buf, "<=", clause_lteq);
- MATCH(condition, buf, "~", clause_contains);
- MATCH(condition, buf, "!~", clause_not_contains);
- MATCH(condition, buf, "^", clause_begins_with);
- MATCH(condition, buf, "!^", clause_not_begins_with);
- MATCH(condition, buf, "$", clause_ends_with);
- MATCH(condition, buf, "!$", clause_not_ends_with);
- MATCH(condition, buf, "@", clause_oneof);
-
+
+ for (i = 0; i < ARRAYLEN(get_clause_match); i++)
+ {
+ if (!strcasecmp(buf, get_clause_match[i].str))
+ {
+ *condition = get_clause_match[i].symbol;
+ return 1;
+ }
+ }
+
return 0;
}