summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Hohmuth <sideral@rockbox.org>2011-07-31 16:26:35 +0000
committerMichael Hohmuth <sideral@rockbox.org>2011-07-31 16:26:35 +0000
commiteab7e747788bd633104019ab82bc75b384a95eff (patch)
tree6a2660b83b6b0448986b0f5813458e09ce0774f2
parentaccea18ded5d2f1bb4db3118f9c7bfa994a2f77d (diff)
downloadrockbox-eab7e747788bd633104019ab82bc75b384a95eff.tar.gz
rockbox-eab7e747788bd633104019ab82bc75b384a95eff.zip
FS#12132 patch 6, part 2: tagnavi.config: Add support for "basename"
in formats and conditions. The basename is the non-directory part of a file's pathname. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30230 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/tagcache.c20
-rw-r--r--apps/tagcache.h4
-rw-r--r--apps/tagtree.c1
3 files changed, 21 insertions, 4 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 089bba13aa..e841d8e420 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -871,6 +871,10 @@ static long check_virtual_tags(int tag, int idx_id,
- find_tag(tag_commitid, idx_id, idx) - 1;
break;
+ case tag_virt_basename:
+ tag = tag_filename; /* return filename; caller handles basename */
+ /* FALLTHRU */
+
default:
data = find_tag(tag, idx_id, idx);
}
@@ -1011,7 +1015,8 @@ static bool check_clauses(struct tagcache_search *tcs,
if (!TAGCACHE_IS_NUMERIC(clause->tag))
{
- if (clause->tag == tag_filename)
+ if (clause->tag == tag_filename
+ || clause->tag == tag_virt_basename)
{
retrieve(tcs, idx, tag_filename, buf, sizeof buf);
}
@@ -1029,7 +1034,11 @@ static bool check_clauses(struct tagcache_search *tcs,
if (!TAGCACHE_IS_NUMERIC(clause->tag))
{
- int fd = tcs->idxfd[clause->tag];
+ int tag = clause->tag;
+ if (tag == tag_virt_basename)
+ tag = tag_filename;
+
+ int fd = tcs->idxfd[tag];
lseek(fd, seek, SEEK_SET);
ecread_tagfile_entry(fd, &tfe);
if (tfe.tag_length >= (int)sizeof(buf))
@@ -1047,6 +1056,13 @@ static bool check_clauses(struct tagcache_search *tcs,
}
}
+ if (clause->tag == tag_virt_basename)
+ {
+ char *basename = strrchr(str, '/');
+ if (basename)
+ str = basename + 1;
+ }
+
if (!check_against_clause(seek, str, clause))
{
/* Clause failed -- try finding a logical-or clause */
diff --git a/apps/tagcache.h b/apps/tagcache.h
index 1dad012ebe..393a2905f5 100644
--- a/apps/tagcache.h
+++ b/apps/tagcache.h
@@ -36,7 +36,7 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title,
/* Real tags end here, count them. */
TAG_COUNT,
/* Virtual tags */
- tag_virt_length_min, tag_virt_length_sec,
+ tag_virt_basename, tag_virt_length_min, tag_virt_length_sec,
tag_virt_playtime_min, tag_virt_playtime_sec,
tag_virt_entryage, tag_virt_autoscore };
@@ -106,7 +106,7 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title,
(1LU << tag_tracknumber) | (1LU << tag_length) | (1LU << tag_bitrate) | \
(1LU << tag_playcount) | (1LU << tag_rating) | (1LU << tag_playtime) | \
(1LU << tag_lastplayed) | (1LU << tag_commitid) | (1LU << tag_mtime) | \
- (1LU << tag_lastoffset) | \
+ (1LU << tag_lastoffset) | (1LU << tag_virt_basename) | \
(1LU << tag_virt_length_min) | (1LU << tag_virt_length_sec) | \
(1LU << tag_virt_playtime_min) | (1LU << tag_virt_playtime_sec) | \
(1LU << tag_virt_entryage) | (1LU << tag_virt_autoscore))
diff --git a/apps/tagtree.c b/apps/tagtree.c
index a929fb6c33..37de9a242d 100644
--- a/apps/tagtree.c
+++ b/apps/tagtree.c
@@ -238,6 +238,7 @@ static int get_tag(int *tag)
{"Ps", tag_virt_playtime_sec},
{"title", tag_title},
{"filename", tag_filename},
+ {"basename", tag_virt_basename},
{"tracknum", tag_tracknumber},
{"discnum", tag_discnumber},
{"year", tag_year},