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