|
|
1.1 ! root 1: /* path.c - return a pathname */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: ! 6: #define CWD "./" ! 7: #define NCWD (sizeof CWD - 1) ! 8: #define DOT "." ! 9: #define DOTDOT ".." ! 10: #define PWD "../" ! 11: #define NPWD (sizeof PWD - 1) ! 12: ! 13: ! 14: static char *pwds; ! 15: ! 16: char *expath (); ! 17: ! 18: ! 19: char *path (name, flag) ! 20: register char *name; ! 21: register int flag; ! 22: { ! 23: register char *cp, ! 24: *ep; ! 25: ! 26: if ((cp = expath (name, flag)) ! 27: && (ep = cp + strlen (cp) - 1) > cp ! 28: && *ep == '/') ! 29: *ep = NULL; ! 30: ! 31: return cp; ! 32: } ! 33: ! 34: /* */ ! 35: ! 36: static char *expath (name, flag) ! 37: register char *name; ! 38: register int flag; ! 39: { ! 40: register char *cp, ! 41: *ep; ! 42: char buffer[BUFSIZ]; ! 43: ! 44: if (flag == TSUBCWF) { ! 45: (void) sprintf (buffer, "%s/%s", m_getfolder (), name); ! 46: name = m_mailpath (buffer); ! 47: compath (name); ! 48: (void) sprintf (buffer, "%s/", m_maildir ("")); ! 49: if (ssequal (buffer, name)) { ! 50: cp = name; ! 51: name = getcpy (name + strlen (buffer)); ! 52: free (cp); ! 53: } ! 54: flag = TFOLDER; ! 55: } ! 56: ! 57: if (*name == '/' ! 58: || (flag == TFOLDER ! 59: && (strncmp (name, CWD, NCWD) ! 60: && strcmp (name, DOT) ! 61: && strcmp (name, DOTDOT) ! 62: && strncmp (name, PWD, NPWD)))) ! 63: return getcpy (name); ! 64: ! 65: if (pwds == NULL) ! 66: pwds = pwd (); ! 67: ! 68: if (strcmp (name, DOT) == 0 || strcmp (name, CWD) == 0) ! 69: return getcpy (pwds); ! 70: ! 71: ep = pwds + strlen (pwds); ! 72: if ((cp = rindex (pwds, '/')) == NULL) ! 73: cp = ep; ! 74: else ! 75: if (cp == pwds) ! 76: cp++; ! 77: ! 78: if (strncmp (name, CWD, NCWD) == 0) ! 79: name += NCWD; ! 80: ! 81: if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) { ! 82: (void) sprintf (buffer, "%.*s", cp - pwds, pwds); ! 83: return getcpy (buffer); ! 84: } ! 85: ! 86: if (strncmp (name, PWD, NPWD) == 0) ! 87: name += NPWD; ! 88: else ! 89: cp = ep; ! 90: ! 91: (void) sprintf (buffer, "%.*s/%s", cp - pwds, pwds, name); ! 92: return getcpy (buffer); ! 93: } ! 94: ! 95: /* */ ! 96: ! 97: static compath (f) ! 98: register char *f; ! 99: { ! 100: register char *cp, ! 101: *dp; ! 102: ! 103: if (*f != '/') ! 104: return; ! 105: ! 106: for (cp = f; *cp;) ! 107: if (*cp == '/') { ! 108: switch (*++cp) { ! 109: case NULL: ! 110: if (--cp > f) ! 111: *cp = NULL; ! 112: break; ! 113: ! 114: case '/': ! 115: for (dp = cp; *dp == '/'; dp++) ! 116: continue; ! 117: (void) strcpy (cp--, dp); ! 118: continue; ! 119: ! 120: case '.': ! 121: if (strcmp (cp, DOT) == 0) { ! 122: if (cp > f + 1) ! 123: cp--; ! 124: *cp = NULL; ! 125: break; ! 126: } ! 127: if (strcmp (cp, DOTDOT) == 0) { ! 128: for (cp -= 2; cp > f; cp--) ! 129: if (*cp == '/') ! 130: break; ! 131: if (cp <= f) ! 132: cp = f + 1; ! 133: *cp = NULL; ! 134: break; ! 135: } ! 136: if (strncmp (cp, PWD, NPWD) == 0) { ! 137: for (dp = cp - 2; dp > f; dp--) ! 138: if (*dp == '/') ! 139: break; ! 140: if (dp <= f) ! 141: dp = f; ! 142: (void) strcpy (dp, cp + NPWD - 1); ! 143: cp = dp; ! 144: continue; ! 145: } ! 146: if (strncmp (cp, CWD, NCWD) == 0) { ! 147: (void) strcpy (cp - 1, cp + NCWD - 1); ! 148: cp--; ! 149: continue; ! 150: } ! 151: continue; ! 152: ! 153: default: ! 154: cp++; ! 155: continue; ! 156: } ! 157: break; ! 158: } ! 159: else ! 160: cp++; ! 161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.