xref: /freebsd/contrib/less/optfunc.c (revision 000ba3e8196af5b890e39cbe6e7d007d08fae507)
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