- Fix for possible unset uid/gid in toproto
 - Fix for default mtree style
 - Update libelf
 - Importing libexecinfo
 - Resynchronize GCC, mpc, gmp, mpfr
 - build.sh: Replace params with show-params.
     This has been done as the make target has been renamed in the same
     way, while a new target named params has been added. This new
     target generates a file containing all the parameters, instead of
     printing it on the console.
 - Update test48 with new etc/services (Fix by Ben Gras <ben@minix3.org)
     get getservbyport() out of the inner loop
Change-Id: Ie6ad5226fa2621ff9f0dee8782ea48f9443d2091
		
	
			
		
			
				
	
	
		
			732 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			732 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*	$NetBSD: optfunc.c,v 1.3 2013/09/04 19:44:21 tron Exp $	*/
 | 
						|
 | 
						|
/*
 | 
						|
 * Copyright (C) 1984-2012  Mark Nudelman
 | 
						|
 *
 | 
						|
 * You may distribute under the terms of either the GNU General Public
 | 
						|
 * License or the Less License, as specified in the README file.
 | 
						|
 *
 | 
						|
 * For more information, see the README file.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Handling functions for command line options.
 | 
						|
 *
 | 
						|
 * Most options are handled by the generic code in option.c.
 | 
						|
 * But all string options, and a few non-string options, require
 | 
						|
 * special handling specific to the particular option.
 | 
						|
 * This special processing is done by the "handling functions" in this file.
 | 
						|
 *
 | 
						|
 * Each handling function is passed a "type" and, if it is a string
 | 
						|
 * option, the string which should be "assigned" to the option.
 | 
						|
 * The type may be one of:
 | 
						|
 *	INIT	The option is being initialized from the command line.
 | 
						|
 *	TOGGLE	The option is being changed from within the program.
 | 
						|
 *	QUERY	The setting of the option is merely being queried.
 | 
						|
 */
 | 
						|
 | 
						|
#include "less.h"
 | 
						|
#include "option.h"
 | 
						|
 | 
						|
extern int nbufs;
 | 
						|
extern int bufspace;
 | 
						|
extern int pr_type;
 | 
						|
extern int plusoption;
 | 
						|
extern int swindow;
 | 
						|
extern int sc_width;
 | 
						|
extern int sc_height;
 | 
						|
extern int secure;
 | 
						|
extern int dohelp;
 | 
						|
extern int any_display;
 | 
						|
extern char openquote;
 | 
						|
extern char closequote;
 | 
						|
extern char *prproto[];
 | 
						|
extern char *eqproto;
 | 
						|
extern char *hproto;
 | 
						|
extern char *wproto;
 | 
						|
extern IFILE curr_ifile;
 | 
						|
extern char version[];
 | 
						|
extern int jump_sline;
 | 
						|
extern int jump_sline_fraction;
 | 
						|
extern int shift_count;
 | 
						|
extern int shift_count_fraction;
 | 
						|
extern int less_is_more;
 | 
						|
#if LOGFILE
 | 
						|
extern char *namelogfile;
 | 
						|
extern int force_logfile;
 | 
						|
extern int logfile;
 | 
						|
#endif
 | 
						|
#if TAGS
 | 
						|
public char *tagoption = NULL;
 | 
						|
extern char *tags;
 | 
						|
#endif
 | 
						|
#if MSDOS_COMPILER
 | 
						|
extern int nm_fg_color, nm_bg_color;
 | 
						|
extern int bo_fg_color, bo_bg_color;
 | 
						|
extern int ul_fg_color, ul_bg_color;
 | 
						|
extern int so_fg_color, so_bg_color;
 | 
						|
extern int bl_fg_color, bl_bg_color;
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#if LOGFILE
 | 
						|
