summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorJose <pepone@users.noreply.github.com>2021-01-07 20:25:12 +0100
committerGitHub <noreply@github.com>2021-01-07 20:25:12 +0100
commit0396ab5884e6354b1a828cbc91ef6e2177eed2aa (patch)
tree235369028744e6612ad65dbe90fe72465ac21bc5 /cpp
parentFix u8 string in Ice/proxy test (diff)
downloadice-0396ab5884e6354b1a828cbc91ef6e2177eed2aa.tar.bz2
ice-0396ab5884e6354b1a828cbc91ef6e2177eed2aa.tar.xz
ice-0396ab5884e6354b1a828cbc91ef6e2177eed2aa.zip
Use readline only when stdin is a tty (#1230)
* Use readline only with TTY terminals * Fix readline usage in IceStorm
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/IceGrid/Parser.cpp103
-rw-r--r--cpp/src/IceStorm/Parser.cpp107
2 files changed, 111 insertions, 99 deletions
diff --git a/cpp/src/IceGrid/Parser.cpp b/cpp/src/IceGrid/Parser.cpp
index d8e997f9778..edcf11e4c69 100644
--- a/cpp/src/IceGrid/Parser.cpp
+++ b/cpp/src/IceGrid/Parser.cpp
@@ -2573,70 +2573,77 @@ Parser::getInput(char* buf, size_t& result, size_t maxSize)
else
{
#if defined(__APPLE__) || defined(__linux__)
- const char* prompt = parser->getPrompt();
- char* line = readline(const_cast<char*>(prompt));
- if(!line)
+ if (isatty(fileno(stdin)) == 1)
{
- result = 0;
- }
- else
- {
- if(*line)
+ const char* prompt = parser->getPrompt();
+ char* line = readline(const_cast<char*>(prompt));
+ if(!line)
{
- add_history(line);
- }
-
- result = strlen(line) + 1;
- if(result > maxSize)
- {
- free(line);
- error("input line too long");
result = 0;
}
else
{
- strcpy(buf, line);
- strcat(buf, "\n");
- free(line);
+ if(*line)
+ {
+ add_history(line);
+ }
+
+ result = strlen(line) + 1;
+ if(result > maxSize)
+ {
+ free(line);
+ error("input line too long");
+ result = 0;
+ }
+ else
+ {
+ strcpy(buf, line);
+ strcat(buf, "\n");
+ free(line);
+ }
}
}
-#else
- consoleOut << parser->getPrompt() << flush;
- string line;
- while(true)
+ else
{
- int c = getc(yyin);
- if(c == EOF)
+#endif
+ consoleOut << parser->getPrompt() << flush;
+ string line;
+ while(true)
{
- if(line.size())
+ int c = getc(yyin);
+ if(c == EOF)
{
- line += '\n';
+ if(line.size())
+ {
+ line += '\n';
+ }
+ break;
}
- break;
- }
- line += static_cast<char>(c);
- if(c == '\n')
- {
- break;
+ line += static_cast<char>(c);
+ if(c == '\n')
+ {
+ break;
+ }
}
- }
#ifdef _WIN32
- if(windowsConsoleConverter)
- {
- line = nativeToUTF8(line, windowsConsoleConverter);
- }
+ if(windowsConsoleConverter)
+ {
+ line = nativeToUTF8(line, windowsConsoleConverter);
+ }
#endif
- result = line.length();
- if(result > maxSize)
- {
- error("input line too long");
- buf[0] = EOF;
- result = 1;
- }
- else
- {
- strcpy(buf, line.c_str());
+ result = line.length();
+ if(result > maxSize)
+ {
+ error("input line too long");
+ buf[0] = EOF;
+ result = 1;
+ }
+ else
+ {
+ strcpy(buf, line.c_str());
+ }
+#if defined(__APPLE__) || defined(__linux__)
}
#endif
}
diff --git a/cpp/src/IceStorm/Parser.cpp b/cpp/src/IceStorm/Parser.cpp
index 52f22f71b55..0629ca0e393 100644
--- a/cpp/src/IceStorm/Parser.cpp
+++ b/cpp/src/IceStorm/Parser.cpp
@@ -444,75 +444,80 @@ Parser::getInput(char* buf, size_t& result, size_t maxSize)
}
else
{
-
#if defined(__APPLE__) || defined(__linux__)
- const char* prompt = parser->getPrompt();
- char* line = readline(const_cast<char*>(prompt));
- if(!line)
- {
- result = 0;
- }
- else
+ if (isatty(fileno(stdin)) == 1)
{
- if(*line)
- {
- add_history(line);
- }
-
- result = strlen(line) + 1;
- if(result > maxSize)
+ const char* prompt = parser->getPrompt();
+ char* line = readline(const_cast<char*>(prompt));
+ if(!line)
{
- free(line);
- error("input line too long");
result = 0;
}
else
{
- strcpy(buf, line);
- strcat(buf, "\n");
- free(line);
+ if(*line)
+ {
+ add_history(line);
+ }
+
+ result = strlen(line) + 1;
+ if(result > maxSize)
+ {
+ free(line);
+ error("input line too long");
+ result = 0;
+ }
+ else
+ {
+ strcpy(buf, line);
+ strcat(buf, "\n");
+ free(line);
+ }
}
}
-#else
- consoleOut << parser->getPrompt() << flush;
-
- string line;
- while(true)
+ else
{
- int c = getc(yyin);
- if(c == EOF)
+#endif
+ consoleOut << parser->getPrompt() << flush;
+
+ string line;
+ while(true)
{
- if(line.size())
+ int c = getc(yyin);
+ if(c == EOF)
{
- line += '\n';
+ if(line.size())
+ {
+ line += '\n';
+ }
+ break;
}
- break;
- }
- line += static_cast<char>(c);
- if(c == '\n')
- {
- break;
+ line += static_cast<char>(c);
+ if(c == '\n')
+ {
+ break;
+ }
}
- }
#ifdef _WIN32
- if(windowsConsoleConverter)
- {
- line = nativeToUTF8(line, windowsConsoleConverter);
- }
+ if(windowsConsoleConverter)
+ {
+ line = nativeToUTF8(line, windowsConsoleConverter);
+ }
#endif
- result = line.length();
- if(result > maxSize)
- {
- error("input line too long");
- buf[0] = EOF;
- result = 1;
- }
- else
- {
- strcpy(buf, line.c_str());
+ result = line.length();
+ if(result > maxSize)
+ {
+ error("input line too long");
+ buf[0] = EOF;
+ result = 1;
+ }
+ else
+ {
+ strcpy(buf, line.c_str());
+ }
+#if defined(__APPLE__) || defined(__linux__)
}
-
#endif
}
}