move(xlines - 1, x + wcswidth(buf, pos));
r = get_wch(ch);
- if (r != ERR) {
- if (r == OK) {
- switch (*ch) {
- case KEY_ENTER: // fallthrough
- case '\n': // fallthrough
- case '\r':
- goto END;
- case 127: // fallthrough
- case '\b': /* rhel25 sends '\b' for backspace */
- if (pos > 0) {
- memmove(buf + pos - 1, buf + pos,
- (len - pos) * WCHAR_T_WIDTH);
- --len, --pos;
- } // fallthrough
- case '\t': /* TAB breaks cursor position, ignore it */
- continue;
- case CONTROL('L'):
- printprompt(prompt);
- len = pos = 0;
- continue;
- case CONTROL('A'):
- pos = 0;
- continue;
- case CONTROL('E'):
- pos = len;
- continue;
- case CONTROL('U'):
- printprompt(prompt);
- memmove(buf, buf + pos, (len - pos) * WCHAR_T_WIDTH);
- len -= pos;
- pos = 0;
- continue;
- case 27: /* Exit prompt on Escape */
- len = 0;
- goto END;
- }
+ if (r == ERR)
+ continue;
- /* Filter out all other control chars */
- if (*ch < ASCII_MAX && keyname(*ch)[0] == '^')
- continue;
+ if (r == OK) {
+ switch (*ch) {
+ case KEY_ENTER: // fallthrough
+ case '\n': // fallthrough
+ case '\r':
+ goto END;
+ case 127: // fallthrough
+ case '\b': /* rhel25 sends '\b' for backspace */
+ if (pos > 0) {
+ memmove(buf + pos - 1, buf + pos,
+ (len - pos) * WCHAR_T_WIDTH);
+ --len, --pos;
+ } // fallthrough
+ case '\t': /* TAB breaks cursor position, ignore it */
+ continue;
+ case CONTROL('L'):
+ printprompt(prompt);
+ len = pos = 0;
+ continue;
+ case CONTROL('A'):
+ pos = 0;
+ continue;
+ case CONTROL('E'):
+ pos = len;
+ continue;
+ case CONTROL('U'):
+ printprompt(prompt);
+ memmove(buf, buf + pos, (len - pos) * WCHAR_T_WIDTH);
+ len -= pos;
+ pos = 0;
+ continue;
+ case 27: /* Exit prompt on Escape */
+ len = 0;
+ goto END;
+ }
+
+ /* Filter out all other control chars */
+ if (*ch < ASCII_MAX && keyname(*ch)[0] == '^')
+ continue;
- if (pos < READLINE_MAX - 1) {
- memmove(buf + pos + 1, buf + pos,
+ if (pos < READLINE_MAX - 1) {
+ memmove(buf + pos + 1, buf + pos,
+ (len - pos) * WCHAR_T_WIDTH);
+ buf[pos] = *ch;
+ ++len, ++pos;
+ continue;
+ }
+ } else {
+ switch (*ch) {
+#ifdef KE
+ case KEY_RESIZE:
+ clearoldprompt();
+ xlines = LINES;
+ printprompt(prompt);
+ break;
+#endif
+ case KEY_LEFT:
+ if (pos > 0)
+ --pos;
+ break;
+ case KEY_RIGHT:
+ if (pos < len)
+ ++pos;
+ break;
+ case KEY_BACKSPACE:
+ if (pos > 0) {
+ memmove(buf + pos - 1, buf + pos,
(len - pos) * WCHAR_T_WIDTH);
- buf[pos] = *ch;
- ++len, ++pos;
- continue;
+ --len, --pos;
}
- } else {
- switch (*ch) {
-#ifdef KEY_RESIZE
- case KEY_RESIZE:
- clearoldprompt();
- xlines = LINES;
- printprompt(prompt);
- break;
-#endif
- case KEY_LEFT:
- if (pos > 0)
- --pos;
- break;
- case KEY_RIGHT:
- if (pos < len)
- ++pos;
- break;
- case KEY_BACKSPACE:
- if (pos > 0) {
- memmove(buf + pos - 1, buf + pos,
- (len - pos) * WCHAR_T_WIDTH);
- --len, --pos;
- }
- break;
- case KEY_DC:
- if (pos < len) {
- memmove(buf + pos, buf + pos + 1,
- (len - pos - 1) * WCHAR_T_WIDTH);
- --len;
- }
- break;
- case KEY_END:
- pos = len;
- break;
- case KEY_HOME:
- pos = 0;
- break;
- default:
- break;
+ break;
+ case KEY_DC:
+ if (pos < len) {
+ memmove(buf + pos, buf + pos + 1,
+ (len - pos - 1) * WCHAR_T_WIDTH);
+ --len;
}
+ break;
+ case KEY_END:
+ pos = len;
+ break;
+ case KEY_HOME:
+ pos = 0;
+ break;
+ default:
+ break;
}
}
}