X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=libbb%2Fsimplify_path.c;h=f80e3e8a5eef53ddeba2cd365bbd39506cfea8f9;hb=0939f2ebd25a0f9905d0c50276f796497a57fa93;hp=b714c66b6c586e96636c9b352d6df7e0efffd150;hpb=d921b2ecc0d294ad4bf8c7458fc52a60c28727d2;p=oweals%2Fbusybox.git diff --git a/libbb/simplify_path.c b/libbb/simplify_path.c index b714c66b6..f80e3e8a5 100644 --- a/libbb/simplify_path.c +++ b/libbb/simplify_path.c @@ -6,33 +6,27 @@ * * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ - #include "libbb.h" -char *bb_simplify_path(const char *path) +char* FAST_FUNC bb_simplify_abs_path_inplace(char *start) { - char *s, *start, *p; + char *s, *p; - if (path[0] == '/') - start = xstrdup(path); - else { - s = xgetcwd(NULL); - start = concat_path_file(s, path); - free(s); - } p = s = start; - do { if (*p == '/') { if (*s == '/') { /* skip duplicate (or initial) slash */ continue; - } else if (*s == '.') { - if (s[1] == '/' || s[1] == 0) { /* remove extra '.' */ + } + if (*s == '.') { + if (s[1] == '/' || !s[1]) { /* remove extra '.' */ continue; - } else if ((s[1] == '.') && (s[2] == '/' || s[2] == 0)) { + } + if ((s[1] == '.') && (s[2] == '/' || !s[2])) { ++s; if (p > start) { - while (*--p != '/'); /* omit previous dir */ + while (*--p != '/') /* omit previous dir */ + continue; } continue; } @@ -44,7 +38,22 @@ char *bb_simplify_path(const char *path) if ((p == start) || (*p != '/')) { /* not a trailing slash */ ++p; /* so keep last character */ } - *p = 0; + *p = '\0'; + return p; +} + +char* FAST_FUNC bb_simplify_path(const char *path) +{ + char *s, *p; + + if (path[0] == '/') + s = xstrdup(path); + else { + p = xrealloc_getcwd_or_warn(NULL); + s = concat_path_file(p, path); + free(p); + } - return start; + bb_simplify_abs_path_inplace(s); + return s; }