mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-20 05:38:50 +00:00
platform support for counting column widths and checking isprint
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154944 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b90757078f
commit
fdc97cd2c3
17
include/llvm/Support/Locale.h
Normal file
17
include/llvm/Support/Locale.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef LLVM_SUPPORT_LOCALE
|
||||||
|
#define LLVM_SUPPORT_LOCALE
|
||||||
|
|
||||||
|
#include "llvm/ADT/StringRef.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
namespace sys {
|
||||||
|
namespace locale {
|
||||||
|
|
||||||
|
int columnWidth(StringRef s);
|
||||||
|
bool isPrint(int c);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LLVM_SUPPORT_LOCALE
|
@ -32,6 +32,7 @@ add_llvm_library(LLVMSupport
|
|||||||
IntrusiveRefCntPtr.cpp
|
IntrusiveRefCntPtr.cpp
|
||||||
IsInf.cpp
|
IsInf.cpp
|
||||||
IsNAN.cpp
|
IsNAN.cpp
|
||||||
|
Locale.cpp
|
||||||
LockFileManager.cpp
|
LockFileManager.cpp
|
||||||
ManagedStatic.cpp
|
ManagedStatic.cpp
|
||||||
MemoryBuffer.cpp
|
MemoryBuffer.cpp
|
||||||
|
10
lib/Support/Locale.cpp
Normal file
10
lib/Support/Locale.cpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include "llvm/Support/Locale.h"
|
||||||
|
#include "llvm/Config/config.h"
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include "LocaleXlocale.inc"
|
||||||
|
#elif LLVM_ON_WIN32
|
||||||
|
#include "LocaleWindows.inc"
|
||||||
|
#else
|
||||||
|
#include "LocaleGeneric.inc"
|
||||||
|
#endif
|
17
lib/Support/LocaleGeneric.inc
Normal file
17
lib/Support/LocaleGeneric.inc
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include <cwctype>
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
namespace sys {
|
||||||
|
namespace locale {
|
||||||
|
|
||||||
|
int columnWidth(StringRef s) {
|
||||||
|
return s.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isPrint(int c) {
|
||||||
|
return iswprint(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
lib/Support/LocaleWindows.inc
Normal file
15
lib/Support/LocaleWindows.inc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
namespace llvm {
|
||||||
|
namespace sys {
|
||||||
|
namespace locale {
|
||||||
|
|
||||||
|
int columnWidth(StringRef s) {
|
||||||
|
return s.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isPrint(int c) {
|
||||||
|
return ' ' <= c && c <= '~';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
61
lib/Support/LocaleXlocale.inc
Normal file
61
lib/Support/LocaleXlocale.inc
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#include "llvm/ADT/SmallVector.h"
|
||||||
|
#include "llvm/ADT/SmallString.h"
|
||||||
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
|
#include <cassert>
|
||||||
|
#include <xlocale.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
struct locale_holder {
|
||||||
|
locale_holder()
|
||||||
|
: l(newlocale(LC_CTYPE_MASK,"en_US.UTF-8",LC_GLOBAL_LOCALE))
|
||||||
|
{
|
||||||
|
assert(NULL!=l);
|
||||||
|
}
|
||||||
|
~locale_holder() {
|
||||||
|
freelocale(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mbswidth(llvm::SmallString<16> s) const {
|
||||||
|
// this implementation assumes no '\0' in s
|
||||||
|
assert(s.size()==strlen(s.c_str()));
|
||||||
|
|
||||||
|
size_t size = mbstowcs_l(NULL,s.c_str(),0,l);
|
||||||
|
assert(size>=0);
|
||||||
|
if (size==0)
|
||||||
|
return 0;
|
||||||
|
llvm::SmallVector<wchar_t,200> ws(size);
|
||||||
|
size = mbstowcs_l(&ws[0],s.c_str(),ws.size(),l);
|
||||||
|
assert(ws.size()==size);
|
||||||
|
return wcswidth_l(&ws[0],ws.size(),l);
|
||||||
|
}
|
||||||
|
|
||||||
|
int isprint(int c) const {
|
||||||
|
return iswprint_l(c,l);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
locale_t l;
|
||||||
|
};
|
||||||
|
|
||||||
|
llvm::ManagedStatic<locale_holder> l;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
namespace sys {
|
||||||
|
namespace locale {
|
||||||
|
|
||||||
|
int columnWidth(StringRef s) {
|
||||||
|
int width = l->mbswidth(s);
|
||||||
|
assert(width>=0);
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isPrint(int c) {
|
||||||
|
return l->isprint(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user