0
|
1 /* path.c - return a pathname */
|
|
2 #ifndef lint
|
12
|
3 static char ident[] = "@(#)$Id: path.c,v 1.1.1.1 2005/04/18 14:46:06 kono Exp $";
|
0
|
4 #endif /* lint */
|
|
5
|
|
6 #include "../h/mh.h"
|
|
7 #include <stdio.h>
|
|
8
|
|
9 #define CWD "./"
|
|
10 #define NCWD (sizeof CWD - 1)
|
|
11 #define DOT "."
|
|
12 #define DOTDOT ".."
|
|
13 #define PWD "../"
|
|
14 #define NPWD (sizeof PWD - 1)
|
|
15
|
|
16
|
|
17 static char *pwds;
|
|
18
|
|
19 static char *expath ();
|
|
20 static compath();
|
|
21
|
|
22
|
|
23 char *path (name, flag)
|
|
24 register char *name;
|
|
25 register int flag;
|
|
26 {
|
|
27 register char *cp,
|
|
28 *ep;
|
|
29
|
|
30 if ((cp = expath (name, flag))
|
|
31 && (ep = cp + strlen (cp) - 1) > cp
|
|
32 && *ep == '/')
|
|
33 *ep = 0;
|
|
34
|
|
35 return cp;
|
|
36 }
|
|
37
|
|
38 /* */
|
|
39
|
|
40 static char *expath (name, flag)
|
|
41 register char *name;
|
|
42 register int flag;
|
|
43 {
|
|
44 register char *cp,
|
|
45 *ep;
|
|
46 char buffer[BUFSIZ];
|
|
47
|
|
48 if (flag == TSUBCWF) {
|
|
49 (void) sprintf (buffer, "%s/%s", m_getfolder (), name);
|
|
50 name = m_mailpath (buffer);
|
|
51 compath (name);
|
|
52 (void) sprintf (buffer, "%s/", m_maildir (""));
|
|
53 if (ssequal (buffer, name)) {
|
|
54 cp = name;
|
|
55 name = getcpy (name + strlen (buffer));
|
|
56 free (cp);
|
|
57 }
|
|
58 flag = TFOLDER;
|
|
59 }
|
|
60
|
|
61 if (*name == '/'
|
|
62 || (flag == TFOLDER
|
|
63 && (strncmp (name, CWD, NCWD)
|
|
64 && strcmp (name, DOT)
|
|
65 && strcmp (name, DOTDOT)
|
|
66 && strncmp (name, PWD, NPWD))))
|
|
67 return getcpy (name);
|
|
68
|
|
69 if (pwds == NULL)
|
|
70 pwds = pwd ();
|
|
71
|
|
72 if (strcmp (name, DOT) == 0 || strcmp (name, CWD) == 0)
|
|
73 return getcpy (pwds);
|
|
74
|
|
75 ep = pwds + strlen (pwds);
|
|
76 if ((cp = rindex (pwds, '/')) == NULL)
|
|
77 cp = ep;
|
|
78 else
|
|
79 if (cp == pwds)
|
|
80 cp++;
|
|
81
|
|
82 if (strncmp (name, CWD, NCWD) == 0)
|
|
83 name += NCWD;
|
|
84
|
|
85 if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) {
|
12
|
86 (void) sprintf (buffer, "%.*s", (int)(cp - pwds), pwds);
|
0
|
87 return getcpy (buffer);
|
|
88 }
|
|
89
|
|
90 if (strncmp (name, PWD, NPWD) == 0)
|
|
91 name += NPWD;
|
|
92 else
|
|
93 cp = ep;
|
|
94
|
12
|
95 (void) sprintf (buffer, "%.*s/%s", (int)(cp - pwds), pwds, name);
|
0
|
96 return getcpy (buffer);
|
|
97 }
|
|
98
|
|
99 /* */
|
|
100
|
|
101 static 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 0:
|
|
114 if (--cp > f)
|
|
115 *cp = 0;
|
|
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 = 0;
|
|
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 = 0;
|
|
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 }
|