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