X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6c42153ad9362cc676ea66563bf400d7511b3b68..0960755b43eeadb9af44c924cf85b39bd2fb78f6:/sbr/path.c diff --git a/sbr/path.c b/sbr/path.c index 0ae27d39..bf9283a3 100644 --- a/sbr/path.c +++ b/sbr/path.c @@ -1,8 +1,4 @@ - -/* - * path.c -- return a pathname - * - * $Id$ +/* path.c -- return a pathname * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -10,13 +6,13 @@ */ #include +#include +#include "m_maildir.h" #define CWD "./" -#define NCWD (sizeof(CWD) - 1) #define DOT "." #define DOTDOT ".." #define PWD "../" -#define NPWD (sizeof(PWD) - 1) static char *pwds; @@ -26,11 +22,16 @@ static char *pwds; static char *expath(char *,int); static void compath(char *); +char * +pluspath(char *name) +{ + return path(name + 1, *name == '+' ? TFOLDER : TSUBCWF); +} char * path(char *name, int flag) { - register char *cp, *ep; + char *cp, *ep; if ((cp = expath (name, flag)) && (ep = cp + strlen (cp) - 1) > cp @@ -44,7 +45,7 @@ path(char *name, int flag) static char * expath (char *name, int flag) { - register char *cp, *ep; + char *cp, *ep; char buffer[BUFSIZ]; if (flag == TSUBCWF) { @@ -54,7 +55,7 @@ expath (char *name, int flag) snprintf (buffer, sizeof(buffer), "%s/", m_maildir ("")); if (ssequal (buffer, name)) { cp = name; - name = getcpy (name + strlen (buffer)); + name = mh_xstrdup(name + strlen(buffer)); free (cp); } flag = TFOLDER; @@ -62,104 +63,104 @@ expath (char *name, int flag) if (*name == '/' || (flag == TFOLDER - && (strncmp (name, CWD, NCWD) + && (!has_prefix(name, CWD) && strcmp (name, DOT) && strcmp (name, DOTDOT) - && strncmp (name, PWD, NPWD)))) - return getcpy (name); + && !has_prefix(name, PWD)))) + return mh_xstrdup(name); if (pwds == NULL) pwds = pwd (); if (strcmp (name, DOT) == 0 || strcmp (name, CWD) == 0) - return getcpy (pwds); + return mh_xstrdup(pwds); ep = pwds + strlen (pwds); if ((cp = strrchr(pwds, '/')) == NULL) cp = ep; - else - if (cp == pwds) - cp++; + else if (cp == pwds) + cp++; - if (strncmp (name, CWD, NCWD) == 0) - name += NCWD; + if (has_prefix(name, CWD)) + name += LEN(CWD); if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) { - snprintf (buffer, sizeof(buffer), "%.*s", cp - pwds, pwds); - return getcpy (buffer); + snprintf (buffer, sizeof(buffer), "%.*s", (int)(cp - pwds), pwds); + return mh_xstrdup(buffer); } - if (strncmp (name, PWD, NPWD) == 0) - name += NPWD; + if (has_prefix(name, PWD)) + name += LEN(PWD); else cp = ep; - snprintf (buffer, sizeof(buffer), "%.*s/%s", cp - pwds, pwds, name); - return getcpy (buffer); + snprintf (buffer, sizeof(buffer), "%.*s/%s", (int)(cp - pwds), pwds, name); + return mh_xstrdup(buffer); } static void compath (char *f) { - register char *cp, *dp; + char *cp, *dp; if (*f != '/') return; - for (cp = f; *cp;) - if (*cp == '/') { - switch (*++cp) { - case 0: - if (--cp > f) - *cp = '\0'; - break; - - case '/': - for (dp = cp; *dp == '/'; dp++) - continue; - strcpy (cp--, dp); - continue; - - case '.': - if (strcmp (cp, DOT) == 0) { - if (cp > f + 1) - cp--; - *cp = '\0'; - break; - } - if (strcmp (cp, DOTDOT) == 0) { - for (cp -= 2; cp > f; cp--) - if (*cp == '/') - break; - if (cp <= f) - cp = f + 1; - *cp = '\0'; - break; - } - if (strncmp (cp, PWD, NPWD) == 0) { - for (dp = cp - 2; dp > f; dp--) - if (*dp == '/') - break; - if (dp <= f) - dp = f; - strcpy (dp, cp + NPWD - 1); - cp = dp; - continue; - } - if (strncmp (cp, CWD, NCWD) == 0) { - strcpy (cp - 1, cp + NCWD - 1); - cp--; - continue; - } - continue; - - default: - cp++; - continue; - } - break; - } - else + for (cp = f; *cp;) { + if (*cp != '/') { cp++; + continue; + } + + switch (*++cp) { + case 0: + if (--cp > f) + *cp = '\0'; + return; + + case '/': + for (dp = cp; *dp == '/'; dp++) + continue; + strcpy (cp--, dp); + continue; + + case '.': + if (strcmp (cp, DOT) == 0) { + if (cp > f + 1) + cp--; + *cp = '\0'; + return; + } + if (strcmp (cp, DOTDOT) == 0) { + for (cp -= 2; cp > f; cp--) + if (*cp == '/') + break; + if (cp <= f) + cp = f + 1; + *cp = '\0'; + return; + } + if (has_prefix(cp, PWD)) { + for (dp = cp - 2; dp > f; dp--) + if (*dp == '/') + break; + if (dp <= f) + dp = f; + strcpy (dp, cp + LEN(PWD) - 1); + cp = dp; + continue; + } + if (has_prefix(cp, CWD)) { + strcpy (cp - 1, cp + LEN(CWD) - 1); + cp--; + continue; + } + continue; + + default: + cp++; + continue; + } + } }