3 * Copyright (c) 1998-2002
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)
13 * LOCATION: see http://www.boost.org for most recent version.
14 * FILE: wide_posix_api.cpp
15 * VERSION: see <boost/version.hpp>
16 * DESCRIPTION: Implements the wide character POSIX API wrappers.
19 #define BOOST_REGEX_SOURCE
21 #include <boost/regex/config.hpp>
23 #ifndef BOOST_NO_WREGEX
25 #include <boost/regex.hpp>
26 #include <boost/cregex.hpp>
33 #pragma warning(disable:981)
36 #if defined(BOOST_NO_STDC_NAMESPACE) || defined(__NetBSD__)
38 # ifndef BOOST_NO_SWPRINTF
49 unsigned int wmagic_value
= 28631;
51 const wchar_t* wnames
[] = {
77 typedef boost::basic_regex
<wchar_t, c_regex_traits
<wchar_t> > wc_regex_type
;
79 BOOST_REGEX_DECL
int BOOST_REGEX_CCALL
regcompW(regex_tW
* expression
, const wchar_t* ptr
, int f
)
81 #ifndef BOOST_NO_EXCEPTIONS
84 expression
->guts
= new wc_regex_type();
85 #ifndef BOOST_NO_EXCEPTIONS
92 if(0 == expression
->guts
)
96 boost::uint_fast32_t flags
= (f
& REG_PERLEX
) ? 0 : ((f
& REG_EXTENDED
) ? wregex::extended
: wregex::basic
);
97 expression
->eflags
= (f
& REG_NEWLINE
) ? match_not_dot_newline
: match_default
;
99 // and translate those that are actually set:
100 if(f
& REG_NOCOLLATE
)
102 flags
|= wregex::nocollate
;
103 #ifndef BOOST_REGEX_V3
104 flags
&= ~wregex::collate
;
110 //expression->eflags |= match_any;
111 flags
|= wregex::nosubs
;
115 flags
|= wregex::literal
;
117 flags
|= wregex::icase
;
118 if(f
& REG_ESCAPE_IN_LISTS
)
119 flags
&= ~wregex::no_escape_in_lists
;
120 if(f
& REG_NEWLINE_ALT
)
121 flags
|= wregex::newline_alt
;
125 p2
= expression
->re_endp
;
126 else p2
= ptr
+ std::wcslen(ptr
);
130 #ifndef BOOST_NO_EXCEPTIONS
133 expression
->re_magic
= wmagic_value
;
134 static_cast<wc_regex_type
*>(expression
->guts
)->set_expression(ptr
, p2
, flags
);
135 expression
->re_nsub
= static_cast<wc_regex_type
*>(expression
->guts
)->mark_count();
136 result
= static_cast<wc_regex_type
*>(expression
->guts
)->error_code();
137 #ifndef BOOST_NO_EXCEPTIONS
139 catch(const boost::regex_error
& be
)
145 result
= REG_E_UNKNOWN
;
149 regfreeW(expression
);
154 BOOST_REGEX_DECL regsize_t BOOST_REGEX_CCALL
regerrorW(int code
, const regex_tW
* e
, wchar_t* buf
, regsize_t buf_size
)
156 std::size_t result
= 0;
160 if((code
<= (int)REG_E_UNKNOWN
) && (code
>= 0))
162 result
= std::wcslen(wnames
[code
]) + 1;
163 if(buf_size
>= result
)
164 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(_WIN32_WCE) && !defined(UNDER_CE)
165 ::wcscpy_s(buf
, buf_size
, wnames
[code
]);
167 std::wcscpy(buf
, wnames
[code
]);
173 #if !defined(BOOST_NO_SWPRINTF)
179 for(int i
= 0; i
<= (int)REG_E_UNKNOWN
; ++i
)
181 if(std::wcscmp(e
->re_endp
, wnames
[i
]) == 0)
183 #if defined(_WIN32_WCE) && !defined(UNDER_CE)
184 (std::swprintf
)(localbuf
, L
"%d", i
);
186 (std::swprintf
)(localbuf
, 5, L
"%d", i
);
188 if(std::wcslen(localbuf
) < buf_size
)
189 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(_WIN32_WCE) && !defined(UNDER_CE)
190 ::wcscpy_s(buf
, buf_size
, localbuf
);
192 std::wcscpy(buf
, localbuf
);
194 return std::wcslen(localbuf
) + 1;
197 #if defined(_WIN32_WCE) && !defined(UNDER_CE)
198 (std::swprintf
)(localbuf
, L
"%d", 0);
200 (std::swprintf
)(localbuf
, 5, L
"%d", 0);
202 if(std::wcslen(localbuf
) < buf_size
)
203 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(_WIN32_WCE) && !defined(UNDER_CE)
204 ::wcscpy_s(buf
, buf_size
, localbuf
);
206 std::wcscpy(buf
, localbuf
);
208 return std::wcslen(localbuf
) + 1;
211 if(code
<= (int)REG_E_UNKNOWN
)
214 if((e
) && (e
->re_magic
== wmagic_value
))
215 p
= static_cast<wc_regex_type
*>(e
->guts
)->get_traits().error_string(static_cast< ::boost::regex_constants::error_type
>(code
));
218 p
= BOOST_REGEX_DETAIL_NS::get_default_error_string(static_cast< ::boost::regex_constants::error_type
>(code
));
220 std::size_t len
= p
.size();
223 BOOST_REGEX_DETAIL_NS::copy(p
.c_str(), p
.c_str() + p
.size() + 1, buf
);
232 BOOST_REGEX_DECL
int BOOST_REGEX_CCALL
regexecW(const regex_tW
* expression
, const wchar_t* buf
, regsize_t n
, regmatch_t
* array
, int eflags
)
235 #pragma warning(push)
236 #pragma warning(disable:4267)
239 match_flag_type flags
= match_default
| expression
->eflags
;
241 const wchar_t* start
;
244 if(eflags
& REG_NOTBOL
)
245 flags
|= match_not_bol
;
246 if(eflags
& REG_NOTEOL
)
247 flags
|= match_not_eol
;
248 if(eflags
& REG_STARTEND
)
250 start
= buf
+ array
[0].rm_so
;
251 end
= buf
+ array
[0].rm_eo
;
256 end
= buf
+ std::wcslen(buf
);
259 #ifndef BOOST_NO_EXCEPTIONS
262 if(expression
->re_magic
== wmagic_value
)
264 result
= regex_search(start
, end
, m
, *static_cast<wc_regex_type
*>(expression
->guts
), flags
);
268 #ifndef BOOST_NO_EXCEPTIONS
271 return REG_E_UNKNOWN
;
276 // extract what matched:
278 for(i
= 0; (i
< n
) && (i
< expression
->re_nsub
+ 1); ++i
)
280 array
[i
].rm_so
= (m
[i
].matched
== false) ? -1 : (m
[i
].first
- buf
);
281 array
[i
].rm_eo
= (m
[i
].matched
== false) ? -1 : (m
[i
].second
- buf
);
283 // and set anything else to -1:
284 for(i
= expression
->re_nsub
+ 1; i
< n
; ++i
)
297 BOOST_REGEX_DECL
void BOOST_REGEX_CCALL
regfreeW(regex_tW
* expression
)
299 if(expression
->re_magic
== wmagic_value
)
301 delete static_cast<wc_regex_type
*>(expression
->guts
);
303 expression
->re_magic
= 0;
306 } // namespace boost;