1a5f0fb15SPaul Saab /* 27f074f9cSXin LI * Copyright (C) 1984-2007 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[]; 48efd72c2eSXin LI extern int jump_sline; 49efd72c2eSXin LI extern int jump_sline_fraction; 50efd72c2eSXin LI extern int less_is_more; 51a5f0fb15SPaul Saab #if LOGFILE 52a5f0fb15SPaul Saab extern char *namelogfile; 53a5f0fb15SPaul Saab extern int force_logfile; 54a5f0fb15SPaul Saab extern int logfile; 55a5f0fb15SPaul Saab #endif 56a5f0fb15SPaul Saab #if TAGS 57a5f0fb15SPaul Saab public char *tagoption = NULL; 58a5f0fb15SPaul Saab extern char *tags; 59a5f0fb15SPaul Saab #endif 60a5f0fb15SPaul Saab #if MSDOS_COMPILER 61a5f0fb15SPaul Saab extern int nm_fg_color, nm_bg_color; 62a5f0fb15SPaul Saab extern int bo_fg_color, bo_bg_color; 63a5f0fb15SPaul Saab extern int ul_fg_color, ul_bg_color; 64a5f0fb15SPaul Saab extern int so_fg_color, so_bg_color; 65a5f0fb15SPaul Saab extern int bl_fg_color, bl_bg_color; 66a5f0fb15SPaul Saab #endif 67a5f0fb15SPaul Saab 68a5f0fb15SPaul Saab 69a5f0fb15SPaul Saab #if LOGFILE 70a5f0fb15SPaul Saab /* 71a5f0fb15SPaul Saab * Handler for -o option. 72a5f0fb15SPaul Saab */ 73a5f0fb15SPaul Saab public void 74a5f0fb15SPaul Saab opt_o(type, s) 75a5f0fb15SPaul Saab int type; 76a5f0fb15SPaul Saab char *s; 77a5f0fb15SPaul Saab { 78a5f0fb15SPaul Saab PARG parg; 79a5f0fb15SPaul Saab 80a5f0fb15SPaul Saab if (secure) 81a5f0fb15SPaul Saab { 82a5f0fb15SPaul Saab error("log file support is not available", NULL_PARG); 83a5f0fb15SPaul Saab return; 84a5f0fb15SPaul Saab } 85a5f0fb15SPaul Saab switch (type) 86a5f0fb15SPaul Saab { 87a5f0fb15SPaul Saab case INIT: 88a5f0fb15SPaul Saab namelogfile = s; 89a5f0fb15SPaul Saab break; 90a5f0fb15SPaul Saab case TOGGLE: 91a5f0fb15SPaul Saab if (ch_getflags() & CH_CANSEEK) 92a5f0fb15SPaul Saab { 93a5f0fb15SPaul Saab error("Input is not a pipe", NULL_PARG); 94a5f0fb15SPaul Saab return; 95a5f0fb15SPaul Saab } 96a5f0fb15SPaul Saab if (logfile >= 0) 97a5f0fb15SPaul Saab { 98a5f0fb15SPaul Saab error("Log file is already in use", NULL_PARG); 99a5f0fb15SPaul Saab return; 100a5f0fb15SPaul Saab } 101a5f0fb15SPaul Saab s = skipsp(s); 102a5f0fb15SPaul Saab namelogfile = lglob(s); 103a5f0fb15SPaul Saab use_logfile(namelogfile); 104a5f0fb15SPaul Saab sync_logfile(); 105a5f0fb15SPaul Saab break; 106a5f0fb15SPaul Saab case QUERY: 107a5f0fb15SPaul Saab if (logfile < 0) 108a5f0fb15SPaul Saab error("No log file", NULL_PARG); 109a5f0fb15SPaul Saab else 110a5f0fb15SPaul Saab { 111000ba3e8STim J. Robbins parg.p_string = namelogfile; 112a5f0fb15SPaul Saab error("Log file \"%s\"", &parg); 113a5f0fb15SPaul Saab } 114a5f0fb15SPaul Saab break; 115a5f0fb15SPaul Saab } 116a5f0fb15SPaul Saab } 117a5f0fb15SPaul Saab 118a5f0fb15SPaul Saab /* 119a5f0fb15SPaul Saab * Handler for -O option. 120a5f0fb15SPaul Saab */ 121a5f0fb15SPaul Saab public void 122a5f0fb15SPaul Saab opt__O(type, s) 123a5f0fb15SPaul Saab int type; 124a5f0fb15SPaul Saab char *s; 125a5f0fb15SPaul Saab { 126a5f0fb15SPaul Saab force_logfile = TRUE; 127a5f0fb15SPaul Saab opt_o(type, s); 128a5f0fb15SPaul Saab } 129a5f0fb15SPaul Saab #endif 130a5f0fb15SPaul Saab 131a5f0fb15SPaul Saab /* 132a5f0fb15SPaul Saab * Handlers for -l option. 133a5f0fb15SPaul Saab */ 134a5f0fb15SPaul Saab public void 135a5f0fb15SPaul Saab opt_l(type, s) 136a5f0fb15SPaul Saab int type; 137a5f0fb15SPaul Saab char *s; 138a5f0fb15SPaul Saab { 139a5f0fb15SPaul Saab int err; 140a5f0fb15SPaul Saab int n; 141a5f0fb15SPaul Saab char *t; 142a5f0fb15SPaul Saab 143a5f0fb15SPaul Saab switch (type) 144a5f0fb15SPaul Saab { 145a5f0fb15SPaul Saab case INIT: 146a5f0fb15SPaul Saab t = s; 147000ba3e8STim J. Robbins n = getnum(&t, "l", &err); 148a5f0fb15SPaul Saab if (err || n <= 0) 149a5f0fb15SPaul Saab { 150a5f0fb15SPaul Saab error("Line number is required after -l", NULL_PARG); 151a5f0fb15SPaul Saab return; 152a5f0fb15SPaul Saab } 153a5f0fb15SPaul Saab plusoption = TRUE; 154a5f0fb15SPaul Saab ungetsc(s); 155a5f0fb15SPaul Saab break; 156a5f0fb15SPaul Saab } 157a5f0fb15SPaul Saab } 158a5f0fb15SPaul Saab 1597f074f9cSXin LI /* 1607f074f9cSXin LI * Handlers for -j option. 1617f074f9cSXin LI */ 1627f074f9cSXin LI public void 1637f074f9cSXin LI opt_j(type, s) 1647f074f9cSXin LI int type; 1657f074f9cSXin LI char *s; 1667f074f9cSXin LI { 1677f074f9cSXin LI PARG parg; 1687f074f9cSXin LI char buf[16]; 1697f074f9cSXin LI int len; 1707f074f9cSXin LI int err; 1717f074f9cSXin LI 1727f074f9cSXin LI switch (type) 1737f074f9cSXin LI { 1747f074f9cSXin LI case INIT: 1757f074f9cSXin LI case TOGGLE: 1767f074f9cSXin LI if (*s == '.') 1777f074f9cSXin LI { 1787f074f9cSXin LI s++; 1797f074f9cSXin LI jump_sline_fraction = getfraction(&s, "j", &err); 1807f074f9cSXin LI if (err) 1817f074f9cSXin LI error("Invalid line fraction", NULL_PARG); 1827f074f9cSXin LI else 1837f074f9cSXin LI calc_jump_sline(); 1847f074f9cSXin LI } else 1857f074f9cSXin LI { 1867f074f9cSXin LI int sline = getnum(&s, "j", &err); 1877f074f9cSXin LI if (err) 1887f074f9cSXin LI error("Invalid line number", NULL_PARG); 1897f074f9cSXin LI else 1907f074f9cSXin LI { 1917f074f9cSXin LI jump_sline = sline; 1927f074f9cSXin LI jump_sline_fraction = -1; 1937f074f9cSXin LI } 1947f074f9cSXin LI } 1957f074f9cSXin LI break; 1967f074f9cSXin LI case QUERY: 1977f074f9cSXin LI if (jump_sline_fraction < 0) 1987f074f9cSXin LI { 1997f074f9cSXin LI parg.p_int = jump_sline; 2007f074f9cSXin LI error("Position target at screen line %d", &parg); 2017f074f9cSXin LI } else 2027f074f9cSXin LI { 2037f074f9cSXin LI 2047f074f9cSXin LI sprintf(buf, ".%06d", jump_sline_fraction); 2057f074f9cSXin LI len = strlen(buf); 2067f074f9cSXin LI while (len > 2 && buf[len-1] == '0') 2077f074f9cSXin LI len--; 2087f074f9cSXin LI buf[len] = '\0'; 2097f074f9cSXin LI parg.p_string = buf; 2107f074f9cSXin LI error("Position target at screen position %s", &parg); 2117f074f9cSXin LI } 2127f074f9cSXin LI break; 2137f074f9cSXin LI } 2147f074f9cSXin LI } 2157f074f9cSXin LI 2167f074f9cSXin LI public void 2177f074f9cSXin LI calc_jump_sline() 2187f074f9cSXin LI { 2197f074f9cSXin LI if (jump_sline_fraction < 0) 2207f074f9cSXin LI return; 2217f074f9cSXin LI jump_sline = sc_height * jump_sline_fraction / NUM_FRAC_DENOM; 2227f074f9cSXin LI } 2237f074f9cSXin LI 224a5f0fb15SPaul Saab #if USERFILE 225a5f0fb15SPaul Saab public void 226a5f0fb15SPaul Saab opt_k(type, s) 227a5f0fb15SPaul Saab int type; 228a5f0fb15SPaul Saab char *s; 229a5f0fb15SPaul Saab { 230a5f0fb15SPaul Saab PARG parg; 231a5f0fb15SPaul Saab 232a5f0fb15SPaul Saab switch (type) 233a5f0fb15SPaul Saab { 234a5f0fb15SPaul Saab case INIT: 235a5f0fb15SPaul Saab if (lesskey(s, 0)) 236a5f0fb15SPaul Saab { 237000ba3e8STim J. Robbins parg.p_string = s; 238a5f0fb15SPaul Saab error("Cannot use lesskey file \"%s\"", &parg); 239a5f0fb15SPaul Saab } 240a5f0fb15SPaul Saab break; 241a5f0fb15SPaul Saab } 242a5f0fb15SPaul Saab } 243a5f0fb15SPaul Saab #endif 244a5f0fb15SPaul Saab 245a5f0fb15SPaul Saab #if TAGS 246a5f0fb15SPaul Saab /* 247a5f0fb15SPaul Saab * Handler for -t option. 248a5f0fb15SPaul Saab */ 249a5f0fb15SPaul Saab public void 250a5f0fb15SPaul Saab opt_t(type, s) 251a5f0fb15SPaul Saab int type; 252a5f0fb15SPaul Saab char *s; 253a5f0fb15SPaul Saab { 254a5f0fb15SPaul Saab IFILE save_ifile; 255a5f0fb15SPaul Saab POSITION pos; 256a5f0fb15SPaul Saab 257a5f0fb15SPaul Saab switch (type) 258a5f0fb15SPaul Saab { 259a5f0fb15SPaul Saab case INIT: 260a5f0fb15SPaul Saab tagoption = s; 261a5f0fb15SPaul Saab /* Do the rest in main() */ 262a5f0fb15SPaul Saab break; 263a5f0fb15SPaul Saab case TOGGLE: 264a5f0fb15SPaul Saab if (secure) 265a5f0fb15SPaul Saab { 266a5f0fb15SPaul Saab error("tags support is not available", NULL_PARG); 267a5f0fb15SPaul Saab break; 268a5f0fb15SPaul Saab } 269a5f0fb15SPaul Saab findtag(skipsp(s)); 270a5f0fb15SPaul Saab save_ifile = save_curr_ifile(); 2716dcb072bSXin LI /* 2726dcb072bSXin LI * Try to open the file containing the tag 2736dcb072bSXin LI * and search for the tag in that file. 2746dcb072bSXin LI */ 2756dcb072bSXin LI if (edit_tagfile() || (pos = tagsearch()) == NULL_POSITION) 276a5f0fb15SPaul Saab { 2776dcb072bSXin LI /* Failed: reopen the old file. */ 278a5f0fb15SPaul Saab reedit_ifile(save_ifile); 279a5f0fb15SPaul Saab break; 280a5f0fb15SPaul Saab } 281a5f0fb15SPaul Saab unsave_ifile(save_ifile); 282a5f0fb15SPaul Saab jump_loc(pos, jump_sline); 283a5f0fb15SPaul Saab break; 284a5f0fb15SPaul Saab } 285a5f0fb15SPaul Saab } 286a5f0fb15SPaul Saab 287a5f0fb15SPaul Saab /* 288a5f0fb15SPaul Saab * Handler for -T option. 289a5f0fb15SPaul Saab */ 290a5f0fb15SPaul Saab public void 291a5f0fb15SPaul Saab opt__T(type, s) 292a5f0fb15SPaul Saab int type; 293a5f0fb15SPaul Saab char *s; 294a5f0fb15SPaul Saab { 295a5f0fb15SPaul Saab PARG parg; 296a5f0fb15SPaul Saab 297a5f0fb15SPaul Saab switch (type) 298a5f0fb15SPaul Saab { 299a5f0fb15SPaul Saab case INIT: 300a5f0fb15SPaul Saab tags = s; 301a5f0fb15SPaul Saab break; 302a5f0fb15SPaul Saab case TOGGLE: 303a5f0fb15SPaul Saab s = skipsp(s); 304a5f0fb15SPaul Saab tags = lglob(s); 305a5f0fb15SPaul Saab break; 306a5f0fb15SPaul Saab case QUERY: 307000ba3e8STim J. Robbins parg.p_string = tags; 308a5f0fb15SPaul Saab error("Tags file \"%s\"", &parg); 309a5f0fb15SPaul Saab break; 310a5f0fb15SPaul Saab } 311a5f0fb15SPaul Saab } 312a5f0fb15SPaul Saab #endif 313a5f0fb15SPaul Saab 314a5f0fb15SPaul Saab /* 315a5f0fb15SPaul Saab * Handler for -p option. 316a5f0fb15SPaul Saab */ 317a5f0fb15SPaul Saab public void 318a5f0fb15SPaul Saab opt_p(type, s) 319a5f0fb15SPaul Saab int type; 320a5f0fb15SPaul Saab register char *s; 321a5f0fb15SPaul Saab { 322a5f0fb15SPaul Saab switch (type) 323a5f0fb15SPaul Saab { 324a5f0fb15SPaul Saab case INIT: 325a5f0fb15SPaul Saab /* 326a5f0fb15SPaul Saab * Unget a search command for the specified string. 327a5f0fb15SPaul Saab * {{ This won't work if the "/" command is 328a5f0fb15SPaul Saab * changed or invalidated by a .lesskey file. }} 329a5f0fb15SPaul Saab */ 330a5f0fb15SPaul Saab plusoption = TRUE; 331a5f0fb15SPaul Saab ungetsc(s); 3326dcb072bSXin LI /* 3336dcb072bSXin LI * In "more" mode, the -p argument is a command, 3346dcb072bSXin LI * not a search string, so we don't need a slash. 3356dcb072bSXin LI */ 3367f074f9cSXin LI if (!less_is_more) 337a5f0fb15SPaul Saab ungetsc("/"); 338a5f0fb15SPaul Saab break; 339a5f0fb15SPaul Saab } 340a5f0fb15SPaul Saab } 341a5f0fb15SPaul Saab 342a5f0fb15SPaul Saab /* 343a5f0fb15SPaul Saab * Handler for -P option. 344a5f0fb15SPaul Saab */ 345a5f0fb15SPaul Saab public void 346a5f0fb15SPaul Saab opt__P(type, s) 347a5f0fb15SPaul Saab int type; 348a5f0fb15SPaul Saab register char *s; 349a5f0fb15SPaul Saab { 350a5f0fb15SPaul Saab register char **proto; 351a5f0fb15SPaul Saab PARG parg; 352a5f0fb15SPaul Saab 353a5f0fb15SPaul Saab switch (type) 354a5f0fb15SPaul Saab { 355a5f0fb15SPaul Saab case INIT: 356a5f0fb15SPaul Saab case TOGGLE: 357a5f0fb15SPaul Saab /* 358a5f0fb15SPaul Saab * Figure out which prototype string should be changed. 359a5f0fb15SPaul Saab */ 360a5f0fb15SPaul Saab switch (*s) 361a5f0fb15SPaul Saab { 362a5f0fb15SPaul Saab case 's': proto = &prproto[PR_SHORT]; s++; break; 363a5f0fb15SPaul Saab case 'm': proto = &prproto[PR_MEDIUM]; s++; break; 364a5f0fb15SPaul Saab case 'M': proto = &prproto[PR_LONG]; s++; break; 365a5f0fb15SPaul Saab case '=': proto = &eqproto; s++; break; 366a5f0fb15SPaul Saab case 'h': proto = &hproto; s++; break; 367c9346414SPaul Saab case 'w': proto = &wproto; s++; break; 368a5f0fb15SPaul Saab default: proto = &prproto[PR_SHORT]; break; 369a5f0fb15SPaul Saab } 370a5f0fb15SPaul Saab free(*proto); 371a5f0fb15SPaul Saab *proto = save(s); 372a5f0fb15SPaul Saab break; 373a5f0fb15SPaul Saab case QUERY: 374a5f0fb15SPaul Saab parg.p_string = prproto[pr_type]; 375a5f0fb15SPaul Saab error("%s", &parg); 376a5f0fb15SPaul Saab break; 377a5f0fb15SPaul Saab } 378a5f0fb15SPaul Saab } 379a5f0fb15SPaul Saab 380a5f0fb15SPaul Saab /* 381a5f0fb15SPaul Saab * Handler for the -b option. 382a5f0fb15SPaul Saab */ 383a5f0fb15SPaul Saab /*ARGSUSED*/ 384a5f0fb15SPaul Saab public void 385a5f0fb15SPaul Saab opt_b(type, s) 386a5f0fb15SPaul Saab int type; 387a5f0fb15SPaul Saab char *s; 388a5f0fb15SPaul Saab { 389a5f0fb15SPaul Saab switch (type) 390a5f0fb15SPaul Saab { 391a5f0fb15SPaul Saab case INIT: 392000ba3e8STim J. Robbins case TOGGLE: 393000ba3e8STim J. Robbins /* 394000ba3e8STim J. Robbins * Set the new number of buffers. 395000ba3e8STim J. Robbins */ 396000ba3e8STim J. Robbins ch_setbufspace(bufspace); 397000ba3e8STim J. Robbins break; 398000ba3e8STim J. Robbins case QUERY: 399a5f0fb15SPaul Saab break; 400a5f0fb15SPaul Saab } 401a5f0fb15SPaul Saab } 402a5f0fb15SPaul Saab 403a5f0fb15SPaul Saab /* 404a5f0fb15SPaul Saab * Handler for the -i option. 405a5f0fb15SPaul Saab */ 406a5f0fb15SPaul Saab /*ARGSUSED*/ 407a5f0fb15SPaul Saab public void 408a5f0fb15SPaul Saab opt_i(type, s) 409a5f0fb15SPaul Saab int type; 410a5f0fb15SPaul Saab char *s; 411a5f0fb15SPaul Saab { 412a5f0fb15SPaul Saab switch (type) 413a5f0fb15SPaul Saab { 414a5f0fb15SPaul Saab case TOGGLE: 415a5f0fb15SPaul Saab chg_caseless(); 416a5f0fb15SPaul Saab break; 417a5f0fb15SPaul Saab case QUERY: 418a5f0fb15SPaul Saab case INIT: 419a5f0fb15SPaul Saab break; 420a5f0fb15SPaul Saab } 421a5f0fb15SPaul Saab } 422a5f0fb15SPaul Saab 423a5f0fb15SPaul Saab /* 424a5f0fb15SPaul Saab * Handler for the -V option. 425a5f0fb15SPaul Saab */ 426a5f0fb15SPaul Saab /*ARGSUSED*/ 427a5f0fb15SPaul Saab public void 428a5f0fb15SPaul Saab opt__V(type, s) 429a5f0fb15SPaul Saab int type; 430a5f0fb15SPaul Saab char *s; 431a5f0fb15SPaul Saab { 432a5f0fb15SPaul Saab switch (type) 433a5f0fb15SPaul Saab { 434a5f0fb15SPaul Saab case TOGGLE: 435a5f0fb15SPaul Saab case QUERY: 436a5f0fb15SPaul Saab dispversion(); 437a5f0fb15SPaul Saab break; 438a5f0fb15SPaul Saab case INIT: 439a5f0fb15SPaul Saab /* 440a5f0fb15SPaul Saab * Force output to stdout per GNU standard for --version output. 441a5f0fb15SPaul Saab */ 442a5f0fb15SPaul Saab any_display = 1; 443a5f0fb15SPaul Saab putstr("less "); 444a5f0fb15SPaul Saab putstr(version); 4456dcb072bSXin LI putstr("\nCopyright (C) 1984-2005 Mark Nudelman\n\n"); 446a5f0fb15SPaul Saab putstr("less comes with NO WARRANTY, to the extent permitted by law.\n"); 447a5f0fb15SPaul Saab putstr("For information about the terms of redistribution,\n"); 448a5f0fb15SPaul Saab putstr("see the file named README in the less distribution.\n"); 449c9346414SPaul Saab putstr("Homepage: http://www.greenwoodsoftware.com/less\n"); 450a5f0fb15SPaul Saab quit(QUIT_OK); 451a5f0fb15SPaul Saab break; 452a5f0fb15SPaul Saab } 453a5f0fb15SPaul Saab } 454a5f0fb15SPaul Saab 455a5f0fb15SPaul Saab #if MSDOS_COMPILER 456a5f0fb15SPaul Saab /* 457a5f0fb15SPaul Saab * Parse an MSDOS color descriptor. 458a5f0fb15SPaul Saab */ 459a5f0fb15SPaul Saab static void 460a5f0fb15SPaul Saab colordesc(s, fg_color, bg_color) 461a5f0fb15SPaul Saab char *s; 462a5f0fb15SPaul Saab int *fg_color; 463a5f0fb15SPaul Saab int *bg_color; 464a5f0fb15SPaul Saab { 465a5f0fb15SPaul Saab int fg, bg; 466a5f0fb15SPaul Saab int err; 467a5f0fb15SPaul Saab 468000ba3e8STim J. Robbins fg = getnum(&s, "D", &err); 469a5f0fb15SPaul Saab if (err) 470a5f0fb15SPaul Saab { 471a5f0fb15SPaul Saab error("Missing fg color in -D", NULL_PARG); 472a5f0fb15SPaul Saab return; 473a5f0fb15SPaul Saab } 474a5f0fb15SPaul Saab if (*s != '.') 475a5f0fb15SPaul Saab bg = 0; 476a5f0fb15SPaul Saab else 477a5f0fb15SPaul Saab { 478a5f0fb15SPaul Saab s++; 479000ba3e8STim J. Robbins bg = getnum(&s, "D", &err); 480a5f0fb15SPaul Saab if (err) 481a5f0fb15SPaul Saab { 482a5f0fb15SPaul Saab error("Missing fg color in -D", NULL_PARG); 483a5f0fb15SPaul Saab return; 484a5f0fb15SPaul Saab } 485a5f0fb15SPaul Saab } 486a5f0fb15SPaul Saab if (*s != '\0') 487a5f0fb15SPaul Saab error("Extra characters at end of -D option", NULL_PARG); 488a5f0fb15SPaul Saab *fg_color = fg; 489a5f0fb15SPaul Saab *bg_color = bg; 490a5f0fb15SPaul Saab } 491a5f0fb15SPaul Saab 492a5f0fb15SPaul Saab /* 493a5f0fb15SPaul Saab * Handler for the -D option. 494a5f0fb15SPaul Saab */ 495a5f0fb15SPaul Saab /*ARGSUSED*/ 496a5f0fb15SPaul Saab public void 497a5f0fb15SPaul Saab opt_D(type, s) 498a5f0fb15SPaul Saab int type; 499a5f0fb15SPaul Saab char *s; 500a5f0fb15SPaul Saab { 501a5f0fb15SPaul Saab switch (type) 502a5f0fb15SPaul Saab { 503a5f0fb15SPaul Saab case INIT: 504a5f0fb15SPaul Saab case TOGGLE: 505a5f0fb15SPaul Saab switch (*s++) 506a5f0fb15SPaul Saab { 507a5f0fb15SPaul Saab case 'n': 508a5f0fb15SPaul Saab colordesc(s, &nm_fg_color, &nm_bg_color); 509a5f0fb15SPaul Saab break; 510a5f0fb15SPaul Saab case 'd': 511a5f0fb15SPaul Saab colordesc(s, &bo_fg_color, &bo_bg_color); 512a5f0fb15SPaul Saab break; 513a5f0fb15SPaul Saab case 'u': 514a5f0fb15SPaul Saab colordesc(s, &ul_fg_color, &ul_bg_color); 515a5f0fb15SPaul Saab break; 516a5f0fb15SPaul Saab case 'k': 517a5f0fb15SPaul Saab colordesc(s, &bl_fg_color, &bl_bg_color); 518a5f0fb15SPaul Saab break; 519a5f0fb15SPaul Saab case 's': 520a5f0fb15SPaul Saab colordesc(s, &so_fg_color, &so_bg_color); 521a5f0fb15SPaul Saab break; 522a5f0fb15SPaul Saab default: 523a5f0fb15SPaul Saab error("-D must be followed by n, d, u, k or s", NULL_PARG); 524a5f0fb15SPaul Saab break; 525a5f0fb15SPaul Saab } 526a5f0fb15SPaul Saab if (type == TOGGLE) 527a5f0fb15SPaul Saab { 5286dcb072bSXin LI at_enter(AT_STANDOUT); 5296dcb072bSXin LI at_exit(); 530a5f0fb15SPaul Saab } 531a5f0fb15SPaul Saab break; 532a5f0fb15SPaul Saab case QUERY: 533a5f0fb15SPaul Saab break; 534a5f0fb15SPaul Saab } 535a5f0fb15SPaul Saab } 536a5f0fb15SPaul Saab #endif 537a5f0fb15SPaul Saab 538a5f0fb15SPaul Saab /* 539c9346414SPaul Saab * Handler for the -x option. 540c9346414SPaul Saab */ 541c9346414SPaul Saab public void 542c9346414SPaul Saab opt_x(type, s) 543c9346414SPaul Saab int type; 544c9346414SPaul Saab register char *s; 545c9346414SPaul Saab { 546c9346414SPaul Saab extern int tabstops[]; 547c9346414SPaul Saab extern int ntabstops; 548c9346414SPaul Saab extern int tabdefault; 549c9346414SPaul Saab char msg[60+(4*TABSTOP_MAX)]; 550c9346414SPaul Saab int i; 551c9346414SPaul Saab PARG p; 552c9346414SPaul Saab 553c9346414SPaul Saab switch (type) 554c9346414SPaul Saab { 555c9346414SPaul Saab case INIT: 556c9346414SPaul Saab case TOGGLE: 557c9346414SPaul Saab /* Start at 1 because tabstops[0] is always zero. */ 558c9346414SPaul Saab for (i = 1; i < TABSTOP_MAX; ) 559c9346414SPaul Saab { 560c9346414SPaul Saab int n = 0; 561000ba3e8STim J. Robbins s = skipsp(s); 562c9346414SPaul Saab while (*s >= '0' && *s <= '9') 563c9346414SPaul Saab n = (10 * n) + (*s++ - '0'); 564c9346414SPaul Saab if (n > tabstops[i-1]) 565c9346414SPaul Saab tabstops[i++] = n; 566000ba3e8STim J. Robbins s = skipsp(s); 567c9346414SPaul Saab if (*s++ != ',') 568c9346414SPaul Saab break; 569c9346414SPaul Saab } 570c9346414SPaul Saab if (i < 2) 571c9346414SPaul Saab return; 572c9346414SPaul Saab ntabstops = i; 573c9346414SPaul Saab tabdefault = tabstops[ntabstops-1] - tabstops[ntabstops-2]; 574c9346414SPaul Saab break; 575c9346414SPaul Saab case QUERY: 576c9346414SPaul Saab strcpy(msg, "Tab stops "); 577c9346414SPaul Saab if (ntabstops > 2) 578c9346414SPaul Saab { 579c9346414SPaul Saab for (i = 1; i < ntabstops; i++) 580c9346414SPaul Saab { 581c9346414SPaul Saab if (i > 1) 582c9346414SPaul Saab strcat(msg, ","); 583c9346414SPaul Saab sprintf(msg+strlen(msg), "%d", tabstops[i]); 584c9346414SPaul Saab } 585c9346414SPaul Saab sprintf(msg+strlen(msg), " and then "); 586c9346414SPaul Saab } 587c9346414SPaul Saab sprintf(msg+strlen(msg), "every %d spaces", 588c9346414SPaul Saab tabdefault); 589c9346414SPaul Saab p.p_string = msg; 590c9346414SPaul Saab error("%s", &p); 591c9346414SPaul Saab break; 592c9346414SPaul Saab } 593c9346414SPaul Saab } 594c9346414SPaul Saab 595c9346414SPaul Saab 596c9346414SPaul Saab /* 597a5f0fb15SPaul Saab * Handler for the -" option. 598a5f0fb15SPaul Saab */ 599a5f0fb15SPaul Saab public void 600a5f0fb15SPaul Saab opt_quote(type, s) 601a5f0fb15SPaul Saab int type; 602a5f0fb15SPaul Saab register char *s; 603a5f0fb15SPaul Saab { 604a5f0fb15SPaul Saab char buf[3]; 605a5f0fb15SPaul Saab PARG parg; 606a5f0fb15SPaul Saab 607a5f0fb15SPaul Saab switch (type) 608a5f0fb15SPaul Saab { 609a5f0fb15SPaul Saab case INIT: 610a5f0fb15SPaul Saab case TOGGLE: 611000ba3e8STim J. Robbins if (s[0] == '\0') 612000ba3e8STim J. Robbins { 613000ba3e8STim J. Robbins openquote = closequote = '\0'; 614000ba3e8STim J. Robbins break; 615000ba3e8STim J. Robbins } 616a5f0fb15SPaul Saab if (s[1] != '\0' && s[2] != '\0') 617a5f0fb15SPaul Saab { 618a5f0fb15SPaul Saab error("-\" must be followed by 1 or 2 chars", NULL_PARG); 619a5f0fb15SPaul Saab return; 620a5f0fb15SPaul Saab } 621a5f0fb15SPaul Saab openquote = s[0]; 622a5f0fb15SPaul Saab if (s[1] == '\0') 623a5f0fb15SPaul Saab closequote = openquote; 624a5f0fb15SPaul Saab else 625a5f0fb15SPaul Saab closequote = s[1]; 626a5f0fb15SPaul Saab break; 627a5f0fb15SPaul Saab case QUERY: 628a5f0fb15SPaul Saab buf[0] = openquote; 629a5f0fb15SPaul Saab buf[1] = closequote; 630a5f0fb15SPaul Saab buf[2] = '\0'; 631a5f0fb15SPaul Saab parg.p_string = buf; 632a5f0fb15SPaul Saab error("quotes %s", &parg); 633a5f0fb15SPaul Saab break; 634a5f0fb15SPaul Saab } 635a5f0fb15SPaul Saab } 636a5f0fb15SPaul Saab 637a5f0fb15SPaul Saab /* 638a5f0fb15SPaul Saab * "-?" means display a help message. 639a5f0fb15SPaul Saab * If from the command line, exit immediately. 640a5f0fb15SPaul Saab */ 641a5f0fb15SPaul Saab /*ARGSUSED*/ 642a5f0fb15SPaul Saab public void 643a5f0fb15SPaul Saab opt_query(type, s) 644a5f0fb15SPaul Saab int type; 645a5f0fb15SPaul Saab char *s; 646a5f0fb15SPaul Saab { 647a5f0fb15SPaul Saab switch (type) 648a5f0fb15SPaul Saab { 649a5f0fb15SPaul Saab case QUERY: 650a5f0fb15SPaul Saab case TOGGLE: 651a5f0fb15SPaul Saab error("Use \"h\" for help", NULL_PARG); 652a5f0fb15SPaul Saab break; 653a5f0fb15SPaul Saab case INIT: 654a5f0fb15SPaul Saab dohelp = 1; 655a5f0fb15SPaul Saab } 656a5f0fb15SPaul Saab } 657a5f0fb15SPaul Saab 658a5f0fb15SPaul Saab /* 659a5f0fb15SPaul Saab * Get the "screen window" size. 660a5f0fb15SPaul Saab */ 661a5f0fb15SPaul Saab public int 662a5f0fb15SPaul Saab get_swindow() 663a5f0fb15SPaul Saab { 664a5f0fb15SPaul Saab if (swindow > 0) 665a5f0fb15SPaul Saab return (swindow); 666a5f0fb15SPaul Saab return (sc_height + swindow); 667a5f0fb15SPaul Saab } 668a5f0fb15SPaul Saab 669