diff options
Diffstat (limited to 'llvm/lib/Support/Windows/Program.inc')
-rw-r--r-- | llvm/lib/Support/Windows/Program.inc | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/llvm/lib/Support/Windows/Program.inc b/llvm/lib/Support/Windows/Program.inc index f1d612cf3c98..824834c1cbbe 100644 --- a/llvm/lib/Support/Windows/Program.inc +++ b/llvm/lib/Support/Windows/Program.inc @@ -67,13 +67,10 @@ ErrorOr<std::string> sys::findProgramByName(StringRef Name, if (const char *PathExtEnv = std::getenv("PATHEXT")) SplitString(PathExtEnv, PathExts, ";"); - SmallVector<wchar_t, MAX_PATH> U16Result; - DWORD Len = MAX_PATH; + SmallVector<char, MAX_PATH> U8Result; for (StringRef Ext : PathExts) { - SmallVector<wchar_t, MAX_PATH> U16Ext; - if (std::error_code EC = windows::UTF8ToUTF16(Ext, U16Ext)) - return EC; - + SmallVector<wchar_t, MAX_PATH> U16Result; + DWORD Len = MAX_PATH; do { U16Result.reserve(Len); // Lets attach the extension manually. That is needed for files @@ -88,20 +85,24 @@ ErrorOr<std::string> sys::findProgramByName(StringRef Name, U16Result.capacity(), U16Result.data(), nullptr); } while (Len > U16Result.capacity()); - if (Len != 0) + if (Len == 0) + continue; + + U16Result.set_size(Len); + + if (std::error_code EC = + windows::UTF16ToUTF8(U16Result.data(), U16Result.size(), U8Result)) + return EC; + + if (sys::fs::can_execute(U8Result)) break; // Found it. + + U8Result.clear(); } - if (Len == 0) + if (U8Result.empty()) return mapWindowsError(::GetLastError()); - U16Result.set_size(Len); - - SmallVector<char, MAX_PATH> U8Result; - if (std::error_code EC = - windows::UTF16ToUTF8(U16Result.data(), U16Result.size(), U8Result)) - return EC; - return std::string(U8Result.begin(), U8Result.end()); } @@ -487,6 +488,18 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait, return WaitResult; } +std::error_code llvm::sys::ChangeStdinMode(sys::fs::OpenFlags Flags){ + if (!(Flags & fs::OF_CRLF)) + return ChangeStdinToBinary(); + return std::error_code(); +} + +std::error_code llvm::sys::ChangeStdoutMode(sys::fs::OpenFlags Flags){ + if (!(Flags & fs::OF_CRLF)) + return ChangeStdoutToBinary(); + return std::error_code(); +} + std::error_code sys::ChangeStdinToBinary() { int result = _setmode(_fileno(stdin), _O_BINARY); if (result == -1) @@ -505,7 +518,7 @@ std::error_code llvm::sys::writeFileWithEncoding(StringRef FileName, StringRef Contents, WindowsEncodingMethod Encoding) { std::error_code EC; - llvm::raw_fd_ostream OS(FileName, EC, llvm::sys::fs::OF_Text); + llvm::raw_fd_ostream OS(FileName, EC, llvm::sys::fs::OF_TextWithCRLF); if (EC) return EC; |