gno/bin/less/cmdbuf.c

146 lines
2.2 KiB
C
Raw Normal View History

/*
* 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);
}