summaryrefslogtreecommitdiffstats
path: root/source/core/slang-command-line.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2021-11-10 17:33:22 -0500
committerGitHub <noreply@github.com>2021-11-10 17:33:22 -0500
commit8a9e518371df03b3f382e0fe869da83751fdda0b (patch)
tree749f9c1c79acd375ec3ee97e45a10007dd6632fa /source/core/slang-command-line.cpp
parent95e82acc0b32c81a9c6ac39708d18a423d8c7b1e (diff)
Interprocess communication via pipes (#2009)
* #include an absolute path didn't work - because paths were taken to always be relative. * Use 'Process' to communicate with an command line tool. * Remove slang-win-stream * Tidy up windows ProcessUtil. * First version of BufferedReadStream. * Windows working IPC for steams. * Test proxy count option. * Split Process/ProcessUtil. Process is platform dependant. ProcessUtil are functions that are platform independent. * First implementation of Unix Process interface. * Unix process compiles on cygwin. * Fix typo in unix process. * Separate unix pipe stream error of invalid access, from pipe availability. * Fix in standard line extraction. * Make fd non blocking. * Fix issues with Windows Process streams. * Added UnixPipe. * Some fixes around UnixPipeStream. * Make a unix stream closed explicit. * Hack to debug linux process/stream. * Revert to old linux pipe handling. * Pass executable path for unit tests. Split out CommandLine into own source. * Small improvements in process/command line. * Check process behavior with crash. * Make stderr and stdout unbuffered for crash testing. * Only turn disable buffering in crash test. * Disable crash test on CI. * Fix crash on clang/linux. * Enable crash test. Remove _appendBuffer as can use StreamUtil functionality.
Diffstat (limited to 'source/core/slang-command-line.cpp')
-rw-r--r--source/core/slang-command-line.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/source/core/slang-command-line.cpp b/source/core/slang-command-line.cpp
new file mode 100644
index 000000000..419c031ab
--- /dev/null
+++ b/source/core/slang-command-line.cpp
@@ -0,0 +1,54 @@
+// slang-command-line.cpp
+#include "slang-command-line.h"
+
+#include "slang-process.h"
+
+#include "slang-string.h"
+#include "slang-string-escape-util.h"
+#include "slang-string-util.h"
+
+#include "../../slang-com-helper.h"
+
+namespace Slang {
+
+void CommandLine::addPrefixPathArg(const char* prefix, const String& path, const char* pathPostfix)
+{
+ StringBuilder builder;
+ builder << prefix << path;
+ if (pathPostfix)
+ {
+ // Work out the path with the postfix
+ builder << pathPostfix;
+ }
+ addArg(builder.ProduceString());
+}
+
+void CommandLine::setExecutable(const String& dir, const String& name)
+{
+ StringBuilder builder;
+ Path::combineIntoBuilder(dir.getUnownedSlice(), name.getUnownedSlice(), builder);
+ builder << Process::getExecutableSuffix();
+ setExecutablePath(builder.ProduceString());
+}
+
+void CommandLine::append(StringBuilder& out) const
+{
+ auto escapeHandler = Process::getEscapeHandler();
+
+ StringEscapeUtil::appendMaybeQuoted(escapeHandler, m_executable.getUnownedSlice(), out);
+
+ for (const auto& arg : m_args)
+ {
+ out << " ";
+ StringEscapeUtil::appendMaybeQuoted(escapeHandler, arg.getUnownedSlice(), out);
+ }
+}
+
+String CommandLine::toString() const
+{
+ StringBuilder buf;
+ append(buf);
+ return buf.ProduceString();
+}
+
+} // namespace Slang