mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
d11aae6992
Summary: Calling WriteConsoleW is the most reliable way to print Unicode characters to a Windows console. If binary data gets printed to the console, attempting to re-encode it shouldn't be a problem, since garbage in can produce garbage out. This breaks printing strings in the local codepage, which WriteConsoleA knows how to handle. For example, this can happen when user source code is encoded with the local codepage, and an LLVM tool quotes it while emitting a caret diagnostic. This is unfortunate, but well-behaved tools should validate that their input is UTF-8 and escape non-UTF-8 characters before sending them to raw_fd_ostream. Clang already does this, but not all LLVM tools do this. One drawback to the current implementation is printing a string a byte at a time doesn't work. Consider this LLVM code: for (char C : MyStr) outs() << C; Because outs() is now unbuffered, we wil try to convert each byte to UTF-16, which will fail. However, this already didn't work, so I think we may as well update callers that do that as we find them to print complete portions of strings. You can see a real example of this in my patch to SourceMgr.cpp Fixes PR38669 and PR36267. Reviewers: zturner, efriedma Subscribers: llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D51558 llvm-svn: 341433
20 lines
377 B
C++
20 lines
377 B
C++
#include "llvm/Support/Locale.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/Unicode.h"
|
|
|
|
namespace llvm {
|
|
namespace sys {
|
|
namespace locale {
|
|
|
|
int columnWidth(StringRef Text) {
|
|
return llvm::sys::unicode::columnWidthUTF8(Text);
|
|
}
|
|
|
|
bool isPrint(int UCS) {
|
|
return llvm::sys::unicode::isPrintable(UCS);
|
|
}
|
|
|
|
} // namespace locale
|
|
} // namespace sys
|
|
} // namespace llvm
|