Added all of the MH sources, including RCS files, in
[mmh] / 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 }