xref: /openbsd/usr.bin/less/opttbl.c (revision f2dfb0a4)
1 /*
2  * Copyright (c) 1984,1985,1989,1994,1995  Mark Nudelman
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice in the documentation and/or other materials provided with
12  *    the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
20  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
21  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 
28 /*
29  * The option table.
30  */
31 
32 #include "less.h"
33 #include "option.h"
34 
35 /*
36  * Variables controlled by command line options.
37  */
38 public int quiet;		/* Should we suppress the audible bell? */
39 public int how_search;		/* Where should forward searches start? */
40 public int top_scroll;		/* Repaint screen from top?
41 				   (alternative is scroll from bottom) */
42 public int pr_type;		/* Type of prompt (short, medium, long) */
43 public int bs_mode;		/* How to process backspaces */
44 public int know_dumb;		/* Don't complain about dumb terminals */
45 public int quit_at_eof;		/* Quit after hitting end of file twice */
46 public int be_helpful;		/* more(1) style -d */
47 public int squeeze;		/* Squeeze multiple blank lines into one */
48 public int tabstop;		/* Tab settings */
49 public int back_scroll;		/* Repaint screen on backwards movement */
50 public int forw_scroll;		/* Repaint screen on forward movement */
51 public int twiddle;		/* Display "~" for lines after EOF */
52 public int caseless;		/* Do "caseless" searches */
53 public int linenums;		/* Use line numbers */
54 public int cbufs;		/* Current number of buffers */
55 public int autobuf;		/* Automatically allocate buffers as needed */
56 public int nohelp;		/* Disable the HELP command */
57 public int ctldisp;		/* Send control chars to screen untranslated */
58 public int force_open;		/* Open the file even if not regular file */
59 public int swindow;		/* Size of scrolling window */
60 public int jump_sline;		/* Screen line of "jump target" */
61 public int chopline;		/* Truncate displayed lines at screen width */
62 public int no_init;		/* Disable sending ti/te termcap strings */
63 #if HILITE_SEARCH
64 public int hilite_search;	/* Highlight matched search patterns? */
65 #endif
66 
67 /*
68  * Table of all options and their semantics.
69  */
70 static struct option option[] =
71 {
72 	{ 'a', BOOL, OPT_OFF, &how_search, NULL,
73 		"Search includes displayed screen",
74 		"Search skips displayed screen",
75 		NULL
76 	},
77 	{ 'b', NUMBER, 10, &cbufs, opt_b,
78 		"Buffers: ",
79 		"%d buffers",
80 		NULL
81 	},
82 	{ 'B', BOOL, OPT_ON, &autobuf, NULL,
83 		"Don't automatically allocate buffers",
84 		"Automatically allocate buffers when needed",
85 		NULL
86 	},
87 	{ 'c', TRIPLE, OPT_OFF, &top_scroll, NULL,
88 		"Repaint by scrolling from bottom of screen",
89 		"Repaint by clearing each line",
90 		"Repaint by painting from top of screen"
91 	},
92 #if 0
93 	{ 'd', BOOL|NO_TOGGLE, OPT_OFF, &know_dumb, NULL,
94 		"Assume intelligent terminal",
95 		"Assume dumb terminal",
96 		NULL
97 	},
98 #else
99 	{ 'd', BOOL, OPT_OFF, &be_helpful, NULL,
100 		"Be less helpful in prompts",
101 		"Be helpful in prompts",
102 		NULL,
103 	},
104 #endif
105 #if MSOFTC
106 	{ 'D', STRING|REPAINT, 0, NULL, opt_D,
107 		"color desc: ", NULL, NULL
108 	},
109 #endif
110 	{ 'e', TRIPLE, OPT_OFF, &quit_at_eof, NULL,
111 		"Don't quit at end-of-file",
112 		"Quit at end-of-file",
113 		"Quit immediately at end-of-file"
114 	},
115 	{ 'f', BOOL, OPT_OFF, &force_open, NULL,
116 		"Open only regular files",
117 		"Open even non-regular files",
118 		NULL
119 	},
120 #if HILITE_SEARCH
121 	{ 'g', TRIPLE|HL_REPAINT, OPT_ONPLUS, &hilite_search, NULL,
122 		"Don't highlight search matches",
123 		"Highlight matches for previous search only",
124 		"Highlight all matches for previous search pattern",
125 	},
126 #endif
127 	{ 'h', NUMBER, -1, &back_scroll, NULL,
128 		"Backwards scroll limit: ",
129 		"Backwards scroll limit is %d lines",
130 		NULL
131 	},
132 	{ 'H', BOOL|NO_TOGGLE, OPT_OFF, &nohelp, NULL,
133 		"Allow help command",
134 		"Don't allow help command",
135 		NULL
136 	},
137 	{ 'i', TRIPLE|HL_REPAINT, OPT_OFF, &caseless, opt_i,
138 		"Case is significant in searches",
139 		"Ignore case in searches",
140 		"Ignore case in searches and in patterns"
141 	},
142 	{ 'j', NUMBER, 1, &jump_sline, NULL,
143 		"Target line: ",
144 		"Position target at screen line %d",
145 		NULL
146 	},
147 #if USERFILE
148 	{ 'k', STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_k,
149 		NULL, NULL, NULL
150 	},
151 #endif
152 	{ 'l', STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_l,
153 		NULL, NULL, NULL
154 	},
155 	{ 'm', TRIPLE, OPT_OFF, &pr_type, NULL,
156 		"Short prompt",
157 		"Medium prompt",
158 		"Long prompt"
159 	},
160 	{ 'n', TRIPLE|REPAINT, OPT_ON, &linenums, NULL,
161 		"Don't use line numbers",
162 		"Use line numbers",
163 		"Constantly display line numbers"
164 	},
165 #if LOGFILE
166 	{ 'o', STRING, 0, NULL, opt_o,
167 		"log file: ", NULL, NULL
168 	},
169 	{ 'O', STRING, 0, NULL, opt__O,
170 		"Log file: ", NULL, NULL
171 	},
172 #endif
173 	{ 'p', STRING|NO_TOGGLE|NO_QUERY, 0, NULL, opt_p,
174 		NULL, NULL, NULL
175 	},
176 	{ 'P', STRING, 0, NULL, opt__P,
177 		"prompt: ", NULL, NULL
178 	},
179 	{ 'q', TRIPLE, OPT_OFF, &quiet, NULL,
180 		"Ring the bell for errors AND at eof/bof",
181 		"Ring the bell for errors but not at eof/bof",
182 		"Never ring the bell"
183 	},
184 	{ 'r', BOOL|REPAINT, OPT_ON, &ctldisp, NULL,
185 		"Display control characters directly",
186 		"Display control characters as ^X",
187 		NULL
188 	},
189 	{ 's', BOOL|REPAINT, OPT_OFF, &squeeze, NULL,
190 		"Display all blank lines",
191 		"Squeeze multiple blank lines",
192 		NULL
193 	},
194 	{ 'S', BOOL|REPAINT, OPT_OFF, &chopline, NULL,
195 		"Fold long lines",
196 		"Chop long lines",
197 		NULL
198 	},
199 #if TAGS
200 	{ 't', STRING|NO_QUERY, 0, NULL, opt_t,
201 		"tag: ", NULL, NULL
202 	},
203 	{ 'T', STRING, 0, NULL, opt__T,
204 		"tags file: ", NULL, NULL
205 	},
206 #endif
207 	{ 'u', TRIPLE|REPAINT, OPT_OFF, &bs_mode, NULL,
208 		"Display underlined text in underline mode",
209 		"Backspaces cause overstrike",
210 		"Print backspace as ^H"
211 	},
212 	{ 'V', NOVAR, 0, NULL, opt__V,
213 		NULL, NULL, NULL
214 	},
215 	{ 'w', BOOL|REPAINT, OPT_ON, &twiddle, NULL,
216 		"Display nothing for lines after end-of-file",
217 		"Display ~ for lines after end-of-file",
218 		NULL
219 	},
220 	{ 'x', NUMBER|REPAINT, 8, &tabstop, NULL,
221 		"Tab stops: ",
222 		"Tab stops every %d spaces",
223 		NULL
224 	},
225 	{ 'X', BOOL|NO_TOGGLE, OPT_OFF, &no_init, NULL,
226 		"Send init/deinit strings to terminal",
227 		"Don't use init/deinit strings",
228 		NULL
229 	},
230 	{ 'y', NUMBER, -1, &forw_scroll, NULL,
231 		"Forward scroll limit: ",
232 		"Forward scroll limit is %d lines",
233 		NULL
234 	},
235 	{ 'z', NUMBER, -1, &swindow, NULL,
236 		"Scroll window size: ",
237 		"Scroll window size is %d lines",
238 		NULL
239 	},
240 	{ '?', NOVAR, 0, NULL, opt_query,
241 		NULL, NULL, NULL
242 	},
243 	{ '\0' }
244 };
245 
246 
247 /*
248  * Initialize each option to its default value.
249  */
250 	public void
251 init_option()
252 {
253 	register struct option *o;
254 
255 	for (o = option;  o->oletter != '\0';  o++)
256 	{
257 		/*
258 		 * Set each variable to its default.
259 		 */
260 		if (o->ovar != NULL)
261 			*(o->ovar) = o->odefault;
262 	}
263 }
264 
265 /*
266  * Find an option in the option table.
267  */
268 	public struct option *
269 findopt(c)
270 	int c;
271 {
272 	register struct option *o;
273 
274 	for (o = option;  o->oletter != '\0';  o++)
275 	{
276 		if (o->oletter == c)
277 			return (o);
278 		if ((o->otype & TRIPLE) && toupper(o->oletter) == c)
279 			return (o);
280 	}
281 	return (NULL);
282 }
283