Skip to content

Commit

Permalink
Merge branch 'bugfix/linenoise_calculates_negative_prompt_len_v5.1' i…
Browse files Browse the repository at this point in the history
…nto 'release/v5.1'

fix(console): Fixed linenoise prompt length calculation (v5.1)

See merge request espressif/esp-idf!28527
  • Loading branch information
ESP-Marius committed Feb 27, 2024
2 parents ba155b0 + e2e1542 commit 51c263b
Showing 1 changed file with 23 additions and 5 deletions.
28 changes: 23 additions & 5 deletions components/console/linenoise/linenoise.c
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,23 @@ uint32_t getMillis(void) {
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

static inline size_t prompt_len_ignore_escape_seq(const char *prompt) {
size_t plen = 0;
bool in_escape_sequence = false;

for (; *prompt != '\0'; ++prompt) {
if (*prompt == '\033') {
in_escape_sequence = true;
} else if (in_escape_sequence && *prompt == 'm') {
in_escape_sequence = false;
} else if (!in_escape_sequence) {
++plen;
}
}

return plen;
}

/* This function is the core of the line editing capability of linenoise.
* It expects 'fd' to be already in "raw mode" so that every key pressed
* will be returned ASAP to read().
Expand Down Expand Up @@ -839,15 +856,16 @@ static int linenoiseEdit(char *buf, size_t buflen, const char *prompt)
* initially is just an empty string. */
linenoiseHistoryAdd("");

int pos1 = getCursorPosition();
if (write(out_fd, prompt,l.plen) == -1) {
return -1;
}
flushWrite();
int pos2 = getCursorPosition();
if (pos1 >= 0 && pos2 >= 0) {
l.plen = pos2 - pos1;
}

/* If the prompt has been registered with ANSI escape sequences
* for terminal colors then we remove them from the prompt length
* calculation. */
l.plen = prompt_len_ignore_escape_seq(prompt);

while(1) {
char c;
int nread;
Expand Down

0 comments on commit 51c263b

Please sign in to comment.