]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/sbr/path.c
Always check that mktemp()/mktemp2() succeeds before trying to
[nmh] / docs / historical / mh-6.8.5 / sbr / path.c
1 /* path.c - return a pathname */
2 #ifndef lint
3 static char ident[] = "@(#)$Id: path.c,v 1.6 1992/12/15 00:20:22 jromine Exp $";
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 /* \f */
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) {
86 (void) sprintf (buffer, "%.*s", cp - pwds, pwds);
87 return getcpy (buffer);
88 }
89
90 if (strncmp (name, PWD, NPWD) == 0)
91 name += NPWD;
92 else
93 cp = ep;
94
95 (void) sprintf (buffer, "%.*s/%s", cp - pwds, pwds, name);
96 return getcpy (buffer);
97 }
98
99 /* \f */
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 }