-
-/*
- * 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
#include <h/mh.h>
#include <h/utils.h>
+#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;
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)
if (cp == pwds)
cp++;
- if (HasPrefix(name, CWD))
- name += NCWD;
+ if (has_prefix(name, CWD))
+ name += LEN(CWD);
if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) {
snprintf (buffer, sizeof(buffer), "%.*s", (int)(cp - pwds), pwds);
return mh_xstrdup(buffer);
}
- if (HasPrefix(name, PWD))
- name += NPWD;
+ if (has_prefix(name, PWD))
+ name += LEN(PWD);
else
cp = ep;
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 + NPWD - 1);
- cp = dp;
- continue;
- }
- if (HasPrefix(cp, CWD)) {
- 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;
+ }
+ }
}