- register char *cp, *ep;
- char buffer[BUFSIZ];
-
- if (flag == TSUBCWF) {
- snprintf (buffer, sizeof(buffer), "%s/%s", getfolder (1), name);
- name = m_mailpath (buffer);
- compath (name);
- snprintf (buffer, sizeof(buffer), "%s/", m_maildir (""));
- if (ssequal (buffer, name)) {
- cp = name;
- name = getcpy (name + strlen (buffer));
- free (cp);
+ register char *cp, *ep;
+ char buffer[BUFSIZ];
+
+ if (flag == TSUBCWF) {
+ snprintf(buffer, sizeof(buffer), "%s/%s", getfolder(1), name);
+ name = m_mailpath(buffer);
+ compath(name);
+ snprintf(buffer, sizeof(buffer), "%s/", m_maildir(""));
+ if (isprefix(buffer, name)) {
+ cp = name;
+ name = getcpy(name + strlen(buffer));
+ free(cp);
+ }
+ flag = TFOLDER;
+ }
+
+ if (*name == '/' || (flag == TFOLDER
+ && (strncmp(name, CWD, NCWD) && strcmp(name, DOT)
+ && strcmp(name, DOTDOT) && strncmp(name, PWD, NPWD))))
+ return getcpy(name);
+
+ if (pwds == NULL)
+ pwds = pwd();
+
+ if (strcmp(name, DOT) == 0 || strcmp(name, CWD) == 0)
+ return getcpy(pwds);
+
+ ep = pwds + strlen(pwds);
+ if ((cp = strrchr(pwds, '/')) == NULL)
+ cp = ep;
+ else
+ if (cp == pwds)
+ cp++;
+
+ if (strncmp(name, CWD, NCWD) == 0)
+ name += NCWD;
+
+ if (strcmp(name, DOTDOT) == 0 || strcmp(name, PWD) == 0) {
+ snprintf(buffer, sizeof(buffer), "%.*s", (int)(cp - pwds), pwds);
+ return getcpy(buffer);