1 1.5 rin /* $NetBSD: ip_funcs.c,v 1.5 2018/08/07 08:05:47 rin Exp $ */ 2 1.1 christos /*- 3 1.1 christos * Copyright (c) 1996 4 1.1 christos * Keith Bostic. All rights reserved. 5 1.1 christos * 6 1.1 christos * See the LICENSE file for redistribution information. 7 1.1 christos */ 8 1.1 christos 9 1.1 christos #include "config.h" 10 1.1 christos 11 1.4 christos #include <sys/cdefs.h> 12 1.4 christos #if 0 13 1.1 christos #ifndef lint 14 1.1 christos static const char sccsid[] = "Id: ip_funcs.c,v 8.23 2001/06/25 15:19:23 skimo Exp (Berkeley) Date: 2001/06/25 15:19:23 "; 15 1.1 christos #endif /* not lint */ 16 1.4 christos #else 17 1.5 rin __RCSID("$NetBSD: ip_funcs.c,v 1.5 2018/08/07 08:05:47 rin Exp $"); 18 1.4 christos #endif 19 1.1 christos 20 1.1 christos #include <sys/types.h> 21 1.1 christos #include <sys/queue.h> 22 1.1 christos #include <sys/time.h> 23 1.1 christos 24 1.1 christos #include <bitstring.h> 25 1.1 christos #include <stdio.h> 26 1.1 christos #include <stdlib.h> 27 1.2 christos #include <unistd.h> 28 1.1 christos #include <string.h> 29 1.1 christos 30 1.1 christos #include "../common/common.h" 31 1.1 christos #include "../vi/vi.h" 32 1.1 christos #include "../ipc/ip.h" 33 1.1 christos 34 1.1 christos /* 35 1.1 christos * ip_addstr -- 36 1.1 christos * Add len bytes from the string at the cursor, advancing the cursor. 37 1.1 christos * 38 1.1 christos * PUBLIC: int ip_waddstr __P((SCR *, const CHAR_T *, size_t)); 39 1.1 christos */ 40 1.1 christos int 41 1.1 christos ip_waddstr(SCR *sp, const CHAR_T *str, size_t len) 42 1.1 christos { 43 1.1 christos IP_BUF ipb; 44 1.1 christos IP_PRIVATE *ipp; 45 1.2 christos int rval; 46 1.1 christos 47 1.1 christos ipp = IPP(sp); 48 1.1 christos 49 1.3 christos memset(&ipb, 0, sizeof(ipb)); 50 1.1 christos ipb.code = SI_WADDSTR; 51 1.1 christos ipb.len1 = len * sizeof(CHAR_T); 52 1.2 christos ipb.str1 = __UNCONST(str); 53 1.1 christos rval = vi_send(ipp->o_fd, "a", &ipb); 54 1.1 christos /* XXXX */ 55 1.1 christos ipp->col += len; 56 1.1 christos 57 1.1 christos return (rval); 58 1.1 christos } 59 1.1 christos 60 1.1 christos /* 61 1.1 christos * ip_addstr -- 62 1.1 christos * Add len bytes from the string at the cursor, advancing the cursor. 63 1.1 christos * 64 1.1 christos * PUBLIC: int ip_addstr __P((SCR *, const char *, size_t)); 65 1.1 christos */ 66 1.1 christos int 67 1.1 christos ip_addstr(SCR *sp, const char *str, size_t len) 68 1.1 christos { 69 1.1 christos IP_BUF ipb; 70 1.1 christos IP_PRIVATE *ipp; 71 1.1 christos int iv, rval; 72 1.1 christos 73 1.1 christos ipp = IPP(sp); 74 1.1 christos 75 1.1 christos /* 76 1.1 christos * If ex isn't in control, it's the last line of the screen and 77 1.1 christos * it's a split screen, use inverse video. 78 1.1 christos */ 79 1.3 christos memset(&ipb, 0, sizeof(ipb)); 80 1.1 christos iv = 0; 81 1.1 christos if (!F_ISSET(sp, SC_SCR_EXWROTE) && 82 1.1 christos ipp->row == LASTLINE(sp) && IS_SPLIT(sp)) { 83 1.1 christos iv = 1; 84 1.1 christos ip_attr(sp, SA_INVERSE, 1); 85 1.1 christos } 86 1.1 christos ipb.code = SI_ADDSTR; 87 1.1 christos ipb.len1 = len; 88 1.1 christos ipb.str1 = str; 89 1.1 christos rval = vi_send(ipp->o_fd, "a", &ipb); 90 1.1 christos /* XXXX */ 91 1.1 christos ipp->col += len; 92 1.1 christos 93 1.1 christos if (iv) 94 1.1 christos ip_attr(sp, SA_INVERSE, 0); 95 1.1 christos return (rval); 96 1.1 christos } 97 1.1 christos 98 1.1 christos /* 99 1.1 christos * ip_attr -- 100 1.1 christos * Toggle a screen attribute on/off. 101 1.1 christos * 102 1.1 christos * PUBLIC: int ip_attr __P((SCR *, scr_attr_t, int)); 103 1.1 christos */ 104 1.1 christos int 105 1.1 christos ip_attr(SCR *sp, scr_attr_t attribute, int on) 106 1.1 christos { 107 1.1 christos IP_BUF ipb; 108 1.1 christos IP_PRIVATE *ipp = IPP(sp); 109 1.1 christos 110 1.3 christos memset(&ipb, 0, sizeof(ipb)); 111 1.1 christos if (attribute == SA_ALTERNATE) { 112 1.1 christos if (on) F_SET(ipp, IP_ON_ALTERNATE); 113 1.1 christos else F_CLR(ipp, IP_ON_ALTERNATE); 114 1.1 christos } 115 1.1 christos 116 1.1 christos ipb.code = SI_ATTRIBUTE; 117 1.1 christos ipb.val1 = attribute; 118 1.1 christos ipb.val2 = on; 119 1.1 christos 120 1.1 christos return (vi_send(ipp->o_fd, "12", &ipb)); 121 1.1 christos } 122 1.1 christos 123 1.1 christos /* 124 1.1 christos * ip_baud -- 125 1.1 christos * Return the baud rate. 126 1.1 christos * 127 1.1 christos * PUBLIC: int ip_baud __P((SCR *, u_long *)); 128 1.1 christos */ 129 1.1 christos int 130 1.1 christos ip_baud(SCR *sp, u_long *ratep) 131 1.1 christos { 132 1.1 christos *ratep = 9600; /* XXX: Translation: fast. */ 133 1.1 christos return (0); 134 1.1 christos } 135 1.1 christos 136 1.1 christos /* 137 1.1 christos * ip_bell -- 138 1.1 christos * Ring the bell/flash the screen. 139 1.1 christos * 140 1.1 christos * PUBLIC: int ip_bell __P((SCR *)); 141 1.1 christos */ 142 1.1 christos int 143 1.1 christos ip_bell(SCR *sp) 144 1.1 christos { 145 1.1 christos IP_BUF ipb; 146 1.1 christos IP_PRIVATE *ipp = IPP(sp); 147 1.1 christos 148 1.3 christos memset(&ipb, 0, sizeof(ipb)); 149 1.1 christos ipb.code = SI_BELL; 150 1.1 christos 151 1.1 christos return (vi_send(ipp->o_fd, NULL, &ipb)); 152 1.1 christos } 153 1.1 christos 154 1.1 christos /* 155 1.1 christos * ip_busy -- 156 1.1 christos * Display a busy message. 157 1.1 christos * 158 1.1 christos * PUBLIC: void ip_busy __P((SCR *, const char *, busy_t)); 159 1.1 christos */ 160 1.1 christos void 161 1.1 christos ip_busy(SCR *sp, const char *str, busy_t bval) 162 1.1 christos { 163 1.1 christos IP_BUF ipb; 164 1.1 christos IP_PRIVATE *ipp = IPP(sp); 165 1.1 christos 166 1.3 christos memset(&ipb, 0, sizeof(ipb)); 167 1.1 christos switch (bval) { 168 1.1 christos case BUSY_ON: 169 1.1 christos ipb.code = SI_BUSY_ON; 170 1.1 christos ipb.str1 = str; 171 1.1 christos ipb.len1 = strlen(str); 172 1.1 christos (void)vi_send(ipp->o_fd, "a", &ipb); 173 1.1 christos break; 174 1.1 christos case BUSY_OFF: 175 1.1 christos ipb.code = SI_BUSY_OFF; 176 1.1 christos (void)vi_send(ipp->o_fd, NULL, &ipb); 177 1.1 christos break; 178 1.1 christos case BUSY_UPDATE: 179 1.1 christos break; 180 1.1 christos } 181 1.1 christos return; 182 1.1 christos } 183 1.1 christos 184 1.1 christos /* 185 1.1 christos * ip_child -- 186 1.1 christos * Prepare child. 187 1.1 christos * 188 1.1 christos * PUBLIC: int ip_child __P((SCR *)); 189 1.1 christos */ 190 1.1 christos int 191 1.1 christos ip_child(SCR *sp) 192 1.1 christos { 193 1.1 christos IP_PRIVATE *ipp = IPP(sp); 194 1.1 christos 195 1.1 christos if (ipp->t_fd != -1) { 196 1.1 christos dup2(ipp->t_fd, 0); 197 1.1 christos dup2(ipp->t_fd, 1); 198 1.1 christos dup2(ipp->t_fd, 2); 199 1.1 christos close(ipp->t_fd); 200 1.1 christos } 201 1.1 christos return 0; 202 1.1 christos } 203 1.1 christos 204 1.1 christos /* 205 1.1 christos * ip_clrtoeol -- 206 1.1 christos * Clear from the current cursor to the end of the line. 207 1.1 christos * 208 1.1 christos * PUBLIC: int ip_clrtoeol __P((SCR *)); 209 1.1 christos */ 210 1.1 christos int 211 1.1 christos ip_clrtoeol(SCR *sp) 212 1.1 christos { 213 1.1 christos IP_BUF ipb; 214 1.1 christos IP_PRIVATE *ipp = IPP(sp); 215 1.1 christos 216 1.1 christos /* Temporary hack until we can pass screen pointers 217 1.1 christos * or name screens 218 1.1 christos */ 219 1.3 christos memset(&ipb, 0, sizeof(ipb)); 220 1.1 christos if (IS_VSPLIT(sp)) { 221 1.1 christos size_t x, y, spcnt; 222 1.1 christos int error; 223 1.1 christos 224 1.1 christos y = ipp->row; 225 1.1 christos x = ipp->col; 226 1.1 christos error = 0; 227 1.1 christos for (spcnt = sp->cols - x; 228 1.1 christos spcnt > 0 && ! error; --spcnt) 229 1.1 christos error = ip_addstr(sp, " ", 1); 230 1.1 christos if (sp->coff == 0) 231 1.1 christos error |= ip_addstr(sp, "|", 1); 232 1.1 christos error |= ip_move(sp, y, x); 233 1.1 christos return error; 234 1.1 christos } 235 1.1 christos 236 1.1 christos ipb.code = SI_CLRTOEOL; 237 1.1 christos 238 1.1 christos return (vi_send(ipp->o_fd, NULL, &ipb)); 239 1.1 christos } 240 1.1 christos 241 1.1 christos /* 242 1.1 christos * ip_cursor -- 243 1.1 christos * Return the current cursor position. 244 1.1 christos * 245 1.1 christos * PUBLIC: int ip_cursor __P((SCR *, size_t *, size_t *)); 246 1.1 christos */ 247 1.1 christos int 248 1.1 christos ip_cursor(SCR *sp, size_t *yp, size_t *xp) 249 1.1 christos { 250 1.1 christos IP_PRIVATE *ipp; 251 1.1 christos 252 1.1 christos ipp = IPP(sp); 253 1.1 christos *yp = ipp->row; 254 1.1 christos *xp = ipp->col; 255 1.1 christos return (0); 256 1.1 christos } 257 1.1 christos 258 1.1 christos /* 259 1.1 christos * ip_deleteln -- 260 1.1 christos * Delete the current line, scrolling all lines below it. 261 1.1 christos * 262 1.1 christos * PUBLIC: int ip_deleteln __P((SCR *)); 263 1.1 christos */ 264 1.1 christos int 265 1.1 christos ip_deleteln(SCR *sp) 266 1.1 christos { 267 1.1 christos IP_BUF ipb; 268 1.1 christos IP_PRIVATE *ipp = IPP(sp); 269 1.1 christos 270 1.1 christos /* 271 1.1 christos * This clause is required because the curses screen uses reverse 272 1.1 christos * video to delimit split screens. If the screen does not do this, 273 1.1 christos * this code won't be necessary. 274 1.1 christos * 275 1.1 christos * If the bottom line was in reverse video, rewrite it in normal 276 1.1 christos * video before it's scrolled. 277 1.1 christos */ 278 1.3 christos memset(&ipb, 0, sizeof(ipb)); 279 1.1 christos if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) { 280 1.1 christos ipb.code = SI_REWRITE; 281 1.1 christos ipb.val1 = RLNO(sp, LASTLINE(sp)); 282 1.1 christos if (vi_send(ipp->o_fd, "1", &ipb)) 283 1.1 christos return (1); 284 1.1 christos } 285 1.1 christos 286 1.1 christos /* 287 1.1 christos * The bottom line is expected to be blank after this operation, 288 1.1 christos * and other screens must support that semantic. 289 1.1 christos */ 290 1.1 christos ipb.code = SI_DELETELN; 291 1.1 christos return (vi_send(ipp->o_fd, NULL, &ipb)); 292 1.1 christos } 293 1.1 christos 294 1.1 christos /* 295 1.1 christos * ip_discard -- 296 1.1 christos * Discard a screen. 297 1.1 christos * 298 1.1 christos * PUBLIC: int ip_discard __P((SCR *, SCR **)); 299 1.1 christos */ 300 1.1 christos int 301 1.1 christos ip_discard(SCR *discardp, SCR **acquirep) 302 1.1 christos { 303 1.1 christos return (0); 304 1.1 christos } 305 1.1 christos 306 1.1 christos /* 307 1.1 christos * ip_ex_adjust -- 308 1.1 christos * Adjust the screen for ex. 309 1.1 christos * 310 1.1 christos * PUBLIC: int ip_ex_adjust __P((SCR *, exadj_t)); 311 1.1 christos */ 312 1.1 christos int 313 1.1 christos ip_ex_adjust(SCR *sp, exadj_t action) 314 1.1 christos { 315 1.1 christos abort(); 316 1.1 christos /* NOTREACHED */ 317 1.1 christos } 318 1.1 christos 319 1.5 rin #ifdef IMCTRL 320 1.5 rin /* 321 1.5 rin * ip_imctrl -- 322 1.5 rin * XXX not implemented yet. 323 1.5 rin * 324 1.5 rin * PUBLIC: #ifdef IMCTRL 325 1.5 rin * PUBLIC: void ip_imctrl __P((SCR *, imctrl_t)); 326 1.5 rin * PUBLIC: #endif 327 1.5 rin */ 328 1.5 rin void 329 1.5 rin ip_imctrl(SCR *sp, imctrl_t action) 330 1.5 rin { 331 1.5 rin 332 1.5 rin return; 333 1.5 rin } 334 1.5 rin #endif 335 1.5 rin 336 1.1 christos /* 337 1.1 christos * ip_insertln -- 338 1.1 christos * Push down the current line, discarding the bottom line. 339 1.1 christos * 340 1.1 christos * PUBLIC: int ip_insertln __P((SCR *)); 341 1.1 christos */ 342 1.1 christos int 343 1.1 christos ip_insertln(SCR *sp) 344 1.1 christos { 345 1.1 christos IP_BUF ipb; 346 1.1 christos IP_PRIVATE *ipp = IPP(sp); 347 1.1 christos 348 1.3 christos memset(&ipb, 0, sizeof(ipb)); 349 1.1 christos ipb.code = SI_INSERTLN; 350 1.1 christos 351 1.1 christos return (vi_send(ipp->o_fd, NULL, &ipb)); 352 1.1 christos } 353 1.1 christos 354 1.1 christos /* 355 1.1 christos * ip_keyval -- 356 1.1 christos * Return the value for a special key. 357 1.1 christos * 358 1.1 christos * PUBLIC: int ip_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); 359 1.1 christos */ 360 1.1 christos int 361 1.1 christos ip_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep) 362 1.1 christos { 363 1.1 christos /* 364 1.1 christos * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990, 365 1.1 christos * VWERASE is a 4BSD extension. 366 1.1 christos */ 367 1.1 christos switch (val) { 368 1.1 christos case KEY_VEOF: 369 1.1 christos *dnep = '\004'; /* ^D */ 370 1.1 christos break; 371 1.1 christos case KEY_VERASE: 372 1.1 christos *dnep = '\b'; /* ^H */ 373 1.1 christos break; 374 1.1 christos case KEY_VKILL: 375 1.1 christos *dnep = '\025'; /* ^U */ 376 1.1 christos break; 377 1.1 christos #ifdef VWERASE 378 1.1 christos case KEY_VWERASE: 379 1.1 christos *dnep = '\027'; /* ^W */ 380 1.1 christos break; 381 1.1 christos #endif 382 1.1 christos default: 383 1.1 christos *dnep = 1; 384 1.1 christos break; 385 1.1 christos } 386 1.1 christos return (0); 387 1.1 christos } 388 1.1 christos 389 1.1 christos /* 390 1.1 christos * ip_move -- 391 1.1 christos * Move the cursor. 392 1.1 christos * 393 1.1 christos * PUBLIC: int ip_move __P((SCR *, size_t, size_t)); 394 1.1 christos */ 395 1.1 christos int 396 1.1 christos ip_move(SCR *sp, size_t lno, size_t cno) 397 1.1 christos { 398 1.1 christos IP_PRIVATE *ipp; 399 1.1 christos IP_BUF ipb; 400 1.1 christos 401 1.1 christos ipp = IPP(sp); 402 1.1 christos ipp->row = lno; 403 1.1 christos ipp->col = cno; 404 1.1 christos 405 1.3 christos memset(&ipb, 0, sizeof(ipb)); 406 1.1 christos ipb.code = SI_MOVE; 407 1.1 christos ipb.val1 = RLNO(sp, lno); 408 1.1 christos ipb.val2 = RCNO(sp, cno); 409 1.1 christos return (vi_send(ipp->o_fd, "12", &ipb)); 410 1.1 christos } 411 1.1 christos 412 1.1 christos /* 413 1.1 christos * PUBLIC: void ip_msg __P((SCR *, mtype_t, char *, size_t)); 414 1.1 christos */ 415 1.1 christos void 416 1.1 christos ip_msg(SCR *sp, mtype_t mtype, char *line, size_t len) 417 1.1 christos { 418 1.1 christos IP_PRIVATE *ipp = IPP(sp); 419 1.1 christos 420 1.1 christos if (F_ISSET(ipp, IP_ON_ALTERNATE)) 421 1.1 christos vs_msg(sp, mtype, line, len); 422 1.1 christos else { 423 1.1 christos write(ipp->t_fd, line, len); 424 1.1 christos F_CLR(sp, SC_EX_WAIT_NO); 425 1.1 christos } 426 1.1 christos } 427 1.1 christos 428 1.1 christos /* 429 1.1 christos * ip_refresh -- 430 1.1 christos * Refresh the screen. 431 1.1 christos * 432 1.1 christos * PUBLIC: int ip_refresh __P((SCR *, int)); 433 1.1 christos */ 434 1.1 christos int 435 1.1 christos ip_refresh(SCR *sp, int repaint) 436 1.1 christos { 437 1.1 christos IP_BUF ipb; 438 1.1 christos IP_PRIVATE *ipp; 439 1.1 christos db_recno_t total; 440 1.1 christos 441 1.1 christos ipp = IPP(sp); 442 1.1 christos 443 1.1 christos /* 444 1.1 christos * If the scroll bar information has changed since we last sent 445 1.1 christos * it, resend it. Currently, we send three values: 446 1.1 christos * 447 1.1 christos * top The line number of the first line in the screen. 448 1.1 christos * num The number of lines visible on the screen. 449 1.1 christos * total The number of lines in the file. 450 1.1 christos * 451 1.1 christos * XXX 452 1.1 christos * This is a gross violation of layering... we're looking at data 453 1.1 christos * structures at which we have absolutely no business whatsoever 454 1.1 christos * looking... 455 1.1 christos */ 456 1.3 christos memset(&ipb, 0, sizeof(ipb)); 457 1.1 christos ipb.val1 = HMAP->lno; 458 1.1 christos ipb.val2 = TMAP->lno - HMAP->lno; 459 1.1 christos if (sp->ep != NULL && sp->ep->db != NULL) 460 1.1 christos (void)db_last(sp, &total); 461 1.1 christos ipb.val3 = total == 0 ? 1 : total; 462 1.1 christos if (ipb.val1 != ipp->sb_top || 463 1.1 christos ipb.val2 != ipp->sb_num || ipb.val3 != ipp->sb_total) { 464 1.1 christos ipb.code = SI_SCROLLBAR; 465 1.1 christos (void)vi_send(ipp->o_fd, "123", &ipb); 466 1.1 christos ipp->sb_top = ipb.val1; 467 1.1 christos ipp->sb_num = ipb.val2; 468 1.1 christos ipp->sb_total = ipb.val3; 469 1.1 christos } 470 1.1 christos 471 1.1 christos /* Refresh/repaint the screen. */ 472 1.1 christos ipb.code = repaint ? SI_REDRAW : SI_REFRESH; 473 1.1 christos return (vi_send(ipp->o_fd, NULL, &ipb)); 474 1.1 christos } 475 1.1 christos 476 1.1 christos /* 477 1.1 christos * ip_rename -- 478 1.1 christos * Rename the file. 479 1.1 christos * 480 1.1 christos * PUBLIC: int ip_rename __P((SCR *, char *, int)); 481 1.1 christos */ 482 1.1 christos int 483 1.1 christos ip_rename(SCR *sp, char *name, int on) 484 1.1 christos { 485 1.1 christos IP_BUF ipb; 486 1.1 christos IP_PRIVATE *ipp = IPP(sp); 487 1.1 christos 488 1.3 christos memset(&ipb, 0, sizeof(ipb)); 489 1.1 christos ipb.code = SI_RENAME; 490 1.1 christos ipb.str1 = name; 491 1.1 christos ipb.len1 = name ? strlen(name) : 0; 492 1.1 christos return (vi_send(ipp->o_fd, "a", &ipb)); 493 1.1 christos } 494 1.1 christos 495 1.1 christos /* 496 1.1 christos * ip_reply -- 497 1.1 christos * Reply to a message. 498 1.1 christos * 499 1.1 christos * PUBLIC: int ip_reply __P((SCR *, int, char *)); 500 1.1 christos */ 501 1.1 christos int 502 1.1 christos ip_reply(SCR *sp, int status, char *msg) 503 1.1 christos { 504 1.1 christos IP_BUF ipb; 505 1.1 christos IP_PRIVATE *ipp = IPP(sp); 506 1.1 christos 507 1.3 christos memset(&ipb, 0, sizeof(ipb)); 508 1.1 christos ipb.code = SI_REPLY; 509 1.1 christos ipb.val1 = status; 510 1.1 christos ipb.str1 = msg == NULL ? "" : msg; 511 1.1 christos ipb.len1 = strlen(ipb.str1); 512 1.1 christos return (vi_send(ipp->o_fd, "1a", &ipb)); 513 1.1 christos } 514 1.1 christos 515 1.1 christos /* 516 1.1 christos * ip_split -- 517 1.1 christos * Split a screen. 518 1.1 christos * 519 1.1 christos * PUBLIC: int ip_split __P((SCR *, SCR *)); 520 1.1 christos */ 521 1.1 christos int 522 1.1 christos ip_split(SCR *origp, SCR *newp) 523 1.1 christos { 524 1.1 christos return (0); 525 1.1 christos } 526 1.1 christos 527 1.1 christos /* 528 1.1 christos * ip_suspend -- 529 1.1 christos * Suspend a screen. 530 1.1 christos * 531 1.1 christos * PUBLIC: int ip_suspend __P((SCR *, int *)); 532 1.1 christos */ 533 1.1 christos int 534 1.1 christos ip_suspend(SCR *sp, int *allowedp) 535 1.1 christos { 536 1.1 christos *allowedp = 0; 537 1.1 christos return (0); 538 1.1 christos } 539 1.1 christos 540 1.1 christos /* 541 1.1 christos * ip_usage -- 542 1.1 christos * Print out the ip usage messages. 543 1.1 christos * 544 1.1 christos * PUBLIC: void ip_usage __P((void)); 545 1.1 christos */ 546 1.1 christos void 547 1.1 christos ip_usage(void) 548 1.1 christos { 549 1.1 christos #define USAGE "\ 550 1.1 christos usage: vi [-eFlRrSv] [-c command] [-I ifd.ofd] [-t tag] [-w size] [file ...]\n" 551 1.1 christos (void)fprintf(stderr, "%s", USAGE); 552 1.1 christos #undef USAGE 553 1.1 christos } 554