]> git.saurik.com Git - wxWidgets.git/blob - src/common/xlocale.cpp
e72fd843a058b91396770b96254a16caf0fc1042
[wxWidgets.git] / src / common / xlocale.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/xlocale.cpp
3 // Purpose: xlocale wrappers/impl to provide some xlocale wrappers
4 // Author: Brian Vanderburg II, Vadim Zeitlin
5 // Created: 2008-01-07
6 // RCS-ID: $Id$
7 // Copyright: (c) 2008 Brian Vanderburg II
8 // 2008 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #if wxUSE_XLOCALE
27
28 #ifndef WX_PRECOMP
29 #include "wx/module.h"
30 #endif
31
32 #include "wx/xlocale.h"
33
34 // ----------------------------------------------------------------------------
35 // module globals
36 // ----------------------------------------------------------------------------
37
38 // This is the C locale object, it is created on demand
39 static wxXLocale *gs_cLocale = NULL;
40
41 // ============================================================================
42 // implementation
43 // ============================================================================
44
45 // ----------------------------------------------------------------------------
46 // Module for gs_cLocale cleanup
47 // ----------------------------------------------------------------------------
48
49 class wxXLocaleModule : public wxModule
50 {
51 public:
52 virtual bool OnInit() { return true; }
53 virtual void OnExit() { wxDELETE(gs_cLocale); }
54
55 DECLARE_DYNAMIC_CLASS(wxXLocaleModule)
56 };
57
58 IMPLEMENT_DYNAMIC_CLASS(wxXLocaleModule, wxModule)
59
60
61 // ============================================================================
62 // wxXLocale implementation
63 // ============================================================================
64
65 // ----------------------------------------------------------------------------
66 // common parts
67 // ----------------------------------------------------------------------------
68
69 // Get the C locale
70 wxXLocale& wxXLocale::GetCLocale()
71 {
72 if ( !gs_cLocale )
73 {
74 gs_cLocale = new wxXLocale(wx_static_cast(wxXLocaleCTag *, NULL));
75 }
76
77 return *gs_cLocale;
78 }
79
80 #ifdef wxHAS_XLOCALE_SUPPORT
81
82 wxXLocale::wxXLocale(wxLanguage lang)
83 {
84 const wxLanguageInfo * const info = wxLocale::GetLanguageInfo(lang);
85 if ( !info )
86 {
87 m_locale = NULL;
88 }
89 else
90 {
91 #ifdef __WXMSW__
92 Init(info->Description);
93 #else
94 Init(info->CanonicalName);
95 #endif
96 }
97 }
98
99 #if wxCHECK_VISUALC_VERSION(8)
100
101 // ----------------------------------------------------------------------------
102 // implementation using MSVC locale API
103 // ----------------------------------------------------------------------------
104
105 void wxXLocale::Init(const char *loc)
106 {
107 m_locale = _create_locale(LC_ALL, loc);
108 }
109
110 void wxXLocale::Free()
111 {
112 if ( m_locale )
113 _free_locale(m_locale);
114 }
115
116 #elif defined(HAVE_LOCALE_T)
117
118 // ----------------------------------------------------------------------------
119 // implementation using xlocale API
120 // ----------------------------------------------------------------------------
121
122 void wxXLocale::Init(const char *loc)
123 {
124 m_locale = newlocale(LC_ALL_MASK, loc, NULL);
125 }
126
127 void wxXLocale::Free()
128 {
129 if ( m_locale )
130 freelocale(m_locale);
131 }
132
133 #else
134 #error "Unknown xlocale support."
135 #endif
136
137 #endif // wxHAS_XLOCALE_SUPPORT
138
139 #ifndef wxHAS_XLOCALE_SUPPORT
140
141 // ============================================================================
142 // Implementation of wxFoo_l() functions for "C" locale without xlocale support
143 // ============================================================================
144
145 // ----------------------------------------------------------------------------
146 // character classification and transformation functions
147 // ----------------------------------------------------------------------------
148
149 // lookup table and macros for character type functions
150 #define CTYPE_ALNUM 0x0001
151 #define CTYPE_ALPHA 0x0002
152 #define CTYPE_CNTRL 0x0004
153 #define CTYPE_DIGIT 0x0008
154 #define CTYPE_GRAPH 0x0010
155 #define CTYPE_LOWER 0x0020
156 #define CTYPE_PRINT 0x0040
157 #define CTYPE_PUNCT 0x0080
158 #define CTYPE_SPACE 0x0100
159 #define CTYPE_UPPER 0x0200
160 #define CTYPE_XDIGIT 0x0400
161
162 static unsigned int gs_lookup[] =
163 {
164 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
165 0x0004, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0004, 0x0004,
166 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
167 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
168 0x0140, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
169 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
170 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459,
171 0x0459, 0x0459, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
172 0x00D0, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0253,
173 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253,
174 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253,
175 0x0253, 0x0253, 0x0253, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
176 0x00D0, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0073,
177 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073,
178 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073,
179 0x0073, 0x0073, 0x0073, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x0004
180 };
181
182
183 #define CTYPE_TEST(c, t) ( (c) <= 127 && (gs_lookup[(c)] & (t)) )
184
185
186 // ctype functions
187 #define GEN_ISFUNC(name, test) \
188 int name(const wxUniChar& c, const wxXLocale& loc) \
189 { \
190 wxCHECK(loc.IsOk(), false); \
191 return CTYPE_TEST(c.GetValue(), test); \
192 }
193
194 GEN_ISFUNC(wxIsalnum_l, CTYPE_ALNUM)
195 GEN_ISFUNC(wxIsalpha_l, CTYPE_ALPHA)
196 GEN_ISFUNC(wxIscntrl_l, CTYPE_CNTRL)
197 GEN_ISFUNC(wxIsdigit_l, CTYPE_DIGIT)
198 GEN_ISFUNC(wxIsgraph_l, CTYPE_GRAPH)
199 GEN_ISFUNC(wxIslower_l, CTYPE_LOWER)
200 GEN_ISFUNC(wxIsprint_l, CTYPE_PRINT)
201 GEN_ISFUNC(wxIspunct_l, CTYPE_PUNCT)
202 GEN_ISFUNC(wxIsspace_l, CTYPE_SPACE)
203 GEN_ISFUNC(wxIsupper_l, CTYPE_UPPER)
204 GEN_ISFUNC(wxIsxdigit_l, CTYPE_XDIGIT)
205
206 int wxTolower_l(const wxUniChar& c, const wxXLocale& loc)
207 {
208 wxCHECK(loc.IsOk(), false);
209
210 if(CTYPE_TEST(c.GetValue(), CTYPE_UPPER))
211 {
212 return c - 'A' + 'a';
213 }
214
215 return c;
216 }
217
218 int wxToupper_l(const wxUniChar& c, const wxXLocale& loc)
219 {
220 wxCHECK(loc.IsOk(), false);
221
222 if(CTYPE_TEST(c.GetValue(), CTYPE_LOWER))
223 {
224 return c - 'a' + 'A';
225 }
226
227 return c;
228 }
229
230 #endif // !defined(wxHAS_XLOCALE_SUPPORT)
231
232 #endif // wxUSE_XLOCALE