Annotation of src/usr.bin/mg/dired.c, Revision 1.11
1.11 ! vincent 1: /* $OpenBSD: dired.c,v 1.10 2002/03/11 13:02:56 vincent Exp $ */
1.6 niklas 2:
1.5 millert 3: /* dired module for mg 2a */
4: /* by Robert A. Larson */
1.1 deraadt 5:
6: #include "def.h"
1.9 vincent 7: #include "kbd.h"
1.1 deraadt 8:
9: #ifndef NO_DIRED
1.11 ! vincent 10:
! 11: int d_findfile(int, int);
1.1 deraadt 12:
1.9 vincent 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:
1.5 millert 26: /* ARGSUSED */
27: int
1.10 vincent 28: dired(int f, int n)
1.1 deraadt 29: {
1.9 vincent 30: static int inited = 0;
1.7 mickey 31: char dirname[NFILEN];
1.5 millert 32: BUFFER *bp;
1.1 deraadt 33:
1.9 vincent 34: if (inited == 0) {
35: maps_add((KEYMAP *)&diredmap, "dired");
36: inited = 1;
37: }
38:
1.5 millert 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;
1.9 vincent 44: bp->b_modes[0] = name_mode("fundamental");
45: bp->b_modes[1] = name_mode("dired");
46: bp->b_nmodes = 1;
1.5 millert 47: curbp = bp;
48: return showbuffer(bp, curwp, WFHARD | WFMODE);
1.1 deraadt 49: }
50:
1.5 millert 51: /* ARGSUSED */
52: int
1.10 vincent 53: d_otherwindow(int f, int n)
1.1 deraadt 54: {
1.7 mickey 55: char dirname[NFILEN];
56: BUFFER *bp;
57: MGWIN *wp;
1.5 millert 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;
1.1 deraadt 69: }
70:
1.5 millert 71: /* ARGSUSED */
72: int
1.10 vincent 73: d_del(int f, int n)
1.1 deraadt 74: {
1.5 millert 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;
1.1 deraadt 86: }
87:
1.5 millert 88: /* ARGSUSED */
89: int
1.10 vincent 90: d_undel(int f, int n)
1.1 deraadt 91: {
1.5 millert 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;
1.1 deraadt 103: }
104:
1.5 millert 105: /* ARGSUSED */
106: int
1.10 vincent 107: d_undelbak(int f, int n)
1.1 deraadt 108: {
1.5 millert 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;
1.1 deraadt 120: }
121:
1.5 millert 122: /* ARGSUSED */
123: int
1.10 vincent 124: d_findfile(int f, int n)
1.1 deraadt 125: {
1.5 millert 126: BUFFER *bp;
1.7 mickey 127: int s;
128: char fname[NFILEN];
1.5 millert 129:
1.8 vincent 130: if ((s = d_makename(curwp->w_dotp, fname, sizeof fname)) == ABORT)
1.5 millert 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);
1.1 deraadt 140: }
141:
1.5 millert 142: /* ARGSUSED */
143: int
1.10 vincent 144: d_ffotherwindow(int f, int n)
1.1 deraadt 145: {
1.7 mickey 146: char fname[NFILEN];
147: int s;
1.5 millert 148: BUFFER *bp;
149: MGWIN *wp;
150:
1.8 vincent 151: if ((s = d_makename(curwp->w_dotp, fname, sizeof fname)) == ABORT)
1.5 millert 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);
1.1 deraadt 162: }
163:
1.5 millert 164: /* ARGSUSED */
165: int
1.10 vincent 166: d_expunge(int f, int n)
1.1 deraadt 167: {
1.7 mickey 168: LINE *lp, *nlp;
169: char fname[NFILEN];
1.5 millert 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') {
1.8 vincent 174: switch (d_makename(lp, fname, sizeof fname)) {
1.5 millert 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: }
1.1 deraadt 195: }
1.5 millert 196: return TRUE;
1.1 deraadt 197: }
198:
1.5 millert 199: /* ARGSUSED */
200: int
1.10 vincent 201: d_copy(int f, int n)
1.1 deraadt 202: {
1.7 mickey 203: char frname[NFILEN], toname[NFILEN];
204: int stat;
1.1 deraadt 205:
1.8 vincent 206: if (d_makename(curwp->w_dotp, frname, sizeof frname) != FALSE) {
1.5 millert 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;
1.1 deraadt 214: }
215:
1.5 millert 216: /* ARGSUSED */
217: int
1.10 vincent 218: d_rename(int f, int n)
1.1 deraadt 219: {
1.5 millert 220: char frname[NFILEN], toname[NFILEN];
221: int stat;
1.1 deraadt 222:
1.8 vincent 223: if (d_makename(curwp->w_dotp, frname, sizeof frname) != FALSE) {
1.5 millert 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;
1.1 deraadt 231: }
232: #endif