summaryrefslogtreecommitdiffstats
path: root/apps/tagcache.c
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2011-06-20 15:53:33 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2011-06-20 15:53:33 +0000
commitf2ef42c1da977402e19e6ac77165f9cd0fd25643 (patch)
treee754ee56e727aa3f2741f820ffc3f6a22aa368ca /apps/tagcache.c
parentc56cca261a4e8a72443a3fdf79152782c7c731e5 (diff)
downloadrockbox-f2ef42c1da977402e19e6ac77165f9cd0fd25643.tar.gz
rockbox-f2ef42c1da977402e19e6ac77165f9cd0fd25643.zip
Fixed a changelog export/import problem with tagcache where <CR> or <LF>
characters in a tag could cause the parser fail to import a track statistics correctly. Now line feeds are escaped properly and carriage returns ignored on import. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30021 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/tagcache.c')
-rw-r--r--apps/tagcache.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 6ad8f118a1..0c85fc5957 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -3278,6 +3278,13 @@ static bool write_tag(int fd, const char *tagstr, const char *datastr)
if (*datastr == '"' || *datastr == '\\')
buf[i++] = '\\';
+ else if (*datastr == '\n')
+ {
+ buf[i++] = '\\';
+ buf[i] = 'n';
+ continue;
+ }
+
buf[i] = *(datastr++);
}
@@ -3335,12 +3342,18 @@ static bool read_tag(char *dest, long size,
if (*src == '\\')
{
- dest[pos] = *(src+1);
- src += 2;
+ src++;
+ if (*src == 'n')
+ dest[pos] = '\n';
+ else
+ dest[pos] = *src;
+
+ src++;
continue;
}
- dest[pos] = *src;
+ if (*src == '\0')
+ break;
if (*src == '"')
{
@@ -3348,10 +3361,7 @@ static bool read_tag(char *dest, long size,
break;
}
- if (*src == '\0')
- break;
-
- src++;
+ dest[pos] = *(src++);
}
dest[pos] = '\0';
@@ -3377,10 +3387,10 @@ static int parse_changelog_line(int line_n, const char *buf, void *parameters)
if (*buf == '#')
return 0;
- logf("%d/%s", line_n, buf);
+ /* logf("%d/%s", line_n, buf); */
if (!read_tag(tag_data, sizeof tag_data, buf, "filename"))
{
- logf("filename missing");
+ logf("%d/filename missing", line_n);
logf("-> %s", buf);
return 0;
}
@@ -3388,13 +3398,13 @@ static int parse_changelog_line(int line_n, const char *buf, void *parameters)
idx_id = find_index(tag_data);
if (idx_id < 0)
{
- logf("entry not found");
+ logf("%d/entry not found", line_n);
return 0;
}
if (!get_index(masterfd, idx_id, &idx, false))
{
- logf("failed to retrieve index entry");
+ logf("%d/failed to retrieve index entry", line_n);
return 0;
}
@@ -3402,7 +3412,7 @@ static int parse_changelog_line(int line_n, const char *buf, void *parameters)
if (idx.flag & FLAG_DIRTYNUM)
return 0;
- logf("import: %s", tag_data);
+ logf("%d/import: %s", line_n, tag_data);
idx.flag |= FLAG_DIRTYNUM;
for (i = 0; i < (long)(sizeof(import_tags)/sizeof(import_tags[0])); i++)