From b10854677de8b0fbdfbcd742d9b2598c827b25f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Wunsch?= Date: Wed, 14 Dec 2022 01:07:41 +0100 Subject: [PATCH] Consider libedit only in interactive mode (#1207) --- src/term.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/term.c b/src/term.c index c399c3e4..e4966cc4 100644 --- a/src/term.c +++ b/src/term.c @@ -1357,7 +1357,7 @@ void term_gotline(char *cmdstr) { } -int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { +int terminal_mode_interactive(PROGRAMMER *pgm, struct avrpart *p) { term_pgm = pgm; // For callback routine term_p = p; @@ -1379,10 +1379,10 @@ int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { return pgm->flush_cache(pgm, p); } -#else +#endif -int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { +int terminal_mode_noninteractive(PROGRAMMER *pgm, struct avrpart *p) { char *cmdbuf; int rc = 0; @@ -1398,7 +1398,17 @@ int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { return pgm->flush_cache(pgm, p); } +int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { +#if defined(HAVE_LIBREADLINE) + // GNU libreadline can also work if input is a pipe. + // EditLine (NetBSD, MacOS) has issues with that, so only use it when + // running interactively. + // EditLine uses version 4.2 (0x0402). + if (isatty(fileno(stdin)) || (rl_readline_version >= 0x0500)) + return terminal_mode_interactive(pgm, p); #endif + return terminal_mode_noninteractive(pgm, p); +} static void update_progress_tty(int percent, double etime, const char *hdr, int finish) { static char *header;