]> diplodocus.org Git - nmh/blobdiff - sbr/path.c
mhlsbr.c: Move interface to own file.
[nmh] / sbr / path.c
index 8f6bd55f617e4929e7aa51b33c0d1e8fa486a745..a6568db8df52ec828bfb376f238d9e5a32dbb636 100644 (file)
@@ -1,14 +1,16 @@
-
-/*
- * path.c -- return a pathname
+/* 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
  * complete copyright information.
  */
 
-#include <h/mh.h>
-#include <h/utils.h>
+#include "h/mh.h"
+#include "ssequal.h"
+#include "getfolder.h"
+#include "path.h"
+#include "h/utils.h"
+#include "m_maildir.h"
 
 #define        CWD     "./"
 #define        DOT     "."
@@ -23,26 +25,31 @@ static char *pwds;
 static char *expath(char *,int);
 static void compath(char *);
 
+
+/* Return value must be free(3)'d. */
 char *
 pluspath(char *name)
 {
        return path(name + 1, *name == '+' ? TFOLDER : TSUBCWF);
 }
 
+
+/* Return value must be free(3)'d. */
 char *
 path(char *name, int flag)
 {
-    char *cp, *ep;
+    char *p, *last;
 
-    if ((cp = expath (name, flag))
-           && (ep = cp + strlen (cp) - 1) > cp
-           && *ep == '/')
-       *ep = '\0';
+    p = expath(name, flag);
+    last = p + strlen(p) - 1;
+    if (last > p && *last == '/')
+       *last = '\0';
 
-    return cp;
+    return p;
 }
 
 
+/* Return value must be free(3)'d. */
 static char *
 expath (char *name, int flag)
 {
@@ -64,10 +71,10 @@ expath (char *name, int flag)
 
     if (*name == '/'
            || (flag == TFOLDER
-               && (!HasPrefix(name, CWD)
+               && (!has_prefix(name, CWD)
                    && strcmp (name, DOT)
                    && strcmp (name, DOTDOT)
-                   && !HasPrefix(name, PWD))))
+                   && !has_prefix(name, PWD))))
        return mh_xstrdup(name);
 
     if (pwds == NULL)
@@ -79,11 +86,10 @@ expath (char *name, int flag)
     ep = pwds + strlen (pwds);
     if ((cp = strrchr(pwds, '/')) == NULL)
        cp = ep;
-    else
-       if (cp == pwds)
-           cp++;
+    else if (cp == pwds)
+        cp++;
 
-    if (HasPrefix(name, CWD))
+    if (has_prefix(name, CWD))
        name += LEN(CWD);
 
     if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) {
@@ -91,7 +97,7 @@ expath (char *name, int flag)
        return mh_xstrdup(buffer);
     }
 
-    if (HasPrefix(name, PWD))
+    if (has_prefix(name, PWD))
        name += LEN(PWD);
     else
        cp = ep;
@@ -109,59 +115,60 @@ compath (char *f)
     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 (HasPrefix(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 (HasPrefix(cp, CWD)) {
-                       strcpy (cp - 1, cp + LEN(CWD) - 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;
+        }
+    }
 }