static const FLASH struct fkey_tbl_s fkey_table[] = {
FKEY_TBL_ITEM(B, KEY_DOWN), // Down arrow key
static const FLASH struct fkey_tbl_s fkey_table[] = {
FKEY_TBL_ITEM(B, KEY_DOWN), // Down arrow key
-FKEY_TBL_ITEM(3~, KEY_DC), // Delete character key
-FKEY_TBL_ITEM(2~, KEY_IC), // Ins char/toggle ins mode key
-FKEY_TBL_ITEM(6~, KEY_NPAGE), // Next-page key
-FKEY_TBL_ITEM(5~, KEY_PPAGE), // Previous-page key
+FKEY_TBL_ITEM(3~, KEY_DC), // Delete character key
+FKEY_TBL_ITEM(2~, KEY_IC), // Ins char/toggle ins mode key
+FKEY_TBL_ITEM(6~, KEY_NPAGE), // Next-page key
+FKEY_TBL_ITEM(5~, KEY_PPAGE), // Previous-page key
FKEY_TBL_ITEM(4~, KEY_END), // End key
FKEY_TBL_ITEM(Z, KEY_BTAB), // Back tab key
FKEY_TBL_ITEM(4~, KEY_END), // End key
FKEY_TBL_ITEM(Z, KEY_BTAB), // Back tab key
/* VT400: */
FKEY_TBL_ITEM(11~, KEY_F(1)), // Function key F1
FKEY_TBL_ITEM(12~, KEY_F(2)), // Function key F2
FKEY_TBL_ITEM(13~, KEY_F(3)), // Function key F3
FKEY_TBL_ITEM(14~, KEY_F(4)), // Function key F4
FKEY_TBL_ITEM(15~, KEY_F(5)), // Function key F5
/* VT400: */
FKEY_TBL_ITEM(11~, KEY_F(1)), // Function key F1
FKEY_TBL_ITEM(12~, KEY_F(2)), // Function key F2
FKEY_TBL_ITEM(13~, KEY_F(3)), // Function key F3
FKEY_TBL_ITEM(14~, KEY_F(4)), // Function key F4
FKEY_TBL_ITEM(15~, KEY_F(5)), // Function key F5
FKEY_TBL_ITEM([A, KEY_F(1)), // Function key F1
FKEY_TBL_ITEM([B, KEY_F(2)), // Function key F2
FKEY_TBL_ITEM([C, KEY_F(3)), // Function key F3
FKEY_TBL_ITEM([A, KEY_F(1)), // Function key F1
FKEY_TBL_ITEM([B, KEY_F(2)), // Function key F2
FKEY_TBL_ITEM([C, KEY_F(3)), // Function key F3
FKEY_TBL_ITEM(18~, KEY_F(7)), // Function key F7
FKEY_TBL_ITEM(19~, KEY_F(8)), // Function key F8
FKEY_TBL_ITEM(20~, KEY_F(9)), // Function key F9
FKEY_TBL_ITEM(18~, KEY_F(7)), // Function key F7
FKEY_TBL_ITEM(19~, KEY_F(8)), // Function key F8
FKEY_TBL_ITEM(20~, KEY_F(9)), // Function key F9
-FKEY_TBL_ITEM(21~, KEY_F(10)), // Function key F10
-FKEY_TBL_ITEM(23~, KEY_F(11)), // Function key F11
-FKEY_TBL_ITEM(24~, KEY_F(12)), // Function key F12
+FKEY_TBL_ITEM(21~, KEY_F(10)), // Function key F10
+FKEY_TBL_ITEM(23~, KEY_F(11)), // Function key F11
+FKEY_TBL_ITEM(24~, KEY_F(12)), // Function key F12
-static void putnstr(char *str, int n)
+
+struct hist_node_s {
+ struct hist_node_s *next;
+ char line[];
+};
+typedef struct hist_node_s hist_node;
+
+
+static hist_node *hist_head;
+static hist_node *hist_cur;
+
+static void hist_reset(void)
-#define CTL_CH(c) ((c) - 'a' + 1)
-#define CTL_BACKSPACE ('\b')
-#define DEL ((char)255)
-#define DEL7 ((char)127)
+ while (p && strcmp(p->line, line))
+ p = p->next;
+ return p;
+}
+
+#if 0
+static hist_node *hist_insert(char *line)
+{
+ hist_node *p = (hist_node *) malloc(sizeof (hist_node) + strlen(line) + 1);
+
+ if (p) {
+ strcpy(p->line, line);
+ p->next = hist_head;
+ hist_head = p;
+ }
+ return p;
+}
+#endif
-#define getcmd_putch(ch) putchar(ch)
-#define getcmd_getch() vt_parse()
-#define getcmd_cbeep() getcmd_putch('\a')
+static hist_node *hist_new(char *line)
+{
+ hist_node *p = (hist_node *) malloc(sizeof (hist_node) + strlen(line) + 1);
-static int_fast8_t hist_max;
-static int_fast8_t hist_add_idx;
-static int_fast8_t hist_cur = -1;
+static hist_node *hist_delete(void)
+{
+ hist_node *p = NULL;
+ hist_node *q = hist_head;
- char *p = strdup(line);
- if (p) {
- free(hist_list[hist_add_idx]);
- hist_list[hist_add_idx] = p;
+static uint_fast8_t hist_count(void)
+{
+ hist_node *p = hist_head;
+ uint_fast8_t n = 0;
+
+ while (p) {
+ ++n;
+ p = p->next;
+ }
+ return n;
+}
- if (hist_cur == hist_add_idx) {
- hist_cur = old_cur;
- ret = NULL;
- } else {
- ret = hist_list[hist_cur];
+static char *hist_next(void)
+{
+ hist_node *p = NULL;
+ hist_node *q = hist_head;
+
+ if(q == hist_cur)
+ return NULL;
+
+ while(q->next != hist_cur) {
+ p = q;
+ q = q->next;
- if (hist_cur == hist_add_idx)
+ while (p->next && strncmp(p->line, buf, num))
+ p = p->next;
+
+ if(!strncmp(p->line, buf, num)) {
+ hist_cur = p->next;
+ return p->line;
+ }
+ return NULL;
+}
+
+static char *hist_search_forward (char* buf, uint8_t num)
+{
+ hist_node *p = NULL;
+ hist_node *match = NULL;
+ hist_node *q = hist_head;
+
+ if(q == hist_cur)
-#define ERASE_TO_EOL() { \
- if (num < eol_num) { \
- /* printf_P(PSTR("%*S"), (int)(eol_num - num), PSTR("")); */ \
- print_blanks(eol_num - num); \
- do { \
- getcmd_putch(CTL_BACKSPACE); \
- } while (--eol_num > num); \
- } \
+static void erase_to_eol(uint_fast8_t *num, uint_fast8_t *eol_num)
+{
+ if (*num < *eol_num) {
+ /* printf_P(PSTR("%*S"), (int)(*eol_num - *num), PSTR("")); */
+ print_blanks(*eol_num - *num);
+ do {
+ getcmd_putch(CTL_BACKSPACE);
+ } while (--(*eol_num) > *num);
+ }
-#define REFRESH_TO_EOL() { \
- if (num < eol_num) { \
- wlen = eol_num - num; \
- putnstr(buf + num, wlen); \
- num = eol_num; \
- } \
+static void refresh_to_eol(char *buf, uint_fast8_t *num, uint_fast8_t *eol_num)
+{
+ if (*num < *eol_num) {
+ uint_fast8_t wlen = *eol_num - *num;
+ putnstr(buf + *num, wlen);
+ *num = *eol_num;
+ }
}
static void cread_add_char(char ichar, bool insert, uint_fast8_t *num,
}
static void cread_add_char(char ichar, bool insert, uint_fast8_t *num,
-static void cread_add_str(char *str, int strsize, bool insert,
- uint_fast8_t *num, uint_fast8_t *eol_num,
- char *buf, uint_fast8_t len)
+static void cread_add_str(char *str, bool insert, uint_fast8_t *num,
+ uint_fast8_t *eol_num, char *buf, uint_fast8_t len)
- while (strsize--) {
- cread_add_char(*str, insert, num, eol_num, buf, len);
- str++;
- }
+ char c;
+
+ while ((c = *str++) != '\0')
+ cread_add_char(c, insert, num, eol_num, buf, len);
- if (init_len)
- cread_add_str(buf, init_len, 1, &num, &eol_num, buf, *len);
+ if (buf[0])
+ cread_add_str(buf, 1, &num, &eol_num, buf, len);
+
+ hist_reset();
if (wlen) {
memmove(&buf[num], &buf[num+1], wlen);
putnstr(buf + num, wlen);
if (wlen) {
memmove(&buf[num], &buf[num+1], wlen);
putnstr(buf + num, wlen);
memmove(&buf[num], &buf[num+1], wlen);
getcmd_putch(CTL_BACKSPACE);
putnstr(buf + num, wlen);
memmove(&buf[num], &buf[num+1], wlen);
getcmd_putch(CTL_BACKSPACE);
putnstr(buf + num, wlen);
+ beginning_of_line(&num);
+ /* overwrite current line */
+ cread_add_str(hline, 0, &num, &eol_num, buf, len);
+ erase_to_eol(&num, &eol_num);
+
+ } else {
+ getcmd_cbeep();
+ }
+ } else {
+ getcmd_cbeep();
+ }
+ break;
+ case KEY_PPAGE: /* history-search-backward */
+ case KEY_NPAGE: /* history-search-forward */
+ if (enable_history) {
+ char *hline;
+ if (ichar == KEY_PPAGE)
+ hline = hist_search_backward(buf, num);
+ else
+ hline = hist_search_forward(buf, num);
- /* copy new line into place and display */
- strcpy(buf, hline);
- eol_num = strlen(buf);
- REFRESH_TO_EOL();
+ if (hline) {
+ uint_fast8_t num2 = num;
+ /* overwrite current line from cursor position */
+ cread_add_str(hline+num, 0, &num2, &eol_num, buf, len);
+ /* erase to end of line */
+ erase_to_eol(&num2, &eol_num);
+ /* cursor back */
+ while (num2-- > num)
+ getcmd_putch(CTL_BACKSPACE);
- cread_add_char(ichar, insert, &num, &eol_num, buf,
- *len);
+ cread_add_char(ichar, insert, &num, &eol_num, buf, len);
-static int cli_readline_into_buffer(const FLASH char *const prompt,
- char *buffer, bool enable_history)
-{
- char *p = buffer;
- uint_fast8_t len = CONFIG_SYS_CBSIZE;
- int rc;
-
- if (prompt)
- my_puts_P(prompt);
-
- rc = cread_line(prompt, p, &len, enable_history);
- return rc < 0 ? rc : (int) len;
-}
-
- return cli_readline_into_buffer(prompt, console_buffer, enable_history);
+ if (prompt)
+ my_puts_P(prompt);
+
+ return cread_line(prompt, console_buffer, CONFIG_SYS_CBSIZE, enable_history);