1 /* $Id: dir.c,v 1.13 2001/02/18 19:29:29 amura Exp $ */
2 /*
3 * Name: MG 2a
4 * Directory management functions
5 * Created: Ron Flax (ron@vsedev.vse.com)
6 * Modified for MG 2a by Mic Kaczmarczik 03-Aug-1987
7 */
8
9 /*
10 * $Log: dir.c,v $
11 * Revision 1.13 2001/02/18 19:29:29 amura
12 * split dir.c to port depend/independ
13 *
14 * Revision 1.12 2000/12/22 19:54:35 amura
15 * fix some bug in filename handling
16 *
17 * Revision 1.11 2000/12/14 18:06:23 amura
18 * filename length become flexible
19 *
20 * Revision 1.10 2000/09/21 17:28:29 amura
21 * replace macro _WIN32 to WIN32 for Cygwin
22 *
23 * Revision 1.9 2000/07/22 17:54:09 amura
24 * fix typo bug
25 *
26 * Revision 1.8 2000/07/18 20:30:34 amura
27 * rewrite some description (for Win32)
28 *
29 * Revision 1.7 2000/07/18 12:40:34 amura
30 * for Win32, enable to handle japanese directory
31 *
32 * Revision 1.6 2000/06/27 01:49:42 amura
33 * import to CVS
34 *
35 * Revision 1.5 2000/06/04 05:42:59 amura
36 * win32 drive support
37 *
38 * Revision 1.4 2000/06/01 05:22:25 amura
39 * More robust
40 *
41 * Revision 1.3 2000/03/28 02:37:46 amura
42 * Added startdir.
43 *
44 * Revision 1.2 2000/03/10 21:26:50 amura
45 * Merge Ng for win32 0.4
46 *
47 * Revision 1.1 1999/05/21 02:20:08 amura
48 * Initial revision
49 *
50 */
51 /* 90.01.29 Modified for Ng 1.0 MS-DOS ver. by S.Yoshida */
52
53 #include "config.h" /* 90.12.20 by S.Yoshida */
54 #include "def.h"
55
56 #ifndef NO_DIR
57 #ifdef EXTD_DIR
58 extern VOID makepath pro((char *dname, char *fname, int len)); /* file.c */
59 #endif
60
61 char *startdir = NULL;
62 char *wdir;
63
64 #ifdef EXTD_DIR
65 /*
66 * Store the current working directory with refering filename for the
67 * specified buffer.
68 *
69 * By Tillanosoft, Mar 22, 1999.
70 * Modified by amura, Dec 1, 2000.
71 */
72 VOID
storecwd(bp)73 storecwd(bp)
74 BUFFER *bp;
75 {
76 char path[NFILEN];
77 int lastchar;
78
79 if (bp) {
80 if (bp->b_fname != NULL)
81 makepath(path, bp->b_fname, NFILEN);
82 if (startdir != NULL &&
83 (bp->b_fname == NULL || path[0] == '\0')) {
84 strncpy(path, startdir, NFILEN);
85 path[NFILEN-1] = '\0';
86 lastchar = strlen(path)-1;
87 if (path[lastchar] != BDC1
88 #ifdef BDC2
89 && path[lastchar] != BDC2
90 #endif
91 ) {
92 if (lastchar+2 >= NFILEN)
93 lastchar = NFILEN-2;
94 path[lastchar+1] = BDC1;
95 path[lastchar+2] = '\0';
96 }
97 }
98 if (bp->b_cwd != NULL)
99 free(bp->b_cwd);
100 if ((bp->b_cwd=malloc(strlen(path)+1)) == NULL)
101 return;
102 strcpy(bp->b_cwd, path);
103 }
104 }
105
106 VOID
vchdir(newdir)107 vchdir(newdir)
108 char *newdir;
109 {
110 if (curbp) {
111 if (curbp->b_cwd != NULL)
112 free(curbp->b_cwd);
113 if ((curbp->b_cwd=malloc(strlen(newdir)+1)) == NULL)
114 return;
115 strcpy(curbp->b_cwd, newdir);
116 }
117 }
118
119 VOID
ensurecwd(VOID)120 ensurecwd pro((VOID))
121 {
122 if (curbp) {
123 if (curbp->b_cwd == NULL) {
124 storecwd(curbp);
125 }
126 if (curbp->b_cwd != NULL) {
127 rchdir(curbp->b_cwd); /* ensure we are in the current dir */
128 }
129 }
130 }
131
132 /*
133 * Change current working directory
134 */
135 /*ARGSUSED*/
changedir(f,n)136 changedir(f, n)
137 {
138 register int s;
139 int len;
140 char bufc[NPAT];
141
142 ensurecwd();
143 edefset(curbp->b_cwd);
144
145 #ifndef NO_FILECOMP /* 90.04.04 by K.Maeda */
146 if ((s=eread("Change default directory: ", bufc, NPAT, EFNEW|EFFILE|EFCR))
147 != TRUE)
148 #else /* NO_FILECOMP */
149 if ((s=ereply("Change default directory: ", bufc, NPAT)) != TRUE)
150 #endif /* NO_FILECOMP */
151 return(s);
152 strcpy(bufc, adjustname(bufc));
153 if (rchdir(bufc) < 0) {
154 ewprintf("Can't change dir to %s", bufc);
155 }
156 else {
157 ewprintf("Current directory is now %s", bufc);
158 len = strlen(bufc);
159 if (len<NFILEN-1 && bufc[len-1]!=BDC1
160 #ifdef BDC2
161 && bufc[len-1]!=BDC2
162 #endif
163 ) {
164 bufc[len] = BDC1;
165 bufc[len+1] = '\0';
166 #ifdef AMIGA
167 for (s=len; s>=0; s--)
168 if (bufc[s] == ':')
169 break;
170 if (bufc[s] != ':')
171 bufc[len] = ':';
172 #endif
173 }
174 vchdir(bufc);
175 }
176 return TRUE;
177 }
178
179 #else /* EXTD_DIR */
180
181 /*
182 * Change current working directory
183 */
184 /*ARGSUSED*/
changedir(f,n)185 changedir(f, n)
186 {
187 register int s;
188 char bufc[NFILEN];
189
190 #ifndef NO_FILECOMP /* 90.04.04 by K.Maeda */
191 if ((s=eread("Change default directory: ", bufc, NFILEN, EFNEW|EFFILE|EFCR))
192 != TRUE)
193 #else /* NO_FILECOMP */
194 if ((s=ereply("Change default directory: ", bufc, NFILEN)) != TRUE)
195 #endif /* NO_FILECOMP */
196 return(s);
197 if (bufc[0] == '\0')
198 (VOID) strcpy(bufc, wdir);
199
200 if (rchdir(bufc) == -1) {
201 ewprintf("Can't change dir to %s", bufc);
202 return(FALSE);
203 }
204 dirinit();
205 return(TRUE);
206 }
207 #endif /* EXTD_DIR */
208
209 /*
210 * Show current directory
211 */
212 /*ARGSUSED*/
showcwdir(f,n)213 showcwdir(f, n)
214 {
215 #ifdef EXTD_DIR
216 char dirname[NFILEN];
217 int len;
218
219 if (curbp) {
220 if (curbp->b_cwd == NULL) {
221 storecwd(curbp);
222 }
223 if (curbp->b_cwd == NULL)
224 dirname[0] = '\0';
225 else {
226 (VOID)strcpy(dirname, curbp->b_cwd);
227 len = strlen(dirname) - 1;
228 if (len >= 0) {
229 #ifdef BDC2
230 # ifdef AMIGA
231 if (dirname[len]==BDC2)
232 # else
233 if (dirname[len]==BDC1 || dirname[len]==BDC2)
234 # endif
235 #else
236 if (dirname[len] == BDC1)
237 #endif
238 dirname[len] = '\0';
239 }
240 }
241 ewprintf("Current directory: %s", dirname);
242 }
243 #else /* !EXTD_DIR */
244 dirinit();
245 ewprintf("Current directory: %s", wdir);
246 #endif /* EXTD_DIR */
247 return(TRUE);
248 }
249
250 #endif /* NO_DIR */
251