Line data Source code
1 : /*============================================================================= 2 : Copyright (c) 1998-2003 Joel de Guzman 3 : Copyright (c) 2003 Martin Wille 4 : http://spirit.sourceforge.net/ 5 : 6 : Use, modification and distribution is subject to the Boost Software 7 : License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 8 : http://www.boost.org/LICENSE_1_0.txt) 9 : =============================================================================*/ 10 : #if !defined(BOOST_SPIRIT_PRIMITIVES_IPP) 11 : #define BOOST_SPIRIT_PRIMITIVES_IPP 12 : 13 : #include <cctype> 14 : #if !defined(BOOST_NO_CWCTYPE) 15 : #include <cwctype> 16 : #endif 17 : 18 : #include <string> // char_traits 19 : 20 : #if defined(BOOST_MSVC) 21 : # pragma warning (push) 22 : # pragma warning(disable:4800) 23 : #endif 24 : 25 : namespace boost { namespace spirit { 26 : 27 : BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN 28 : 29 : template <typename DrivedT> struct char_parser; 30 : 31 : namespace impl 32 : { 33 : template <typename IteratorT> 34 : inline IteratorT 35 : get_last(IteratorT first) 36 : { 37 : while (*first) 38 : first++; 39 : return first; 40 : } 41 : 42 : template< 43 : typename RT, 44 : typename IteratorT, 45 : typename ScannerT> 46 : inline RT 47 : string_parser_parse( 48 : IteratorT str_first, 49 : IteratorT str_last, 50 : ScannerT& scan) 51 : { 52 : typedef typename ScannerT::iterator_t iterator_t; 53 : iterator_t saved = scan.first; 54 : std::size_t slen = str_last - str_first; 55 : 56 : while (str_first != str_last) 57 : { 58 : if (scan.at_end() || (*str_first != *scan)) 59 : return scan.no_match(); 60 : ++str_first; 61 : ++scan; 62 : } 63 : 64 : return scan.create_match(slen, nil_t(), saved, scan.first); 65 : } 66 : 67 : /////////////////////////////////////////////////////////////////////////// 68 : // 69 : // Conversion from char_type to int_type 70 : // 71 : /////////////////////////////////////////////////////////////////////////// 72 : 73 : // Use char_traits for char and wchar_t only, as these are the only 74 : // specializations provided in the standard. Other types are on their 75 : // own. 76 : // 77 : // For UDT, one may override: 78 : // 79 : // isalnum 80 : // isalpha 81 : // iscntrl 82 : // isdigit 83 : // isgraph 84 : // islower 85 : // isprint 86 : // ispunct 87 : // isspace 88 : // isupper 89 : // isxdigit 90 : // isblank 91 : // isupper 92 : // tolower 93 : // toupper 94 : // 95 : // in a namespace suitable for Argument Dependent lookup or in 96 : // namespace std (disallowed by the standard). 97 : 98 : template <typename CharT> 99 : struct char_type_char_traits_helper 100 : { 101 : typedef CharT char_type; 102 : typedef typename std::char_traits<CharT>::int_type int_type; 103 : 104 0 : static int_type to_int_type(CharT c) 105 : { 106 0 : return std::char_traits<CharT>::to_int_type(c); 107 : } 108 : 109 : static char_type to_char_type(int_type i) 110 : { 111 : return std::char_traits<CharT>::to_char_type(i); 112 : } 113 : }; 114 : 115 : template <typename CharT> 116 : struct char_traits_helper 117 : { 118 : typedef CharT char_type; 119 : typedef CharT int_type; 120 : 121 : static CharT & to_int_type(CharT & c) 122 : { 123 : return c; 124 : } 125 : 126 : static CharT & to_char_type(CharT & c) 127 : { 128 : return c; 129 : } 130 : }; 131 : 132 : template <> 133 : struct char_traits_helper<char> 134 : : char_type_char_traits_helper<char> 135 : { 136 : }; 137 : 138 : #if !defined(BOOST_NO_CWCTYPE) 139 : 140 : template <> 141 : struct char_traits_helper<wchar_t> 142 : : char_type_char_traits_helper<wchar_t> 143 : { 144 : }; 145 : 146 : #endif 147 : 148 : template <typename CharT> 149 : inline typename char_traits_helper<CharT>::int_type 150 0 : to_int_type(CharT c) 151 : { 152 0 : return char_traits_helper<CharT>::to_int_type(c); 153 : } 154 : 155 : template <typename CharT> 156 : inline CharT 157 : to_char_type(typename char_traits_helper<CharT>::int_type c) 158 : { 159 : return char_traits_helper<CharT>::to_char_type(c); 160 : } 161 : 162 : /////////////////////////////////////////////////////////////////////// 163 : // 164 : // Convenience functions 165 : // 166 : /////////////////////////////////////////////////////////////////////// 167 : 168 : template <typename CharT> 169 : inline bool 170 : isalnum_(CharT c) 171 : { 172 : using namespace std; 173 : return isalnum(to_int_type(c)) ? true : false; 174 : } 175 : 176 : template <typename CharT> 177 : inline bool 178 : isalpha_(CharT c) 179 : { 180 : using namespace std; 181 : return isalpha(to_int_type(c)) ? true : false; 182 : } 183 : 184 : template <typename CharT> 185 : inline bool 186 : iscntrl_(CharT c) 187 : { 188 : using namespace std; 189 : return iscntrl(to_int_type(c)) ? true : false; 190 : } 191 : 192 : template <typename CharT> 193 : inline bool 194 0 : isdigit_(CharT c) 195 : { 196 : using namespace std; 197 0 : return isdigit(to_int_type(c)) ? true : false; 198 : } 199 : 200 : template <typename CharT> 201 : inline bool 202 : isgraph_(CharT c) 203 : { 204 : using namespace std; 205 : return isgraph(to_int_type(c)) ? true : false; 206 : } 207 : 208 : template <typename CharT> 209 : inline bool 210 : islower_(CharT c) 211 : { 212 : using namespace std; 213 : return islower(to_int_type(c)) ? true : false; 214 : } 215 : 216 : template <typename CharT> 217 : inline bool 218 : isprint_(CharT c) 219 : { 220 : using namespace std; 221 : return isprint(to_int_type(c)) ? true : false; 222 : } 223 : 224 : template <typename CharT> 225 : inline bool 226 : ispunct_(CharT c) 227 : { 228 : using namespace std; 229 : return ispunct(to_int_type(c)) ? true : false; 230 : } 231 : 232 : template <typename CharT> 233 : inline bool 234 : isspace_(CharT c) 235 : { 236 : using namespace std; 237 : return isspace(to_int_type(c)) ? true : false; 238 : } 239 : 240 : template <typename CharT> 241 : inline bool 242 : isupper_(CharT c) 243 : { 244 : using namespace std; 245 : return isupper(to_int_type(c)) ? true : false; 246 : } 247 : 248 : template <typename CharT> 249 : inline bool 250 : isxdigit_(CharT c) 251 : { 252 : using namespace std; 253 : return isxdigit(to_int_type(c)) ? true : false; 254 : } 255 : 256 : template <typename CharT> 257 : inline bool 258 : isblank_(CharT c) 259 : { 260 : return (c == ' ' || c == '\t'); 261 : } 262 : 263 : template <typename CharT> 264 : inline CharT 265 : tolower_(CharT c) 266 : { 267 : using namespace std; 268 : return to_char_type<CharT>(tolower(to_int_type(c))); 269 : } 270 : 271 : template <typename CharT> 272 : inline CharT 273 : toupper_(CharT c) 274 : { 275 : using namespace std; 276 : return to_char_type<CharT>(toupper(to_int_type(c))); 277 : } 278 : 279 : #if !defined(BOOST_NO_CWCTYPE) 280 : 281 : inline bool 282 : isalnum_(wchar_t c) 283 : { 284 : using namespace std; 285 : return iswalnum(to_int_type(c)) ? true : false; 286 : } 287 : 288 : inline bool 289 : isalpha_(wchar_t c) 290 : { 291 : using namespace std; 292 : return iswalpha(to_int_type(c)) ? true : false; 293 : } 294 : 295 : inline bool 296 : iscntrl_(wchar_t c) 297 : { 298 : using namespace std; 299 : return iswcntrl(to_int_type(c)) ? true : false; 300 : } 301 : 302 : inline bool 303 : isdigit_(wchar_t c) 304 : { 305 : using namespace std; 306 : return iswdigit(to_int_type(c)) ? true : false; 307 : } 308 : 309 : inline bool 310 : isgraph_(wchar_t c) 311 : { 312 : using namespace std; 313 : return iswgraph(to_int_type(c)) ? true : false; 314 : } 315 : 316 : inline bool 317 : islower_(wchar_t c) 318 : { 319 : using namespace std; 320 : return iswlower(to_int_type(c)) ? true : false; 321 : } 322 : 323 : inline bool 324 : isprint_(wchar_t c) 325 : { 326 : using namespace std; 327 : return iswprint(to_int_type(c)) ? true : false; 328 : } 329 : 330 : inline bool 331 : ispunct_(wchar_t c) 332 : { 333 : using namespace std; 334 : return iswpunct(to_int_type(c)) ? true : false; 335 : } 336 : 337 : inline bool 338 : isspace_(wchar_t c) 339 : { 340 : using namespace std; 341 : return iswspace(to_int_type(c)) ? true : false; 342 : } 343 : 344 : inline bool 345 : isupper_(wchar_t c) 346 : { 347 : using namespace std; 348 : return iswupper(to_int_type(c)) ? true : false; 349 : } 350 : 351 : inline bool 352 : isxdigit_(wchar_t c) 353 : { 354 : using namespace std; 355 : return iswxdigit(to_int_type(c)) ? true : false; 356 : } 357 : 358 : inline bool 359 : isblank_(wchar_t c) 360 : { 361 : return (c == L' ' || c == L'\t'); 362 : } 363 : 364 : inline wchar_t 365 : tolower_(wchar_t c) 366 : { 367 : using namespace std; 368 : return to_char_type<wchar_t>(towlower(to_int_type(c))); 369 : } 370 : 371 : inline wchar_t 372 : toupper_(wchar_t c) 373 : { 374 : using namespace std; 375 : return to_char_type<wchar_t>(towupper(to_int_type(c))); 376 : } 377 : 378 : inline bool 379 : isblank_(bool) 380 : { 381 : return false; 382 : } 383 : 384 : #endif // !defined(BOOST_NO_CWCTYPE) 385 : 386 : } 387 : 388 : BOOST_SPIRIT_CLASSIC_NAMESPACE_END 389 : 390 : }} // namespace boost::spirit::impl 391 : 392 : #ifdef BOOST_MSVC 393 : #pragma warning (pop) 394 : #endif 395 : 396 : #endif