annotate sbr/path.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children 07f8972434be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* path.c - return a pathname */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: path.c,v 1.1.1.1 2005/04/18 14:46:06 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #define CWD "./"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #define NCWD (sizeof CWD - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #define DOT "."
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #define DOTDOT ".."
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #define PWD "../"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #define NPWD (sizeof PWD - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 static char *pwds;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 static char *expath ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 static compath();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 char *path (name, flag)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 register char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 register int flag;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 if ((cp = expath (name, flag))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 && (ep = cp + strlen (cp) - 1) > cp
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 && *ep == '/')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 *ep = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 return cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 static char *expath (name, flag)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 register char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 register int flag;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 if (flag == TSUBCWF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 (void) sprintf (buffer, "%s/%s", m_getfolder (), name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 name = m_mailpath (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 compath (name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 (void) sprintf (buffer, "%s/", m_maildir (""));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 if (ssequal (buffer, name)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 cp = name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 name = getcpy (name + strlen (buffer));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 flag = TFOLDER;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 if (*name == '/'
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 || (flag == TFOLDER
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 && (strncmp (name, CWD, NCWD)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 && strcmp (name, DOT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 && strcmp (name, DOTDOT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 && strncmp (name, PWD, NPWD))))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 return getcpy (name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 if (pwds == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 pwds = pwd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 if (strcmp (name, DOT) == 0 || strcmp (name, CWD) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 return getcpy (pwds);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 ep = pwds + strlen (pwds);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 if ((cp = rindex (pwds, '/')) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 cp = ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 if (cp == pwds)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 if (strncmp (name, CWD, NCWD) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 name += NCWD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) {
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
86 (void) sprintf (buffer, "%.*s", (int)(cp - pwds), pwds);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 return getcpy (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 if (strncmp (name, PWD, NPWD) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 name += NPWD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 cp = ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
95 (void) sprintf (buffer, "%.*s/%s", (int)(cp - pwds), pwds, name);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 return getcpy (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 static compath (f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 register char *f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 if (*f != '/')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 for (cp = f; *cp;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 if (*cp == '/') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 switch (*++cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 case 0:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 if (--cp > f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 case '/':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 for (dp = cp; *dp == '/'; dp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 (void) strcpy (cp--, dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 case '.':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 if (strcmp (cp, DOT) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 if (cp > f + 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 cp--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 if (strcmp (cp, DOTDOT) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 for (cp -= 2; cp > f; cp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 if (*cp == '/')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 if (cp <= f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 cp = f + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 if (strncmp (cp, PWD, NPWD) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 for (dp = cp - 2; dp > f; dp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 if (*dp == '/')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 if (dp <= f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 dp = f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 (void) strcpy (dp, cp + NPWD - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 cp = dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 if (strncmp (cp, CWD, NCWD) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 (void) strcpy (cp - 1, cp + NCWD - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 cp--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 }