xref: /openbsd-src/usr.bin/mg/dired.c (revision db3296cf5c1dd9058ceecc3a29fe4aaa0bd26000)
1 /*	$OpenBSD: dired.c,v 1.11 2003/06/26 23:04:10 vincent Exp $	*/
2 
3 /* dired module for mg 2a	 */
4 /* by Robert A. Larson		 */
5 
6 #include "def.h"
7 #include "kbd.h"
8 
9 #ifndef NO_DIRED
10 
11 int d_findfile(int, int);
12 
13 static PF dired_pf[] = {
14 	d_findfile,
15 };
16 
17 static struct KEYMAPE (1 + IMAPEXT) diredmap = {
18 	1,
19 	1 + IMAPEXT,
20 	rescan,
21 	{
22 		{ CCHR('M'), CCHR('M'), dired_pf, NULL },
23 	}
24 };
25 
26 /* ARGSUSED */
27 int
28 dired(int f, int n)
29 {
30 	static int inited = 0;
31 	char	dirname[NFILEN];
32 	BUFFER *bp;
33 
34 	if (inited == 0) {
35 		maps_add((KEYMAP *)&diredmap, "dired");
36 		inited = 1;
37 	}
38 
39 	dirname[0] = '\0';
40 	if (eread("Dired: ", dirname, NFILEN, EFNEW | EFCR) == ABORT)
41 		return ABORT;
42 	if ((bp = dired_(dirname)) == NULL)
43 		return FALSE;
44 	bp->b_modes[0] = name_mode("fundamental");
45 	bp->b_modes[1] = name_mode("dired");
46 	bp->b_nmodes = 1;
47 	curbp = bp;
48 	return showbuffer(bp, curwp, WFHARD | WFMODE);
49 }
50 
51 /* ARGSUSED */
52 int
53 d_otherwindow(int f, int n)
54 {
55 	char	dirname[NFILEN];
56 	BUFFER	*bp;
57 	MGWIN	*wp;
58 
59 	dirname[0] = '\0';
60 	if (eread("Dired other window: ", dirname, NFILEN, EFNEW | EFCR) == ABORT)
61 		return ABORT;
62 	if ((bp = dired_(dirname)) == NULL)
63 		return FALSE;
64 	if ((wp = popbuf(bp)) == NULL)
65 		return FALSE;
66 	curbp = bp;
67 	curwp = wp;
68 	return TRUE;
69 }
70 
71 /* ARGSUSED */
72 int
73 d_del(int f, int n)
74 {
75 	if (n < 0)
76 		return FALSE;
77 	while (n--) {
78 		if (llength(curwp->w_dotp) > 0)
79 			lputc(curwp->w_dotp, 0, 'D');
80 		if (lforw(curwp->w_dotp) != curbp->b_linep)
81 			curwp->w_dotp = lforw(curwp->w_dotp);
82 	}
83 	curwp->w_flag |= WFEDIT | WFMOVE;
84 	curwp->w_doto = 0;
85 	return TRUE;
86 }
87 
88 /* ARGSUSED */
89 int
90 d_undel(int f, int n)
91 {
92 	if (n < 0)
93 		return d_undelbak(f, -n);
94 	while (n--) {
95 		if (llength(curwp->w_dotp) > 0)
96 			lputc(curwp->w_dotp, 0, ' ');
97 		if (lforw(curwp->w_dotp) != curbp->b_linep)
98 			curwp->w_dotp = lforw(curwp->w_dotp);
99 	}
100 	curwp->w_flag |= WFEDIT | WFMOVE;
101 	curwp->w_doto = 0;
102 	return TRUE;
103 }
104 
105 /* ARGSUSED */
106 int
107 d_undelbak(int f, int n)
108 {
109 	if (n < 0)
110 		return d_undel(f, -n);
111 	while (n--) {
112 		if (llength(curwp->w_dotp) > 0)
113 			lputc(curwp->w_dotp, 0, ' ');
114 		if (lback(curwp->w_dotp) != curbp->b_linep)
115 			curwp->w_dotp = lback(curwp->w_dotp);
116 	}
117 	curwp->w_doto = 0;
118 	curwp->w_flag |= WFEDIT | WFMOVE;
119 	return TRUE;
120 }
121 
122 /* ARGSUSED */
123 int
124 d_findfile(int f, int n)
125 {
126 	BUFFER *bp;
127 	int	s;
128 	char	fname[NFILEN];
129 
130 	if ((s = d_makename(curwp->w_dotp, fname, sizeof fname)) == ABORT)
131 		return FALSE;
132 	if ((bp = (s ? dired_(fname) : findbuffer(fname))) == NULL)
133 		return FALSE;
134 	curbp = bp;
135 	if (showbuffer(bp, curwp, WFHARD) != TRUE)
136 		return FALSE;
137 	if (bp->b_fname[0] != 0)
138 		return TRUE;
139 	return readin(fname);
140 }
141 
142 /* ARGSUSED */
143 int
144 d_ffotherwindow(int f, int n)
145 {
146 	char	fname[NFILEN];
147 	int	s;
148 	BUFFER *bp;
149 	MGWIN  *wp;
150 
151 	if ((s = d_makename(curwp->w_dotp, fname, sizeof fname)) == ABORT)
152 		return FALSE;
153 	if ((bp = (s ? dired_(fname) : findbuffer(fname))) == NULL)
154 		return FALSE;
155 	if ((wp = popbuf(bp)) == NULL)
156 		return FALSE;
157 	curbp = bp;
158 	curwp = wp;
159 	if (bp->b_fname[0] != 0)
160 		return TRUE;	/* never true for dired buffers */
161 	return readin(fname);
162 }
163 
164 /* ARGSUSED */
165 int
166 d_expunge(int f, int n)
167 {
168 	LINE	*lp, *nlp;
169 	char	fname[NFILEN];
170 
171 	for (lp = lforw(curbp->b_linep); lp != curbp->b_linep; lp = nlp) {
172 		nlp = lforw(lp);
173 		if (llength(lp) && lgetc(lp, 0) == 'D') {
174 			switch (d_makename(lp, fname, sizeof fname)) {
175 			case ABORT:
176 				ewprintf("Bad line in dired buffer");
177 				return FALSE;
178 			case FALSE:
179 				if (unlink(fname) < 0) {
180 					ewprintf("Could not delete '%s'", fname);
181 					return FALSE;
182 				}
183 				break;
184 			case TRUE:
185 				if (rmdir(fname) < 0) {
186 					ewprintf("Could not delete directory '%s'",
187 					    fname);
188 					return FALSE;
189 				}
190 				break;
191 			}
192 			lfree(lp);
193 			curwp->w_flag |= WFHARD;
194 		}
195 	}
196 	return TRUE;
197 }
198 
199 /* ARGSUSED */
200 int
201 d_copy(int f, int n)
202 {
203 	char	frname[NFILEN], toname[NFILEN];
204 	int	stat;
205 
206 	if (d_makename(curwp->w_dotp, frname, sizeof frname) != FALSE) {
207 		ewprintf("Not a file");
208 		return FALSE;
209 	}
210 	if ((stat = eread("Copy %s to: ", toname, NFILEN, EFNEW | EFCR, frname))
211 	    != TRUE)
212 		return stat;
213 	return copy(frname, toname) >= 0;
214 }
215 
216 /* ARGSUSED */
217 int
218 d_rename(int f, int n)
219 {
220 	char	frname[NFILEN], toname[NFILEN];
221 	int	stat;
222 
223 	if (d_makename(curwp->w_dotp, frname, sizeof frname) != FALSE) {
224 		ewprintf("Not a file");
225 		return FALSE;
226 	}
227 	if ((stat = eread("Rename %s to: ", toname, NFILEN, EFNEW | EFCR,
228 	    frname)) != TRUE)
229 		return stat;
230 	return rename(frname, toname) >= 0;
231 }
232 #endif
233