| #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. |
| * |
| */ |