/*
 | 
						|
 * Handler for -o option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_o(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	PARG parg;
 | 
						|
 | 
						|
	if (secure)
 | 
						|
	{
 | 
						|
		error("log file support is not available", NULL_PARG);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
		namelogfile = s;
 | 
						|
		break;
 | 
						|
	case TOGGLE:
 | 
						|
		if (ch_getflags() & CH_CANSEEK)
 | 
						|
		{
 | 
						|
			error("Input is not a pipe", NULL_PARG);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		if (logfile >= 0)
 | 
						|
		{
 | 
						|
			error("Log file is already in use", NULL_PARG);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		s = skipsp(s);
 | 
						|
		namelogfile = lglob(s);
 | 
						|
		use_logfile(namelogfile);
 | 
						|
		sync_logfile();
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		if (logfile < 0)
 | 
						|
			error("No log file", NULL_PARG);
 | 
						|
		else
 | 
						|
		{
 | 
						|
			parg.p_string = namelogfile;
 | 
						|
			error("Log file \"%s\"", &parg);
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for -O option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt__O(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	force_logfile = TRUE;
 | 
						|
	opt_o(type, s);
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Handlers for -j option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_j(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	PARG parg;
 | 
						|
	char buf[16];
 | 
						|
	int len;
 | 
						|
	int err;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		if (*s == '.')
 | 
						|
		{
 | 
						|
			s++;
 | 
						|
			jump_sline_fraction = getfraction(&s, "j", &err);
 | 
						|
			if (err)
 | 
						|
				error("Invalid line fraction", NULL_PARG);
 | 
						|
			else
 | 
						|
				calc_jump_sline();
 | 
						|
		} else
 | 
						|
		{
 | 
						|
			int sline = getnum(&s, "j", &err);
 | 
						|
			if (err)
 | 
						|
				error("Invalid line number", NULL_PARG);
 | 
						|
			else
 | 
						|
			{
 | 
						|
				jump_sline = sline;
 | 
						|
				jump_sline_fraction = -1;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		if (jump_sline_fraction < 0)
 | 
						|
		{
 | 
						|
			parg.p_int =  jump_sline;
 | 
						|
			error("Position target at screen line %d", &parg);
 | 
						|
		} else
 | 
						|
		{
 | 
						|
 | 
						|
			sprintf(buf, ".%06d", jump_sline_fraction);
 | 
						|
			len = strlen(buf);
 | 
						|
			while (len > 2 && buf[len-1] == '0')
 | 
						|
				len--;
 | 
						|
			buf[len] = '\0';
 | 
						|
			parg.p_string = buf;
 | 
						|
			error("Position target at screen position %s", &parg);
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
	public void
 | 
						|
calc_jump_sline()
 | 
						|
{
 | 
						|
	if (jump_sline_fraction < 0)
 | 
						|
		return;
 | 
						|
	jump_sline = sc_height * jump_sline_fraction / NUM_FRAC_DENOM;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handlers for -# option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_shift(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	PARG parg;
 | 
						|
	char buf[16];
 | 
						|
	int len;
 | 
						|
	int err;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		if (*s == '.')
 | 
						|
		{
 | 
						|
			s++;
 | 
						|
			shift_count_fraction = getfraction(&s, "#", &err);
 | 
						|
			if (err)
 | 
						|
				error("Invalid column fraction", NULL_PARG);
 | 
						|
			else
 | 
						|
				calc_shift_count();
 | 
						|
		} else
 | 
						|
		{
 | 
						|
			int hs = getnum(&s, "#", &err);
 | 
						|
			if (err)
 | 
						|
				error("Invalid column number", NULL_PARG);
 | 
						|
			else
 | 
						|
			{
 | 
						|
				shift_count = hs;
 | 
						|
				shift_count_fraction = -1;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		if (shift_count_fraction < 0)
 | 
						|
		{
 | 
						|
			parg.p_int = shift_count;
 | 
						|
			error("Horizontal shift %d columns", &parg);
 | 
						|
		} else
 | 
						|
		{
 | 
						|
 | 
						|
			sprintf(buf, ".%06d", shift_count_fraction);
 | 
						|
			len = strlen(buf);
 | 
						|
			while (len > 2 && buf[len-1] == '0')
 | 
						|
				len--;
 | 
						|
			buf[len] = '\0';
 | 
						|
			parg.p_string = buf;
 | 
						|
			error("Horizontal shift %s of screen width", &parg);
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
	public void
 | 
						|
calc_shift_count()
 | 
						|
{
 | 
						|
	if (shift_count_fraction < 0)
 | 
						|
		return;
 | 
						|
	shift_count = sc_width * shift_count_fraction / NUM_FRAC_DENOM;
 | 
						|
}
 | 
						|
 | 
						|
#if USERFILE
 | 
						|
	public void
 | 
						|
opt_k(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	PARG parg;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
		if (lesskey(s, 0))
 | 
						|
		{
 | 
						|
			parg.p_string = s;
 | 
						|
			error("Cannot use lesskey file \"%s\"", &parg);
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#if TAGS
 | 
						|
/*
 | 
						|
 * Handler for -t option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_t(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	IFILE save_ifile;
 | 
						|
	POSITION pos;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
		tagoption = s;
 | 
						|
		/* Do the rest in main() */
 | 
						|
		break;
 | 
						|
	case TOGGLE:
 | 
						|
		if (secure)
 | 
						|
		{
 | 
						|
			error("tags support is not available", NULL_PARG);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		findtag(skipsp(s));
 | 
						|
		save_ifile = save_curr_ifile();
 | 
						|
		/*
 | 
						|
		 * Try to open the file containing the tag
 | 
						|
		 * and search for the tag in that file.
 | 
						|
		 */
 | 
						|
		if (edit_tagfile() || (pos = tagsearch()) == NULL_POSITION)
 | 
						|
		{
 | 
						|
			/* Failed: reopen the old file. */
 | 
						|
			reedit_ifile(save_ifile);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		unsave_ifile(save_ifile);
 | 
						|
		jump_loc(pos, jump_sline);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for -T option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt__T(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	PARG parg;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
		tags = s;
 | 
						|
		break;
 | 
						|
	case TOGGLE:
 | 
						|
		s = skipsp(s);
 | 
						|
		tags = lglob(s);
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		parg.p_string = tags;
 | 
						|
		error("Tags file \"%s\"", &parg);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for -p option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_p(type, s)
 | 
						|
	int type;
 | 
						|
	register char *s;
 | 
						|
{
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
		/*
 | 
						|
		 * Unget a search command for the specified string.
 | 
						|
		 * {{ This won't work if the "/" command is
 | 
						|
		 *    changed or invalidated by a .lesskey file. }}
 | 
						|
		 */
 | 
						|
		plusoption = TRUE;
 | 
						|
		ungetsc(s);
 | 
						|
		/*
 | 
						|
		 * In "more" mode, the -p argument is a command,
 | 
						|
		 * not a search string, so we don't need a slash.
 | 
						|
		 */
 | 
						|
		if (!less_is_more)
 | 
						|
			ungetsc("/");
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for -P option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt__P(type, s)
 | 
						|
	int type;
 | 
						|
	register char *s;
 | 
						|
{
 | 
						|
	register char **proto;
 | 
						|
	PARG parg;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		/*
 | 
						|
		 * Figure out which prototype string should be changed.
 | 
						|
		 */
 | 
						|
		switch (*s)
 | 
						|
		{
 | 
						|
		case 's':  proto = &prproto[PR_SHORT];	s++;	break;
 | 
						|
		case 'm':  proto = &prproto[PR_MEDIUM];	s++;	break;
 | 
						|
		case 'M':  proto = &prproto[PR_LONG];	s++;	break;
 | 
						|
		case '=':  proto = &eqproto;		s++;	break;
 | 
						|
		case 'h':  proto = &hproto;		s++;	break;
 | 
						|
		case 'w':  proto = &wproto;		s++;	break;
 | 
						|
		default:   proto = &prproto[PR_SHORT];		break;
 | 
						|
		}
 | 
						|
		free(*proto);
 | 
						|
		*proto = save(s);
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		parg.p_string = prproto[pr_type];
 | 
						|
		error("%s", &parg);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for the -b option.
 | 
						|
 */
 | 
						|
	/*ARGSUSED*/
 | 
						|
	public void
 | 
						|
opt_b(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		/*
 | 
						|
		 * Set the new number of buffers.
 | 
						|
		 */
 | 
						|
		ch_setbufspace(bufspace);
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for the -i option.
 | 
						|
 */
 | 
						|
	/*ARGSUSED*/
 | 
						|
	public void
 | 
						|
opt_i(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case TOGGLE:
 | 
						|
		chg_caseless();
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
	case INIT:
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for the -V option.
 | 
						|
 */
 | 
						|
	/*ARGSUSED*/
 | 
						|
	public void
 | 
						|
opt__V(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case TOGGLE:
 | 
						|
	case QUERY:
 | 
						|
		dispversion();
 | 
						|
		break;
 | 
						|
	case INIT:
 | 
						|
		/*
 | 
						|
		 * Force output to stdout per GNU standard for --version output.
 | 
						|
		 */
 | 
						|
		any_display = 1;
 | 
						|
		putstr("less ");
 | 
						|
		putstr(version);
 | 
						|
		putstr(" (");
 | 
						|
#if HAVE_GNU_REGEX
 | 
						|
		putstr("GNU ");
 | 
						|
#endif
 | 
						|
#if HAVE_POSIX_REGCOMP
 | 
						|
		putstr("POSIX ");
 | 
						|
#endif
 | 
						|
#if HAVE_PCRE
 | 
						|
		putstr("PCRE ");
 | 
						|
#endif
 | 
						|
#if HAVE_RE_COMP
 | 
						|
		putstr("BSD ");
 | 
						|
#endif
 | 
						|
#if HAVE_REGCMP
 | 
						|
		putstr("V8 ");
 | 
						|
#endif
 | 
						|
#if HAVE_V8_REGCOMP
 | 
						|
		putstr("Spencer V8 ");
 | 
						|
#endif
 | 
						|
#if !HAVE_GNU_REGEX && !HAVE_POSIX_REGCOMP && !HAVE_PCRE && !HAVE_RE_COMP && !HAVE_REGCMP && !HAVE_V8_REGCOMP
 | 
						|
		putstr("no ");
 | 
						|
#endif
 | 
						|
		putstr("regular expressions)\n");
 | 
						|
		putstr("Copyright (C) 1984-2012 Mark Nudelman\n\n");
 | 
						|
		putstr("less comes with NO WARRANTY, to the extent permitted by law.\n");
 | 
						|
		putstr("For information about the terms of redistribution,\n");
 | 
						|
		putstr("see the file named README in the less distribution.\n");
 | 
						|
		putstr("Homepage: http://www.greenwoodsoftware.com/less\n");
 | 
						|
		quit(QUIT_OK);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
#if MSDOS_COMPILER
 | 
						|
/*
 | 
						|
 * Parse an MSDOS color descriptor.
 | 
						|
 */
 | 
						|
   	static void
 | 
						|
colordesc(s, fg_color, bg_color)
 | 
						|
	char *s;
 | 
						|
	int *fg_color;
 | 
						|
	int *bg_color;
 | 
						|
{
 | 
						|
	int fg, bg;
 | 
						|
	int err;
 | 
						|
	
 | 
						|
	fg = getnum(&s, "D", &err);
 | 
						|
	if (err)
 | 
						|
	{
 | 
						|
		error("Missing fg color in -D", NULL_PARG);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	if (*s != '.')
 | 
						|
		bg = nm_bg_color;
 | 
						|
	else
 | 
						|
	{
 | 
						|
		s++;
 | 
						|
		bg = getnum(&s, "D", &err);
 | 
						|
		if (err)
 | 
						|
		{
 | 
						|
			error("Missing bg color in -D", NULL_PARG);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (*s != '\0')
 | 
						|
		error("Extra characters at end of -D option", NULL_PARG);
 | 
						|
	*fg_color = fg;
 | 
						|
	*bg_color = bg;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for the -D option.
 | 
						|
 */
 | 
						|
	/*ARGSUSED*/
 | 
						|
	public void
 | 
						|
opt_D(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		switch (*s++)
 | 
						|
		{
 | 
						|
		case 'n':
 | 
						|
			colordesc(s, &nm_fg_color, &nm_bg_color);
 | 
						|
			break;
 | 
						|
		case 'd':
 | 
						|
			colordesc(s, &bo_fg_color, &bo_bg_color);
 | 
						|
			break;
 | 
						|
		case 'u':
 | 
						|
			colordesc(s, &ul_fg_color, &ul_bg_color);
 | 
						|
			break;
 | 
						|
		case 'k':
 | 
						|
			colordesc(s, &bl_fg_color, &bl_bg_color);
 | 
						|
			break;
 | 
						|
		case 's':
 | 
						|
			colordesc(s, &so_fg_color, &so_bg_color);
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			error("-D must be followed by n, d, u, k or s", NULL_PARG);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		if (type == TOGGLE)
 | 
						|
		{
 | 
						|
			at_enter(AT_STANDOUT);
 | 
						|
			at_exit();
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for the -x option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_x(type, s)
 | 
						|
	int type;
 | 
						|
	register char *s;
 | 
						|
{
 | 
						|
	extern int tabstops[];
 | 
						|
	extern int ntabstops;
 | 
						|
	extern int tabdefault;
 | 
						|
	char msg[60+(4*TABSTOP_MAX)];
 | 
						|
	int i;
 | 
						|
	PARG p;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		/* Start at 1 because tabstops[0] is always zero. */
 | 
						|
		for (i = 1;  i < TABSTOP_MAX;  )
 | 
						|
		{
 | 
						|
			int n = 0;
 | 
						|
			s = skipsp(s);
 | 
						|
			while (*s >= '0' && *s <= '9')
 | 
						|
				n = (10 * n) + (*s++ - '0');
 | 
						|
			if (n > tabstops[i-1])
 | 
						|
				tabstops[i++] = n;
 | 
						|
			s = skipsp(s);
 | 
						|
			if (*s++ != ',')
 | 
						|
				break;
 | 
						|
		}
 | 
						|
		if (i < 2)
 | 
						|
			return;
 | 
						|
		ntabstops = i;
 | 
						|
		tabdefault = tabstops[ntabstops-1] - tabstops[ntabstops-2];
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		strcpy(msg, "Tab stops ");
 | 
						|
		if (ntabstops > 2)
 | 
						|
		{
 | 
						|
			for (i = 1;  i < ntabstops;  i++)
 | 
						|
			{
 | 
						|
				if (i > 1)
 | 
						|
					strcat(msg, ",");
 | 
						|
				sprintf(msg+strlen(msg), "%d", tabstops[i]);
 | 
						|
			}
 | 
						|
			sprintf(msg+strlen(msg), " and then ");
 | 
						|
		}
 | 
						|
		sprintf(msg+strlen(msg), "every %d spaces",
 | 
						|
			tabdefault);
 | 
						|
		p.p_string = msg;
 | 
						|
		error("%s", &p);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Handler for the -" option.
 | 
						|
 */
 | 
						|
	public void
 | 
						|
opt_quote(type, s)
 | 
						|
	int type;
 | 
						|
	register char *s;
 | 
						|
{
 | 
						|
	char buf[3];
 | 
						|
	PARG parg;
 | 
						|
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case INIT:
 | 
						|
	case TOGGLE:
 | 
						|
		if (s[0] == '\0')
 | 
						|
		{
 | 
						|
			openquote = closequote = '\0';
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		if (s[1] != '\0' && s[2] != '\0')
 | 
						|
		{
 | 
						|
			error("-\" must be followed by 1 or 2 chars", NULL_PARG);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		openquote = s[0];
 | 
						|
		if (s[1] == '\0')
 | 
						|
			closequote = openquote;
 | 
						|
		else
 | 
						|
			closequote = s[1];
 | 
						|
		break;
 | 
						|
	case QUERY:
 | 
						|
		buf[0] = openquote;
 | 
						|
		buf[1] = closequote;
 | 
						|
		buf[2] = '\0';
 | 
						|
		parg.p_string = buf;
 | 
						|
		error("quotes %s", &parg);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * "-?" means display a help message.
 | 
						|
 * If from the command line, exit immediately.
 | 
						|
 */
 | 
						|
	/*ARGSUSED*/
 | 
						|
	public void
 | 
						|
opt_query(type, s)
 | 
						|
	int type;
 | 
						|
	char *s;
 | 
						|
{
 | 
						|
	switch (type)
 | 
						|
	{
 | 
						|
	case QUERY:
 | 
						|
	case TOGGLE:
 | 
						|
		error("Use \"h\" for help", NULL_PARG);
 | 
						|
		break;
 | 
						|
	case INIT:
 | 
						|
		dohelp = 1;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Get the "screen window" size.
 | 
						|
 */
 | 
						|
	public int
 | 
						|
get_swindow()
 | 
						|
{
 | 
						|
	if (swindow > 0)
 | 
						|
		return (swindow);
 | 
						|
	return (sc_height + swindow);
 | 
						|
}
 | 
						|
 |