Add CMake build and fix major Linux blockers.

llvm-svn: 121510
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: f5799be4a8971d09acf3bf4067aee815162c3c32
diff --git a/src/locale.cpp b/src/locale.cpp
index 344f8df..4bd77ca 100644
--- a/src/locale.cpp
+++ b/src/locale.cpp
@@ -21,8 +21,6 @@
 #include <langinfo.h>
 #include <stdlib.h>
 
-// FIXME: Locales are hard.
-#if __APPLE__
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 namespace {
@@ -676,61 +674,93 @@
 bool
 ctype<wchar_t>::do_is(mask m, char_type c) const
 {
+#ifdef __APPLE__
     return isascii(c) ? _DefaultRuneLocale.__runetype[c] & m : false;
+#else
+    return false;
+#endif
 }
 
 const wchar_t*
 ctype<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low, ++vec)
         *vec = static_cast<mask>(isascii(*low) ? _DefaultRuneLocale.__runetype[*low] : 0);
     return low;
+#else
+    return NULL;
+#endif
 }
 
 const wchar_t*
 ctype<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low)
         if (isascii(*low) && (_DefaultRuneLocale.__runetype[*low] & m))
             break;
     return low;
+#else
+    return NULL;
+#endif
 }
 
 const wchar_t*
 ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low)
         if (!(isascii(*low) && (_DefaultRuneLocale.__runetype[*low] & m)))
             break;
     return low;
+#else
+    return NULL;
+#endif
 }
 
 wchar_t
 ctype<wchar_t>::do_toupper(char_type c) const
 {
+#ifdef __APPLE__
     return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
+#else
+    return 0;
+#endif
 }
 
 const wchar_t*
 ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low)
         *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low;
     return low;
+#else
+    return NULL;
+#endif
 }
 
 wchar_t
 ctype<wchar_t>::do_tolower(char_type c) const
 {
+#ifdef __APPLE__
     return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c;
+#else
+    return 0;
+#endif
 }
 
 const wchar_t*
 ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low)
         *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low;
     return low;
+#else
+    return NULL;
+#endif
 }
 
 wchar_t
@@ -775,8 +805,10 @@
       __tab_(tab),
       __del_(del)
 {
+#ifdef __APPLE__
     if (__tab_ == 0)
         __tab_ = _DefaultRuneLocale.__runetype;
+#endif
 }
 
 ctype<char>::~ctype()
@@ -788,29 +820,45 @@
 char
 ctype<char>::do_toupper(char_type c) const
 {
+#ifdef __APPLE__
     return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
+#else
+    return 0;
+#endif
 }
 
 const char*
 ctype<char>::do_toupper(char_type* low, const char_type* high) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low)
         *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low;
     return low;
+#else
+    return NULL;
+#endif
 }
 
 char
 ctype<char>::do_tolower(char_type c) const
 {
+#ifdef __APPLE__
     return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c;
+#else
+    return 0;
+#endif
 }
 
 const char*
 ctype<char>::do_tolower(char_type* low, const char_type* high) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low)
         *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low;
     return low;
+#else
+    return NULL;
+#endif
 }
 
 char
@@ -849,7 +897,11 @@
 const ctype<char>::mask*
 ctype<char>::classic_table() throw()
 {
+#ifdef __APPLE__
     return _DefaultRuneLocale.__runetype;
+#else
+    return NULL;
+#endif
 }
 
 // template <> class ctype_byname<char>
@@ -947,6 +999,7 @@
 const wchar_t*
 ctype_byname<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low, ++vec)
     {
         if (isascii(*low))
@@ -975,6 +1028,9 @@
         }
     }
     return low;
+#else
+    return NULL;
+#endif
 }
 
 const wchar_t*
@@ -1026,33 +1082,49 @@
 wchar_t
 ctype_byname<wchar_t>::do_widen(char c) const
 {
+#ifdef __APPLE__
     return btowc_l(c, __l);
+#else
+    return 0;
+#endif
 }
 
 const char*
 ctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low, ++dest)
         *dest = btowc_l(*low, __l);
     return low;
