Permalink
Browse files

support for blacklist terminals, reverting to fgets.

  • Loading branch information...
1 parent 085daf3 commit 1e32ee642476ae5ba6063a2835f775d5bd47ea48 @antirez committed Mar 24, 2010
Showing with 28 additions and 3 deletions.
  1. +28 −3 linenoise.c
View
@@ -81,6 +81,7 @@
#include <unistd.h>
#define LINENOISE_MAX_LINE 4096
+static char *unsupported_term[] = {"dumb","eterm","cons25",NULL};
static struct termios orig_termios; /* in order to restore at exit */
static int rawmode = 0; /* for atexit() function to check if restore is needed*/
@@ -92,6 +93,16 @@ char **history = NULL;
static void linenoiseAtExit(void);
int linenoiseHistoryAdd(const char *line);
+static int isUnsupportedTerm(void) {
+ char *term = getenv("TERM");
+ int j;
+
+ if (term == NULL) return 0;
+ for (j = 0; unsupported_term[j]; j++)
+ if (!strcasecmp(term,unsupported_term[j])) return 1;
+ return 0;
+}
+
static void freeHistory(void) {
if (history) {
int j;
@@ -351,9 +362,23 @@ char *linenoise(const char *prompt) {
char buf[LINENOISE_MAX_LINE];
int count;
- count = linenoiseRaw(buf,LINENOISE_MAX_LINE,prompt);
- if (count == -1) return NULL;
- return strdup(buf);
+ if (isUnsupportedTerm()) {
+ size_t len;
+
+ printf("%s",prompt);
+ fflush(stdout);
+ if (fgets(buf,LINENOISE_MAX_LINE,stdin) == NULL) return NULL;
+ len = strlen(buf);
+ while(len && (buf[len-1] == '\n' || buf[len-1] == '\r')) {
+ len--;
+ buf[len] = '\0';
+ }
+ return strdup(buf);
+ } else {
+ count = linenoiseRaw(buf,LINENOISE_MAX_LINE,prompt);
+ if (count == -1) return NULL;
+ return strdup(buf);
+ }
}
/* Using a circular buffer is smarter, but a bit more complex to handle. */

0 comments on commit 1e32ee6

Please sign in to comment.