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