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