gno/bin/less/cmdbuf.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

146 lines
2.2 KiB
C

/*
* Functions which manipulate the command buffer.
* Used only by command() and related functions.
*/
#pragma noroot
#include "less.h"
#ifdef _ORCAC_
segment "LoadSegONE";
#endif
extern int erase_char, kill_char;
extern int sc_width;
static char cmdbuf[120]; /* Buffer for holding a multi-char command */
static int cmd_col; /* Current column of the multi-char command */
static char *cp; /* Pointer into cmdbuf */
/*
* Reset command buffer (to empty).
*/
public void
cmd_reset(void)
{
cp = cmdbuf;
*cp = '\0';
cmd_col = 0;
}
/*
* How many characters are in the command buffer?
*/
public int
len_cmdbuf(void)
{
return (cp - cmdbuf);
}
/*
* Backspace in the command buffer.
*/
public int
cmd_erase(void)
{
register char *s;
if (cp == cmdbuf)
/*
* Backspace past beginning of the string:
* this usually means abort the command.
*/
return (1);
--cp;
if (*cp == ESC)
s = "ESC";
else
s = prchar(*cp);
while (*s++ != '\0')
{
backspace();
cmd_col--;
}
*cp = '\0';
return (0);
}
/*
* Process a single character of a multi-character command, such as
* a number, or the pattern of a search command.
*/
public int
cmd_char(c)
int c;
{
char *s;
if (c == erase_char)
{
if (cmd_erase())
return (1);
} else if (c == kill_char)
{
/* {{ Could do this faster, but who cares? }} */
while (cmd_erase() == 0)
;
} else if (cp >= &cmdbuf[sizeof(cmdbuf)-1])
{
/*
* No room in the command buffer.
*/
bell();
} else if (cmd_col >= sc_width-4)
{
/*
* No room on the screen.
* {{ Could get fancy here; maybe shift the displayed
* line and make room for more chars, like ksh. }}
*/
bell();
} else
{
/*
* Append the character to the string.
*/
*cp++ = c;
*cp = '\0';
if (c == ESC)
s = "ESC";
else
s = prchar(c);
putstr(s);
cmd_col += strlen(s);
}
return (0);
}
/*
* Return the number currently in the command buffer.
*/
public int
cmd_int(void)
{
return (atoi(cmdbuf));
}
/*
* Display a string, usually as a prompt for input into the command buffer.
*/
public void
cmd_putstr(s)
char *s;
{
putstr(s);
cmd_col += strlen(s);
}
/*
* Return a pointer to the command buffer.
*/
public char *
get_cmdbuf(void)
{
return (cmdbuf);
}