151 lines
3 KiB
C
151 lines
3 KiB
C
#include <common.h>
|
|
#include <watchdog.h>
|
|
|
|
static char erase_seq[] = "\b \b"; /* erase sequence */
|
|
static char tab_seq[] = " "; /* used to expand TABs */
|
|
|
|
static char * delete_char (char *buffer, char *p, int *colp, int *np, int plen)
|
|
{
|
|
char *s;
|
|
|
|
if (*np == 0) {
|
|
return (p);
|
|
}
|
|
|
|
if (*(--p) == '\t') { /* will retype the whole line */
|
|
while (*colp > plen) {
|
|
puts (erase_seq);
|
|
(*colp)--;
|
|
}
|
|
for (s=buffer; s<p; ++s) {
|
|
if (*s == '\t') {
|
|
puts (tab_seq+((*colp) & 07));
|
|
*colp += 8 - ((*colp) & 07);
|
|
} else {
|
|
++(*colp);
|
|
putchar (*s);
|
|
}
|
|
}
|
|
} else {
|
|
puts (erase_seq);
|
|
(*colp)--;
|
|
}
|
|
(*np)--;
|
|
return (p);
|
|
}
|
|
|
|
/*
|
|
* Prompt for input and read a line.
|
|
* If CONFIG_BOOT_RETRY_TIME is defined and retry_time >= 0,
|
|
* time out when time goes past endtime (timebase time in ticks).
|
|
* Return: number of read characters
|
|
* -1 if break
|
|
* -2 if timed out
|
|
*/
|
|
int readline (const char *prompt, char *line, int len)
|
|
{
|
|
char *p = line;
|
|
int n = 0; /* buffer index */
|
|
int plen = 0; /* prompt length */
|
|
int col; /* output column cnt */
|
|
char c;
|
|
|
|
/* print prompt */
|
|
if (prompt) {
|
|
plen = strlen (prompt);
|
|
puts (prompt);
|
|
}
|
|
col = plen;
|
|
|
|
for (;;) {
|
|
#ifdef CONFIG_BOOT_RETRY_TIME
|
|
while (!tstc()) { /* while no incoming data */
|
|
if (retry_time >= 0 && get_ticks() > endtime)
|
|
return (-2); /* timed out */
|
|
}
|
|
#endif
|
|
WATCHDOG_RESET(); /* Trigger watchdog, if needed */
|
|
|
|
#ifdef CONFIG_SHOW_ACTIVITY
|
|
while (!tstc()) {
|
|
extern void show_activity(int arg);
|
|
show_activity(0);
|
|
}
|
|
#endif
|
|
c = getc();
|
|
|
|
/*
|
|
* Special character handling
|
|
*/
|
|
switch (c) {
|
|
case '\r': /* Enter */
|
|
case '\n':
|
|
*p = '\0';
|
|
puts ("\r\n");
|
|
return (p - line);
|
|
|
|
case '\0': /* nul */
|
|
continue;
|
|
|
|
case 0x03: /* ^C - break */
|
|
line[0] = '\0'; /* discard input */
|
|
return (-1);
|
|
|
|
case 0x15: /* ^U - erase line */
|
|
while (col > plen) {
|
|
puts (erase_seq);
|
|
--col;
|
|
}
|
|
p = line;
|
|
n = 0;
|
|
continue;
|
|
|
|
case 0x17: /* ^W - erase word */
|
|
p=delete_char(line, p, &col, &n, plen);
|
|
while ((n > 0) && (*p != ' ')) {
|
|
p=delete_char(line, p, &col, &n, plen);
|
|
}
|
|
continue;
|
|
|
|
case 0x08: /* ^H - backspace */
|
|
case 0x7F: /* DEL - backspace */
|
|
p=delete_char(line, p, &col, &n, plen);
|
|
continue;
|
|
|
|
default:
|
|
/*
|
|
* Must be a normal character then
|
|
*/
|
|
if (n < CONFIG_CBSIZE-2) {
|
|
if (c == '\t') { /* expand TABs */
|
|
puts (tab_seq+(col&07));
|
|
col += 8 - (col&07);
|
|
} else {
|
|
++col; /* echo input */
|
|
putchar (c);
|
|
}
|
|
*p++ = c;
|
|
++n;
|
|
} else { /* Buffer full */
|
|
putchar ('\a');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @file
|
|
* @brief Primitiv Line Parser
|
|
*/
|
|
|
|
/** @page readline_parser Primitive Line Parser
|
|
*
|
|
* There is still a primtive line parser as a alternative to the hush shell
|
|
* environment available. This is for persons who like the old fashion way of
|
|
* edititing and command entering.
|
|
*
|
|
* Enable the "Simple parser" in "General Settings", "Select your shell" to
|
|
* get back the old console feeling.
|
|
*
|
|
*/
|