File: dir.c

package info (click to toggle)
ng 1.5~beta1-9
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 5,140 kB
  • sloc: ansic: 43,437; asm: 3,150; sh: 2,539; cpp: 1,234; makefile: 630
file content (250 lines) | stat: -rw-r--r-- 5,120 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/* $Id: dir.c,v 1.13 2001/02/18 19:29:29 amura Exp $ */
/*
 * Name:	MG 2a
 *		Directory management functions
 * Created:	Ron Flax (ron@vsedev.vse.com)
 *		Modified for MG 2a by Mic Kaczmarczik 03-Aug-1987
 */

/*
 * $Log: dir.c,v $
 * Revision 1.13  2001/02/18 19:29:29  amura
 * split dir.c to port depend/independ
 *
 * Revision 1.12  2000/12/22 19:54:35  amura
 * fix some bug in filename handling
 *
 * Revision 1.11  2000/12/14 18:06:23  amura
 * filename length become flexible
 *
 * Revision 1.10  2000/09/21 17:28:29  amura
 * replace macro _WIN32 to WIN32 for Cygwin
 *
 * Revision 1.9  2000/07/22 17:54:09  amura
 * fix typo bug
 *
 * Revision 1.8  2000/07/18 20:30:34  amura
 * rewrite some description (for Win32)
 *
 * Revision 1.7  2000/07/18 12:40:34  amura
 * for Win32, enable to handle japanese directory
 *
 * Revision 1.6  2000/06/27 01:49:42  amura
 * import to CVS
 *
 * Revision 1.5  2000/06/04  05:42:59  amura
 * win32 drive support
 *
 * Revision 1.4  2000/06/01  05:22:25  amura
 * More robust
 *
 * Revision 1.3  2000/03/28  02:37:46  amura
 * Added startdir.
 *
 * Revision 1.2  2000/03/10  21:26:50  amura
 * Merge Ng for win32 0.4
 *
 * Revision 1.1  1999/05/21  02:20:08  amura
 * Initial revision
 *
 */
/* 90.01.29	Modified for Ng 1.0 MS-DOS ver. by S.Yoshida */

#include "config.h"	/* 90.12.20  by S.Yoshida */
#include "def.h"

#ifndef NO_DIR
#ifdef	EXTD_DIR
extern VOID makepath pro((char *dname, char *fname, int len)); /* file.c */
#endif

char	*startdir = NULL;
char	*wdir;

#ifdef EXTD_DIR
/*
 * Store the current working directory with refering filename for the
 * specified buffer.
 *
 * By Tillanosoft, Mar 22, 1999.
 * Modified by amura, Dec 1, 2000.
 */
VOID
storecwd(bp)
BUFFER *bp;
{
    char path[NFILEN];
    int lastchar;

    if (bp) {
	if (bp->b_fname != NULL)
	    makepath(path, bp->b_fname, NFILEN);
	if (startdir != NULL &&
	    (bp->b_fname == NULL || path[0] == '\0')) {
	    strncpy(path, startdir, NFILEN);
	    path[NFILEN-1] = '\0';
	    lastchar = strlen(path)-1;
	    if (path[lastchar] != BDC1
#ifdef	BDC2
		&& path[lastchar] != BDC2
#endif
		) {
		if (lastchar+2 >= NFILEN)
		    lastchar = NFILEN-2;
		path[lastchar+1] = BDC1;
		path[lastchar+2] = '\0';
	    }
	}
	if (bp->b_cwd != NULL)
	    free(bp->b_cwd);
	if ((bp->b_cwd=malloc(strlen(path)+1)) == NULL)
	    return;
	strcpy(bp->b_cwd, path);
    }
}

VOID
vchdir(newdir)
char *newdir;
{
    if (curbp) {
	if (curbp->b_cwd != NULL)
	    free(curbp->b_cwd);
	if ((curbp->b_cwd=malloc(strlen(newdir)+1)) == NULL)
	    return;
	strcpy(curbp->b_cwd, newdir);
    }
}

VOID
ensurecwd pro((VOID))
{
    if (curbp) {
      if (curbp->b_cwd == NULL) {
	  storecwd(curbp);
      }
      if (curbp->b_cwd != NULL) {
	  rchdir(curbp->b_cwd); /* ensure we are in the current dir */
      }
    }
}

/*
 * Change current working directory
 */
/*ARGSUSED*/
changedir(f, n)
{
    register int s;
    int len;
    char bufc[NPAT];

    ensurecwd();
    edefset(curbp->b_cwd);

#ifndef	NO_FILECOMP	/* 90.04.04  by K.Maeda */
    if ((s=eread("Change default directory: ", bufc, NPAT, EFNEW|EFFILE|EFCR))
	!= TRUE)
#else	/* NO_FILECOMP */
    if ((s=ereply("Change default directory: ", bufc, NPAT)) != TRUE)
#endif	/* NO_FILECOMP */
	return(s);
    strcpy(bufc, adjustname(bufc));
    if (rchdir(bufc) < 0) {
	ewprintf("Can't change dir to %s", bufc);
    }
    else {
	ewprintf("Current directory is now %s", bufc);
	len = strlen(bufc);
	if (len<NFILEN-1 && bufc[len-1]!=BDC1
#ifdef	BDC2
	    && bufc[len-1]!=BDC2
#endif
	    ) {
	    bufc[len] = BDC1;
	    bufc[len+1] = '\0';
#ifdef	AMIGA
	    for (s=len; s>=0; s--)
		if (bufc[s] == ':')
		    break;
	    if (bufc[s] != ':')
		bufc[len] = ':';
#endif
	}
	vchdir(bufc);
    }
    return TRUE;
}

#else	/* EXTD_DIR */

/*
 * Change current working directory
 */
/*ARGSUSED*/
changedir(f, n)
{
    register int s;
    char bufc[NFILEN];

#ifndef	NO_FILECOMP	/* 90.04.04  by K.Maeda */
    if ((s=eread("Change default directory: ", bufc, NFILEN, EFNEW|EFFILE|EFCR))
	!= TRUE)
#else	/* NO_FILECOMP */
    if ((s=ereply("Change default directory: ", bufc, NFILEN)) != TRUE)
#endif	/* NO_FILECOMP */
	return(s);
    if (bufc[0] == '\0')
	(VOID) strcpy(bufc, wdir);
    
    if (rchdir(bufc) == -1) {
	ewprintf("Can't change dir to %s", bufc);
	return(FALSE);
    }
    dirinit();
    return(TRUE);
}
#endif	/* EXTD_DIR */

/*
 * Show current directory
 */
/*ARGSUSED*/
showcwdir(f, n)
{
#ifdef	EXTD_DIR
    char dirname[NFILEN];
    int  len;
    
    if (curbp) {
	if (curbp->b_cwd == NULL) {
	    storecwd(curbp);
	}
	if (curbp->b_cwd == NULL) 
	    dirname[0] = '\0';
	else {
	    (VOID)strcpy(dirname, curbp->b_cwd);
	    len = strlen(dirname) - 1;
	    if (len >= 0) {
#ifdef	BDC2
# ifdef	AMIGA
		if (dirname[len]==BDC2)
# else
		if (dirname[len]==BDC1 || dirname[len]==BDC2)
# endif
#else
	 	if (dirname[len] == BDC1)
#endif
		    dirname[len] = '\0';
	    }
	}
	ewprintf("Current directory: %s", dirname);
    }
#else	/* !EXTD_DIR */
    dirinit();
    ewprintf("Current directory: %s", wdir);
#endif	/* EXTD_DIR */
    return(TRUE);
}

#endif	/* NO_DIR */