diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2017-01-07 07:12:10 -0500 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2017-01-07 19:10:02 -0500 |
commit | 5c6ccb43b55d70350869429da25e2b54b45086d3 (patch) | |
tree | f06266c8ade82f36e7e3360ceca313c8b4adaf80 /apps | |
parent | 5a0a7b8b58a02192e5087077acf9e66fbdf1966e (diff) | |
download | rockbox-5c6ccb43b55d70350869429da25e2b54b45086d3.tar.gz rockbox-5c6ccb43b55d70350869429da25e2b54b45086d3.zip |
Fix track formatting problems in playlist.c
Some changes in behavior were made with filesystem code commit
for the sake of compatibility that changed expected behavior.
* Restore substitution of drive spec in fully-qualified DOS paths
with the playlists's volume spec (or root on univolume targets).
Drive-relative paths of the form "c:foo" (no separator after
':') will be treated as purely relative.
* Restore old behavior of preserving leading whitespace in the
source path and trimming only trailing tabs and spaces.
* Multivolume: Volume substition on fully-qualified UNIX/RB paths
has NOT been reintroduced (and perhaps wasn't intended in the
first place). They will not be modified because there is no
ambiguity to resolve. Doing so would prevent a playlist on
external storage from referencing a file on main storage without
qualifying it with "/<0>...".
* Plain relative paths are and always have been interpreted as
relative to the location of the playlist.
Change-Id: Ic0800cea79c59563b7bac20f8b08abb5051906c7
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playlist.c | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/apps/playlist.c b/apps/playlist.c index 173d445f8c..015e41ae0e 100644 --- a/apps/playlist.c +++ b/apps/playlist.c | |||
@@ -1712,23 +1712,59 @@ static int check_subdir_for_music(char *dir, const char *subdir, bool recurse) | |||
1712 | static ssize_t format_track_path(char *dest, char *src, int buf_length, | 1712 | static ssize_t format_track_path(char *dest, char *src, int buf_length, |
1713 | const char *dir) | 1713 | const char *dir) |
1714 | { | 1714 | { |
1715 | size_t len; | 1715 | size_t len = 0; |
1716 | |||
1717 | /* Look for the end of the string */ | ||
1718 | while (1) | ||
1719 | { | ||
1720 | int c = src[len]; | ||
1721 | if (c == '\n' || c == '\r' || c == '\0') | ||
1722 | break; | ||
1723 | len++; | ||
1724 | } | ||
1725 | |||
1726 | /* Now work back killing white space */ | ||
1727 | while (len > 0) | ||
1728 | { | ||
1729 | int c = src[len - 1]; | ||
1730 | if (c != '\t' && c != ' ') | ||
1731 | break; | ||
1732 | len--; | ||
1733 | } | ||
1716 | 1734 | ||
1717 | /* strip whitespace at beginning and end */ | ||
1718 | len = path_trim_whitespace(src, (const char **)&src); | ||
1719 | src[len] = '\0'; | 1735 | src[len] = '\0'; |
1720 | 1736 | ||
1721 | /* replace backslashes with forward slashes */ | 1737 | /* Replace backslashes with forward slashes */ |
1722 | path_correct_separators(src, src); | 1738 | path_correct_separators(src, src); |
1723 | 1739 | ||
1724 | /* handle DOS style drive letter and parse non-greedily so that: | 1740 | /* Drive letters have no meaning here; handle DOS style drive letter |
1725 | * 1) "c:/foo" becomes "/foo" and the result is absolute | 1741 | * and parse greedily so that: |
1726 | * 2) "c:foo becomes "foo" and the result is relative | 1742 | * |
1727 | * This is how Windows seems to handle it except drive letters are of no | 1743 | * 1) "c:/foo" is fully qualified, use directory volume only |
1728 | * meaning here. */ | 1744 | * 2) "c:foo" is relative to current directory on C, use directory path |
1729 | path_strip_drive(src, (const char **)&src, false); | 1745 | * |
1746 | * Assume any volume on the beginning of the directory path is actually | ||
1747 | * the volume on which it resides. This may not be the case if the dir | ||
1748 | * param contains a path such as "/<1>/foo/../../<0>/bar", which refers | ||
1749 | * to "/<0>/bar" (aka "/bar" at this time). *fingers crossed* | ||
1750 | * | ||
1751 | * If any stripped drive spec was absolute, prepend the playlist | ||
1752 | * directory's volume spec, or root if none. Relative paths remain | ||
1753 | * relative and the playlist's directory fully qualifies them. Absolute | ||
1754 | * UNIX-style paths remain unaltered. | ||
1755 | */ | ||
1756 | if (path_strip_drive(src, (const char **)&src, true) >= 0 && | ||
1757 | src[-1] == PATH_SEPCH) | ||
1758 | { | ||
1759 | #ifdef HAVE_MULTIVOLUME | ||
1760 | const char *p; | ||
1761 | path_strip_volume(dir, &p, false); | ||
1762 | dir = strmemdupa(dir, p - dir); /* empty if no volspec on dir */ | ||
1763 | #else | ||
1764 | dir = ""; /* only volume is root */ | ||
1765 | #endif | ||
1766 | } | ||
1730 | 1767 | ||
1731 | /* prepends directory only if src is relative */ | ||
1732 | len = path_append(dest, *dir ? dir : PATH_ROOTSTR, src, buf_length); | 1768 | len = path_append(dest, *dir ? dir : PATH_ROOTSTR, src, buf_length); |
1733 | if (len >= (size_t)buf_length) | 1769 | if (len >= (size_t)buf_length) |
1734 | return -1; /* buffer too small */ | 1770 | return -1; /* buffer too small */ |