|
|
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.