1 /* 2 * 3 * Copyright (c) 1998-2002 4 * John Maddock 5 * 6 * Use, modification and distribution are subject to the 7 * Boost Software License, Version 1.0. (See accompanying file 8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 * 10 */ 11 12 /* 13 * LOCATION: see http://www.boost.org for most recent version. 14 * FILE config.hpp 15 * VERSION see <boost/version.hpp> 16 * DESCRIPTION: regex extended config setup. 17 */ 18 19 #ifndef BOOST_REGEX_CONFIG_HPP 20 #define BOOST_REGEX_CONFIG_HPP 21 /* 22 * Borland C++ Fix/error check 23 * this has to go *before* we include any std lib headers: 24 */ 25 #if defined(__BORLANDC__) 26 # include <boost/regex/config/borland.hpp> 27 #endif 28 29 /***************************************************************************** 30 * 31 * Include all the headers we need here: 32 * 33 ****************************************************************************/ 34 35 #ifdef __cplusplus 36 37 # ifndef BOOST_REGEX_USER_CONFIG 38 # define BOOST_REGEX_USER_CONFIG <boost/regex/user.hpp> 39 # endif 40 41 # include BOOST_REGEX_USER_CONFIG 42 43 # include <boost/config.hpp> 44 45 #else 46 /* 47 * C build, 48 * don't include <boost/config.hpp> because that may 49 * do C++ specific things in future... 50 */ 51 # include <stdlib.h> 52 # include <stddef.h> 53 # ifdef _MSC_VER 54 # define BOOST_MSVC _MSC_VER 55 # endif 56 #endif 57 58 /***************************************************************************** 59 * 60 * Boilerplate regex config options: 61 * 62 ****************************************************************************/ 63 64 /* Obsolete macro, use BOOST_VERSION instead: */ 65 #define BOOST_RE_VERSION 320 66 67 /* fix: */ 68 #if defined(_UNICODE) && !defined(UNICODE) 69 #define UNICODE 70 #endif 71 72 /* 73 * Fix for gcc prior to 3.4: std::ctype<wchar_t> doesn't allow 74 * masks to be combined, for example: 75 * std::use_facet<std::ctype<wchar_t> >.is(std::ctype_base::lower|std::ctype_base::upper, L'a'); 76 * returns *false*. 77 */ 78 #ifdef __GLIBCPP__ 79 # define BOOST_REGEX_BUGGY_CTYPE_FACET 80 #endif 81 82 /* 83 * Intel C++ before 8.0 ends up with unresolved externals unless we turn off 84 * extern template support: 85 */ 86 #if defined(BOOST_INTEL) && defined(__cplusplus) && (BOOST_INTEL <= 800) 87 # define BOOST_REGEX_NO_EXTERNAL_TEMPLATES 88 #endif 89 /* 90 * Visual C++ doesn't support external templates with C++ extensions turned off: 91 */ 92 #if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS) 93 # define BOOST_REGEX_NO_EXTERNAL_TEMPLATES 94 #endif 95 /* 96 * Shared regex lib will crash without this, frankly it looks a lot like a gcc bug: 97 */ 98 #if defined(__MINGW32__) 99 # define BOOST_REGEX_NO_EXTERNAL_TEMPLATES 100 #endif 101 102 /* 103 * If there isn't good enough wide character support then there will 104 * be no wide character regular expressions: 105 */ 106 #if (defined(BOOST_NO_CWCHAR) || defined(BOOST_NO_CWCTYPE) || defined(BOOST_NO_STD_WSTRING)) 107 # if !defined(BOOST_NO_WREGEX) 108 # define BOOST_NO_WREGEX 109 # endif 110 #else 111 # if defined(__sgi) && (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) 112 /* STLPort on IRIX is misconfigured: <cwctype> does not compile 113 * as a temporary fix include <wctype.h> instead and prevent inclusion 114 * of STLPort version of <cwctype> */ 115 # include <wctype.h> 116 # define __STLPORT_CWCTYPE 117 # define _STLP_CWCTYPE 118 # endif 119 120 #ifdef __cplusplus 121 # include <boost/regex/config/cwchar.hpp> 122 #endif 123 124 #endif 125 126 /* 127 * If Win32 support has been disabled for boost in general, then 128 * it is for regex in particular: 129 */ 130 #if defined(BOOST_DISABLE_WIN32) && !defined(BOOST_REGEX_NO_W32) 131 # define BOOST_REGEX_NO_W32 132 #endif 133 134 /* disable our own file-iterators and mapfiles if we can't 135 * support them: */ 136 #if !defined(BOOST_HAS_DIRENT_H) && !(defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)) 137 # define BOOST_REGEX_NO_FILEITER 138 #endif 139 140 /* backwards compatibitity: */ 141 #if defined(BOOST_RE_NO_LIB) 142 # define BOOST_REGEX_NO_LIB 143 #endif 144 145 #if defined(__GNUC__) && (defined(_WIN32) || defined(__CYGWIN__)) 146 /* gcc on win32 has problems if you include <windows.h> 147 (sporadically generates bad code). */ 148 # define BOOST_REGEX_NO_W32 149 #endif 150 #if defined(__COMO__) && !defined(BOOST_REGEX_NO_W32) && !defined(_MSC_EXTENSIONS) 151 # define BOOST_REGEX_NO_W32 152 #endif 153 154 /***************************************************************************** 155 * 156 * Wide character workarounds: 157 * 158 ****************************************************************************/ 159 160 /* 161 * define BOOST_REGEX_HAS_OTHER_WCHAR_T when wchar_t is a native type, but the users 162 * code may be built with wchar_t as unsigned short: basically when we're building 163 * with MSVC and the /Zc:wchar_t option we place some extra unsigned short versions 164 * of the non-inline functions in the library, so that users can still link to the lib, 165 * irrespective of whether their own code is built with /Zc:wchar_t. 166 * Note that this does NOT WORK with VC10 when the C++ locale is in effect as 167 * the locale's <unsigned short> facets simply do not compile in that case. 168 */ 169 #if defined(__cplusplus) && (defined(BOOST_MSVC) || defined(__ICL)) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) && defined(BOOST_WINDOWS) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) && !defined(BOOST_RWSTD_VER) && ((_MSC_VER < 1600) || !defined(BOOST_REGEX_USE_CPP_LOCALE)) 170 # define BOOST_REGEX_HAS_OTHER_WCHAR_T 171 # ifdef BOOST_MSVC 172 # pragma warning(push) 173 # pragma warning(disable : 4251 4231) 174 # if BOOST_MSVC < 1600 175 # pragma warning(disable : 4660) 176 # endif 177 # endif 178 # if defined(_DLL) && defined(BOOST_MSVC) && (BOOST_MSVC < 1600) 179 # include <string> 180 extern template class __declspec(dllimport) std::basic_string<unsigned short>; 181 # endif 182 # ifdef BOOST_MSVC 183 # pragma warning(pop) 184 # endif 185 #endif 186 187 188 /***************************************************************************** 189 * 190 * Set up dll import/export options: 191 * 192 ****************************************************************************/ 193 194 #ifndef BOOST_SYMBOL_EXPORT 195 # define BOOST_SYMBOL_EXPORT 196 # define BOOST_SYMBOL_IMPORT 197 #endif 198 199 #if (defined(BOOST_REGEX_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)) && !defined(BOOST_REGEX_STATIC_LINK) 200 # if defined(BOOST_REGEX_SOURCE) 201 # define BOOST_REGEX_DECL BOOST_SYMBOL_EXPORT 202 # define BOOST_REGEX_BUILD_DLL 203 # else 204 # define BOOST_REGEX_DECL BOOST_SYMBOL_IMPORT 205 # endif 206 #else 207 # define BOOST_REGEX_DECL 208 #endif 209 210 #if !defined(BOOST_REGEX_NO_LIB) && !defined(BOOST_REGEX_SOURCE) && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus) 211 # define BOOST_LIB_NAME boost_regex 212 # if defined(BOOST_REGEX_DYN_LINK) || defined(BOOST_ALL_DYN_LINK) 213 # define BOOST_DYN_LINK 214 # endif 215 # ifdef BOOST_REGEX_DIAG 216 # define BOOST_LIB_DIAGNOSTIC 217 # endif 218 # include <boost/config/auto_link.hpp> 219 #endif 220 221 /***************************************************************************** 222 * 223 * Set up function call type: 224 * 225 ****************************************************************************/ 226 227 #if defined(BOOST_MSVC) && defined(_MSC_EXTENSIONS) 228 #if defined(_DEBUG) || defined(__MSVC_RUNTIME_CHECKS) || defined(_MANAGED) || defined(BOOST_REGEX_NO_FASTCALL) 229 # define BOOST_REGEX_CALL __cdecl 230 #else 231 # define BOOST_REGEX_CALL __fastcall 232 #endif 233 # define BOOST_REGEX_CCALL __cdecl 234 #endif 235 236 #if defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32) 237 # define BOOST_REGEX_CALL __fastcall 238 # define BOOST_REGEX_CCALL __stdcall 239 #endif 240 241 #ifndef BOOST_REGEX_CALL 242 # define BOOST_REGEX_CALL 243 #endif 244 #ifndef BOOST_REGEX_CCALL 245 #define BOOST_REGEX_CCALL 246 #endif 247 248 /***************************************************************************** 249 * 250 * Set up localisation model: 251 * 252 ****************************************************************************/ 253 254 /* backwards compatibility: */ 255 #ifdef BOOST_RE_LOCALE_C 256 # define BOOST_REGEX_USE_C_LOCALE 257 #endif 258 259 #ifdef BOOST_RE_LOCALE_CPP 260 # define BOOST_REGEX_USE_CPP_LOCALE 261 #endif 262 263 #if defined(__CYGWIN__) 264 # define BOOST_REGEX_USE_C_LOCALE 265 #endif 266 267 /* Win32 defaults to native Win32 locale: */ 268 #if defined(_WIN32) && !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE) && !defined(BOOST_REGEX_NO_W32) 269 # define BOOST_REGEX_USE_WIN32_LOCALE 270 #endif 271 /* otherwise use C++ locale if supported: */ 272 #if !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE) && !defined(BOOST_NO_STD_LOCALE) 273 # define BOOST_REGEX_USE_CPP_LOCALE 274 #endif 275 /* otherwise use C+ locale: */ 276 #if !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE) 277 # define BOOST_REGEX_USE_C_LOCALE 278 #endif 279 280 #ifndef BOOST_REGEX_MAX_STATE_COUNT 281 # define BOOST_REGEX_MAX_STATE_COUNT 100000000 282 #endif 283 284 285 /***************************************************************************** 286 * 287 * Error Handling for exception free compilers: 288 * 289 ****************************************************************************/ 290 291 #ifdef BOOST_NO_EXCEPTIONS 292 /* 293 * If there are no exceptions then we must report critical-errors 294 * the only way we know how; by terminating. 295 */ 296 #include <stdexcept> 297 #include <string> 298 #include <boost/throw_exception.hpp> 299 300 # define BOOST_REGEX_NOEH_ASSERT(x)\ 301 if(0 == (x))\ 302 {\ 303 std::string s("Error: critical regex++ failure in: ");\ 304 s.append(#x);\ 305 std::runtime_error e(s);\ 306 boost::throw_exception(e);\ 307 } 308 #else 309 /* 310 * With exceptions then error handling is taken care of and 311 * there is no need for these checks: 312 */ 313 # define BOOST_REGEX_NOEH_ASSERT(x) 314 #endif 315 316 317 /***************************************************************************** 318 * 319 * Stack protection under MS Windows: 320 * 321 ****************************************************************************/ 322 323 #if !defined(BOOST_REGEX_NO_W32) && !defined(BOOST_REGEX_V3) 324 # if(defined(_WIN32) || defined(_WIN64) || defined(_WINCE)) \ 325 && !defined(__GNUC__) \ 326 && !(defined(__BORLANDC__) && (__BORLANDC__ >= 0x600)) \ 327 && !(defined(__MWERKS__) && (__MWERKS__ <= 0x3003)) 328 # define BOOST_REGEX_HAS_MS_STACK_GUARD 329 # endif 330 #elif defined(BOOST_REGEX_HAS_MS_STACK_GUARD) 331 # undef BOOST_REGEX_HAS_MS_STACK_GUARD 332 #endif 333 334 #if defined(__cplusplus) && defined(BOOST_REGEX_HAS_MS_STACK_GUARD) 335 336 namespace boost{ 337 namespace re_detail{ 338 339 BOOST_REGEX_DECL void BOOST_REGEX_CALL reset_stack_guard_page(); 340 341 } 342 } 343 344 #endif 345 346 347 /***************************************************************************** 348 * 349 * Algorithm selection and configuration: 350 * 351 ****************************************************************************/ 352 353 #if !defined(BOOST_REGEX_RECURSIVE) && !defined(BOOST_REGEX_NON_RECURSIVE) 354 # if defined(BOOST_REGEX_HAS_MS_STACK_GUARD) && !defined(_STLP_DEBUG) && !defined(__STL_DEBUG) && !(defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)) 355 # define BOOST_REGEX_RECURSIVE 356 # else 357 # define BOOST_REGEX_NON_RECURSIVE 358 # endif 359 #endif 360 361 #ifdef BOOST_REGEX_NON_RECURSIVE 362 # ifdef BOOST_REGEX_RECURSIVE 363 # error "Can't set both BOOST_REGEX_RECURSIVE and BOOST_REGEX_NON_RECURSIVE" 364 # endif 365 # ifndef BOOST_REGEX_BLOCKSIZE 366 # define BOOST_REGEX_BLOCKSIZE 4096 367 # endif 368 # if BOOST_REGEX_BLOCKSIZE < 512 369 # error "BOOST_REGEX_BLOCKSIZE must be at least 512" 370 # endif 371 # ifndef BOOST_REGEX_MAX_BLOCKS 372 # define BOOST_REGEX_MAX_BLOCKS 1024 373 # endif 374 # ifdef BOOST_REGEX_HAS_MS_STACK_GUARD 375 # undef BOOST_REGEX_HAS_MS_STACK_GUARD 376 # endif 377 # ifndef BOOST_REGEX_MAX_CACHE_BLOCKS 378 # define BOOST_REGEX_MAX_CACHE_BLOCKS 16 379 # endif 380 #endif 381 382 383 /***************************************************************************** 384 * 385 * helper memory allocation functions: 386 * 387 ****************************************************************************/ 388 389 #if defined(__cplusplus) && defined(BOOST_REGEX_NON_RECURSIVE) 390 namespace boost{ namespace re_detail{ 391 392 BOOST_REGEX_DECL void* BOOST_REGEX_CALL get_mem_block(); 393 BOOST_REGEX_DECL void BOOST_REGEX_CALL put_mem_block(void*); 394 395 }} /* namespaces */ 396 #endif 397 398 /***************************************************************************** 399 * 400 * Diagnostics: 401 * 402 ****************************************************************************/ 403 404 #ifdef BOOST_REGEX_CONFIG_INFO 405 BOOST_REGEX_DECL void BOOST_REGEX_CALL print_regex_library_info(); 406 #endif 407 408 #if defined(BOOST_REGEX_DIAG) 409 # pragma message ("BOOST_REGEX_DECL" BOOST_STRINGIZE(=BOOST_REGEX_DECL)) 410 # pragma message ("BOOST_REGEX_CALL" BOOST_STRINGIZE(=BOOST_REGEX_CALL)) 411 # pragma message ("BOOST_REGEX_CCALL" BOOST_STRINGIZE(=BOOST_REGEX_CCALL)) 412 #ifdef BOOST_REGEX_USE_C_LOCALE 413 # pragma message ("Using C locale in regex traits class") 414 #elif BOOST_REGEX_USE_CPP_LOCALE 415 # pragma message ("Using C++ locale in regex traits class") 416 #else 417 # pragma message ("Using Win32 locale in regex traits class") 418 #endif 419 #if defined(BOOST_REGEX_DYN_LINK) || defined(BOOST_ALL_DYN_LINK) 420 # pragma message ("Dynamic linking enabled") 421 #endif 422 #if defined(BOOST_REGEX_NO_LIB) || defined(BOOST_ALL_NO_LIB) 423 # pragma message ("Auto-linking disabled") 424 #endif 425 #ifdef BOOST_REGEX_NO_EXTERNAL_TEMPLATES 426 # pragma message ("Extern templates disabled") 427 #endif 428 429 #endif 430 431 #endif 432 433 434 435 436