1 #ifndef lint 2 static char sccsid[] = "@(#)lcmd1.c 3.30 04/24/85"; 3 #endif 4 5 /* 6 * Copyright (c) 1983 Regents of the University of California, 7 * All rights reserved. Redistribution permitted subject to 8 * the terms of the Berkeley Software License Agreement. 9 */ 10 11 #include "defs.h" 12 #include "string.h" 13 #include "value.h" 14 #include "lcmd.h" 15 #include "var.h" 16 17 struct lcmd_arg arg_window[] = { 18 { "row", 1, ARG_NUM }, 19 { "column", 1, ARG_NUM }, 20 { "nrows", 2, ARG_NUM }, 21 { "ncols", 2, ARG_NUM }, 22 { "nlines", 2, ARG_NUM }, 23 { "label", 1, ARG_STR }, 24 { "pty", 1, ARG_ANY }, 25 { "frame", 1, ARG_ANY }, 26 { "mapnl", 1, ARG_ANY }, 27 { "shell", 1, ARG_STR|ARG_LIST }, 28 0 29 }; 30 31 l_window(v, a) 32 struct value *v; 33 register struct value *a; 34 { 35 struct ww *w; 36 int col, row, ncol, nrow, id, nline; 37 char *label; 38 char haspty, hasframe, mapnl; 39 char *shf, **sh; 40 char *argv[sizeof shell / sizeof *shell]; 41 register char **pp; 42 43 if ((id = findid()) < 0) 44 return; 45 row = a->v_type == V_ERR ? 1 : a->v_num; 46 a++; 47 col = a->v_type == V_ERR ? 0 : a->v_num; 48 a++; 49 nrow = a->v_type == V_ERR ? wwnrow - row : a->v_num; 50 a++; 51 ncol = a->v_type == V_ERR ? wwncol - col : a->v_num; 52 a++; 53 nline = a->v_type == V_ERR ? nbufline : a->v_num; 54 a++; 55 label = a->v_type == V_ERR ? 0 : a->v_str; 56 if ((haspty = vtobool(++a, 1, -1)) < 0) 57 return; 58 if ((hasframe = vtobool(++a, 1, -1)) < 0) 59 return; 60 if ((mapnl = vtobool(++a, !haspty, -1)) < 0) 61 return; 62 if ((++a)->v_type != V_ERR) { 63 for (pp = argv; a->v_type != V_ERR && 64 pp < &argv[sizeof argv/sizeof *argv-1]; pp++, a++) 65 *pp = a->v_str; 66 *pp = 0; 67 shf = *(sh = argv); 68 if (*sh = rindex(shf, '/')) 69 (*sh)++; 70 else 71 *sh = shf; 72 } else { 73 sh = shell; 74 shf = shellfile; 75 } 76 if ((w = openwin(id, row, col, nrow, ncol, nline, label, haspty, 77 hasframe, shf, sh)) == 0) 78 return; 79 w->ww_mapnl = mapnl; 80 v->v_type = V_NUM; 81 v->v_num = id + 1; 82 } 83 84 struct lcmd_arg arg_nline[] = { 85 { "nlines", 1, ARG_NUM }, 86 0 87 }; 88 89 l_nline(v, a) 90 register struct value *v, *a; 91 { 92 v->v_num = nbufline; 93 v->v_type = V_NUM; 94 if (a->v_type != V_ERR) 95 nbufline = a->v_num; 96 } 97 98 struct lcmd_arg arg_select[] = { 99 { "window", 1, ARG_NUM }, 100 0 101 }; 102 103 l_select(v, a) 104 register struct value *v, *a; 105 { 106 struct ww *w; 107 108 v->v_type = V_NUM; 109 v->v_num = selwin ? selwin->ww_id + 1 : -1; 110 if (a->v_type == V_ERR) 111 return; 112 if ((w = vtowin(a, (struct ww *)0)) == 0) 113 return; 114 setselwin(w); 115 } 116 117 struct lcmd_arg arg_debug[] = { 118 { "flag", 1, ARG_ANY }, 119 0 120 }; 121 122 l_debug(v, a) 123 register struct value *v, *a; 124 { 125 v->v_type = V_NUM; 126 v->v_num = debug; 127 debug = vtobool(a, debug, debug); 128 } 129 130 struct lcmd_arg arg_escape[] = { 131 { "escapec", 1, ARG_STR }, 132 0 133 }; 134 135 l_escape(v, a) 136 register struct value *v, *a; 137 { 138 char buf[2]; 139 140 buf[0] = escapec; 141 buf[1] = 0; 142 if ((v->v_str = str_cpy(buf)) == 0) { 143 error("Out of memory."); 144 return; 145 } 146 v->v_type = V_STR; 147 if (a->v_type != V_ERR) 148 setescape(a->v_str); 149 } 150 151 struct lcmd_arg arg_label[] = { 152 { "window", 1, ARG_NUM }, 153 { "label", 1, ARG_STR }, 154 0 155 }; 156 157 /*ARGSUSED*/ 158 l_label(v, a) 159 struct value *v; 160 register struct value *a; 161 { 162 struct ww *w; 163 164 if ((w = vtowin(a, selwin)) == 0) 165 return; 166 if ((++a)->v_type != V_ERR && setlabel(w, a->v_str) < 0) 167 error("Out of memory."); 168 reframe(); 169 } 170 171 struct lcmd_arg arg_foreground[] = { 172 { "window", 1, ARG_NUM }, 173 { "flag", 1, ARG_ANY }, 174 0 175 }; 176 177 l_foreground(v, a) 178 register struct value *v, *a; 179 { 180 struct ww *w; 181 char flag; 182 183 if ((w = vtowin(a, selwin)) == 0) 184 return; 185 v->v_type = V_NUM; 186 v->v_num = isfg(w); 187 flag = vtobool(++a, v->v_num, v->v_num); 188 if (flag == v->v_num) 189 return; 190 deletewin(w); 191 addwin(w, flag); 192 reframe(); 193 } 194 195 struct lcmd_arg arg_terse[] = { 196 { "flag", 1, ARG_ANY }, 197 0 198 }; 199 200 l_terse(v, a) 201 register struct value *v, *a; 202 { 203 v->v_type = V_NUM; 204 v->v_num = terse; 205 setterse(vtobool(a, terse, terse)); 206 } 207 208 struct lcmd_arg arg_source[] = { 209 { "filename", 1, ARG_STR }, 210 0 211 }; 212 213 l_source(v, a) 214 register struct value *v, *a; 215 { 216 v->v_type = V_NUM; 217 if (a->v_type != V_ERR && dosource(a->v_str) < 0) { 218 error("Can't open %s.", a->v_str); 219 v->v_num = -1; 220 } else 221 v->v_num = 0; 222 } 223 224 struct lcmd_arg arg_write[] = { 225 { "window", 1, ARG_NUM }, 226 { "", 0, ARG_ANY|ARG_LIST }, 227 0 228 }; 229 230 /*ARGSUSED*/ 231 l_write(v, a) 232 struct value *v; 233 register struct value *a; 234 { 235 char buf[20]; 236 struct ww *w; 237 238 if ((w = vtowin(a++, selwin)) == 0) 239 return; 240 while (a->v_type != V_ERR) { 241 if (a->v_type == V_NUM) { 242 (void) sprintf(buf, "%d", a->v_num); 243 (void) write(w->ww_pty, buf, strlen(buf)); 244 } else 245 (void) write(w->ww_pty, a->v_str, strlen(a->v_str)); 246 if ((++a)->v_type != V_ERR) 247 (void) write(w->ww_pty, " ", 1); 248 } 249 } 250 251 struct lcmd_arg arg_close[] = { 252 { "window", 1, ARG_ANY|ARG_LIST }, 253 0 254 }; 255 256 /*ARGSUSED*/ 257 l_close(v, a) 258 struct value *v; 259 register struct value *a; 260 { 261 struct ww *w; 262 263 if (a->v_type == V_STR && str_match(a->v_str, "all", 3)) 264 c_close((struct ww *)0); 265 else 266 for (; a->v_type != V_ERR; a++) 267 if ((w = vtowin(a, (struct ww *)0)) != 0) 268 c_close(w); 269 } 270 271 struct lcmd_arg arg_cursormodes[] = { 272 { "modes", 1, ARG_NUM }, 273 0 274 }; 275 276 l_cursormodes(v, a) 277 register struct value *v, *a; 278 { 279 280 v->v_type = V_NUM; 281 v->v_num = wwcursormodes; 282 if (a->v_type != V_ERR) 283 wwsetcursormodes(a->v_num); 284 } 285 286 struct lcmd_arg arg_unset[] = { 287 { "variable", 1, ARG_ANY }, 288 0 289 }; 290 291 l_unset(v, a) 292 register struct value *v, *a; 293 { 294 v->v_type = V_NUM; 295 switch (a->v_type) { 296 case V_ERR: 297 v->v_num = -1; 298 return; 299 case V_NUM: 300 if ((a->v_str = str_itoa(a->v_num)) == 0) { 301 error("Out of memory."); 302 v->v_num = -1; 303 return; 304 } 305 a->v_type = V_STR; 306 break; 307 } 308 v->v_num = var_unset(a->v_str); 309 } 310 311 struct ww * 312 vtowin(v, w) 313 register struct value *v; 314 struct ww *w; 315 { 316 switch (v->v_type) { 317 case V_ERR: 318 if (w != 0) 319 return w; 320 error("No window specified."); 321 return 0; 322 case V_STR: 323 error("%s: No such window.", v->v_str); 324 return 0; 325 } 326 if (v->v_num < 1 || v->v_num > NWINDOW 327 || (w = window[v->v_num - 1]) == 0) { 328 error("%d: No such window.", v->v_num); 329 return 0; 330 } 331 return w; 332 } 333 334 vtobool(v, def, err) 335 register struct value *v; 336 char def, err; 337 { 338 switch (v->v_type) { 339 case V_NUM: 340 return v->v_num != 0; 341 case V_STR: 342 if (str_match(v->v_str, "true", 1) 343 || str_match(v->v_str, "on", 2) 344 || str_match(v->v_str, "yes", 1)) 345 return 1; 346 else if (str_match(v->v_str, "false", 1) 347 || str_match(v->v_str, "off", 2) 348 || str_match(v->v_str, "no", 1)) 349 return 0; 350 else { 351 error("%s: Illegal boolean value.", v->v_str); 352 return err; 353 } 354 /*NOTREACHED*/ 355 case V_ERR: 356 return def; 357 } 358 /*NOTREACHED*/ 359 } 360