From b10854677de8b0fbdfbcd742d9b2598c827b25f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rg=20Wunsch?= <j@uriah.heep.sax.de>
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;