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