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