+#else
+    return NULL;
+#endif
 }
 
 char
 ctype_byname<wchar_t>::do_narrow(char_type c, char dfault) const
 {
+#ifdef __APPLE__
     int r = wctob_l(c, __l);
     return r != WEOF ? static_cast<char>(r) : dfault;
+#else
+    return 0;
+#endif
 }
 
 const wchar_t*
 ctype_byname<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
 {
+#ifdef __APPLE__
     for (; low != high; ++low, ++dest)
     {
         int r = wctob_l(*low, __l);
         *dest = r != WEOF ? static_cast<char>(r) : dfault;
     }
     return low;
+#else
+    return NULL;
+#endif
 }
 
 // template <> class codecvt<char, char, mbstate_t>
@@ -1148,6 +1220,7 @@
     const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
     extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
 {
+#ifdef __APPLE__
     // look for first internal null in frm
     const intern_type* fend = frm;
     for (; fend != frm_end; ++fend)
@@ -1197,6 +1270,9 @@
         }
     }
     return frm_nxt == frm_end ? ok : partial;
+#else
+    return error;
+#endif
 }
 
 codecvt<wchar_t, char, mbstate_t>::result
@@ -1204,6 +1280,7 @@
     const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
     intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
 {
+#ifdef __APPLE__
     // look for first internal null in frm
     const extern_type* fend = frm;
     for (; fend != frm_end; ++fend)
@@ -1261,12 +1338,16 @@
         }
     }
     return frm_nxt == frm_end ? ok : partial;
+#else
+    return error;
+#endif
 }
 
 codecvt<wchar_t, char, mbstate_t>::result
 codecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st,
     extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
 {
+#ifdef __APPLE__
     to_nxt = to;
     extern_type tmp[MB_LEN_MAX];
     size_t n = wcrtomb_l(tmp, intern_type(), &st, __l);
@@ -1278,11 +1359,15 @@
     for (extern_type* p = tmp; n; --n)  // write it
         *to_nxt++ = *p++;
     return ok;
+#else
+    return error;
+#endif
 }
 
 int
 codecvt<wchar_t, char, mbstate_t>::do_encoding() const throw()
 {
+#ifdef __APPLE__
     if (mbtowc_l(0, 0, MB_LEN_MAX, __l) == 0)
     {
         // stateless encoding
@@ -1291,6 +1376,9 @@
          return 0;
     }
     return -1;
+#else
+    return 0;
+#endif
 }
 
 bool
@@ -1303,6 +1391,7 @@
 codecvt<wchar_t, char, mbstate_t>::do_length(state_type& st,
     const extern_type* frm, const extern_type* frm_end, size_t mx) const
 {
+#ifdef __APPLE__
     int nbytes = 0;
     for (size_t nwchar_t = 0; nwchar_t < mx && frm != frm_end; ++nwchar_t)
     {
@@ -1323,12 +1412,19 @@
         }
     }
     return nbytes;
+#else
+    return 0;
+#endif
 }
 
 int
 codecvt<wchar_t, char, mbstate_t>::do_max_length() const throw()
 {
+#ifdef __APPLE__
     return __l == 0 ? 1 : MB_CUR_MAX_L(__l);
+#else
+    return 0;
+#endif
 }
 
 //                                     Valid UTF ranges
@@ -3869,6 +3965,7 @@
 void
 numpunct_byname<char>::__init(const char* nm)
 {
+#ifdef __APPLE__
     if (strcmp(nm, "C") != 0)
     {
         unique_ptr<_xlocale, int(*)(locale_t)>  loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
@@ -3885,6 +3982,7 @@
         __grouping_ = lc->grouping;
         // locallization for truename and falsename is not available
     }
+#endif
 }
 
 // numpunct_byname<wchar_t>
