mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-22 14:30:29 +00:00
784e3de7cd
passwd, ps, purge, shutdown, stty, upper, and vi. These sources are for the versions of the utils shipped with GNO v2.0.4.
382 lines
5.7 KiB
C
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*/
|
|
}
|
|
}
|