gno/bin/less/optfunc.c
gdr-ftp 784e3de7cd Initial checkin of aroff, binprint, center, less, ls, make, makemake,
passwd, ps, purge, shutdown, stty, upper, and vi.  These sources are
for the versions of the utils shipped with GNO v2.0.4.
1998-03-09 08:30:21 +00:00

382 lines
5.7 KiB
C

/*
* 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.
*/
#pragma noroot
#include "less.h"
#include "option.h"
#ifdef _ORCAC_
segment "LoadSegONE";
#endif
extern int nbufs;
extern int ispipe;
extern int cbufs;
extern int pr_type;
extern int nohelp;
extern int plusoption;
extern char *prproto[];
extern char *eqproto;
extern IFILE curr_ifile;
#if LOGFILE
extern char *namelogfile;
extern int force_logfile;
extern int logfile;
extern char *glob();
#endif
#if TAGS
public int tagoption = 0;
extern char *tagfile;
extern char *tagpattern;
extern char *tags;
#endif
#if __MSDOS__
public char *window_box = NULL;
extern int directvideo;
extern int output_mode;
#endif
#if LOGFILE
/*
* Handler for -o option.
*/
public void
opt_o(type, s)
int type;
char *s;
{
PARG parg;
switch (type)
{
case INIT:
namelogfile = s;
break;
case TOGGLE:
if (!ispipe)
{
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 = glob(s);
if (namelogfile == NULL)
namelogfile = save(s);
use_logfile(s);
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 = 1;
opt_o(type, s);
}
/*
* Handlers for obsolete -l and -L options.
*/
public void
opt_l(type, s)
int type;
char *s;
{
error("The -l option is obsolete. Use -o", NULL_PARG);
}
public void
opt__L(type, s)
int type;
char *s;
{
error("The -L option is obsolete. Use -O", NULL_PARG);
}
#endif
#if USERFILE
public void
opt_k(type, s)
int type;
char *s;
{
PARG parg;
switch (type)
{
case INIT:
if (add_cmdtable(s))
{
parg.p_string = s;
error("Cannot use lesskey file \"%s\"", &parg);
}
break;
case QUERY:
case TOGGLE:
error("Cannot query the -k flag", NULL_PARG);
break;
}
}
#endif
#if TAGS
/*
* Handler for -t option.
*/
public void
opt_t(type, s)
int type;
char *s;
{
char *curr_filename;
switch (type)
{
case INIT:
tagoption = 1;
findtag(s);
break;
case TOGGLE:
findtag(skipsp(s));
if (tagfile != NULL)
{
curr_filename = get_filename(curr_ifile);
if (edit(tagfile, 0) == 0)
if (tagsearch())
(void) edit(curr_filename, 0);
}
break;
case QUERY:
error("Tag is required after -t", NULL_PARG);
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 = glob(s);
if (tags == NULL)
tags = save(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 = 1;
ungetsc(s);
ungetsc("/");
break;
case QUERY:
error("Pattern is required after -p", NULL_PARG);
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 'm': proto = &prproto[PR_MEDIUM]; s++; break;
case 'M': proto = &prproto[PR_LONG]; s++; break;
case '=': proto = &eqproto; s++; break;
default: proto = &prproto[pr_type]; 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 TOGGLE:
case QUERY:
/*
* Allocate the new number of buffers.
*/
cbufs = ch_nbuf(cbufs);
break;
case INIT:
break;
}
}
#if __MSDOS__
/*
* Handler for -v option. (use BIOS or direct video)
*/
public void
opt_v(type, s)
int type;
register char *s;
{
switch (type)
{
case INIT:
case TOGGLE:
if (output_mode == 2)
directvideo = 1;
else
directvideo = 0;
break;
case QUERY:
break;
}
}
/*
* Handler for -W option. (set/modify window boundaries)
*/
public void
opt_W(type, s)
int type;
register char *s;
{
PARG parg;
switch (type)
{
case INIT:
window_box = save(s);
break; /* get_term will take care of actually setting window */
#ifdef MOVE_WINDOW
case TOGGLE:
if (window_box != NULL)
free(window_box);
window_box = save(s);
reset_window();
break;
#endif
case QUERY:
parg.p_string = window_box;
error("%s", &parg);
break;
}
}
#endif
/*
* "-?" means display a help message.
* If from the command line, exit immediately.
*/
/*ARGSUSED*/
public void
opt_query(type, s)
int type;
char *s;
{
if (nohelp)
return;
switch (type)
{
case QUERY:
case TOGGLE:
error("Use \"h\" for help", NULL_PARG);
break;
case INIT:
raw_mode(1);
init();
help();
quit(0);
/*NOTREACHED*/
}
}