1a5f0fb15SPaul Saab /* 2000ba3e8STim J. Robbins * Copyright (C) 1984-2002 Mark Nudelman 3a5f0fb15SPaul Saab * 4a5f0fb15SPaul Saab * You may distribute under the terms of either the GNU General Public 5a5f0fb15SPaul Saab * License or the Less License, as specified in the README file. 6a5f0fb15SPaul Saab * 7a5f0fb15SPaul Saab * For more information about less, or for information on how to 8a5f0fb15SPaul Saab * contact the author, see the README file. 9a5f0fb15SPaul Saab */ 10a5f0fb15SPaul Saab 11a5f0fb15SPaul Saab 12a5f0fb15SPaul Saab /* 13a5f0fb15SPaul Saab * Handling functions for command line options. 14a5f0fb15SPaul Saab * 15a5f0fb15SPaul Saab * Most options are handled by the generic code in option.c. 16a5f0fb15SPaul Saab * But all string options, and a few non-string options, require 17a5f0fb15SPaul Saab * special handling specific to the particular option. 18a5f0fb15SPaul Saab * This special processing is done by the "handling functions" in this file. 19a5f0fb15SPaul Saab * 20a5f0fb15SPaul Saab * Each handling function is passed a "type" and, if it is a string 21a5f0fb15SPaul Saab * option, the string which should be "assigned" to the option. 22a5f0fb15SPaul Saab * The type may be one of: 23a5f0fb15SPaul Saab * INIT The option is being initialized from the command line. 24a5f0fb15SPaul Saab * TOGGLE The option is being changed from within the program. 25a5f0fb15SPaul Saab * QUERY The setting of the option is merely being queried. 26a5f0fb15SPaul Saab */ 27a5f0fb15SPaul Saab 28a5f0fb15SPaul Saab #include "less.h" 29a5f0fb15SPaul Saab #include "option.h" 30a5f0fb15SPaul Saab 31a5f0fb15SPaul Saab extern int nbufs; 32000ba3e8STim J. Robbins extern int bufspace; 33a5f0fb15SPaul Saab extern int pr_type; 34a5f0fb15SPaul Saab extern int plusoption; 35a5f0fb15SPaul Saab extern int swindow; 36a5f0fb15SPaul Saab extern int sc_height; 37a5f0fb15SPaul Saab extern int secure; 38a5f0fb15SPaul Saab extern int dohelp; 39a5f0fb15SPaul Saab extern int any_display; 40a5f0fb15SPaul Saab extern char openquote; 41a5f0fb15SPaul Saab extern char closequote; 42a5f0fb15SPaul Saab extern char *prproto[]; 43a5f0fb15SPaul Saab extern char *eqproto; 44a5f0fb15SPaul Saab extern char *hproto; 45c9346414SPaul Saab extern char *wproto; 46a5f0fb15SPaul Saab extern IFILE curr_ifile; 47a5f0fb15SPaul Saab extern char version[]; 48a5f0fb15SPaul Saab #if LOGFILE 49a5f0fb15SPaul Saab extern char *namelogfile; 50a5f0fb15SPaul Saab extern int force_logfile; 51a5f0fb15SPaul Saab extern int logfile; 52a5f0fb15SPaul Saab #endif 53a5f0fb15SPaul Saab #if TAGS 54a5f0fb15SPaul Saab public char *tagoption = NULL; 55a5f0fb15SPaul Saab extern char *tags; 56a5f0fb15SPaul Saab extern int jump_sline; 57a5f0fb15SPaul Saab #endif 58a5f0fb15SPaul Saab #if MSDOS_COMPILER 59a5f0fb15SPaul Saab extern int nm_fg_color, nm_bg_color; 60a5f0fb15SPaul Saab extern int bo_fg_color, bo_bg_color; 61a5f0fb15SPaul Saab extern int ul_fg_color, ul_bg_color; 62a5f0fb15SPaul Saab extern int so_fg_color, so_bg_color; 63a5f0fb15SPaul Saab extern int bl_fg_color, bl_bg_color; 64a5f0fb15SPaul Saab #endif 65a5f0fb15SPaul Saab 66a5f0fb15SPaul Saab 67a5f0fb15SPaul Saab #if LOGFILE 68a5f0fb15SPaul Saab /* 69a5f0fb15SPaul Saab * Handler for -o option. 70a5f0fb15SPaul Saab */ 71a5f0fb15SPaul Saab public void 72a5f0fb15SPaul Saab opt_o(type, s) 73a5f0fb15SPaul Saab int type; 74a5f0fb15SPaul Saab char *s; 75a5f0fb15SPaul Saab { 76a5f0fb15SPaul Saab PARG parg; 77a5f0fb15SPaul Saab 78a5f0fb15SPaul Saab if (secure) 79a5f0fb15SPaul Saab { 80a5f0fb15SPaul Saab error("log file support is not available", NULL_PARG); 81a5f0fb15SPaul Saab return; 82a5f0fb15SPaul Saab } 83a5f0fb15SPaul Saab switch (type) 84a5f0fb15SPaul Saab { 85a5f0fb15SPaul Saab case INIT: 86a5f0fb15SPaul Saab namelogfile = s; 87a5f0fb15SPaul Saab break; 88a5f0fb15SPaul Saab case TOGGLE: 89a5f0fb15SPaul Saab if (ch_getflags() & CH_CANSEEK) 90a5f0fb15SPaul Saab { 91a5f0fb15SPaul Saab error("Input is not a pipe", NULL_PARG); 92a5f0fb15SPaul Saab return; 93a5f0fb15SPaul Saab } 94a5f0fb15SPaul Saab if (logfile >= 0) 95a5f0fb15SPaul Saab { 96a5f0fb15SPaul Saab error("Log file is already in use", NULL_PARG); 97a5f0fb15SPaul Saab return; 98a5f0fb15SPaul Saab } 99a5f0fb15SPaul Saab s = skipsp(s); 100a5f0fb15SPaul Saab namelogfile = lglob(s); 101a5f0fb15SPaul Saab use_logfile(namelogfile); 102a5f0fb15SPaul Saab sync_logfile(); 103a5f0fb15SPaul Saab break; 104a5f0fb15SPaul Saab case QUERY: 105a5f0fb15SPaul Saab if (logfile < 0) 106a5f0fb15SPaul Saab error("No log file", NULL_PARG); 107a5f0fb15SPaul Saab else 108a5f0fb15SPaul Saab { 109000ba3e8STim J. Robbins parg.p_string = namelogfile; 110a5f0fb15SPaul Saab error("Log file \"%s\"", &parg); 111a5f0fb15SPaul Saab } 112a5f0fb15SPaul Saab break; 113a5f0fb15SPaul Saab } 114a5f0fb15SPaul Saab } 115a5f0fb15SPaul Saab 116a5f0fb15SPaul Saab /* 117a5f0fb15SPaul Saab * Handler for -O option. 118a5f0fb15SPaul Saab */ 119a5f0fb15SPaul Saab public void 120a5f0fb15SPaul Saab opt__O(type, s) 121a5f0fb15SPaul Saab int type; 122a5f0fb15SPaul Saab char *s; 123a5f0fb15SPaul Saab { 124a5f0fb15SPaul Saab force_logfile = TRUE; 125a5f0fb15SPaul Saab opt_o(type, s); 126a5f0fb15SPaul Saab } 127a5f0fb15SPaul Saab #endif 128a5f0fb15SPaul Saab 129a5f0fb15SPaul Saab /* 130a5f0fb15SPaul Saab * Handlers for -l option. 131a5f0fb15SPaul Saab */ 132a5f0fb15SPaul Saab public void 133a5f0fb15SPaul Saab opt_l(type, s) 134a5f0fb15SPaul Saab int type; 135a5f0fb15SPaul Saab char *s; 136a5f0fb15SPaul Saab { 137a5f0fb15SPaul Saab int err; 138a5f0fb15SPaul Saab int n; 139a5f0fb15SPaul Saab char *t; 140a5f0fb15SPaul Saab 141a5f0fb15SPaul Saab switch (type) 142a5f0fb15SPaul Saab { 143a5f0fb15SPaul Saab case INIT: 144a5f0fb15SPaul Saab t = s; 145000ba3e8STim J. Robbins n = getnum(&t, "l", &err); 146a5f0fb15SPaul Saab if (err || n <= 0) 147a5f0fb15SPaul Saab { 148a5f0fb15SPaul Saab error("Line number is required after -l", NULL_PARG); 149a5f0fb15SPaul Saab return; 150a5f0fb15SPaul Saab } 151a5f0fb15SPaul Saab plusoption = TRUE; 152a5f0fb15SPaul Saab ungetsc(s); 153a5f0fb15SPaul Saab break; 154a5f0fb15SPaul Saab } 155a5f0fb15SPaul Saab } 156a5f0fb15SPaul Saab 157a5f0fb15SPaul Saab #if USERFILE 158a5f0fb15SPaul Saab public void 159a5f0fb15SPaul Saab opt_k(type, s) 160a5f0fb15SPaul Saab int type; 161a5f0fb15SPaul Saab char *s; 162a5f0fb15SPaul Saab { 163a5f0fb15SPaul Saab PARG parg; 164a5f0fb15SPaul Saab 165a5f0fb15SPaul Saab switch (type) 166a5f0fb15SPaul Saab { 167a5f0fb15SPaul Saab case INIT: 168a5f0fb15SPaul Saab if (lesskey(s, 0)) 169a5f0fb15SPaul Saab { 170000ba3e8STim J. Robbins parg.p_string = s; 171a5f0fb15SPaul Saab error("Cannot use lesskey file \"%s\"", &parg); 172a5f0fb15SPaul Saab } 173a5f0fb15SPaul Saab break; 174a5f0fb15SPaul Saab } 175a5f0fb15SPaul Saab } 176a5f0fb15SPaul Saab #endif 177a5f0fb15SPaul Saab 178a5f0fb15SPaul Saab #if TAGS 179a5f0fb15SPaul Saab /* 180a5f0fb15SPaul Saab * Handler for -t option. 181a5f0fb15SPaul Saab */ 182a5f0fb15SPaul Saab public void 183a5f0fb15SPaul Saab opt_t(type, s) 184a5f0fb15SPaul Saab int type; 185a5f0fb15SPaul Saab char *s; 186a5f0fb15SPaul Saab { 187a5f0fb15SPaul Saab IFILE save_ifile; 188a5f0fb15SPaul Saab POSITION pos; 189a5f0fb15SPaul Saab 190a5f0fb15SPaul Saab switch (type) 191a5f0fb15SPaul Saab { 192a5f0fb15SPaul Saab case INIT: 193a5f0fb15SPaul Saab tagoption = s; 194a5f0fb15SPaul Saab /* Do the rest in main() */ 195a5f0fb15SPaul Saab break; 196a5f0fb15SPaul Saab case TOGGLE: 197a5f0fb15SPaul Saab if (secure) 198a5f0fb15SPaul Saab { 199a5f0fb15SPaul Saab error("tags support is not available", NULL_PARG); 200a5f0fb15SPaul Saab break; 201a5f0fb15SPaul Saab } 202a5f0fb15SPaul Saab findtag(skipsp(s)); 203a5f0fb15SPaul Saab save_ifile = save_curr_ifile(); 204a5f0fb15SPaul Saab if (edit_tagfile()) 205a5f0fb15SPaul Saab break; 206a5f0fb15SPaul Saab if ((pos = tagsearch()) == NULL_POSITION) 207a5f0fb15SPaul Saab { 208a5f0fb15SPaul Saab reedit_ifile(save_ifile); 209a5f0fb15SPaul Saab break; 210a5f0fb15SPaul Saab } 211a5f0fb15SPaul Saab unsave_ifile(save_ifile); 212a5f0fb15SPaul Saab jump_loc(pos, jump_sline); 213a5f0fb15SPaul Saab break; 214a5f0fb15SPaul Saab } 215a5f0fb15SPaul Saab } 216a5f0fb15SPaul Saab 217a5f0fb15SPaul Saab /* 218a5f0fb15SPaul Saab * Handler for -T option. 219a5f0fb15SPaul Saab */ 220a5f0fb15SPaul Saab public void 221a5f0fb15SPaul Saab opt__T(type, s) 222a5f0fb15SPaul Saab int type; 223a5f0fb15SPaul Saab char *s; 224a5f0fb15SPaul Saab { 225a5f0fb15SPaul Saab PARG parg; 226a5f0fb15SPaul Saab 227a5f0fb15SPaul Saab switch (type) 228a5f0fb15SPaul Saab { 229a5f0fb15SPaul Saab case INIT: 230a5f0fb15SPaul Saab tags = s; 231a5f0fb15SPaul Saab break; 232a5f0fb15SPaul Saab case TOGGLE: 233a5f0fb15SPaul Saab s = skipsp(s); 234a5f0fb15SPaul Saab tags = lglob(s); 235a5f0fb15SPaul Saab break; 236a5f0fb15SPaul Saab case QUERY: 237000ba3e8STim J. Robbins parg.p_string = tags; 238a5f0fb15SPaul Saab error("Tags file \"%s\"", &parg); 239a5f0fb15SPaul Saab break; 240a5f0fb15SPaul Saab } 241a5f0fb15SPaul Saab } 242a5f0fb15SPaul Saab #endif 243a5f0fb15SPaul Saab 244a5f0fb15SPaul Saab /* 245a5f0fb15SPaul Saab * Handler for -p option. 246a5f0fb15SPaul Saab */ 247a5f0fb15SPaul Saab public void 248a5f0fb15SPaul Saab opt_p(type, s) 249a5f0fb15SPaul Saab int type; 250a5f0fb15SPaul Saab register char *s; 251a5f0fb15SPaul Saab { 252a5f0fb15SPaul Saab switch (type) 253a5f0fb15SPaul Saab { 254a5f0fb15SPaul Saab case INIT: 255a5f0fb15SPaul Saab /* 256a5f0fb15SPaul Saab * Unget a search command for the specified string. 257a5f0fb15SPaul Saab * {{ This won't work if the "/" command is 258a5f0fb15SPaul Saab * changed or invalidated by a .lesskey file. }} 259a5f0fb15SPaul Saab */ 260a5f0fb15SPaul Saab plusoption = TRUE; 261a5f0fb15SPaul Saab ungetsc(s); 262a5f0fb15SPaul Saab ungetsc("/"); 263a5f0fb15SPaul Saab break; 264a5f0fb15SPaul Saab } 265a5f0fb15SPaul Saab } 266a5f0fb15SPaul Saab 267a5f0fb15SPaul Saab /* 268a5f0fb15SPaul Saab * Handler for -P option. 269a5f0fb15SPaul Saab */ 270a5f0fb15SPaul Saab public void 271a5f0fb15SPaul Saab opt__P(type, s) 272a5f0fb15SPaul Saab int type; 273a5f0fb15SPaul Saab register char *s; 274a5f0fb15SPaul Saab { 275a5f0fb15SPaul Saab register char **proto; 276a5f0fb15SPaul Saab PARG parg; 277a5f0fb15SPaul Saab 278a5f0fb15SPaul Saab switch (type) 279a5f0fb15SPaul Saab { 280a5f0fb15SPaul Saab case INIT: 281a5f0fb15SPaul Saab case TOGGLE: 282a5f0fb15SPaul Saab /* 283a5f0fb15SPaul Saab * Figure out which prototype string should be changed. 284a5f0fb15SPaul Saab */ 285a5f0fb15SPaul Saab switch (*s) 286a5f0fb15SPaul Saab { 287a5f0fb15SPaul Saab case 's': proto = &prproto[PR_SHORT]; s++; break; 288a5f0fb15SPaul Saab case 'm': proto = &prproto[PR_MEDIUM]; s++; break; 289a5f0fb15SPaul Saab case 'M': proto = &prproto[PR_LONG]; s++; break; 290a5f0fb15SPaul Saab case '=': proto = &eqproto; s++; break; 291a5f0fb15SPaul Saab case 'h': proto = &hproto; s++; break; 292c9346414SPaul Saab case 'w': proto = &wproto; s++; break; 293a5f0fb15SPaul Saab default: proto = &prproto[PR_SHORT]; break; 294a5f0fb15SPaul Saab } 295a5f0fb15SPaul Saab free(*proto); 296a5f0fb15SPaul Saab *proto = save(s); 297a5f0fb15SPaul Saab break; 298a5f0fb15SPaul Saab case QUERY: 299a5f0fb15SPaul Saab parg.p_string = prproto[pr_type]; 300a5f0fb15SPaul Saab error("%s", &parg); 301a5f0fb15SPaul Saab break; 302a5f0fb15SPaul Saab } 303a5f0fb15SPaul Saab } 304a5f0fb15SPaul Saab 305a5f0fb15SPaul Saab /* 306a5f0fb15SPaul Saab * Handler for the -b option. 307a5f0fb15SPaul Saab */ 308a5f0fb15SPaul Saab /*ARGSUSED*/ 309a5f0fb15SPaul Saab public void 310a5f0fb15SPaul Saab opt_b(type, s) 311a5f0fb15SPaul Saab int type; 312a5f0fb15SPaul Saab char *s; 313a5f0fb15SPaul Saab { 314a5f0fb15SPaul Saab switch (type) 315a5f0fb15SPaul Saab { 316a5f0fb15SPaul Saab case INIT: 317000ba3e8STim J. Robbins case TOGGLE: 318000ba3e8STim J. Robbins /* 319000ba3e8STim J. Robbins * Set the new number of buffers. 320000ba3e8STim J. Robbins */ 321000ba3e8STim J. Robbins ch_setbufspace(bufspace); 322000ba3e8STim J. Robbins break; 323000ba3e8STim J. Robbins case QUERY: 324a5f0fb15SPaul Saab break; 325a5f0fb15SPaul Saab } 326a5f0fb15SPaul Saab } 327a5f0fb15SPaul Saab 328a5f0fb15SPaul Saab /* 329a5f0fb15SPaul Saab * Handler for the -i option. 330a5f0fb15SPaul Saab */ 331a5f0fb15SPaul Saab /*ARGSUSED*/ 332a5f0fb15SPaul Saab public void 333a5f0fb15SPaul Saab opt_i(type, s) 334a5f0fb15SPaul Saab int type; 335a5f0fb15SPaul Saab char *s; 336a5f0fb15SPaul Saab { 337a5f0fb15SPaul Saab switch (type) 338a5f0fb15SPaul Saab { 339a5f0fb15SPaul Saab case TOGGLE: 340a5f0fb15SPaul Saab chg_caseless(); 341a5f0fb15SPaul Saab break; 342a5f0fb15SPaul Saab case QUERY: 343a5f0fb15SPaul Saab case INIT: 344a5f0fb15SPaul Saab break; 345a5f0fb15SPaul Saab } 346a5f0fb15SPaul Saab } 347a5f0fb15SPaul Saab 348a5f0fb15SPaul Saab /* 349a5f0fb15SPaul Saab * Handler for the -V option. 350a5f0fb15SPaul Saab */ 351a5f0fb15SPaul Saab /*ARGSUSED*/ 352a5f0fb15SPaul Saab public void 353a5f0fb15SPaul Saab opt__V(type, s) 354a5f0fb15SPaul Saab int type; 355a5f0fb15SPaul Saab char *s; 356a5f0fb15SPaul Saab { 357a5f0fb15SPaul Saab switch (type) 358a5f0fb15SPaul Saab { 359a5f0fb15SPaul Saab case TOGGLE: 360a5f0fb15SPaul Saab case QUERY: 361a5f0fb15SPaul Saab dispversion(); 362a5f0fb15SPaul Saab break; 363a5f0fb15SPaul Saab case INIT: 364a5f0fb15SPaul Saab /* 365a5f0fb15SPaul Saab * Force output to stdout per GNU standard for --version output. 366a5f0fb15SPaul Saab */ 367a5f0fb15SPaul Saab any_display = 1; 368a5f0fb15SPaul Saab putstr("less "); 369a5f0fb15SPaul Saab putstr(version); 370000ba3e8STim J. Robbins putstr("\nCopyright (C) 2002 Mark Nudelman\n\n"); 371a5f0fb15SPaul Saab putstr("less comes with NO WARRANTY, to the extent permitted by law.\n"); 372a5f0fb15SPaul Saab putstr("For information about the terms of redistribution,\n"); 373a5f0fb15SPaul Saab putstr("see the file named README in the less distribution.\n"); 374c9346414SPaul Saab putstr("Homepage: http://www.greenwoodsoftware.com/less\n"); 375a5f0fb15SPaul Saab quit(QUIT_OK); 376a5f0fb15SPaul Saab break; 377a5f0fb15SPaul Saab } 378a5f0fb15SPaul Saab } 379a5f0fb15SPaul Saab 380a5f0fb15SPaul Saab #if MSDOS_COMPILER 381a5f0fb15SPaul Saab /* 382a5f0fb15SPaul Saab * Parse an MSDOS color descriptor. 383a5f0fb15SPaul Saab */ 384a5f0fb15SPaul Saab static void 385a5f0fb15SPaul Saab colordesc(s, fg_color, bg_color) 386a5f0fb15SPaul Saab char *s; 387a5f0fb15SPaul Saab int *fg_color; 388a5f0fb15SPaul Saab int *bg_color; 389a5f0fb15SPaul Saab { 390a5f0fb15SPaul Saab int fg, bg; 391a5f0fb15SPaul Saab int err; 392a5f0fb15SPaul Saab 393000ba3e8STim J. Robbins fg = getnum(&s, "D", &err); 394a5f0fb15SPaul Saab if (err) 395a5f0fb15SPaul Saab { 396a5f0fb15SPaul Saab error("Missing fg color in -D", NULL_PARG); 397a5f0fb15SPaul Saab return; 398a5f0fb15SPaul Saab } 399a5f0fb15SPaul Saab if (*s != '.') 400a5f0fb15SPaul Saab bg = 0; 401a5f0fb15SPaul Saab else 402a5f0fb15SPaul Saab { 403a5f0fb15SPaul Saab s++; 404000ba3e8STim J. Robbins bg = getnum(&s, "D", &err); 405a5f0fb15SPaul Saab if (err) 406a5f0fb15SPaul Saab { 407a5f0fb15SPaul Saab error("Missing fg color in -D", NULL_PARG); 408a5f0fb15SPaul Saab return; 409a5f0fb15SPaul Saab } 410a5f0fb15SPaul Saab } 411a5f0fb15SPaul Saab if (*s != '\0') 412a5f0fb15SPaul Saab error("Extra characters at end of -D option", NULL_PARG); 413a5f0fb15SPaul Saab *fg_color = fg; 414a5f0fb15SPaul Saab *bg_color = bg; 415a5f0fb15SPaul Saab } 416a5f0fb15SPaul Saab 417a5f0fb15SPaul Saab /* 418a5f0fb15SPaul Saab * Handler for the -D option. 419a5f0fb15SPaul Saab */ 420a5f0fb15SPaul Saab /*ARGSUSED*/ 421a5f0fb15SPaul Saab public void 422a5f0fb15SPaul Saab opt_D(type, s) 423a5f0fb15SPaul Saab int type; 424a5f0fb15SPaul Saab char *s; 425a5f0fb15SPaul Saab { 426a5f0fb15SPaul Saab switch (type) 427a5f0fb15SPaul Saab { 428a5f0fb15SPaul Saab case INIT: 429a5f0fb15SPaul Saab case TOGGLE: 430a5f0fb15SPaul Saab switch (*s++) 431a5f0fb15SPaul Saab { 432a5f0fb15SPaul Saab case 'n': 433a5f0fb15SPaul Saab colordesc(s, &nm_fg_color, &nm_bg_color); 434a5f0fb15SPaul Saab break; 435a5f0fb15SPaul Saab case 'd': 436a5f0fb15SPaul Saab colordesc(s, &bo_fg_color, &bo_bg_color); 437a5f0fb15SPaul Saab break; 438a5f0fb15SPaul Saab case 'u': 439a5f0fb15SPaul Saab colordesc(s, &ul_fg_color, &ul_bg_color); 440a5f0fb15SPaul Saab break; 441a5f0fb15SPaul Saab case 'k': 442a5f0fb15SPaul Saab colordesc(s, &bl_fg_color, &bl_bg_color); 443a5f0fb15SPaul Saab break; 444a5f0fb15SPaul Saab case 's': 445a5f0fb15SPaul Saab colordesc(s, &so_fg_color, &so_bg_color); 446a5f0fb15SPaul Saab break; 447a5f0fb15SPaul Saab default: 448a5f0fb15SPaul Saab error("-D must be followed by n, d, u, k or s", NULL_PARG); 449a5f0fb15SPaul Saab break; 450a5f0fb15SPaul Saab } 451a5f0fb15SPaul Saab if (type == TOGGLE) 452a5f0fb15SPaul Saab { 453a5f0fb15SPaul Saab so_enter(); 454a5f0fb15SPaul Saab so_exit(); 455a5f0fb15SPaul Saab } 456a5f0fb15SPaul Saab break; 457a5f0fb15SPaul Saab case QUERY: 458a5f0fb15SPaul Saab break; 459a5f0fb15SPaul Saab } 460a5f0fb15SPaul Saab } 461a5f0fb15SPaul Saab #endif 462a5f0fb15SPaul Saab 463a5f0fb15SPaul Saab /* 464c9346414SPaul Saab * Handler for the -x option. 465c9346414SPaul Saab */ 466c9346414SPaul Saab public void 467c9346414SPaul Saab opt_x(type, s) 468c9346414SPaul Saab int type; 469c9346414SPaul Saab register char *s; 470c9346414SPaul Saab { 471c9346414SPaul Saab extern int tabstops[]; 472c9346414SPaul Saab extern int ntabstops; 473c9346414SPaul Saab extern int tabdefault; 474c9346414SPaul Saab char msg[60+(4*TABSTOP_MAX)]; 475c9346414SPaul Saab int i; 476c9346414SPaul Saab PARG p; 477c9346414SPaul Saab 478c9346414SPaul Saab switch (type) 479c9346414SPaul Saab { 480c9346414SPaul Saab case INIT: 481c9346414SPaul Saab case TOGGLE: 482c9346414SPaul Saab /* Start at 1 because tabstops[0] is always zero. */ 483c9346414SPaul Saab for (i = 1; i < TABSTOP_MAX; ) 484c9346414SPaul Saab { 485c9346414SPaul Saab int n = 0; 486000ba3e8STim J. Robbins s = skipsp(s); 487c9346414SPaul Saab while (*s >= '0' && *s <= '9') 488c9346414SPaul Saab n = (10 * n) + (*s++ - '0'); 489c9346414SPaul Saab if (n > tabstops[i-1]) 490c9346414SPaul Saab tabstops[i++] = n; 491000ba3e8STim J. Robbins s = skipsp(s); 492c9346414SPaul Saab if (*s++ != ',') 493c9346414SPaul Saab break; 494c9346414SPaul Saab } 495c9346414SPaul Saab if (i < 2) 496c9346414SPaul Saab return; 497c9346414SPaul Saab ntabstops = i; 498c9346414SPaul Saab tabdefault = tabstops[ntabstops-1] - tabstops[ntabstops-2]; 499c9346414SPaul Saab break; 500c9346414SPaul Saab case QUERY: 501c9346414SPaul Saab strcpy(msg, "Tab stops "); 502c9346414SPaul Saab if (ntabstops > 2) 503c9346414SPaul Saab { 504c9346414SPaul Saab for (i = 1; i < ntabstops; i++) 505c9346414SPaul Saab { 506c9346414SPaul Saab if (i > 1) 507c9346414SPaul Saab strcat(msg, ","); 508c9346414SPaul Saab sprintf(msg+strlen(msg), "%d", tabstops[i]); 509c9346414SPaul Saab } 510c9346414SPaul Saab sprintf(msg+strlen(msg), " and then "); 511c9346414SPaul Saab } 512c9346414SPaul Saab sprintf(msg+strlen(msg), "every %d spaces", 513c9346414SPaul Saab tabdefault); 514c9346414SPaul Saab p.p_string = msg; 515c9346414SPaul Saab error("%s", &p); 516c9346414SPaul Saab break; 517c9346414SPaul Saab } 518c9346414SPaul Saab } 519c9346414SPaul Saab 520c9346414SPaul Saab 521c9346414SPaul Saab /* 522a5f0fb15SPaul Saab * Handler for the -" option. 523a5f0fb15SPaul Saab */ 524a5f0fb15SPaul Saab public void 525a5f0fb15SPaul Saab opt_quote(type, s) 526a5f0fb15SPaul Saab int type; 527a5f0fb15SPaul Saab register char *s; 528a5f0fb15SPaul Saab { 529a5f0fb15SPaul Saab char buf[3]; 530a5f0fb15SPaul Saab PARG parg; 531a5f0fb15SPaul Saab 532a5f0fb15SPaul Saab switch (type) 533a5f0fb15SPaul Saab { 534a5f0fb15SPaul Saab case INIT: 535a5f0fb15SPaul Saab case TOGGLE: 536000ba3e8STim J. Robbins if (s[0] == '\0') 537000ba3e8STim J. Robbins { 538000ba3e8STim J. Robbins openquote = closequote = '\0'; 539000ba3e8STim J. Robbins break; 540000ba3e8STim J. Robbins } 541a5f0fb15SPaul Saab if (s[1] != '\0' && s[2] != '\0') 542a5f0fb15SPaul Saab { 543a5f0fb15SPaul Saab error("-\" must be followed by 1 or 2 chars", NULL_PARG); 544a5f0fb15SPaul Saab return; 545a5f0fb15SPaul Saab } 546a5f0fb15SPaul Saab openquote = s[0]; 547a5f0fb15SPaul Saab if (s[1] == '\0') 548a5f0fb15SPaul Saab closequote = openquote; 549a5f0fb15SPaul Saab else 550a5f0fb15SPaul Saab closequote = s[1]; 551a5f0fb15SPaul Saab break; 552a5f0fb15SPaul Saab case QUERY: 553a5f0fb15SPaul Saab buf[0] = openquote; 554a5f0fb15SPaul Saab buf[1] = closequote; 555a5f0fb15SPaul Saab buf[2] = '\0'; 556a5f0fb15SPaul Saab parg.p_string = buf; 557a5f0fb15SPaul Saab error("quotes %s", &parg); 558a5f0fb15SPaul Saab break; 559a5f0fb15SPaul Saab } 560a5f0fb15SPaul Saab } 561a5f0fb15SPaul Saab 562a5f0fb15SPaul Saab /* 563a5f0fb15SPaul Saab * "-?" means display a help message. 564a5f0fb15SPaul Saab * If from the command line, exit immediately. 565a5f0fb15SPaul Saab */ 566a5f0fb15SPaul Saab /*ARGSUSED*/ 567a5f0fb15SPaul Saab public void 568a5f0fb15SPaul Saab opt_query(type, s) 569a5f0fb15SPaul Saab int type; 570a5f0fb15SPaul Saab char *s; 571a5f0fb15SPaul Saab { 572a5f0fb15SPaul Saab switch (type) 573a5f0fb15SPaul Saab { 574a5f0fb15SPaul Saab case QUERY: 575a5f0fb15SPaul Saab case TOGGLE: 576a5f0fb15SPaul Saab error("Use \"h\" for help", NULL_PARG); 577a5f0fb15SPaul Saab break; 578a5f0fb15SPaul Saab case INIT: 579a5f0fb15SPaul Saab dohelp = 1; 580a5f0fb15SPaul Saab } 581a5f0fb15SPaul Saab } 582a5f0fb15SPaul Saab 583a5f0fb15SPaul Saab /* 584a5f0fb15SPaul Saab * Get the "screen window" size. 585a5f0fb15SPaul Saab */ 586a5f0fb15SPaul Saab public int 587a5f0fb15SPaul Saab get_swindow() 588a5f0fb15SPaul Saab { 589a5f0fb15SPaul Saab if (swindow > 0) 590a5f0fb15SPaul Saab return (swindow); 591a5f0fb15SPaul Saab return (sc_height + swindow); 592a5f0fb15SPaul Saab } 593a5f0fb15SPaul Saab 594