@@ -3908,6 +4006,7 @@
 void
 numpunct_byname<wchar_t>::__init(const char* nm)
 {
+#ifdef __APPLE__
     if (strcmp(nm, "C") != 0)
     {
         unique_ptr<_xlocale, int(*)(locale_t)>  loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
@@ -3924,6 +4023,7 @@
         __grouping_ = lc->grouping;
         // locallization for truename and falsename is not available
     }
+#endif
 }
 
 // num_get helpers
@@ -4488,6 +4588,7 @@
 wstring
 __time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct)
 {
+#ifdef __APPLE__
     tm t;
     t.tm_sec = 59;
     t.tm_min = 55;
@@ -4632,6 +4733,9 @@
         ++wbb;
     }
     return result;
+#else
+    return wstring();
+#endif
 }
 
 template <>
@@ -4675,6 +4779,7 @@
 void
 __time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct)
 {
+#ifdef __APPLE__
     tm t = {0};
     char buf[100];
     size_t be;
@@ -4746,6 +4851,7 @@
     __r_ = __analyze('r', ct);
     __x_ = __analyze('x', ct);
     __X_ = __analyze('X', ct);
+#endif
 }
 
 template <class CharT>
@@ -5007,6 +5113,7 @@
 __time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm,
                      char __fmt, char __mod) const
 {
+#ifdef __APPLE__
     char __nar[100];
     char* __ne = __nar + 100;
     __do_put(__nar, __ne, __tm, __fmt, __mod);
@@ -5016,6 +5123,7 @@
     if (j == -1)
         __throw_runtime_error("locale not supported");
     __we = __wb + j;
+#endif
 }
 
 // moneypunct_byname
@@ -5260,6 +5368,7 @@
 void
 moneypunct_byname<char, false>::init(const char* nm)
 {
+#ifdef __APPLE__
     typedef moneypunct<char, false> base;
     unique_ptr<_xlocale, int(*)(locale_t)>  loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
 #ifndef _LIBCPP_NO_EXCEPTIONS
@@ -5292,12 +5401,14 @@
         __negative_sign_ = lc->negative_sign;
     __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn);
     __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn);
+#endif
 }
 
 template<>
 void
 moneypunct_byname<char, true>::init(const char* nm)
 {
+#ifdef __APPLE__
     typedef moneypunct<char, true> base;
     unique_ptr<_xlocale, int(*)(locale_t)>  loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
 #ifndef _LIBCPP_NO_EXCEPTIONS
@@ -5330,12 +5441,14 @@
         __negative_sign_ = lc->negative_sign;
     __init_pat(__pos_format_, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn);
     __init_pat(__neg_format_, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn);
+#endif
 }
 
 template<>
 void
 moneypunct_byname<wchar_t, false>::init(const char* nm)
 {
+#ifdef __APPLE__
     typedef moneypunct<wchar_t, false> base;
     unique_ptr<_xlocale, int(*)(locale_t)>  loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
 #ifndef _LIBCPP_NO_EXCEPTIONS
@@ -5391,12 +5504,14 @@
     }
     __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn);
     __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn);
+#endif
 }
 
 template<>
 void
 moneypunct_byname<wchar_t, true>::init(const char* nm)
 {
+#ifdef __APPLE__
     typedef moneypunct<wchar_t, true> base;
     unique_ptr<_xlocale, int(*)(locale_t)>  loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
 #ifndef _LIBCPP_NO_EXCEPTIONS
@@ -5452,6 +5567,7 @@
     }
     __init_pat(__pos_format_, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn);
     __init_pat(__neg_format_, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn);
+#endif
 }
 
 void __do_nothing(void*) {}
@@ -5526,4 +5642,3 @@
 template class __vector_base_common<true>;
 
 _LIBCPP_END_NAMESPACE_STD
-#endif  // __APPLE__