mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/linenoise_calculates_negative_prompt_len_v5.2' into 'release/v5.2'
fix(console): Fixed linenoise prompt length calculation (v5.2) See merge request espressif/esp-idf!28526
This commit is contained in:
commit
6b6ca2d1ca
@ -804,6 +804,23 @@ uint32_t getMillis(void) {
|
|||||||
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
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.
|
/* 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
|
* It expects 'fd' to be already in "raw mode" so that every key pressed
|
||||||
* will be returned ASAP to read().
|
* will be returned ASAP to read().
|
||||||
@ -839,15 +856,16 @@ static int linenoiseEdit(char *buf, size_t buflen, const char *prompt)
|
|||||||
* initially is just an empty string. */
|
* initially is just an empty string. */
|
||||||
linenoiseHistoryAdd("");
|
linenoiseHistoryAdd("");
|
||||||
|
|
||||||
int pos1 = getCursorPosition();
|
|
||||||
if (write(out_fd, prompt,l.plen) == -1) {
|
if (write(out_fd, prompt,l.plen) == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
flushWrite();
|
flushWrite();
|
||||||
int pos2 = getCursorPosition();
|
|
||||||
if (pos1 >= 0 && pos2 >= 0) {
|
/* If the prompt has been registered with ANSI escape sequences
|
||||||
l.plen = pos2 - pos1;
|
* for terminal colors then we remove them from the prompt length
|
||||||
}
|
* calculation. */
|
||||||
|
l.plen = prompt_len_ignore_escape_seq(prompt);
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
char c;
|
char c;
|
||||||
int nread;
|
int nread;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user