acassis commented on code in PR #3657:
URL: https://github.com/apache/nuttx-apps/pull/3657#discussion_r3644814225
##########
system/readline/readline_common.c:
##########
@@ -670,55 +1350,175 @@ ssize_t readline_common(FAR struct rl_common_s *vtbl,
FAR char *buf,
else if (ch == '\n')
{
-#ifdef CONFIG_READLINE_CMD_HISTORY
- /* Save history of command, only if there was something
- * typed besides return character.
- */
+ return submit_line(buf, nch);
+ }
- if (nch >= 1)
- {
- /* If this command is the one at the top of the circular
- * buffer, don't save it again.
- */
+ /* Emacs-style control keys */
- if (strncmp(buf, g_cmdhist.buf[g_cmdhist.head], nch + 1) != 0)
+#ifdef CONFIG_READLINE_EDIT_EMACS
+ else if (ch == CTRL_A) /* Ctrl+A = Home */
+ {
+ cursor = 0;
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == CTRL_B) /* Ctrl+B = Left */
+ {
+ if (cursor > 0)
+ {
+ cursor--;
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
+ else if (ch == CTRL_D) /* Ctrl+D = Delete at cursor */
+ {
+ if (cursor < nch)
+ {
+ int k;
+ for (k = cursor + 1; k < nch; k++)
+ buf[k - 1] = buf[k];
+ nch--;
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
{
- g_cmdhist.head = (g_cmdhist.head + 1) % RL_CMDHIST_LEN;
-
- for (i = 0; (i < nch) && i < (RL_CMDHIST_LINELEN - 1); i++)
- {
- g_cmdhist.buf[g_cmdhist.head][i] = buf[i];
- }
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
+ }
+ else if (ch == CTRL_E) /* Ctrl+E = End */
+ {
+ while (cursor < nch)
+ {
+ cursor++;
+ RL_WRITE(vtbl, g_curright, sizeof(g_curright));
+ }
+ }
+ else if (ch == CTRL_F) /* Ctrl+F = Right */
+ {
+ if (cursor < nch)
+ {
+ cursor++;
+ RL_WRITE(vtbl, g_curright, sizeof(g_curright));
+ }
+ }
+ else if (ch == CTRL_K) /* Ctrl+K = Kill to EOL */
+ {
+ nch = cursor;
+ buf[nch] = '\0';
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ }
+ else if (ch == CTRL_U) /* Ctrl+U = Kill to BOL */
+ {
+ int j;
+ for (j = cursor; j < nch; j++)
+ buf[j - cursor] = buf[j];
+ nch -= cursor;
+ cursor = 0;
+ buf[nch] = '\0';
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == CTRL_W) /* Ctrl+W = Kill word backward (FIXME)
*/
+ {
+ int start, k;
+ start = cursor;
+ while (start > 0 && buf[start - 1] == ' ')
+ start--;
+ while (start > 0 && buf[start - 1] != ' ')
+ start--;
+ for (k = start; k < nch; k++)
+ buf[k - (cursor - start)] = buf[k];
+ nch -= (cursor - start);
+ cursor = start;
+ buf[nch] = '\0';
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
+ {
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
- g_cmdhist.buf[g_cmdhist.head][i] = '\0';
+#ifdef CONFIG_READLINE_EDIT_EMACS_REVERSE_SEARCH
+ else if (ch == CTRL_R && g_cmdhist.len > 0)
+ {
+ /* Ctrl+R = start a reverse incremental search through the
+ * command history, bash-style. Save the line currently
+ * being edited so it can be restored if the search is
+ * cancelled (Ctrl+G).
+ */
- if (g_cmdhist.len < RL_CMDHIST_LEN)
- {
- g_cmdhist.len++;
- }
- }
+ insearch = true;
+ searchlen = 0;
+ searchoffset = 1;
- g_cmdhist.offset = 1;
+ savednch = nch;
+ if (savednch > RL_CMDHIST_LINELEN - 1)
+ {
+ savednch = RL_CMDHIST_LINELEN - 1;
}
-#endif /* CONFIG_READLINE_CMD_HISTORY */
- /* The newline is stored in the buffer along with the null
- * terminator.
- */
+ for (i = 0; i < savednch; i++)
+ {
+ savedbuf[i] = buf[i];
+ }
- buf[nch++] = '\n';
- buf[nch] = '\0';
+ savedcursor = cursor;
+ nch = 0;
- return nch;
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch, false);
+#endif
}
+#endif /* CONFIG_READLINE_EDIT_EMACS_REVERSE_SEARCH */
+#endif /* CONFIG_READLINE_EDIT_EMACS */
/* Otherwise, put the character in the line buffer if the
* character is not a control byte
*/
else if (!iscntrl(ch & 0xff))
{
+#ifdef CONFIG_READLINE_EDIT
+ /* Defensive check: 'cursor' must always satisfy
+ * 0 <= cursor <= nch. It should never be able to get out of
+ * that range now, but clamp it rather than trust it blindly
+ * -- indexing buf[] with an out-of-range cursor is a
+ * memory-safety bug (a stale cursor previously let this
+ * write arbitrarily far past the end of the caller's
+ * buffer).
+ */
+
+ if (cursor < 0 || cursor > nch)
+ {
+ cursor = nch;
+ }
+
+ /* Only insert if there is room for the new character plus
+ * the line's null terminator. Checking this before writing
+ * (rather than only after, as the non-editing path below
+ * does) is what actually prevents the out-of-bounds write.
+ */
+
+ if (nch + 1 < buflen)
+ {
+ int j;
+ for (j = nch; j > cursor; j--) buf[j] = buf[j - 1];
Review Comment:
ok
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]