forked from espressif/esp-idf
console: make empty line behavior run-time configurable
This commit is contained in:
@@ -1,10 +0,0 @@
|
|||||||
menu "Linenoise"
|
|
||||||
|
|
||||||
config ESP_LINENOISE_RETURN_ZERO_STRING
|
|
||||||
bool "Return 0 length strings"
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
If enabled linenoise will return 0 length strings if the user presses enter with out typing
|
|
||||||
a command, if disabled NULL will be returned instead.
|
|
||||||
|
|
||||||
endmenu
|
|
@@ -116,7 +116,6 @@
|
|||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "linenoise.h"
|
#include "linenoise.h"
|
||||||
#include "sdkconfig.h"
|
|
||||||
|
|
||||||
#define LINENOISE_DEFAULT_HISTORY_MAX_LEN 100
|
#define LINENOISE_DEFAULT_HISTORY_MAX_LEN 100
|
||||||
#define LINENOISE_MAX_LINE 4096
|
#define LINENOISE_MAX_LINE 4096
|
||||||
@@ -130,6 +129,7 @@ static int dumbmode = 0; /* Dumb mode where line editing is disabled. Off by def
|
|||||||
static int history_max_len = LINENOISE_DEFAULT_HISTORY_MAX_LEN;
|
static int history_max_len = LINENOISE_DEFAULT_HISTORY_MAX_LEN;
|
||||||
static int history_len = 0;
|
static int history_len = 0;
|
||||||
static char **history = NULL;
|
static char **history = NULL;
|
||||||
|
static bool allow_empty = true;
|
||||||
|
|
||||||
/* The linenoiseState structure represents the state during line editing.
|
/* The linenoiseState structure represents the state during line editing.
|
||||||
* We pass this state to functions implementing specific editing
|
* We pass this state to functions implementing specific editing
|
||||||
@@ -888,6 +888,10 @@ static int linenoiseEdit(char *buf, size_t buflen, const char *prompt)
|
|||||||
return l.len;
|
return l.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void linenoiseAllowEmpty(bool val) {
|
||||||
|
allow_empty = val;
|
||||||
|
}
|
||||||
|
|
||||||
int linenoiseProbe(void) {
|
int linenoiseProbe(void) {
|
||||||
/* Switch to non-blocking mode */
|
/* Switch to non-blocking mode */
|
||||||
int flags = fcntl(STDIN_FILENO, F_GETFL);
|
int flags = fcntl(STDIN_FILENO, F_GETFL);
|
||||||
@@ -980,13 +984,11 @@ char *linenoise(const char *prompt) {
|
|||||||
} else {
|
} else {
|
||||||
count = linenoiseDumb(buf, LINENOISE_MAX_LINE, prompt);
|
count = linenoiseDumb(buf, LINENOISE_MAX_LINE, prompt);
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_ESP_LINENOISE_RETURN_ZERO_STRING
|
|
||||||
if (count >= 0) {
|
|
||||||
#else
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
#endif
|
|
||||||
sanitize(buf);
|
sanitize(buf);
|
||||||
count = strlen(buf);
|
count = strlen(buf);
|
||||||
|
} else if (count == 0 && allow_empty) {
|
||||||
|
/* will return an empty (0-length) string */
|
||||||
} else {
|
} else {
|
||||||
free(buf);
|
free(buf);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -43,6 +43,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct linenoiseCompletions {
|
typedef struct linenoiseCompletions {
|
||||||
size_t len;
|
size_t len;
|
||||||
char **cvec;
|
char **cvec;
|
||||||
@@ -68,6 +70,7 @@ void linenoiseClearScreen(void);
|
|||||||
void linenoiseSetMultiLine(int ml);
|
void linenoiseSetMultiLine(int ml);
|
||||||
void linenoiseSetDumbMode(int set);
|
void linenoiseSetDumbMode(int set);
|
||||||
void linenoisePrintKeyCodes(void);
|
void linenoisePrintKeyCodes(void);
|
||||||
|
void linenoiseAllowEmpty(bool);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -36,6 +36,9 @@ Linenoise library does not need explicit initialization. However, some configura
|
|||||||
:cpp:func:`linenoiseSetMultiLine`
|
:cpp:func:`linenoiseSetMultiLine`
|
||||||
Switch between single line and multi line editing modes. In single line mode, if the length of the command exceeds the width of the terminal, the command text is scrolled within the line to show the end of the text. In this case the beginning of the text is hidden. Single line needs less data to be sent to refresh screen on each key press, so exhibits less glitching compared to the multi line mode. On the flip side, editing commands and copying command text from terminal in single line mode is harder. Default is single line mode.
|
Switch between single line and multi line editing modes. In single line mode, if the length of the command exceeds the width of the terminal, the command text is scrolled within the line to show the end of the text. In this case the beginning of the text is hidden. Single line needs less data to be sent to refresh screen on each key press, so exhibits less glitching compared to the multi line mode. On the flip side, editing commands and copying command text from terminal in single line mode is harder. Default is single line mode.
|
||||||
|
|
||||||
|
:cpp:func:`linenoiseAllowEmpty`
|
||||||
|
Set whether linenoise library will return a zero-length string (if ``true``) or ``NULL`` (if ``false``) for empty lines. By default, zero-length strings are returned.
|
||||||
|
|
||||||
|
|
||||||
Main loop
|
Main loop
|
||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
|
@@ -112,6 +112,9 @@ static void initialize_console(void)
|
|||||||
/* Set command history size */
|
/* Set command history size */
|
||||||
linenoiseHistorySetMaxLen(100);
|
linenoiseHistorySetMaxLen(100);
|
||||||
|
|
||||||
|
/* Don't return empty lines */
|
||||||
|
linenoiseAllowEmpty(false);
|
||||||
|
|
||||||
#if CONFIG_STORE_HISTORY
|
#if CONFIG_STORE_HISTORY
|
||||||
/* Load command history from filesystem */
|
/* Load command history from filesystem */
|
||||||
linenoiseHistoryLoad(HISTORY_PATH);
|
linenoiseHistoryLoad(HISTORY_PATH);
|
||||||
@@ -174,7 +177,7 @@ void app_main(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Add the command to the history if not empty*/
|
/* Add the command to the history if not empty*/
|
||||||
if(strlen(line) > 0) {
|
if (strlen(line) > 0) {
|
||||||
linenoiseHistoryAdd(line);
|
linenoiseHistoryAdd(line);
|
||||||
#if CONFIG_STORE_HISTORY
|
#if CONFIG_STORE_HISTORY
|
||||||
/* Save command history to filesystem */
|
/* Save command history to filesystem */
|
||||||
@@ -197,8 +200,7 @@ void app_main(void)
|
|||||||
/* linenoise allocates line buffer on the heap, so need to free it */
|
/* linenoise allocates line buffer on the heap, so need to free it */
|
||||||
linenoiseFree(line);
|
linenoiseFree(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_LOGE(TAG, "Error or end-of-input, terminating console");
|
ESP_LOGE(TAG, "Error or end-of-input, terminating console");
|
||||||
esp_console_deinit();
|
esp_console_deinit();
|
||||||
vTaskDelete(NULL); /* terminate app_main */
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user