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