summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorJames D. Smith <smithjd15@gmail.com>2021-09-18 21:09:24 -0600
committerSolomon Peachy <pizza@shaftnet.org>2021-09-19 21:05:58 -0400
commit760277e096cd35629166367352c108d6ab3b59c2 (patch)
tree75967beb624e48f51943ffa98ff562110e5c1d97 /firmware
parent67716c6b46a7780bff6b80408b3452c01bfbfdc4 (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.c51
-rw-r--r--firmware/export/pathfuncs.h1
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 */