mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-22 14:30:29 +00:00
146 lines
2.2 KiB
C
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);
|
||
|
}
|