diff options
author | James D. Smith <smithjd15@gmail.com> | 2021-09-18 21:09:24 -0600 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2021-09-19 21:05:58 -0400 |
commit | 760277e096cd35629166367352c108d6ab3b59c2 (patch) | |
tree | 75967beb624e48f51943ffa98ff562110e5c1d97 /firmware | |
parent | 67716c6b46a7780bff6b80408b3452c01bfbfdc4 (diff) |
Dir cache: Fix resume of relative path playlists.
Slightly modified from original patch by Fabrice Bellard.
Change-Id: I9ae04fa460f0f1b9c616e6f99505d4c5d4358f68
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/common/pathfuncs.c | 51 | ||||
-rw-r--r-- | firmware/export/pathfuncs.h | 1 |
2 files changed, 52 insertions, 0 deletions
diff --git a/firmware/common/pathfuncs.c b/firmware/common/pathfuncs.c index 1c48a54972..2b4e6a8eb0 100644 --- a/firmware/common/pathfuncs.c +++ b/firmware/common/pathfuncs.c @@ -340,6 +340,57 @@ void path_correct_separators(char *dstpath, const char *path) strcpy(dstp, p); } +/* Remove dot segments from the path + * + * 'path' and 'dstpath' may either be the same buffer or non-overlapping + */ +void path_remove_dot_segments (char *dstpath, const char *path) +{ + char *dstp = dstpath; + char *odstp = dstpath; + const char *p = path; + + while (*p) + { + if (p[0] == '.' && p[1] == PATH_SEPCH) + p += 2; + else if (p[0] == '.' && p[1] == '.' && p[2] == PATH_SEPCH) + p += 3; + else if (p[0] == PATH_SEPCH && p[1] == '.' && p[2] == PATH_SEPCH) + p += 2; + else if (p[0] == PATH_SEPCH && p[1] == '.' && !p[2]) + { + *dstp++ = PATH_SEPCH; + break; + } + else if (p[0] == PATH_SEPCH && p[1] == '.' && + p[2] == '.' && p[3] == PATH_SEPCH) + { + dstp = odstp; + p += 3; + } + else if (p[0] == PATH_SEPCH && p[1] == '.' && p[2] == '.' && !p[3]) + { + dstp = odstp; + *dstp++ = PATH_SEPCH; + break; + } + else if (p[0] == '.' && !p[1]) + break; + else if (p[0] == '.' && p[1] == '.' && !p[2]) + break; + else + { + odstp = dstp; + if (p[0] == PATH_SEPCH) + *dstp++ = *p++; + while (p[0] && p[0] != PATH_SEPCH) + *dstp++ = *p++; + } + } + *dstp = 0; +} + /* Appends one path to another, adding separators between components if needed. * Return value and behavior is otherwise as strlcpy so that truncation may be * detected. diff --git a/firmware/export/pathfuncs.h b/firmware/export/pathfuncs.h index 92539c54c1..350dd4e548 100644 --- a/firmware/export/pathfuncs.h +++ b/firmware/export/pathfuncs.h @@ -82,6 +82,7 @@ size_t path_basename(const char *name, const char **nameptr); size_t path_dirname(const char *name, const char **nameptr); size_t path_strip_trailing_separators(const char *name, const char **nameptr); void path_correct_separators(char *dstpath, const char *path); +void path_remove_dot_segments(char *dstpath, const char *path); /* constants useable in basepath and component */ #define PA_SEP_HARD NULL /* separate even if base is empty */ |