1a5f0fb15SPaul Saab /* 2*c77c4889SXin LI * Copyright (C) 1984-2024 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 * 796e55cc7SXin LI * For more information, see the README file. 8a5f0fb15SPaul Saab */ 9a5f0fb15SPaul Saab 10a5f0fb15SPaul Saab 11a5f0fb15SPaul Saab /* 12a5f0fb15SPaul Saab * The option table. 13a5f0fb15SPaul Saab */ 14a5f0fb15SPaul Saab 15a5f0fb15SPaul Saab #include "less.h" 16a5f0fb15SPaul Saab #include "option.h" 17a5f0fb15SPaul Saab 18a5f0fb15SPaul Saab /* 19a5f0fb15SPaul Saab * Variables controlled by command line options. 20a5f0fb15SPaul Saab */ 21a5f0fb15SPaul Saab public int quiet; /* Should we suppress the audible bell? */ 22d713e089SXin LI public int no_vbell; /* Should we suppress the visual bell? */ 23a5f0fb15SPaul Saab public int how_search; /* Where should forward searches start? */ 24a5f0fb15SPaul Saab public int top_scroll; /* Repaint screen from top? 25a5f0fb15SPaul Saab (alternative is scroll from bottom) */ 26a5f0fb15SPaul Saab public int pr_type; /* Type of prompt (short, medium, long) */ 27a5f0fb15SPaul Saab public int bs_mode; /* How to process backspaces */ 28a5f0fb15SPaul Saab public int know_dumb; /* Don't complain about dumb terminals */ 29a5f0fb15SPaul Saab public int quit_at_eof; /* Quit after hitting end of file twice */ 30a5f0fb15SPaul Saab public int quit_if_one_screen; /* Quit if EOF on first screen */ 31a5f0fb15SPaul Saab public int squeeze; /* Squeeze multiple blank lines into one */ 32a5f0fb15SPaul Saab public int tabstop; /* Tab settings */ 33a5f0fb15SPaul Saab public int back_scroll; /* Repaint screen on backwards movement */ 34a5f0fb15SPaul Saab public int forw_scroll; /* Repaint screen on forward movement */ 35a5f0fb15SPaul Saab public int caseless; /* Do "caseless" searches */ 36a5f0fb15SPaul Saab public int linenums; /* Use line numbers */ 37a5f0fb15SPaul Saab public int autobuf; /* Automatically allocate buffers as needed */ 38000ba3e8STim J. Robbins public int bufspace; /* Max buffer space per file (K) */ 39a5f0fb15SPaul Saab public int ctldisp; /* Send control chars to screen untranslated */ 40a5f0fb15SPaul Saab public int force_open; /* Open the file even if not regular file */ 41a5f0fb15SPaul Saab public int swindow; /* Size of scrolling window */ 42a5f0fb15SPaul Saab public int jump_sline; /* Screen line of "jump target" */ 437f074f9cSXin LI public long jump_sline_fraction = -1; 44*c77c4889SXin LI public int shift_count; /* Number of positions to shift horizontally */ 45f0be0a1fSXin LI public long shift_count_fraction = -1; 46a5f0fb15SPaul Saab public int chopline; /* Truncate displayed lines at screen width */ 47d713e089SXin LI public int wordwrap; /* Wrap lines at space */ 48a5f0fb15SPaul Saab public int no_init; /* Disable sending ti/te termcap strings */ 49c9346414SPaul Saab public int no_keypad; /* Disable sending ks/ke termcap strings */ 50a5f0fb15SPaul Saab public int twiddle; /* Show tildes after EOF */ 51a5f0fb15SPaul Saab public int show_attn; /* Hilite first unread line */ 528ed69c6fSPaul Saab public int status_col; /* Display a status column */ 53000ba3e8STim J. Robbins public int use_lessopen; /* Use the LESSOPEN filter */ 546dcb072bSXin LI public int quit_on_intr; /* Quit on interrupt */ 55464501a8SXin LI public int follow_mode; /* F cmd Follows file desc or file name? */ 56464501a8SXin LI public int oldbot; /* Old bottom of screen behavior {{REMOVE}} */ 577bd2567cSXin LI public int opt_use_backslash; /* Use backslash escaping in option parsing */ 58*c77c4889SXin LI public LWCHAR rscroll_char; /* Char which marks chopped lines with -S */ 59b2ea2440SXin LI public int rscroll_attr; /* Attribute of rscroll_char */ 60b7780dbeSXin LI public int no_hist_dups; /* Remove dups from history list */ 61b7780dbeSXin LI public int mousecap; /* Allow mouse for scrolling */ 62b7780dbeSXin LI public int wheel_lines; /* Number of lines to scroll on mouse wheel scroll */ 63b7780dbeSXin LI public int perma_marks; /* Save marks in history file */ 642235c7feSXin LI public int linenum_width; /* Width of line numbers */ 652235c7feSXin LI public int status_col_width; /* Width of status column */ 662235c7feSXin LI public int incr_search; /* Incremental search */ 672235c7feSXin LI public int use_color; /* Use UI color */ 6895270f73SXin LI public int want_filesize; /* Scan to EOF if necessary to get file size */ 6995270f73SXin LI public int status_line; /* Highlight entire marked lines */ 7095270f73SXin LI public int header_lines; /* Freeze header lines at top of screen */ 7195270f73SXin LI public int header_cols; /* Freeze header columns at left of screen */ 7295270f73SXin LI public int nonum_headers; /* Don't give headers line numbers */ 73*c77c4889SXin LI public int nosearch_header_lines = 0; /* Don't search in header lines */ 74*c77c4889SXin LI public int nosearch_header_cols = 0; /* Don't search in header columns */ 7595270f73SXin LI public int redraw_on_quit; /* Redraw last screen after term deinit */ 7695270f73SXin LI public int def_search_type; /* */ 7795270f73SXin LI public int exit_F_on_close; /* Exit F command when input closes */ 78d713e089SXin LI public int modelines; /* Lines to read looking for modelines */ 79d713e089SXin LI public int show_preproc_error; /* Display msg when preproc exits with error */ 80d713e089SXin LI public int proc_backspace; /* Special handling of backspace */ 81d713e089SXin LI public int proc_tab; /* Special handling of tab */ 82d713e089SXin LI public int proc_return; /* Special handling of carriage return */ 83*c77c4889SXin LI public int match_shift; /* Extra horizontal shift on search match */ 84*c77c4889SXin LI public long match_shift_fraction = NUM_FRAC_DENOM/2; /* 1/2 of screen width */ 85d713e089SXin LI public char intr_char = CONTROL('X'); /* Char to interrupt reads */ 86a5f0fb15SPaul Saab #if HILITE_SEARCH 87a5f0fb15SPaul Saab public int hilite_search; /* Highlight matched search patterns? */ 88a5f0fb15SPaul Saab #endif 89a5f0fb15SPaul Saab 906dcb072bSXin LI public int less_is_more = 0; /* Make compatible with POSIX more */ 916dcb072bSXin LI 92a5f0fb15SPaul Saab /* 93a5f0fb15SPaul Saab * Long option names. 94a5f0fb15SPaul Saab */ 95a5f0fb15SPaul Saab static struct optname a_optname = { "search-skip-screen", NULL }; 96a5f0fb15SPaul Saab static struct optname b_optname = { "buffers", NULL }; 97a5f0fb15SPaul Saab static struct optname B__optname = { "auto-buffers", NULL }; 98a5f0fb15SPaul Saab static struct optname c_optname = { "clear-screen", NULL }; 99a5f0fb15SPaul Saab static struct optname d_optname = { "dumb", NULL }; 100a5f0fb15SPaul Saab static struct optname D__optname = { "color", NULL }; 101a5f0fb15SPaul Saab static struct optname e_optname = { "quit-at-eof", NULL }; 102a5f0fb15SPaul Saab static struct optname f_optname = { "force", NULL }; 103a5f0fb15SPaul Saab static struct optname F__optname = { "quit-if-one-screen", NULL }; 104a5f0fb15SPaul Saab #if HILITE_SEARCH 105a5f0fb15SPaul Saab static struct optname g_optname = { "hilite-search", NULL }; 106a5f0fb15SPaul Saab #endif 107a5f0fb15SPaul Saab static struct optname h_optname = { "max-back-scroll", NULL }; 108a5f0fb15SPaul Saab static struct optname i_optname = { "ignore-case", NULL }; 109a5f0fb15SPaul Saab static struct optname j_optname = { "jump-target", NULL }; 1108ed69c6fSPaul Saab static struct optname J__optname = { "status-column", NULL }; 111a5f0fb15SPaul Saab #if USERFILE 112a5f0fb15SPaul Saab static struct optname k_optname = { "lesskey-file", NULL }; 11330a1828cSXin LI #if HAVE_LESSKEYSRC 11430a1828cSXin LI static struct optname ks_optname = { "lesskey-src", NULL }; 115*c77c4889SXin LI static struct optname kc_optname = { "lesskey-content", NULL }; 11630a1828cSXin LI #endif /* HAVE_LESSKEYSRC */ 117a5f0fb15SPaul Saab #endif 1186dcb072bSXin LI static struct optname K__optname = { "quit-on-intr", NULL }; 119000ba3e8STim J. Robbins static struct optname L__optname = { "no-lessopen", NULL }; 120a5f0fb15SPaul Saab static struct optname m_optname = { "long-prompt", NULL }; 121a5f0fb15SPaul Saab static struct optname n_optname = { "line-numbers", NULL }; 122a5f0fb15SPaul Saab #if LOGFILE 123a5f0fb15SPaul Saab static struct optname o_optname = { "log-file", NULL }; 124a5f0fb15SPaul Saab static struct optname O__optname = { "LOG-FILE", NULL }; 125a5f0fb15SPaul Saab #endif 126a5f0fb15SPaul Saab static struct optname p_optname = { "pattern", NULL }; 127a5f0fb15SPaul Saab static struct optname P__optname = { "prompt", NULL }; 128a5f0fb15SPaul Saab static struct optname q2_optname = { "silent", NULL }; 129a5f0fb15SPaul Saab static struct optname q_optname = { "quiet", &q2_optname }; 130a5f0fb15SPaul Saab static struct optname r_optname = { "raw-control-chars", NULL }; 131a5f0fb15SPaul Saab static struct optname s_optname = { "squeeze-blank-lines", NULL }; 132a5f0fb15SPaul Saab static struct optname S__optname = { "chop-long-lines", NULL }; 133a5f0fb15SPaul Saab #if TAGS 134a5f0fb15SPaul Saab static struct optname t_optname = { "tag", NULL }; 135a5f0fb15SPaul Saab static struct optname T__optname = { "tag-file", NULL }; 136a5f0fb15SPaul Saab #endif 137a5f0fb15SPaul Saab static struct optname u_optname = { "underline-special", NULL }; 138a5f0fb15SPaul Saab static struct optname V__optname = { "version", NULL }; 139a5f0fb15SPaul Saab static struct optname w_optname = { "hilite-unread", NULL }; 140a5f0fb15SPaul Saab static struct optname x_optname = { "tabs", NULL }; 141a5f0fb15SPaul Saab static struct optname X__optname = { "no-init", NULL }; 142a5f0fb15SPaul Saab static struct optname y_optname = { "max-forw-scroll", NULL }; 143a5f0fb15SPaul Saab static struct optname z_optname = { "window", NULL }; 144a5f0fb15SPaul Saab static struct optname quote_optname = { "quotes", NULL }; 145a5f0fb15SPaul Saab static struct optname tilde_optname = { "tilde", NULL }; 146a5f0fb15SPaul Saab static struct optname query_optname = { "help", NULL }; 1478ed69c6fSPaul Saab static struct optname pound_optname = { "shift", NULL }; 148c9346414SPaul Saab static struct optname keypad_optname = { "no-keypad", NULL }; 1497f074f9cSXin LI static struct optname oldbot_optname = { "old-bot", NULL }; 150464501a8SXin LI static struct optname follow_optname = { "follow-name", NULL }; 1517bd2567cSXin LI static struct optname use_backslash_optname = { "use-backslash", NULL }; 152b2ea2440SXin LI static struct optname rscroll_optname = { "rscroll", NULL }; 153b7780dbeSXin LI static struct optname nohistdups_optname = { "no-histdups", NULL }; 154b7780dbeSXin LI static struct optname mousecap_optname = { "mouse", NULL }; 155b7780dbeSXin LI static struct optname wheel_lines_optname = { "wheel-lines", NULL }; 156b7780dbeSXin LI static struct optname perma_marks_optname = { "save-marks", NULL }; 1572235c7feSXin LI static struct optname linenum_width_optname = { "line-num-width", NULL }; 1582235c7feSXin LI static struct optname status_col_width_optname = { "status-col-width", NULL }; 1592235c7feSXin LI static struct optname incr_search_optname = { "incsearch", NULL }; 1602235c7feSXin LI static struct optname use_color_optname = { "use-color", NULL }; 16130a1828cSXin LI static struct optname want_filesize_optname = { "file-size", NULL }; 16295270f73SXin LI static struct optname status_line_optname = { "status-line", NULL }; 16395270f73SXin LI static struct optname header_optname = { "header", NULL }; 16495270f73SXin LI static struct optname nonum_headers_optname = { "no-number-headers", NULL }; 165d713e089SXin LI static struct optname nosearch_headers_optname = { "no-search-headers", NULL }; 166*c77c4889SXin LI static struct optname nosearch_header_lines_optname = { "no-search-header-lines", NULL }; 167*c77c4889SXin LI static struct optname nosearch_header_cols_optname = { "no-search-header-columns", NULL }; 16895270f73SXin LI static struct optname redraw_on_quit_optname = { "redraw-on-quit", NULL }; 16995270f73SXin LI static struct optname search_type_optname = { "search-options", NULL }; 17095270f73SXin LI static struct optname exit_F_on_close_optname = { "exit-follow-on-close", NULL }; 171d713e089SXin LI static struct optname modelines_optname = { "modelines", NULL }; 172d713e089SXin LI static struct optname no_vbell_optname = { "no-vbell", NULL }; 173d713e089SXin LI static struct optname intr_optname = { "intr", NULL }; 174d713e089SXin LI static struct optname wordwrap_optname = { "wordwrap", NULL }; 175d713e089SXin LI static struct optname show_preproc_error_optname = { "show-preproc-errors", NULL }; 176d713e089SXin LI static struct optname proc_backspace_optname = { "proc-backspace", NULL }; 177d713e089SXin LI static struct optname proc_tab_optname = { "proc-tab", NULL }; 178d713e089SXin LI static struct optname proc_return_optname = { "proc-return", NULL }; 179*c77c4889SXin LI static struct optname match_shift_optname = { "match-shift", NULL }; 1802235c7feSXin LI #if LESSTEST 1812235c7feSXin LI static struct optname ttyin_name_optname = { "tty", NULL }; 1822235c7feSXin LI #endif /*LESSTEST*/ 183a5f0fb15SPaul Saab 184a5f0fb15SPaul Saab 185a5f0fb15SPaul Saab /* 186a5f0fb15SPaul Saab * Table of all options and their semantics. 187c9346414SPaul Saab * 188c9346414SPaul Saab * For BOOL and TRIPLE options, odesc[0], odesc[1], odesc[2] are 189c9346414SPaul Saab * the description of the option when set to 0, 1 or 2, respectively. 190c9346414SPaul Saab * For NUMBER options, odesc[0] is the prompt to use when entering 191c9346414SPaul Saab * a new value, and odesc[1] is the description, which should contain 192c9346414SPaul Saab * one %d which is replaced by the value of the number. 193c9346414SPaul Saab * For STRING options, odesc[0] is the prompt to use when entering 194c9346414SPaul Saab * a new value, and odesc[1], if not NULL, is the set of characters 195c9346414SPaul Saab * that are valid in the string. 196a5f0fb15SPaul Saab */ 197000ba3e8STim J. Robbins static struct loption option[] = 198a5f0fb15SPaul Saab { 199a5f0fb15SPaul Saab { 'a', &a_optname, 20033096f16SXin LI TRIPLE, OPT_ONPLUS, &how_search, NULL, 201000ba3e8STim J. Robbins { 202a5f0fb15SPaul Saab "Search includes displayed screen", 203a5f0fb15SPaul Saab "Search skips displayed screen", 20433096f16SXin LI "Search includes all of displayed screen" 205000ba3e8STim J. Robbins } 206a5f0fb15SPaul Saab }, 207a5f0fb15SPaul Saab 208a5f0fb15SPaul Saab { 'b', &b_optname, 209000ba3e8STim J. Robbins NUMBER|INIT_HANDLER, 64, &bufspace, opt_b, 210000ba3e8STim J. Robbins { 211000ba3e8STim J. Robbins "Max buffer space per file (K): ", 212000ba3e8STim J. Robbins "Max buffer space per file: %dK", 213a5f0fb15SPaul Saab NULL 214000ba3e8STim J. Robbins } 215a5f0fb15SPaul Saab }, 216a5f0fb15SPaul Saab { 'B', &B__optname, 217a5f0fb15SPaul Saab BOOL, OPT_ON, &autobuf, NULL, 218000ba3e8STim J. Robbins { 219a5f0fb15SPaul Saab "Don't automatically allocate buffers", 220a5f0fb15SPaul Saab "Automatically allocate buffers when needed", 221a5f0fb15SPaul Saab NULL 222000ba3e8STim J. Robbins } 223a5f0fb15SPaul Saab }, 224a5f0fb15SPaul Saab { 'c', &c_optname, 225a5f0fb15SPaul Saab TRIPLE, OPT_OFF, &top_scroll, NULL, 226000ba3e8STim J. Robbins { 227a5f0fb15SPaul Saab "Repaint by scrolling from bottom of screen", 2287f074f9cSXin LI "Repaint by painting from top of screen", 229a5f0fb15SPaul Saab "Repaint by painting from top of screen" 230000ba3e8STim J. Robbins } 231a5f0fb15SPaul Saab }, 232a5f0fb15SPaul Saab { 'd', &d_optname, 233a5f0fb15SPaul Saab BOOL|NO_TOGGLE, OPT_OFF, &know_dumb, NULL, 234000ba3e8STim J. Robbins { 235a5f0fb15SPaul Saab "Assume intelligent terminal", 236a5f0fb15SPaul Saab "Assume dumb terminal", 237a5f0fb15SPaul Saab NULL 238000ba3e8STim J. Robbins } 239a5f0fb15SPaul Saab }, 240a5f0fb15SPaul Saab { 'D', &D__optname, 2412235c7feSXin LI STRING|REPAINT|NO_QUERY, 0, NULL, opt_D, 242*c77c4889SXin LI { "color desc: ", "s", NULL } 243a5f0fb15SPaul Saab }, 244a5f0fb15SPaul Saab { 'e', &e_optname, 245a5f0fb15SPaul Saab TRIPLE, OPT_OFF, &quit_at_eof, NULL, 246000ba3e8STim J. Robbins { 247a5f0fb15SPaul Saab "Don't quit at end-of-file", 248a5f0fb15SPaul Saab "Quit at end-of-file", 249a5f0fb15SPaul Saab "Quit immediately at end-of-file" 250000ba3e8STim J. Robbins } 251a5f0fb15SPaul Saab }, 252a5f0fb15SPaul Saab { 'f', &f_optname, 253a5f0fb15SPaul Saab BOOL, OPT_OFF, &force_open, NULL, 254000ba3e8STim J. Robbins { 255a5f0fb15SPaul Saab "Open only regular files", 256a5f0fb15SPaul Saab "Open even non-regular files", 257a5f0fb15SPaul Saab NULL 258000ba3e8STim J. Robbins } 259a5f0fb15SPaul Saab }, 260a5f0fb15SPaul Saab { 'F', &F__optname, 261a5f0fb15SPaul Saab BOOL, OPT_OFF, &quit_if_one_screen, NULL, 262000ba3e8STim J. Robbins { 263a5f0fb15SPaul Saab "Don't quit if end-of-file on first screen", 264a5f0fb15SPaul Saab "Quit if end-of-file on first screen", 265a5f0fb15SPaul Saab NULL 266000ba3e8STim J. Robbins } 267a5f0fb15SPaul Saab }, 268a5f0fb15SPaul Saab #if HILITE_SEARCH 269a5f0fb15SPaul Saab { 'g', &g_optname, 270a5f0fb15SPaul Saab TRIPLE|HL_REPAINT, OPT_ONPLUS, &hilite_search, NULL, 271000ba3e8STim J. Robbins { 272a5f0fb15SPaul Saab "Don't highlight search matches", 273a5f0fb15SPaul Saab "Highlight matches for previous search only", 274a5f0fb15SPaul Saab "Highlight all matches for previous search pattern", 275000ba3e8STim J. Robbins } 276a5f0fb15SPaul Saab }, 277a5f0fb15SPaul Saab #endif 278a5f0fb15SPaul Saab { 'h', &h_optname, 279a5f0fb15SPaul Saab NUMBER, -1, &back_scroll, NULL, 280000ba3e8STim J. Robbins { 281a5f0fb15SPaul Saab "Backwards scroll limit: ", 282a5f0fb15SPaul Saab "Backwards scroll limit is %d lines", 283a5f0fb15SPaul Saab NULL 284000ba3e8STim J. Robbins } 285a5f0fb15SPaul Saab }, 286a5f0fb15SPaul Saab { 'i', &i_optname, 287a5f0fb15SPaul Saab TRIPLE|HL_REPAINT, OPT_OFF, &caseless, opt_i, 288000ba3e8STim J. Robbins { 289a5f0fb15SPaul Saab "Case is significant in searches", 290a5f0fb15SPaul Saab "Ignore case in searches", 291a5f0fb15SPaul Saab "Ignore case in searches and in patterns" 292000ba3e8STim J. Robbins } 293a5f0fb15SPaul Saab }, 294a5f0fb15SPaul Saab { 'j', &j_optname, 2957f074f9cSXin LI STRING, 0, NULL, opt_j, 296000ba3e8STim J. Robbins { 297a5f0fb15SPaul Saab "Target line: ", 298*c77c4889SXin LI "-.d", 299a5f0fb15SPaul Saab NULL 300000ba3e8STim J. Robbins } 301a5f0fb15SPaul Saab }, 3028ed69c6fSPaul Saab { 'J', &J__optname, 3038ed69c6fSPaul Saab BOOL|REPAINT, OPT_OFF, &status_col, NULL, 304000ba3e8STim J. Robbins { 3058ed69c6fSPaul Saab "Don't display a status column", 3068ed69c6fSPaul Saab "Display a status column", 3078ed69c6fSPaul Saab NULL 308000ba3e8STim J. Robbins } 3098ed69c6fSPaul Saab }, 310a5f0fb15SPaul Saab #if USERFILE 311a5f0fb15SPaul Saab { 'k', &k_optname, 312a5f0fb15SPaul Saab STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_k, 313000ba3e8STim J. Robbins { NULL, NULL, NULL } 314a5f0fb15SPaul Saab }, 31530a1828cSXin LI #if HAVE_LESSKEYSRC 316*c77c4889SXin LI { OLETTER_NONE, &kc_optname, 317*c77c4889SXin LI STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_kc, 318*c77c4889SXin LI { NULL, NULL, NULL } 319*c77c4889SXin LI }, 32030a1828cSXin LI { OLETTER_NONE, &ks_optname, 32130a1828cSXin LI STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_ks, 32230a1828cSXin LI { NULL, NULL, NULL } 32330a1828cSXin LI }, 32430a1828cSXin LI #endif /* HAVE_LESSKEYSRC */ 325a5f0fb15SPaul Saab #endif 3266dcb072bSXin LI { 'K', &K__optname, 3276dcb072bSXin LI BOOL, OPT_OFF, &quit_on_intr, NULL, 3286dcb072bSXin LI { 3296dcb072bSXin LI "Interrupt (ctrl-C) returns to prompt", 3306dcb072bSXin LI "Interrupt (ctrl-C) exits less", 3316dcb072bSXin LI NULL 3326dcb072bSXin LI } 3336dcb072bSXin LI }, 334000ba3e8STim J. Robbins { 'L', &L__optname, 335000ba3e8STim J. Robbins BOOL, OPT_ON, &use_lessopen, NULL, 336000ba3e8STim J. Robbins { 337000ba3e8STim J. Robbins "Don't use the LESSOPEN filter", 338000ba3e8STim J. Robbins "Use the LESSOPEN filter", 339000ba3e8STim J. Robbins NULL 340000ba3e8STim J. Robbins } 341a5f0fb15SPaul Saab }, 342a5f0fb15SPaul Saab { 'm', &m_optname, 343a5f0fb15SPaul Saab TRIPLE, OPT_OFF, &pr_type, NULL, 344000ba3e8STim J. Robbins { 345a5f0fb15SPaul Saab "Short prompt", 346a5f0fb15SPaul Saab "Medium prompt", 347a5f0fb15SPaul Saab "Long prompt" 348000ba3e8STim J. Robbins } 349a5f0fb15SPaul Saab }, 350a5f0fb15SPaul Saab { 'n', &n_optname, 351a5f0fb15SPaul Saab TRIPLE|REPAINT, OPT_ON, &linenums, NULL, 352000ba3e8STim J. Robbins { 353a5f0fb15SPaul Saab "Don't use line numbers", 354a5f0fb15SPaul Saab "Use line numbers", 355a5f0fb15SPaul Saab "Constantly display line numbers" 356000ba3e8STim J. Robbins } 357a5f0fb15SPaul Saab }, 358a5f0fb15SPaul Saab #if LOGFILE 359a5f0fb15SPaul Saab { 'o', &o_optname, 360a5f0fb15SPaul Saab STRING, 0, NULL, opt_o, 361000ba3e8STim J. Robbins { "log file: ", NULL, NULL } 362a5f0fb15SPaul Saab }, 363a5f0fb15SPaul Saab { 'O', &O__optname, 364a5f0fb15SPaul Saab STRING, 0, NULL, opt__O, 365000ba3e8STim J. Robbins { "Log file: ", NULL, NULL } 366a5f0fb15SPaul Saab }, 367a5f0fb15SPaul Saab #endif 368a5f0fb15SPaul Saab { 'p', &p_optname, 369a5f0fb15SPaul Saab STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_p, 370000ba3e8STim J. Robbins { NULL, NULL, NULL } 371a5f0fb15SPaul Saab }, 372a5f0fb15SPaul Saab { 'P', &P__optname, 373a5f0fb15SPaul Saab STRING, 0, NULL, opt__P, 374000ba3e8STim J. Robbins { "prompt: ", NULL, NULL } 375a5f0fb15SPaul Saab }, 376a5f0fb15SPaul Saab { 'q', &q_optname, 377a5f0fb15SPaul Saab TRIPLE, OPT_OFF, &quiet, NULL, 378000ba3e8STim J. Robbins { 379a5f0fb15SPaul Saab "Ring the bell for errors AND at eof/bof", 380a5f0fb15SPaul Saab "Ring the bell for errors but not at eof/bof", 381a5f0fb15SPaul Saab "Never ring the bell" 382000ba3e8STim J. Robbins } 383a5f0fb15SPaul Saab }, 384a5f0fb15SPaul Saab { 'r', &r_optname, 385a5f0fb15SPaul Saab TRIPLE|REPAINT, OPT_OFF, &ctldisp, NULL, 386000ba3e8STim J. Robbins { 387a5f0fb15SPaul Saab "Display control characters as ^X", 38830a1828cSXin LI "Display control characters directly (not recommended)", 38930a1828cSXin LI "Display ANSI sequences directly, other control characters as ^X" 390000ba3e8STim J. Robbins } 391a5f0fb15SPaul Saab }, 392a5f0fb15SPaul Saab { 's', &s_optname, 393a5f0fb15SPaul Saab BOOL|REPAINT, OPT_OFF, &squeeze, NULL, 394000ba3e8STim J. Robbins { 395a5f0fb15SPaul Saab "Display all blank lines", 396a5f0fb15SPaul Saab "Squeeze multiple blank lines", 397a5f0fb15SPaul Saab NULL 398000ba3e8STim J. Robbins } 399a5f0fb15SPaul Saab }, 400a5f0fb15SPaul Saab { 'S', &S__optname, 401*c77c4889SXin LI BOOL|REPAINT, OPT_OFF, &chopline, opt__S, 402000ba3e8STim J. Robbins { 403a5f0fb15SPaul Saab "Fold long lines", 404a5f0fb15SPaul Saab "Chop long lines", 405a5f0fb15SPaul Saab NULL 406000ba3e8STim J. Robbins } 407a5f0fb15SPaul Saab }, 408a5f0fb15SPaul Saab #if TAGS 409a5f0fb15SPaul Saab { 't', &t_optname, 410a5f0fb15SPaul Saab STRING|NO_QUERY, 0, NULL, opt_t, 411000ba3e8STim J. Robbins { "tag: ", NULL, NULL } 412a5f0fb15SPaul Saab }, 413a5f0fb15SPaul Saab { 'T', &T__optname, 414a5f0fb15SPaul Saab STRING, 0, NULL, opt__T, 415000ba3e8STim J. Robbins { "tags file: ", NULL, NULL } 416a5f0fb15SPaul Saab }, 417a5f0fb15SPaul Saab #endif 418a5f0fb15SPaul Saab { 'u', &u_optname, 419d713e089SXin LI TRIPLE|REPAINT|HL_REPAINT, OPT_OFF, &bs_mode, NULL, 420000ba3e8STim J. Robbins { 421a5f0fb15SPaul Saab "Display underlined text in underline mode", 422a5f0fb15SPaul Saab "Backspaces cause overstrike", 423a5f0fb15SPaul Saab "Print backspace as ^H" 424000ba3e8STim J. Robbins } 425a5f0fb15SPaul Saab }, 426a5f0fb15SPaul Saab { 'V', &V__optname, 427a5f0fb15SPaul Saab NOVAR, 0, NULL, opt__V, 428000ba3e8STim J. Robbins { NULL, NULL, NULL } 429a5f0fb15SPaul Saab }, 430a5f0fb15SPaul Saab { 'w', &w_optname, 431a5f0fb15SPaul Saab TRIPLE|REPAINT, OPT_OFF, &show_attn, NULL, 432000ba3e8STim J. Robbins { 433a5f0fb15SPaul Saab "Don't highlight first unread line", 434a5f0fb15SPaul Saab "Highlight first unread line after forward-screen", 435a5f0fb15SPaul Saab "Highlight first unread line after any forward movement", 436000ba3e8STim J. Robbins } 437a5f0fb15SPaul Saab }, 438a5f0fb15SPaul Saab { 'x', &x_optname, 439c9346414SPaul Saab STRING|REPAINT, 0, NULL, opt_x, 440000ba3e8STim J. Robbins { 441a5f0fb15SPaul Saab "Tab stops: ", 442*c77c4889SXin LI "d,", 443a5f0fb15SPaul Saab NULL 444000ba3e8STim J. Robbins } 445a5f0fb15SPaul Saab }, 446a5f0fb15SPaul Saab { 'X', &X__optname, 447a5f0fb15SPaul Saab BOOL|NO_TOGGLE, OPT_OFF, &no_init, NULL, 448000ba3e8STim J. Robbins { 449a5f0fb15SPaul Saab "Send init/deinit strings to terminal", 450a5f0fb15SPaul Saab "Don't use init/deinit strings", 451a5f0fb15SPaul Saab NULL 452000ba3e8STim J. Robbins } 453a5f0fb15SPaul Saab }, 454a5f0fb15SPaul Saab { 'y', &y_optname, 455a5f0fb15SPaul Saab NUMBER, -1, &forw_scroll, NULL, 456000ba3e8STim J. Robbins { 457a5f0fb15SPaul Saab "Forward scroll limit: ", 458a5f0fb15SPaul Saab "Forward scroll limit is %d lines", 459a5f0fb15SPaul Saab NULL 460000ba3e8STim J. Robbins } 461a5f0fb15SPaul Saab }, 462a5f0fb15SPaul Saab { 'z', &z_optname, 463a5f0fb15SPaul Saab NUMBER, -1, &swindow, NULL, 464000ba3e8STim J. Robbins { 465a5f0fb15SPaul Saab "Scroll window size: ", 466a5f0fb15SPaul Saab "Scroll window size is %d lines", 467a5f0fb15SPaul Saab NULL 468000ba3e8STim J. Robbins } 469a5f0fb15SPaul Saab }, 470a5f0fb15SPaul Saab { '"', "e_optname, 471a5f0fb15SPaul Saab STRING, 0, NULL, opt_quote, 472*c77c4889SXin LI { "quotes: ", "s", NULL } 473a5f0fb15SPaul Saab }, 474a5f0fb15SPaul Saab { '~', &tilde_optname, 475a5f0fb15SPaul Saab BOOL|REPAINT, OPT_ON, &twiddle, NULL, 476000ba3e8STim J. Robbins { 477a5f0fb15SPaul Saab "Don't show tildes after end of file", 478a5f0fb15SPaul Saab "Show tildes after end of file", 479a5f0fb15SPaul Saab NULL 480000ba3e8STim J. Robbins } 481a5f0fb15SPaul Saab }, 482a5f0fb15SPaul Saab { '?', &query_optname, 483a5f0fb15SPaul Saab NOVAR, 0, NULL, opt_query, 484000ba3e8STim J. Robbins { NULL, NULL, NULL } 485a5f0fb15SPaul Saab }, 4868ed69c6fSPaul Saab { '#', £_optname, 487f0be0a1fSXin LI STRING, 0, NULL, opt_shift, 488000ba3e8STim J. Robbins { 4898ed69c6fSPaul Saab "Horizontal shift: ", 490*c77c4889SXin LI ".d", 4918ed69c6fSPaul Saab NULL 492000ba3e8STim J. Robbins } 4938ed69c6fSPaul Saab }, 49433096f16SXin LI { OLETTER_NONE, &keypad_optname, 495c9346414SPaul Saab BOOL|NO_TOGGLE, OPT_OFF, &no_keypad, NULL, 496000ba3e8STim J. Robbins { 497c9346414SPaul Saab "Use keypad mode", 498c9346414SPaul Saab "Don't use keypad mode", 499c9346414SPaul Saab NULL 500000ba3e8STim J. Robbins } 501c9346414SPaul Saab }, 50233096f16SXin LI { OLETTER_NONE, &oldbot_optname, 5037f074f9cSXin LI BOOL, OPT_OFF, &oldbot, NULL, 5047f074f9cSXin LI { 5057f074f9cSXin LI "Use new bottom of screen behavior", 5067f074f9cSXin LI "Use old bottom of screen behavior", 5077f074f9cSXin LI NULL 5087f074f9cSXin LI } 5097f074f9cSXin LI }, 51033096f16SXin LI { OLETTER_NONE, &follow_optname, 511464501a8SXin LI BOOL, FOLLOW_DESC, &follow_mode, NULL, 512464501a8SXin LI { 51333096f16SXin LI "F command follows file descriptor", 51433096f16SXin LI "F command follows file name", 515464501a8SXin LI NULL 516464501a8SXin LI } 517464501a8SXin LI }, 5187bd2567cSXin LI { OLETTER_NONE, &use_backslash_optname, 5197bd2567cSXin LI BOOL, OPT_OFF, &opt_use_backslash, NULL, 5207bd2567cSXin LI { 5217bd2567cSXin LI "Use backslash escaping in command line parameters", 5227bd2567cSXin LI "Don't use backslash escaping in command line parameters", 5237bd2567cSXin LI NULL 5247bd2567cSXin LI } 5257bd2567cSXin LI }, 526b2ea2440SXin LI { OLETTER_NONE, &rscroll_optname, 527b2ea2440SXin LI STRING|REPAINT|INIT_HANDLER, 0, NULL, opt_rscroll, 528*c77c4889SXin LI { "rscroll character: ", "s", NULL } 529b2ea2440SXin LI }, 530b7780dbeSXin LI { OLETTER_NONE, &nohistdups_optname, 531b7780dbeSXin LI BOOL, OPT_OFF, &no_hist_dups, NULL, 532b7780dbeSXin LI { 533b7780dbeSXin LI "Allow duplicates in history list", 534b7780dbeSXin LI "Remove duplicates from history list", 535b7780dbeSXin LI NULL 536b7780dbeSXin LI } 537b7780dbeSXin LI }, 538b7780dbeSXin LI { OLETTER_NONE, &mousecap_optname, 539b7780dbeSXin LI TRIPLE, OPT_OFF, &mousecap, opt_mousecap, 540b7780dbeSXin LI { 541b7780dbeSXin LI "Ignore mouse input", 542b7780dbeSXin LI "Use the mouse for scrolling", 543b7780dbeSXin LI "Use the mouse for scrolling (reverse)" 544b7780dbeSXin LI } 545b7780dbeSXin LI }, 546b7780dbeSXin LI { OLETTER_NONE, &wheel_lines_optname, 547b7780dbeSXin LI NUMBER|INIT_HANDLER, 0, &wheel_lines, opt_wheel_lines, 548b7780dbeSXin LI { 549b7780dbeSXin LI "Lines to scroll on mouse wheel: ", 550b7780dbeSXin LI "Scroll %d line(s) on mouse wheel", 551b7780dbeSXin LI NULL 552b7780dbeSXin LI } 553b7780dbeSXin LI }, 554b7780dbeSXin LI { OLETTER_NONE, &perma_marks_optname, 555b7780dbeSXin LI BOOL, OPT_OFF, &perma_marks, NULL, 556b7780dbeSXin LI { 557b7780dbeSXin LI "Don't save marks in history file", 558b7780dbeSXin LI "Save marks in history file", 559b7780dbeSXin LI NULL 560b7780dbeSXin LI } 561b7780dbeSXin LI }, 5622235c7feSXin LI { OLETTER_NONE, &linenum_width_optname, 5632235c7feSXin LI NUMBER|REPAINT, MIN_LINENUM_WIDTH, &linenum_width, opt_linenum_width, 5642235c7feSXin LI { 5652235c7feSXin LI "Line number width: ", 5662235c7feSXin LI "Line number width is %d chars", 5672235c7feSXin LI NULL 5682235c7feSXin LI } 5692235c7feSXin LI }, 5702235c7feSXin LI { OLETTER_NONE, &status_col_width_optname, 5712235c7feSXin LI NUMBER|REPAINT, 2, &status_col_width, opt_status_col_width, 5722235c7feSXin LI { 5732235c7feSXin LI "Status column width: ", 5742235c7feSXin LI "Status column width is %d chars", 5752235c7feSXin LI NULL 5762235c7feSXin LI } 5772235c7feSXin LI }, 5782235c7feSXin LI { OLETTER_NONE, &incr_search_optname, 5792235c7feSXin LI BOOL, OPT_OFF, &incr_search, NULL, 5802235c7feSXin LI { 5812235c7feSXin LI "Incremental search is off", 5822235c7feSXin LI "Incremental search is on", 5832235c7feSXin LI NULL 5842235c7feSXin LI } 5852235c7feSXin LI }, 5862235c7feSXin LI { OLETTER_NONE, &use_color_optname, 5872235c7feSXin LI BOOL|REPAINT, OPT_OFF, &use_color, NULL, 5882235c7feSXin LI { 5892235c7feSXin LI "Don't use color", 5902235c7feSXin LI "Use color", 5912235c7feSXin LI NULL 5922235c7feSXin LI } 5932235c7feSXin LI }, 59430a1828cSXin LI { OLETTER_NONE, &want_filesize_optname, 59530a1828cSXin LI BOOL|REPAINT, OPT_OFF, &want_filesize, opt_filesize, 59630a1828cSXin LI { 59730a1828cSXin LI "Don't get size of each file", 59830a1828cSXin LI "Get size of each file", 59930a1828cSXin LI NULL 60030a1828cSXin LI } 60130a1828cSXin LI }, 60295270f73SXin LI { OLETTER_NONE, &status_line_optname, 60395270f73SXin LI BOOL|REPAINT, OPT_OFF, &status_line, NULL, 60495270f73SXin LI { 60595270f73SXin LI "Don't color each line with its status column color", 60695270f73SXin LI "Color each line with its status column color", 60795270f73SXin LI NULL 60895270f73SXin LI } 60995270f73SXin LI }, 61095270f73SXin LI { OLETTER_NONE, &header_optname, 61195270f73SXin LI STRING|REPAINT, 0, NULL, opt_header, 612*c77c4889SXin LI { "Header lines: ", "d,", NULL } 61395270f73SXin LI }, 61495270f73SXin LI { OLETTER_NONE, &nonum_headers_optname, 61595270f73SXin LI BOOL|REPAINT, 0, &nonum_headers, NULL, 61695270f73SXin LI { 61795270f73SXin LI "Number header lines", 61895270f73SXin LI "Don't number header lines", 61995270f73SXin LI NULL 62095270f73SXin LI } 62195270f73SXin LI }, 622d713e089SXin LI { OLETTER_NONE, &nosearch_headers_optname, 623*c77c4889SXin LI BOOL|HL_REPAINT, 0, NULL, opt_nosearch_headers, 624d713e089SXin LI { 625*c77c4889SXin LI NULL, NULL, NULL 626*c77c4889SXin LI } 627*c77c4889SXin LI }, 628*c77c4889SXin LI { OLETTER_NONE, &nosearch_header_lines_optname, 629*c77c4889SXin LI BOOL|HL_REPAINT, 0, NULL, opt_nosearch_header_lines, 630*c77c4889SXin LI { 631*c77c4889SXin LI NULL, NULL, NULL 632*c77c4889SXin LI } 633*c77c4889SXin LI }, 634*c77c4889SXin LI { OLETTER_NONE, &nosearch_header_cols_optname, 635*c77c4889SXin LI BOOL|HL_REPAINT, 0, NULL, opt_nosearch_header_cols, 636*c77c4889SXin LI { 637*c77c4889SXin LI NULL, NULL, NULL 638d713e089SXin LI } 639d713e089SXin LI }, 64095270f73SXin LI { OLETTER_NONE, &redraw_on_quit_optname, 64195270f73SXin LI BOOL, OPT_OFF, &redraw_on_quit, NULL, 64295270f73SXin LI { 64395270f73SXin LI "Don't redraw screen when quitting", 64495270f73SXin LI "Redraw last screen when quitting", 64595270f73SXin LI NULL 64695270f73SXin LI } 64795270f73SXin LI }, 64895270f73SXin LI { OLETTER_NONE, &search_type_optname, 64995270f73SXin LI STRING, 0, NULL, opt_search_type, 650*c77c4889SXin LI { "Search options: ", "s", NULL } 65195270f73SXin LI }, 65295270f73SXin LI { OLETTER_NONE, &exit_F_on_close_optname, 65395270f73SXin LI BOOL, OPT_OFF, &exit_F_on_close, NULL, 65495270f73SXin LI { 65595270f73SXin LI "Don't exit F command when input closes", 65695270f73SXin LI "Exit F command when input closes", 65795270f73SXin LI NULL 65895270f73SXin LI } 65995270f73SXin LI }, 660d713e089SXin LI { OLETTER_NONE, &no_vbell_optname, 661d713e089SXin LI BOOL, OPT_OFF, &no_vbell, NULL, 6622235c7feSXin LI { 663d713e089SXin LI "Display visual bell", 664d713e089SXin LI "Don't display visual bell", 6652235c7feSXin LI NULL 6662235c7feSXin LI } 6672235c7feSXin LI }, 668d713e089SXin LI { OLETTER_NONE, &modelines_optname, 669d713e089SXin LI NUMBER, 0, &modelines, NULL, 670d713e089SXin LI { 671d713e089SXin LI "Lines to read looking for modelines: ", 672d713e089SXin LI "Read %d lines looking for modelines", 673d713e089SXin LI NULL 674d713e089SXin LI } 675d713e089SXin LI }, 676d713e089SXin LI { OLETTER_NONE, &intr_optname, 677d713e089SXin LI STRING, 0, NULL, opt_intr, 678*c77c4889SXin LI { "interrupt character: ", "s", NULL } 679d713e089SXin LI }, 680d713e089SXin LI { OLETTER_NONE, &wordwrap_optname, 681d713e089SXin LI BOOL|REPAINT, OPT_OFF, &wordwrap, NULL, 682d713e089SXin LI { 683d713e089SXin LI "Wrap lines at any character", 684d713e089SXin LI "Wrap lines at spaces", 685d713e089SXin LI NULL 686d713e089SXin LI } 687d713e089SXin LI }, 688d713e089SXin LI { OLETTER_NONE, &show_preproc_error_optname, 689d713e089SXin LI BOOL, OPT_OFF, &show_preproc_error, NULL, 690d713e089SXin LI { 691d713e089SXin LI "Don't show error message if preprocessor fails", 692d713e089SXin LI "Show error message if preprocessor fails", 693d713e089SXin LI NULL 694d713e089SXin LI } 695d713e089SXin LI }, 696d713e089SXin LI { OLETTER_NONE, &proc_backspace_optname, 697d713e089SXin LI TRIPLE|REPAINT|HL_REPAINT, OPT_OFF, &proc_backspace, NULL, 698d713e089SXin LI { 699d713e089SXin LI "Backspace handling is specified by the -U option", 700d713e089SXin LI "Display underline text in underline mode", 701d713e089SXin LI "Print backspaces as ^H" 702d713e089SXin LI } 703d713e089SXin LI }, 704d713e089SXin LI { OLETTER_NONE, &proc_tab_optname, 705d713e089SXin LI TRIPLE|REPAINT|HL_REPAINT, OPT_OFF, &proc_tab, NULL, 706d713e089SXin LI { 707d713e089SXin LI "Tab handling is specified by the -U option", 708d713e089SXin LI "Expand tabs to spaces", 709d713e089SXin LI "Print tabs as ^I" 710d713e089SXin LI } 711d713e089SXin LI }, 712d713e089SXin LI { OLETTER_NONE, &proc_return_optname, 713d713e089SXin LI TRIPLE|REPAINT|HL_REPAINT, OPT_OFF, &proc_return, NULL, 714d713e089SXin LI { 715d713e089SXin LI "Carriage return handling is specified by the -U option", 716d713e089SXin LI "Delete carriage return before newline", 717d713e089SXin LI "Print carriage return as ^M" 718d713e089SXin LI } 719d713e089SXin LI }, 720*c77c4889SXin LI { OLETTER_NONE, &match_shift_optname, 721*c77c4889SXin LI STRING|INIT_HANDLER, 0, NULL, opt_match_shift, 722*c77c4889SXin LI { 723*c77c4889SXin LI "Search match shift: ", 724*c77c4889SXin LI ".d", 725*c77c4889SXin LI NULL 726*c77c4889SXin LI } 727*c77c4889SXin LI }, 728d713e089SXin LI #if LESSTEST 729d713e089SXin LI { OLETTER_NONE, &ttyin_name_optname, 730d713e089SXin LI STRING|NO_TOGGLE, 0, NULL, opt_ttyin_name, 7312235c7feSXin LI { 7322235c7feSXin LI NULL, 7332235c7feSXin LI NULL, 7342235c7feSXin LI NULL 7352235c7feSXin LI } 7362235c7feSXin LI }, 7372235c7feSXin LI #endif /*LESSTEST*/ 738000ba3e8STim J. Robbins { '\0', NULL, NOVAR, 0, NULL, NULL, { NULL, NULL, NULL } } 739a5f0fb15SPaul Saab }; 740a5f0fb15SPaul Saab 741a5f0fb15SPaul Saab 742a5f0fb15SPaul Saab /* 743a5f0fb15SPaul Saab * Initialize each option to its default value. 744a5f0fb15SPaul Saab */ 745d713e089SXin LI public void init_option(void) 746a5f0fb15SPaul Saab { 7471ea31627SRobert Watson struct loption *o; 748*c77c4889SXin LI constant char *p; 7496dcb072bSXin LI 7506dcb072bSXin LI p = lgetenv("LESS_IS_MORE"); 751b7780dbeSXin LI if (!isnullenv(p)) 7526dcb072bSXin LI less_is_more = 1; 753a5f0fb15SPaul Saab 754a5f0fb15SPaul Saab for (o = option; o->oletter != '\0'; o++) 755a5f0fb15SPaul Saab { 756a5f0fb15SPaul Saab /* 757a5f0fb15SPaul Saab * Set each variable to its default. 758a5f0fb15SPaul Saab */ 759a5f0fb15SPaul Saab if (o->ovar != NULL) 760a5f0fb15SPaul Saab *(o->ovar) = o->odefault; 761000ba3e8STim J. Robbins if (o->otype & INIT_HANDLER) 762000ba3e8STim J. Robbins (*(o->ofunc))(INIT, (char *) NULL); 763a5f0fb15SPaul Saab } 764a5f0fb15SPaul Saab } 765a5f0fb15SPaul Saab 766a5f0fb15SPaul Saab /* 767a5f0fb15SPaul Saab * Find an option in the option table, given its option letter. 768a5f0fb15SPaul Saab */ 769d713e089SXin LI public struct loption * findopt(int c) 770a5f0fb15SPaul Saab { 7711ea31627SRobert Watson struct loption *o; 772a5f0fb15SPaul Saab 773a5f0fb15SPaul Saab for (o = option; o->oletter != '\0'; o++) 774a5f0fb15SPaul Saab { 775a5f0fb15SPaul Saab if (o->oletter == c) 776a5f0fb15SPaul Saab return (o); 7776dcb072bSXin LI if ((o->otype & TRIPLE) && ASCII_TO_UPPER(o->oletter) == c) 778a5f0fb15SPaul Saab return (o); 779a5f0fb15SPaul Saab } 780a5f0fb15SPaul Saab return (NULL); 781a5f0fb15SPaul Saab } 782a5f0fb15SPaul Saab 783a5f0fb15SPaul Saab /* 784000ba3e8STim J. Robbins * 785000ba3e8STim J. Robbins */ 786*c77c4889SXin LI static lbool is_optchar(char c) 787000ba3e8STim J. Robbins { 7886dcb072bSXin LI if (ASCII_IS_UPPER(c)) 789*c77c4889SXin LI return TRUE; 7906dcb072bSXin LI if (ASCII_IS_LOWER(c)) 791*c77c4889SXin LI return TRUE; 792000ba3e8STim J. Robbins if (c == '-') 793*c77c4889SXin LI return TRUE; 794*c77c4889SXin LI return FALSE; 795000ba3e8STim J. Robbins } 796000ba3e8STim J. Robbins 797000ba3e8STim J. Robbins /* 798a5f0fb15SPaul Saab * Find an option in the option table, given its option name. 799a5f0fb15SPaul Saab * p_optname is the (possibly partial) name to look for, and 800a5f0fb15SPaul Saab * is updated to point after the matched name. 801a5f0fb15SPaul Saab * p_oname if non-NULL is set to point to the full option name. 802a5f0fb15SPaul Saab */ 803*c77c4889SXin LI public struct loption * findopt_name(constant char **p_optname, constant char **p_oname, lbool *p_ambig) 804a5f0fb15SPaul Saab { 805*c77c4889SXin LI constant char *optname = *p_optname; 8061ea31627SRobert Watson struct loption *o; 8071ea31627SRobert Watson struct optname *oname; 808*c77c4889SXin LI size_t len; 809a5f0fb15SPaul Saab int uppercase; 810000ba3e8STim J. Robbins struct loption *maxo = NULL; 811a5f0fb15SPaul Saab struct optname *maxoname = NULL; 812*c77c4889SXin LI size_t maxlen = 0; 813*c77c4889SXin LI lbool ambig = FALSE; 814*c77c4889SXin LI lbool exact = FALSE; 815a5f0fb15SPaul Saab 816a5f0fb15SPaul Saab /* 817a5f0fb15SPaul Saab * Check all options. 818a5f0fb15SPaul Saab */ 819a5f0fb15SPaul Saab for (o = option; o->oletter != '\0'; o++) 820a5f0fb15SPaul Saab { 821a5f0fb15SPaul Saab /* 822a5f0fb15SPaul Saab * Check all names for this option. 823a5f0fb15SPaul Saab */ 824a5f0fb15SPaul Saab for (oname = o->onames; oname != NULL; oname = oname->onext) 825a5f0fb15SPaul Saab { 826a5f0fb15SPaul Saab /* 827a5f0fb15SPaul Saab * Try normal match first (uppercase == 0), 828a5f0fb15SPaul Saab * then, then if it's a TRIPLE option, 829a5f0fb15SPaul Saab * try uppercase match (uppercase == 1). 830a5f0fb15SPaul Saab */ 831a5f0fb15SPaul Saab for (uppercase = 0; uppercase <= 1; uppercase++) 832a5f0fb15SPaul Saab { 833a5f0fb15SPaul Saab len = sprefix(optname, oname->oname, uppercase); 834*c77c4889SXin LI if (len == 0 || is_optchar(optname[len])) 835000ba3e8STim J. Robbins { 836000ba3e8STim J. Robbins /* 837000ba3e8STim J. Robbins * We didn't use all of the option name. 838000ba3e8STim J. Robbins */ 839000ba3e8STim J. Robbins continue; 840000ba3e8STim J. Robbins } 841a5f0fb15SPaul Saab if (!exact && len == maxlen) 842a5f0fb15SPaul Saab /* 843a5f0fb15SPaul Saab * Already had a partial match, 844a5f0fb15SPaul Saab * and now there's another one that 845a5f0fb15SPaul Saab * matches the same length. 846a5f0fb15SPaul Saab */ 847*c77c4889SXin LI ambig = TRUE; 848a5f0fb15SPaul Saab else if (len > maxlen) 849a5f0fb15SPaul Saab { 850a5f0fb15SPaul Saab /* 851a5f0fb15SPaul Saab * Found a better match than 852a5f0fb15SPaul Saab * the one we had. 853a5f0fb15SPaul Saab */ 854a5f0fb15SPaul Saab maxo = o; 855a5f0fb15SPaul Saab maxoname = oname; 856a5f0fb15SPaul Saab maxlen = len; 857*c77c4889SXin LI ambig = FALSE; 858*c77c4889SXin LI exact = (len == strlen(oname->oname)); 859a5f0fb15SPaul Saab } 860a5f0fb15SPaul Saab if (!(o->otype & TRIPLE)) 861a5f0fb15SPaul Saab break; 862a5f0fb15SPaul Saab } 863a5f0fb15SPaul Saab } 864a5f0fb15SPaul Saab } 865*c77c4889SXin LI if (p_ambig != NULL) 866*c77c4889SXin LI *p_ambig = ambig; 867a5f0fb15SPaul Saab if (ambig) 868a5f0fb15SPaul Saab { 869a5f0fb15SPaul Saab /* 870a5f0fb15SPaul Saab * Name matched more than one option. 871a5f0fb15SPaul Saab */ 872a5f0fb15SPaul Saab return (NULL); 873a5f0fb15SPaul Saab } 874a5f0fb15SPaul Saab *p_optname = optname + maxlen; 875a5f0fb15SPaul Saab if (p_oname != NULL) 876000ba3e8STim J. Robbins *p_oname = maxoname == NULL ? NULL : maxoname->oname; 877a5f0fb15SPaul Saab return (maxo); 878a5f0fb15SPaul Saab } 879