diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-04-29 15:45:25 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-29 15:45:25 -0400 |
| commit | ad6f3070251f25cf022c231b8567d78e98061127 (patch) | |
| tree | 1fa9d2058f8e86710a9e716e493473217b6dff77 /source/core | |
| parent | 972bd3c4c24b06501c52127416afb763a066b8ad (diff) | |
Simplify CommandLine by removing Escaping (#1825)
* #include an absolute path didn't work - because paths were taken to always be relative.
* Split out StringEscapeUtil.
* Added StringEscapeUtil.
* Fix typo in unix quoting type.
* Small comment improvements.
* Try to fix linux linking issue.
* Fix typo.
* Attempt to fix linux link issue.
* Update VS proj even though nothing really changed.
* Fix another typo issue.
* Fix for windows issue.
Fixed bug.
* Make separate Utils for escaping.
* Fix typo.
* Split out into StringEscapeHandler.
* Windows shell does handle removing quotes (so remove code to remove them).
* Handle unescaping if not initiating using the shell.
* Slight improvement around shell like decoding.
* Simplify command extraction.
* Add shared-library category type.
* Fix bug in command extraction.
* Typo in transcendental category.
* Enable unit-test on in smoke test category.
* Make parsing failing output as a failing test.
* Fixes for transcendental tests. Disable tests that do not work.
* Changed category parsing.
* Removed the TestResult parameter from _gatherTestsForFile.
Made testsList only output.
* Remove testing if all tests were disabled.
* Make args of CommandLine always unescaped.
* Add category.
* Don't need escaping on unix/linux.
* Remove some no longer used functions.
Diffstat (limited to 'source/core')
| -rw-r--r-- | source/core/slang-process-util.h | 57 | ||||
| -rw-r--r-- | source/core/slang-string-escape-util.cpp | 11 | ||||
| -rw-r--r-- | source/core/slang-string-escape-util.h | 5 | ||||
| -rw-r--r-- | source/core/unix/slang-unix-process-util.cpp | 23 | ||||
| -rw-r--r-- | source/core/windows/slang-win-process-util.cpp | 9 |
5 files changed, 27 insertions, 78 deletions
diff --git a/source/core/slang-process-util.h b/source/core/slang-process-util.h index d47a4793b..af524940c 100644 --- a/source/core/slang-process-util.h +++ b/source/core/slang-process-util.h @@ -18,31 +18,12 @@ struct CommandLine Filename, ///< The executable is set as a filename }; - enum class ArgType - { - Escaped, - Unescaped, - }; - - struct Arg - { - ArgType type; ///< How to interpret the argument value - String value; ///< The argument value - }; - /// Add args - assumed unescaped - void addArg(const String& in) { m_args.add(Arg{ArgType::Unescaped, in}); } + void addArg(const String& in) { m_args.add(in); } void addArgs(const String* args, Int argsCount) { for (Int i = 0; i < argsCount; ++i) addArg(args[i]); } - /// Add args - all assumed unescaped - void addArgs(const Arg* args, Int argCount) { m_args.addRange(args, argCount); } - - /// Add an escaped arg - void addEscapedArg(const String& in) { m_args.add(Arg{ArgType::Escaped, in}); } - void addEscapedArgs(const String* args, Int argsCount) { for (Int i = 0; i < argsCount; ++i) addEscapedArg(args[i]); } - /// Find the index of an arg which is exact match for slice - SLANG_INLINE Index findArgIndex(const UnownedStringSlice& slice) const; + SLANG_INLINE Index findArgIndex(const UnownedStringSlice& slice) const { return m_args.indexOf(slice); } /// Set the executable path void setExecutablePath(const String& path) { m_executableType = ExecutableType::Path; m_executable = path; } @@ -62,7 +43,7 @@ struct CommandLine ExecutableType m_executableType; ///< How the executable is specified String m_executable; ///< Executable to run. Note that the executable is never escaped. - List<Arg> m_args; ///< The arguments + List<String> m_args; ///< The arguments (Stored *unescaped*) }; struct ExecuteResult @@ -101,42 +82,16 @@ struct ProcessUtil }; // ----------------------------------------------------------------------- -SLANG_INLINE Index CommandLine::findArgIndex(const UnownedStringSlice& slice) const -{ - const Index count = m_args.getCount(); - - for (Index i = 0; i < count; ++i) - { - const auto& arg = m_args[i]; - if (arg.value == slice) - { - return i; - } - } - return -1; -} - -// ----------------------------------------------------------------------- SLANG_INLINE void CommandLine::addPrefixPathArg(const char* prefix, const String& path, const char* pathPostfix) { - auto escapeHandler = ProcessUtil::getEscapeHandler(); - StringBuilder builder; - builder << prefix; + builder << prefix << path; if (pathPostfix) { // Work out the path with the postfix - StringBuilder fullPath; - fullPath << path << pathPostfix; - StringEscapeUtil::appendMaybeQuoted(escapeHandler, fullPath.getUnownedSlice(), builder); + builder << pathPostfix; } - else - { - StringEscapeUtil::appendMaybeQuoted(escapeHandler, path.getUnownedSlice(), builder); - } - - // This arg doesn't need subsequent escaping - addEscapedArg(builder); + addArg(builder.ProduceString()); } } diff --git a/source/core/slang-string-escape-util.cpp b/source/core/slang-string-escape-util.cpp index 13fce6dc7..5e4db269c 100644 --- a/source/core/slang-string-escape-util.cpp +++ b/source/core/slang-string-escape-util.cpp @@ -2,6 +2,7 @@ #include "slang-char-util.h" #include "slang-text-io.h" +#include "slang-memory-arena.h" #include "../../slang-com-helper.h" @@ -459,12 +460,13 @@ StringEscapeUtil::Handler* StringEscapeUtil::getHandler(Style style) } } -/* static */void StringEscapeUtil::appendQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) +/* static */SlangResult StringEscapeUtil::appendQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) { const char quoteChar = handler->getQuoteChar(); out.appendChar(quoteChar); - handler->appendEscaped(slice, out); + SlangResult res = handler->appendEscaped(slice, out); out.appendChar(quoteChar); + return res; } /* static */SlangResult StringEscapeUtil::appendUnquoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) @@ -480,15 +482,16 @@ StringEscapeUtil::Handler* StringEscapeUtil::getHandler(Style style) return handler->appendUnescaped(slice.subString(1, len - 2), out); } -/* static */void StringEscapeUtil::appendMaybeQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) +/* static */SlangResult StringEscapeUtil::appendMaybeQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) { if (handler->isQuotingNeeded(slice)) { - appendQuoted(handler, slice, out); + return appendQuoted(handler, slice, out); } else { out.append(slice); + return SLANG_OK; } } diff --git a/source/core/slang-string-escape-util.h b/source/core/slang-string-escape-util.h index 31f781dc6..9dc653df3 100644 --- a/source/core/slang-string-escape-util.h +++ b/source/core/slang-string-escape-util.h @@ -2,6 +2,7 @@ #define SLANG_CORE_STRING_ESCAPE_UTIL_H #include "slang-string.h" +#include "slang-list.h" namespace Slang { @@ -56,7 +57,7 @@ struct StringEscapeUtil static Handler* getHandler(Style style); /// If quoting is needed appends to out quoted - static void appendMaybeQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); + static SlangResult appendMaybeQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); /// If the slice appears to be quoted for the style, unquote it, else just append to out static SlangResult appendMaybeUnquoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); @@ -65,7 +66,7 @@ struct StringEscapeUtil static SlangResult appendUnquoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); /// Append with quotes (even if not needed) - static void appendQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); + static SlangResult appendQuoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); /// Shells can have multiple quoted sections. This function makes a string with out quoting static SlangResult unescapeShellLike(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out); diff --git a/source/core/unix/slang-unix-process-util.cpp b/source/core/unix/slang-unix-process-util.cpp index a3b66af38..24107fab3 100644 --- a/source/core/unix/slang-unix-process-util.cpp +++ b/source/core/unix/slang-unix-process-util.cpp @@ -4,6 +4,7 @@ #include "../slang-common.h" #include "../slang-string-util.h" #include "../slang-string-escape-util.h" +#include "../slang-memory-arena.h" #include <stdio.h> #include <stdlib.h> @@ -40,20 +41,15 @@ namespace Slang { auto escapeHandler = getEscapeHandler(); // When outputting the command line we potentially need to escape the path to the - // command and args - that aren't already explicitly marked as escaped. + // command and args - that aren't already explicitly marked as escaped. + StringBuilder cmd; StringEscapeUtil::appendMaybeQuoted(escapeHandler, commandLine.m_executable.getUnownedSlice(), cmd); for (const auto& arg : commandLine.m_args) { cmd << " "; - if (arg.type == CommandLine::ArgType::Unescaped) - { - StringEscapeUtil::appendMaybeQuoted(escapeHandler, arg.value.getUnownedSlice(), cmd); - } - else - { - cmd << arg.value; - } + + StringEscapeUtil::appendMaybeQuoted(escapeHandler, arg.getUnownedSlice(), cmd); } return cmd.ToString(); } @@ -63,16 +59,17 @@ namespace Slang { outExecuteResult.init(); List<char const*> argPtrs; + // Add the command argPtrs.add(commandLine.m_executable.getBuffer()); - // Add all the args - they don't need any explicit escaping + // Add all the args - they don't need any explicit escaping for (auto arg : commandLine.m_args) { - // All args for this target must be unescaped - SLANG_ASSERT(arg.type == CommandLine::ArgType::Unescaped); - argPtrs.add(arg.value.getBuffer()); + // All args for this target must be unescaped (as they are in CommandLine) + argPtrs.add(arg.getBuffer()); } + // Terminate with a null argPtrs.add(nullptr); diff --git a/source/core/windows/slang-win-process-util.cpp b/source/core/windows/slang-win-process-util.cpp index 9cc567318..4039361a4 100644 --- a/source/core/windows/slang-win-process-util.cpp +++ b/source/core/windows/slang-win-process-util.cpp @@ -169,14 +169,7 @@ static DWORD WINAPI _readerThreadProc(LPVOID threadParam) for (const auto& arg : commandLine.m_args) { cmd << " "; - if (arg.type == CommandLine::ArgType::Unescaped) - { - StringEscapeUtil::appendMaybeQuoted(escapeHandler, arg.value.getUnownedSlice(), cmd); - } - else - { - cmd << arg.value; - } + StringEscapeUtil::appendMaybeQuoted(escapeHandler, arg.getUnownedSlice(), cmd); } return cmd.ToString(); } |
