]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/regex/src/regex.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / regex / src / regex.cpp
CommitLineData
7c673cae
FG
1/*
2 *
3 * Copyright (c) 1998-2004
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: regex.cpp
15 * VERSION: see <boost/version.hpp>
16 * DESCRIPTION: Misc boost::regbase member funnctions.
17 */
18
19
20#define BOOST_REGEX_SOURCE
21
1e59de90 22#include <boost/regex/config.hpp>
7c673cae 23
7c673cae 24#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
1e59de90
TL
25
26#include <malloc.h>
27
92f5a8d4
TL
28#ifndef WIN32_LEAN_AND_MEAN
29# define WIN32_LEAN_AND_MEAN
30#endif
7c673cae
FG
31#ifndef NOMINMAX
32# define NOMINMAX
33#endif
34#define NOGDI
35#define NOUSER
36#include <windows.h>
1e59de90
TL
37#include <stdexcept>
38#include <boost/regex/pattern_except.hpp>
39#include <boost/regex/v4/protected_call.hpp>
7c673cae 40
1e59de90
TL
41namespace boost {
42namespace BOOST_REGEX_DETAIL_NS {
7c673cae
FG
43
44static void execute_eror()
45{
46 // we only get here after a stack overflow,
47 // this has to be a separate proceedure because we
48 // can't mix __try{}__except block with local objects
49 // that have destructors:
50 reset_stack_guard_page();
51 std::runtime_error err("Out of stack space, while attempting to match a regular expression.");
52 raise_runtime_error(err);
53}
54
55bool BOOST_REGEX_CALL abstract_protected_call::execute()const
56{
57 __try{
58 return this->call();
59 }__except(EXCEPTION_STACK_OVERFLOW == GetExceptionCode())
60 {
61 execute_eror();
62 }
63 // We never really get here at all:
64 return false;
65}
66
67BOOST_REGEX_DECL void BOOST_REGEX_CALL reset_stack_guard_page()
68{
69#if defined(BOOST_REGEX_HAS_MS_STACK_GUARD) && defined(_MSC_VER) && (_MSC_VER >= 1300)
70 _resetstkoflw();
71#else
72 //
73 // We need to locate the current page being used by the stack,
74 // move to the page below it and then deallocate and protect
75 // that page. Note that ideally we would protect only the lowest
76 // stack page that has been allocated: in practice there
77 // seems to be no easy way to locate this page, in any case as
78 // long as the next page is protected, then Windows will figure
79 // the rest out for us...
80 //
81 SYSTEM_INFO si;
82 GetSystemInfo(&si);
83 MEMORY_BASIC_INFORMATION mi;
84 DWORD previous_protection_status;
85 //
86 // this is an address in our stack space:
87 //
88 LPBYTE page = (LPBYTE)&page;
89 //
90 // Get the current memory page in use:
91 //
92 VirtualQuery(page, &mi, sizeof(mi));
93 //
94 // Go to the page one below this:
95 //
96 page = (LPBYTE)(mi.BaseAddress)-si.dwPageSize;
97 //
98 // Free and protect everything from the start of the
99 // allocation range, to the end of the page below the
100 // one in use:
101 //
102 if (!VirtualFree(mi.AllocationBase, (LPBYTE)page - (LPBYTE)mi.AllocationBase, MEM_DECOMMIT)
103 || !VirtualProtect(page, si.dwPageSize, PAGE_GUARD | PAGE_READWRITE, &previous_protection_status))
104 {
105 throw std::bad_exception();
106 }
107#endif
108}
7c673cae 109}
1e59de90 110} // namspaces
7c673cae
FG
111#endif
112
7c673cae
FG
113#if defined(BOOST_RE_USE_VCL) && defined(BOOST_REGEX_DYN_LINK)
114
115int WINAPI DllEntryPoint(HINSTANCE , unsigned long , void*)
116{
117 return 1;
118}
119#endif
120