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