Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2011 Hartmut Kaiser
|
Chris@16
|
3 Copyright (c) 2001-2011 Joel de Guzman
|
Chris@16
|
4
|
Chris@16
|
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 =============================================================================*/
|
Chris@16
|
8 #if !defined(BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM)
|
Chris@16
|
9 #define BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM
|
Chris@16
|
10
|
Chris@16
|
11 #if defined(_MSC_VER)
|
Chris@16
|
12 #pragma once
|
Chris@16
|
13 #endif
|
Chris@16
|
14
|
Chris@16
|
15 #include <cwctype>
|
Chris@16
|
16 #include <string>
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/cstdint.hpp>
|
Chris@16
|
19 #include <boost/spirit/home/support/assert_msg.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 namespace boost { namespace spirit { namespace traits
|
Chris@16
|
22 {
|
Chris@16
|
23 template <std::size_t N>
|
Chris@16
|
24 struct wchar_t_size
|
Chris@16
|
25 {
|
Chris@16
|
26 BOOST_SPIRIT_ASSERT_MSG(N == 1 || N == 2 || N == 4,
|
Chris@16
|
27 not_supported_size_of_wchar_t, ());
|
Chris@16
|
28 };
|
Chris@16
|
29
|
Chris@16
|
30 template <> struct wchar_t_size<1> { enum { mask = 0xff }; };
|
Chris@16
|
31 template <> struct wchar_t_size<2> { enum { mask = 0xffff }; };
|
Chris@16
|
32 template <> struct wchar_t_size<4> { enum { mask = 0xffffffff }; };
|
Chris@16
|
33
|
Chris@16
|
34 }}}
|
Chris@16
|
35
|
Chris@16
|
36 namespace boost { namespace spirit { namespace char_encoding
|
Chris@16
|
37 {
|
Chris@16
|
38 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
39 // Test characters for specified conditions (using std wchar_t functions)
|
Chris@16
|
40 ///////////////////////////////////////////////////////////////////////////
|
Chris@16
|
41
|
Chris@16
|
42 struct standard_wide
|
Chris@16
|
43 {
|
Chris@16
|
44 typedef wchar_t char_type;
|
Chris@16
|
45
|
Chris@16
|
46 template <typename Char>
|
Chris@16
|
47 static typename std::char_traits<Char>::int_type
|
Chris@16
|
48 to_int_type(Char ch)
|
Chris@16
|
49 {
|
Chris@16
|
50 return std::char_traits<Char>::to_int_type(ch);
|
Chris@16
|
51 }
|
Chris@16
|
52
|
Chris@16
|
53 template <typename Char>
|
Chris@16
|
54 static Char
|
Chris@16
|
55 to_char_type(typename std::char_traits<Char>::int_type ch)
|
Chris@16
|
56 {
|
Chris@16
|
57 return std::char_traits<Char>::to_char_type(ch);
|
Chris@16
|
58 }
|
Chris@16
|
59
|
Chris@16
|
60 static bool
|
Chris@16
|
61 ischar(int ch)
|
Chris@16
|
62 {
|
Chris@16
|
63 // we have to watch out for sign extensions (casting is there to
|
Chris@16
|
64 // silence certain compilers complaining about signed/unsigned
|
Chris@16
|
65 // mismatch)
|
Chris@16
|
66 return (
|
Chris@16
|
67 std::size_t(0) ==
|
Chris@16
|
68 std::size_t(ch & ~traits::wchar_t_size<sizeof(wchar_t)>::mask) ||
|
Chris@16
|
69 std::size_t(~0) ==
|
Chris@16
|
70 std::size_t(ch | traits::wchar_t_size<sizeof(wchar_t)>::mask)
|
Chris@16
|
71 ) ? true : false; // any wchar_t, but no other bits set
|
Chris@16
|
72 }
|
Chris@16
|
73
|
Chris@16
|
74 static bool
|
Chris@16
|
75 isalnum(wchar_t ch)
|
Chris@16
|
76 {
|
Chris@16
|
77 using namespace std;
|
Chris@16
|
78 return iswalnum(to_int_type(ch)) ? true : false;
|
Chris@16
|
79 }
|
Chris@16
|
80
|
Chris@16
|
81 static bool
|
Chris@16
|
82 isalpha(wchar_t ch)
|
Chris@16
|
83 {
|
Chris@16
|
84 using namespace std;
|
Chris@16
|
85 return iswalpha(to_int_type(ch)) ? true : false;
|
Chris@16
|
86 }
|
Chris@16
|
87
|
Chris@16
|
88 static bool
|
Chris@16
|
89 iscntrl(wchar_t ch)
|
Chris@16
|
90 {
|
Chris@16
|
91 using namespace std;
|
Chris@16
|
92 return iswcntrl(to_int_type(ch)) ? true : false;
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 static bool
|
Chris@16
|
96 isdigit(wchar_t ch)
|
Chris@16
|
97 {
|
Chris@16
|
98 using namespace std;
|
Chris@16
|
99 return iswdigit(to_int_type(ch)) ? true : false;
|
Chris@16
|
100 }
|
Chris@16
|
101
|
Chris@16
|
102 static bool
|
Chris@16
|
103 isgraph(wchar_t ch)
|
Chris@16
|
104 {
|
Chris@16
|
105 using namespace std;
|
Chris@16
|
106 return iswgraph(to_int_type(ch)) ? true : false;
|
Chris@16
|
107 }
|
Chris@16
|
108
|
Chris@16
|
109 static bool
|
Chris@16
|
110 islower(wchar_t ch)
|
Chris@16
|
111 {
|
Chris@16
|
112 using namespace std;
|
Chris@16
|
113 return iswlower(to_int_type(ch)) ? true : false;
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 static bool
|
Chris@16
|
117 isprint(wchar_t ch)
|
Chris@16
|
118 {
|
Chris@16
|
119 using namespace std;
|
Chris@16
|
120 return iswprint(to_int_type(ch)) ? true : false;
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 static bool
|
Chris@16
|
124 ispunct(wchar_t ch)
|
Chris@16
|
125 {
|
Chris@16
|
126 using namespace std;
|
Chris@16
|
127 return iswpunct(to_int_type(ch)) ? true : false;
|
Chris@16
|
128 }
|
Chris@16
|
129
|
Chris@16
|
130 static bool
|
Chris@16
|
131 isspace(wchar_t ch)
|
Chris@16
|
132 {
|
Chris@16
|
133 using namespace std;
|
Chris@16
|
134 return iswspace(to_int_type(ch)) ? true : false;
|
Chris@16
|
135 }
|
Chris@16
|
136
|
Chris@16
|
137 static bool
|
Chris@16
|
138 isupper(wchar_t ch)
|
Chris@16
|
139 {
|
Chris@16
|
140 using namespace std;
|
Chris@16
|
141 return iswupper(to_int_type(ch)) ? true : false;
|
Chris@16
|
142 }
|
Chris@16
|
143
|
Chris@16
|
144 static bool
|
Chris@16
|
145 isxdigit(wchar_t ch)
|
Chris@16
|
146 {
|
Chris@16
|
147 using namespace std;
|
Chris@16
|
148 return iswxdigit(to_int_type(ch)) ? true : false;
|
Chris@16
|
149 }
|
Chris@16
|
150
|
Chris@16
|
151 static bool
|
Chris@16
|
152 isblank BOOST_PREVENT_MACRO_SUBSTITUTION (wchar_t ch)
|
Chris@16
|
153 {
|
Chris@16
|
154 return (ch == L' ' || ch == L'\t');
|
Chris@16
|
155 }
|
Chris@16
|
156
|
Chris@101
|
157 ///////////////////////////////////////////////////////////////////////
|
Chris@101
|
158 // Simple character conversions
|
Chris@101
|
159 ///////////////////////////////////////////////////////////////////////
|
Chris@101
|
160
|
Chris@16
|
161 static wchar_t
|
Chris@16
|
162 tolower(wchar_t ch)
|
Chris@16
|
163 {
|
Chris@16
|
164 using namespace std;
|
Chris@16
|
165 return isupper(ch) ?
|
Chris@16
|
166 to_char_type<wchar_t>(towlower(to_int_type(ch))) : ch;
|
Chris@16
|
167 }
|
Chris@16
|
168
|
Chris@16
|
169 static wchar_t
|
Chris@16
|
170 toupper(wchar_t ch)
|
Chris@16
|
171 {
|
Chris@16
|
172 using namespace std;
|
Chris@16
|
173 return islower(ch) ?
|
Chris@16
|
174 to_char_type<wchar_t>(towupper(to_int_type(ch))) : ch;
|
Chris@16
|
175 }
|
Chris@16
|
176
|
Chris@16
|
177 static ::boost::uint32_t
|
Chris@16
|
178 toucs4(int ch)
|
Chris@16
|
179 {
|
Chris@16
|
180 return ch;
|
Chris@16
|
181 }
|
Chris@16
|
182 };
|
Chris@16
|
183 }}}
|
Chris@16
|
184
|
Chris@16
|
185 #endif
|
Chris@16
|
186
|