blob: a8168b67a33c5118db7afe394b78c8c2892258af [file] [log] [blame]
Jeff Thompson86b6d642013-10-17 15:01:56 -07001/*
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 <ndnboost/version.hpp>
16 * DESCRIPTION: regex extended config setup.
17 */
18
19#ifndef NDNBOOST_REGEX_CONFIG_HPP
20#define NDNBOOST_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 <ndnboost/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 NDNBOOST_REGEX_USER_CONFIG
38# define NDNBOOST_REGEX_USER_CONFIG <ndnboost/regex/user.hpp>
39# endif
40
41# include NDNBOOST_REGEX_USER_CONFIG
42
43# include <ndnboost/config.hpp>
44
45#else
46 /*
47 * C build,
48 * don't include <ndnboost/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 NDNBOOST_MSVC _MSC_VER
55# endif
56#endif
57
58/*****************************************************************************
59 *
60 * Boilerplate regex config options:
61 *
62 ****************************************************************************/
63
64/* Obsolete macro, use NDNBOOST_VERSION instead: */
65#define NDNBOOST_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 NDNBOOST_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(NDNBOOST_INTEL) && defined(__cplusplus) && (NDNBOOST_INTEL <= 800)
87# define NDNBOOST_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 NDNBOOST_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 NDNBOOST_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(NDNBOOST_NO_CWCHAR) || defined(NDNBOOST_NO_CWCTYPE) || defined(NDNBOOST_NO_STD_WSTRING))
107# if !defined(NDNBOOST_NO_WREGEX)
108# define NDNBOOST_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 <ndnboost/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(NDNBOOST_DISABLE_WIN32) && !defined(NDNBOOST_REGEX_NO_W32)
131# define NDNBOOST_REGEX_NO_W32
132#endif
133
134/* disable our own file-iterators and mapfiles if we can't
135 * support them: */
136#if !defined(NDNBOOST_HAS_DIRENT_H) && !(defined(_WIN32) && !defined(NDNBOOST_REGEX_NO_W32))
137# define NDNBOOST_REGEX_NO_FILEITER
138#endif
139
140/* backwards compatibitity: */
141#if defined(NDNBOOST_RE_NO_LIB)
142# define NDNBOOST_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 NDNBOOST_REGEX_NO_W32
149#endif
150#if defined(__COMO__) && !defined(NDNBOOST_REGEX_NO_W32) && !defined(_MSC_EXTENSIONS)
151# define NDNBOOST_REGEX_NO_W32
152#endif
153
154/*****************************************************************************
155 *
156 * Wide character workarounds:
157 *
158 ****************************************************************************/
159
160/*
161 * define NDNBOOST_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(NDNBOOST_MSVC) || defined(__ICL)) && !defined(NDNBOOST_NO_INTRINSIC_WCHAR_T) && defined(NDNBOOST_WINDOWS) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) && !defined(NDNBOOST_RWSTD_VER) && ((_MSC_VER < 1600) || !defined(NDNBOOST_REGEX_USE_CPP_LOCALE))
170# define NDNBOOST_REGEX_HAS_OTHER_WCHAR_T
171# ifdef NDNBOOST_MSVC
172# pragma warning(push)
173# pragma warning(disable : 4251 4231)
174# if NDNBOOST_MSVC < 1600
175# pragma warning(disable : 4660)
176# endif
177# endif
178# if defined(_DLL) && defined(NDNBOOST_MSVC) && (NDNBOOST_MSVC < 1600)
179# include <string>
180 extern template class __declspec(dllimport) std::basic_string<unsigned short>;
181# endif
182# ifdef NDNBOOST_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 NDNBOOST_SYMBOL_EXPORT
195# define NDNBOOST_SYMBOL_EXPORT
196# define NDNBOOST_SYMBOL_IMPORT
197#endif
198
199#if (defined(NDNBOOST_REGEX_DYN_LINK) || defined(NDNBOOST_ALL_DYN_LINK)) && !defined(NDNBOOST_REGEX_STATIC_LINK)
200# if defined(NDNBOOST_REGEX_SOURCE)
201# define NDNBOOST_REGEX_DECL NDNBOOST_SYMBOL_EXPORT
202# define NDNBOOST_REGEX_BUILD_DLL
203# else
204# define NDNBOOST_REGEX_DECL NDNBOOST_SYMBOL_IMPORT
205# endif
206#else
207# define NDNBOOST_REGEX_DECL
208#endif
209
210#if !defined(NDNBOOST_REGEX_NO_LIB) && !defined(NDNBOOST_REGEX_SOURCE) && !defined(NDNBOOST_ALL_NO_LIB) && defined(__cplusplus)
211# define NDNBOOST_LIB_NAME ndnboost_regex
212# if defined(NDNBOOST_REGEX_DYN_LINK) || defined(NDNBOOST_ALL_DYN_LINK)
213# define NDNBOOST_DYN_LINK
214# endif
215# ifdef NDNBOOST_REGEX_DIAG
216# define NDNBOOST_LIB_DIAGNOSTIC
217# endif
218# include <ndnboost/config/auto_link.hpp>
219#endif
220
221/*****************************************************************************
222 *
223 * Set up function call type:
224 *
225 ****************************************************************************/
226
227#if defined(NDNBOOST_MSVC) && (NDNBOOST_MSVC >= 1200) && defined(_MSC_EXTENSIONS)
228#if defined(_DEBUG) || defined(__MSVC_RUNTIME_CHECKS) || defined(_MANAGED) || defined(NDNBOOST_REGEX_NO_FASTCALL)
229# define NDNBOOST_REGEX_CALL __cdecl
230#else
231# define NDNBOOST_REGEX_CALL __fastcall
232#endif
233# define NDNBOOST_REGEX_CCALL __cdecl
234#endif
235
236#if defined(__BORLANDC__) && !defined(NDNBOOST_DISABLE_WIN32)
237# define NDNBOOST_REGEX_CALL __fastcall
238# define NDNBOOST_REGEX_CCALL __stdcall
239#endif
240
241#ifndef NDNBOOST_REGEX_CALL
242# define NDNBOOST_REGEX_CALL
243#endif
244#ifndef NDNBOOST_REGEX_CCALL
245#define NDNBOOST_REGEX_CCALL
246#endif
247
248/*****************************************************************************
249 *
250 * Set up localisation model:
251 *
252 ****************************************************************************/
253
254/* backwards compatibility: */
255#ifdef NDNBOOST_RE_LOCALE_C
256# define NDNBOOST_REGEX_USE_C_LOCALE
257#endif
258
259#ifdef NDNBOOST_RE_LOCALE_CPP
260# define NDNBOOST_REGEX_USE_CPP_LOCALE
261#endif
262
263#if defined(__CYGWIN__)
264# define NDNBOOST_REGEX_USE_C_LOCALE
265#endif
266
267/* Win32 defaults to native Win32 locale: */
268#if defined(_WIN32) && !defined(NDNBOOST_REGEX_USE_WIN32_LOCALE) && !defined(NDNBOOST_REGEX_USE_C_LOCALE) && !defined(NDNBOOST_REGEX_USE_CPP_LOCALE) && !defined(NDNBOOST_REGEX_NO_W32)
269# define NDNBOOST_REGEX_USE_WIN32_LOCALE
270#endif
271/* otherwise use C++ locale if supported: */
272#if !defined(NDNBOOST_REGEX_USE_WIN32_LOCALE) && !defined(NDNBOOST_REGEX_USE_C_LOCALE) && !defined(NDNBOOST_REGEX_USE_CPP_LOCALE) && !defined(NDNBOOST_NO_STD_LOCALE)
273# define NDNBOOST_REGEX_USE_CPP_LOCALE
274#endif
275/* otherwise use C+ locale: */
276#if !defined(NDNBOOST_REGEX_USE_WIN32_LOCALE) && !defined(NDNBOOST_REGEX_USE_C_LOCALE) && !defined(NDNBOOST_REGEX_USE_CPP_LOCALE)
277# define NDNBOOST_REGEX_USE_C_LOCALE
278#endif
279
280#ifndef NDNBOOST_REGEX_MAX_STATE_COUNT
281# define NDNBOOST_REGEX_MAX_STATE_COUNT 100000000
282#endif
283
284
285/*****************************************************************************
286 *
287 * Error Handling for exception free compilers:
288 *
289 ****************************************************************************/
290
291#ifdef NDNBOOST_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 <ndnboost/throw_exception.hpp>
299
300# define NDNBOOST_REGEX_NOEH_ASSERT(x)\
301if(0 == (x))\
302{\
303 std::string s("Error: critical regex++ failure in: ");\
304 s.append(#x);\
305 std::runtime_error e(s);\
306 ndnboost::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 NDNBOOST_REGEX_NOEH_ASSERT(x)
314#endif
315
316
317/*****************************************************************************
318 *
319 * Stack protection under MS Windows:
320 *
321 ****************************************************************************/
322
323#if !defined(NDNBOOST_REGEX_NO_W32) && !defined(NDNBOOST_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 NDNBOOST_REGEX_HAS_MS_STACK_GUARD
329# endif
330#elif defined(NDNBOOST_REGEX_HAS_MS_STACK_GUARD)
331# undef NDNBOOST_REGEX_HAS_MS_STACK_GUARD
332#endif
333
334#if defined(__cplusplus) && defined(NDNBOOST_REGEX_HAS_MS_STACK_GUARD)
335
336namespace ndnboost{
337namespace re_detail{
338
339NDNBOOST_REGEX_DECL void NDNBOOST_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(NDNBOOST_REGEX_RECURSIVE) && !defined(NDNBOOST_REGEX_NON_RECURSIVE)
354# if defined(NDNBOOST_REGEX_HAS_MS_STACK_GUARD) && !defined(_STLP_DEBUG) && !defined(__STL_DEBUG) && !(defined(NDNBOOST_MSVC) && (NDNBOOST_MSVC >= 1400))
355# define NDNBOOST_REGEX_RECURSIVE
356# else
357# define NDNBOOST_REGEX_NON_RECURSIVE
358# endif
359#endif
360
361#ifdef NDNBOOST_REGEX_NON_RECURSIVE
362# ifdef NDNBOOST_REGEX_RECURSIVE
363# error "Can't set both NDNBOOST_REGEX_RECURSIVE and NDNBOOST_REGEX_NON_RECURSIVE"
364# endif
365# ifndef NDNBOOST_REGEX_BLOCKSIZE
366# define NDNBOOST_REGEX_BLOCKSIZE 4096
367# endif
368# if NDNBOOST_REGEX_BLOCKSIZE < 512
369# error "NDNBOOST_REGEX_BLOCKSIZE must be at least 512"
370# endif
371# ifndef NDNBOOST_REGEX_MAX_BLOCKS
372# define NDNBOOST_REGEX_MAX_BLOCKS 1024
373# endif
374# ifdef NDNBOOST_REGEX_HAS_MS_STACK_GUARD
375# undef NDNBOOST_REGEX_HAS_MS_STACK_GUARD
376# endif
377# ifndef NDNBOOST_REGEX_MAX_CACHE_BLOCKS
378# define NDNBOOST_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(NDNBOOST_REGEX_NON_RECURSIVE)
390namespace ndnboost{ namespace re_detail{
391
392NDNBOOST_REGEX_DECL void* NDNBOOST_REGEX_CALL get_mem_block();
393NDNBOOST_REGEX_DECL void NDNBOOST_REGEX_CALL put_mem_block(void*);
394
395}} /* namespaces */
396#endif
397
398/*****************************************************************************
399 *
400 * Diagnostics:
401 *
402 ****************************************************************************/
403
404#ifdef NDNBOOST_REGEX_CONFIG_INFO
405NDNBOOST_REGEX_DECL void NDNBOOST_REGEX_CALL print_regex_library_info();
406#endif
407
408#if defined(NDNBOOST_REGEX_DIAG)
409# pragma message ("NDNBOOST_REGEX_DECL" NDNBOOST_STRINGIZE(=NDNBOOST_REGEX_DECL))
410# pragma message ("NDNBOOST_REGEX_CALL" NDNBOOST_STRINGIZE(=NDNBOOST_REGEX_CALL))
411# pragma message ("NDNBOOST_REGEX_CCALL" NDNBOOST_STRINGIZE(=NDNBOOST_REGEX_CCALL))
412#ifdef NDNBOOST_REGEX_USE_C_LOCALE
413# pragma message ("Using C locale in regex traits class")
414#elif NDNBOOST_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(NDNBOOST_REGEX_DYN_LINK) || defined(NDNBOOST_ALL_DYN_LINK)
420# pragma message ("Dynamic linking enabled")
421#endif
422#if defined(NDNBOOST_REGEX_NO_LIB) || defined(NDNBOOST_ALL_NO_LIB)
423# pragma message ("Auto-linking disabled")
424#endif
425#ifdef NDNBOOST_REGEX_NO_EXTERNAL_TEMPLATES
426# pragma message ("Extern templates disabled")
427#endif
428
429#endif
430
431#endif
432
433
434
435