mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +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
|
||||
IsInf.cpp
|
||||
IsNAN.cpp
|
||||
Locale.cpp
|
||||
LockFileManager.cpp
|
||||
ManagedStatic.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