Merge lp:~zorba-coders/zorba/bug-1123161 into lp:zorba
- bug-1123161
- Merge into trunk
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Chris Hillery | ||||||||
Approved revision: | 11286 | ||||||||
Merged at revision: | 11258 | ||||||||
Proposed branch: | lp:~zorba-coders/zorba/bug-1123161 | ||||||||
Merge into: | lp:zorba | ||||||||
Diff against target: |
922 lines (+383/-229) 12 files modified
ChangeLog (+6/-2) src/diagnostics/diagnostic_en.xml (+18/-2) src/diagnostics/pregenerated/dict_en.cpp (+10/-0) src/diagnostics/pregenerated/dict_zed_keys.h (+5/-1) src/util/ascii_util.cpp (+11/-5) src/util/regex.cpp (+321/-108) test/fots/CMakeLists.txt (+9/-106) test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res (+1/-0) test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res (+1/-0) test/rbkt/Queries/CMakeLists.txt (+1/-3) test/rbkt/Queries/zorba/string/Regex/regex_err25.spec (+0/-1) test/rbkt/Queries/zorba/string/Regex/regex_err7.spec (+0/-1) |
||||||||
To merge this branch: | bzr merge lp:~zorba-coders/zorba/bug-1123161 | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Chris Hillery | Approve | ||
Paul J. Lucas | Approve | ||
Matthias Brantner | Approve | ||
Review via email: mp+148773@code.launchpad.net |
Commit message
Fixed 100 FOTS failures, aka, bugs.
Description of the change
Fixed 100 FOTS failures, aka, bugs.
Zorba Build Bot (zorba-buildbot) wrote : | # |
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job bug-1123161-2013-02-
All tests succeeded!
Zorba Build Bot (zorba-buildbot) wrote : | # |
Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 1 Pending.
Chris Hillery (ceejatec) wrote : | # |
More detailed commit message and Changelog entry, please.
Paul J. Lucas (paul-lucas) wrote : | # |
> More detailed commit message and Changelog entry, please.
I'm not finished yet. It was just to see if I broke anything.
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Zorba Build Bot (zorba-buildbot) wrote : | # |
The attempt to merge lp:~zorba-coders/zorba/bug-1123161 into lp:zorba failed. Below is the output from the failed tests.
CMake Error at /home/ceej/
Validation queue job bug-1123161-2013-02-
final status was:
1 tests did not succeed - changes not commited.
Error in read script: /home/ceej/
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job bug-1123161-2013-02-
All tests succeeded!
Zorba Build Bot (zorba-buildbot) wrote : | # |
Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 1 Pending.
Paul J. Lucas (paul-lucas) : | # |
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Zorba Build Bot (zorba-buildbot) wrote : | # |
The attempt to merge lp:~zorba-coders/zorba/bug-1123161 into lp:zorba failed. Below is the output from the failed tests.
CMake Error at /home/ceej/
Validation queue job bug-1123161-2013-02-
final status was:
2 tests did not succeed - changes not commited.
Error in read script: /home/ceej/
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Zorba Build Bot (zorba-buildbot) wrote : | # |
The attempt to merge lp:~zorba-coders/zorba/bug-1123161 into lp:zorba failed. Below is the output from the failed tests.
CMake Error at /home/ceej/
Validation queue job bug-1123161-2013-02-
final status was:
8 tests did not succeed - changes not commited.
Error in read script: /home/ceej/
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job bug-1123161-2013-02-
All tests succeeded!
Zorba Build Bot (zorba-buildbot) wrote : | # |
Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 1 Approve.
Chris Hillery (ceejatec) wrote : | # |
I do have two minor points, but they're just about comments so I'll go ahead and leave my Approve vote too.
First, one minor typo: "ahe" instead of "the" in regex.cpp.
Second, question about comment:
//
// The '=' is neither the first or last character within a
// character range (i.e., a literal '-') so therefore it's
// indicating a character range.
//
Is there some context about '=' that I'm missing, or is that just a typo and it should be '-'?
Matthias Brantner (matthias-brantner) : | # |
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Paul J. Lucas (paul-lucas) : | # |
Paul J. Lucas (paul-lucas) wrote : | # |
> Is there some context about '=' that I'm missing, or is that just a typo and
> it should be '-'?
Typo.
Paul J. Lucas (paul-lucas) : | # |
Chris Hillery (ceejatec) : | # |
Chris Hillery (ceejatec) wrote : | # |
I re-voted to prevent this RQ run from succeeding, because it won't have Paul's typo fixes in it. I'll re-start it in a bit.
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job bug-1123161-2013-02-
All tests succeeded!
Zorba Build Bot (zorba-buildbot) wrote : | # |
Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 2 Approve, 1 Needs Fixing.
Chris Hillery (ceejatec) : | # |
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue starting for merge proposal.
Log at: http://
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job bug-1123161-2013-02-
All tests succeeded!
Preview Diff
1 | === modified file 'ChangeLog' | |||
2 | --- ChangeLog 2013-02-15 21:39:41 +0000 | |||
3 | +++ ChangeLog 2013-02-26 01:37:22 +0000 | |||
4 | @@ -28,10 +28,14 @@ | |||
5 | 28 | * Fixed bug #1111786 (xml/json parse error location in catch clause). | 28 | * Fixed bug #1111786 (xml/json parse error location in catch clause). |
6 | 29 | * NaN items are considered equal to each other during grouping | 29 | * NaN items are considered equal to each other during grouping |
7 | 30 | * Fixed bug #855481 (Too small time types on Windows). | 30 | * Fixed bug #855481 (Too small time types on Windows). |
8 | 31 | * Fixed bug #1132032 (Certain regexes involving ^ should be legal) | ||
9 | 32 | * Fixed bug #1023168 (Non-single-char-escapes in regex character ranges not | ||
10 | 33 | caught) | ||
11 | 34 | * Fixed bug #866874 (regex "range subtraction" not supported for ICU) | ||
12 | 31 | * Fixed bug in computing the static type of an allowing-empty FOR variable. | 35 | * Fixed bug in computing the static type of an allowing-empty FOR variable. |
13 | 32 | * Fixed bug #1099648 and #1088886 (XML parsing failures on Red Hat) | 36 | * Fixed bug #1099648 and #1088886 (XML parsing failures on Red Hat) |
16 | 33 | * Fixed bug #1099535 (xml:parse endless loop) | 37 | * Fixed bug #1099535 (xml:parse endless loop) |
17 | 34 | * Fixed bug #866958 (Parsing error not explicit enough) | 38 | * Fixed bug #866958 (Parsing error not explicit enough) |
18 | 35 | * Fixed bug #867068 (Incorrect usage of XQDY0027) | 39 | * Fixed bug #867068 (Incorrect usage of XQDY0027) |
19 | 36 | * Fixed bug #1023362 (xsi:type attribute ignored during validation) | 40 | * Fixed bug #1023362 (xsi:type attribute ignored during validation) |
20 | 37 | 41 | ||
21 | 38 | 42 | ||
22 | === modified file 'src/diagnostics/diagnostic_en.xml' | |||
23 | --- src/diagnostics/diagnostic_en.xml 2013-02-21 14:33:24 +0000 | |||
24 | +++ src/diagnostics/diagnostic_en.xml 2013-02-26 01:37:22 +0000 | |||
25 | @@ -3222,6 +3222,10 @@ | |||
26 | 3222 | <value>'$3': illegal character within { }</value> | 3222 | <value>'$3': illegal character within { }</value> |
27 | 3223 | </entry> | 3223 | </entry> |
28 | 3224 | 3224 | ||
29 | 3225 | <entry key="BadEndCharInRange_34"> | ||
30 | 3226 | <value>'$3': invalid end character in range (less than '$4' start character)</value> | ||
31 | 3227 | </entry> | ||
32 | 3228 | |||
33 | 3225 | <entry key="BadDecDigit_3"> | 3229 | <entry key="BadDecDigit_3"> |
34 | 3226 | <value>'$3': invalid decimal digit</value> | 3230 | <value>'$3': invalid decimal digit</value> |
35 | 3227 | </entry> | 3231 | </entry> |
36 | @@ -3246,12 +3250,20 @@ | |||
37 | 3246 | <value>invalid library module</value> | 3250 | <value>invalid library module</value> |
38 | 3247 | </entry> | 3251 | </entry> |
39 | 3248 | 3252 | ||
40 | 3253 | <entry key="BadPath"> | ||
41 | 3254 | <value>invalid path</value> | ||
42 | 3255 | </entry> | ||
43 | 3256 | |||
44 | 3257 | <entry key="BadQuantifierHere_3" if="!defined(ZORBA_NO_ICU)"> | ||
45 | 3258 | <value>'$3': quantifier illegal here</value> | ||
46 | 3259 | </entry> | ||
47 | 3260 | |||
48 | 3249 | <entry key="BadRegexEscape_3" if="!defined(ZORBA_NO_ICU)"> | 3261 | <entry key="BadRegexEscape_3" if="!defined(ZORBA_NO_ICU)"> |
49 | 3250 | <value>"$3": illegal escape character</value> | 3262 | <value>"$3": illegal escape character</value> |
50 | 3251 | </entry> | 3263 | </entry> |
51 | 3252 | 3264 | ||
54 | 3253 | <entry key="BadPath"> | 3265 | <entry key="BadRegexParen_3" if="!defined(ZORBA_NO_ICU)"> |
55 | 3254 | <value>invalid path</value> | 3266 | <value>"$3": illegal character after "(?"</value> |
56 | 3255 | </entry> | 3267 | </entry> |
57 | 3256 | 3268 | ||
58 | 3257 | <entry key="BadStreamState"> | 3269 | <entry key="BadStreamState"> |
59 | @@ -3626,6 +3638,10 @@ | |||
60 | 3626 | <value>can not treat as "$4"</value> | 3638 | <value>can not treat as "$4"</value> |
61 | 3627 | </entry> | 3639 | </entry> |
62 | 3628 | 3640 | ||
63 | 3641 | <entry key="NotSingleCharEsc_3" if="!defined(ZORBA_NO_ICU)"> | ||
64 | 3642 | <value>"\\$3": multi-character and category escapes not permitted in character range</value> | ||
65 | 3643 | </entry> | ||
66 | 3644 | |||
67 | 3629 | <entry key="NoTypeInMainModule_4"> | 3645 | <entry key="NoTypeInMainModule_4"> |
68 | 3630 | <value>type of variable "$4" is not among the in-scope types of the main module</value> | 3646 | <value>type of variable "$4" is not among the in-scope types of the main module</value> |
69 | 3631 | </entry> | 3647 | </entry> |
70 | 3632 | 3648 | ||
71 | === modified file 'src/diagnostics/pregenerated/dict_en.cpp' | |||
72 | --- src/diagnostics/pregenerated/dict_en.cpp 2013-02-21 14:33:24 +0000 | |||
73 | +++ src/diagnostics/pregenerated/dict_en.cpp 2013-02-26 01:37:22 +0000 | |||
74 | @@ -549,6 +549,7 @@ | |||
75 | 549 | { "~BadCharAfter_34", "'$3': illegal character after '$4'" }, | 549 | { "~BadCharAfter_34", "'$3': illegal character after '$4'" }, |
76 | 550 | { "~BadCharInBraces_3", "'$3': illegal character within { }" }, | 550 | { "~BadCharInBraces_3", "'$3': illegal character within { }" }, |
77 | 551 | { "~BadDecDigit_3", "'$3': invalid decimal digit" }, | 551 | { "~BadDecDigit_3", "'$3': invalid decimal digit" }, |
78 | 552 | { "~BadEndCharInRange_34", "'$3': invalid end character in range (less than '$4' start character)" }, | ||
79 | 552 | { "~BadFileURIAuthority_2", "\"$2\": invalid authority for \"file\" scheme" }, | 553 | { "~BadFileURIAuthority_2", "\"$2\": invalid authority for \"file\" scheme" }, |
80 | 553 | { "~BadHexSequence", "invalid hexedecimal sequence" }, | 554 | { "~BadHexSequence", "invalid hexedecimal sequence" }, |
81 | 554 | { "~BadItem", "invalid item" }, | 555 | { "~BadItem", "invalid item" }, |
82 | @@ -556,8 +557,14 @@ | |||
83 | 556 | { "~BadLibraryModule", "invalid library module" }, | 557 | { "~BadLibraryModule", "invalid library module" }, |
84 | 557 | { "~BadPath", "invalid path" }, | 558 | { "~BadPath", "invalid path" }, |
85 | 558 | #if !defined(ZORBA_NO_ICU) | 559 | #if !defined(ZORBA_NO_ICU) |
86 | 560 | { "~BadQuantifierHere_3", "'$3': quantifier illegal here" }, | ||
87 | 561 | #endif | ||
88 | 562 | #if !defined(ZORBA_NO_ICU) | ||
89 | 559 | { "~BadRegexEscape_3", "\"$3\": illegal escape character" }, | 563 | { "~BadRegexEscape_3", "\"$3\": illegal escape character" }, |
90 | 560 | #endif | 564 | #endif |
91 | 565 | #if !defined(ZORBA_NO_ICU) | ||
92 | 566 | { "~BadRegexParen_3", "\"$3\": illegal character after \"(?\"" }, | ||
93 | 567 | #endif | ||
94 | 561 | { "~BadStreamState", "bad I/O stream state" }, | 568 | { "~BadStreamState", "bad I/O stream state" }, |
95 | 562 | { "~BadTokenInBraces_3", "\"$3\": illegal token within { }" }, | 569 | { "~BadTokenInBraces_3", "\"$3\": illegal token within { }" }, |
96 | 563 | { "~BadTraceStream", "trace stream not retrievable using SerializationCallback" }, | 570 | { "~BadTraceStream", "trace stream not retrievable using SerializationCallback" }, |
97 | @@ -726,6 +733,9 @@ | |||
98 | 726 | { "~NotDocOrElementNode", "not a document or element node" }, | 733 | { "~NotDocOrElementNode", "not a document or element node" }, |
99 | 727 | { "~NotInStaticCtx", "not found in static context" }, | 734 | { "~NotInStaticCtx", "not found in static context" }, |
100 | 728 | { "~NotPlainFile", "not plain file" }, | 735 | { "~NotPlainFile", "not plain file" }, |
101 | 736 | #if !defined(ZORBA_NO_ICU) | ||
102 | 737 | { "~NotSingleCharEsc_3", "\"\\\\$3\": multi-character and category escapes not permitted in character range" }, | ||
103 | 738 | #endif | ||
104 | 729 | { "~NotSpecified", "not specified" }, | 739 | { "~NotSpecified", "not specified" }, |
105 | 730 | { "~OpIsSameNodeMustHaveNodes", "op:is-same-node() must have nodes as parameters" }, | 740 | { "~OpIsSameNodeMustHaveNodes", "op:is-same-node() must have nodes as parameters" }, |
106 | 731 | { "~OpNodeAfterMustHaveNodes", "op:node-after() must have nodes as parameters" }, | 741 | { "~OpNodeAfterMustHaveNodes", "op:node-after() must have nodes as parameters" }, |
107 | 732 | 742 | ||
108 | === modified file 'src/diagnostics/pregenerated/dict_zed_keys.h' | |||
109 | --- src/diagnostics/pregenerated/dict_zed_keys.h 2013-02-09 00:26:52 +0000 | |||
110 | +++ src/diagnostics/pregenerated/dict_zed_keys.h 2013-02-26 01:37:22 +0000 | |||
111 | @@ -129,14 +129,17 @@ | |||
112 | 129 | #define ZED_BadArgTypeForFn_2o34o "~BadArgTypeForFn_2o34o" | 129 | #define ZED_BadArgTypeForFn_2o34o "~BadArgTypeForFn_2o34o" |
113 | 130 | #define ZED_BadCharAfter_34 "~BadCharAfter_34" | 130 | #define ZED_BadCharAfter_34 "~BadCharAfter_34" |
114 | 131 | #define ZED_BadCharInBraces_3 "~BadCharInBraces_3" | 131 | #define ZED_BadCharInBraces_3 "~BadCharInBraces_3" |
115 | 132 | #define ZED_BadEndCharInRange_34 "~BadEndCharInRange_34" | ||
116 | 132 | #define ZED_BadDecDigit_3 "~BadDecDigit_3" | 133 | #define ZED_BadDecDigit_3 "~BadDecDigit_3" |
117 | 133 | #define ZED_BadFileURIAuthority_2 "~BadFileURIAuthority_2" | 134 | #define ZED_BadFileURIAuthority_2 "~BadFileURIAuthority_2" |
118 | 134 | #define ZED_BadHexSequence "~BadHexSequence" | 135 | #define ZED_BadHexSequence "~BadHexSequence" |
119 | 135 | #define ZED_BadItem "~BadItem" | 136 | #define ZED_BadItem "~BadItem" |
120 | 136 | #define ZED_BadIterator "~BadIterator" | 137 | #define ZED_BadIterator "~BadIterator" |
121 | 137 | #define ZED_BadLibraryModule "~BadLibraryModule" | 138 | #define ZED_BadLibraryModule "~BadLibraryModule" |
122 | 139 | #define ZED_BadPath "~BadPath" | ||
123 | 140 | #define ZED_BadQuantifierHere_3 "~BadQuantifierHere_3" | ||
124 | 138 | #define ZED_BadRegexEscape_3 "~BadRegexEscape_3" | 141 | #define ZED_BadRegexEscape_3 "~BadRegexEscape_3" |
126 | 139 | #define ZED_BadPath "~BadPath" | 142 | #define ZED_BadRegexParen_3 "~BadRegexParen_3" |
127 | 140 | #define ZED_BadStreamState "~BadStreamState" | 143 | #define ZED_BadStreamState "~BadStreamState" |
128 | 141 | #define ZED_BadTokenInBraces_3 "~BadTokenInBraces_3" | 144 | #define ZED_BadTokenInBraces_3 "~BadTokenInBraces_3" |
129 | 142 | #define ZED_BadTraceStream "~BadTraceStream" | 145 | #define ZED_BadTraceStream "~BadTraceStream" |
130 | @@ -230,6 +233,7 @@ | |||
131 | 230 | #define ZED_NoSerializationCallbackForTraceStream "~NoSerializationCallbackForTraceStream" | 233 | #define ZED_NoSerializationCallbackForTraceStream "~NoSerializationCallbackForTraceStream" |
132 | 231 | #define ZED_NoSourceURI "~NoSourceURI" | 234 | #define ZED_NoSourceURI "~NoSourceURI" |
133 | 232 | #define ZED_NoTreatAs_4 "~NoTreatAs_4" | 235 | #define ZED_NoTreatAs_4 "~NoTreatAs_4" |
134 | 236 | #define ZED_NotSingleCharEsc_3 "~NotSingleCharEsc_3" | ||
135 | 233 | #define ZED_NoTypeInMainModule_4 "~NoTypeInMainModule_4" | 237 | #define ZED_NoTypeInMainModule_4 "~NoTypeInMainModule_4" |
136 | 234 | #define ZED_NoTypeInModule_45 "~NoTypeInModule_45" | 238 | #define ZED_NoTypeInModule_45 "~NoTypeInModule_45" |
137 | 235 | #define ZED_NoURIAuthority "~NoURIAuthority" | 239 | #define ZED_NoURIAuthority "~NoURIAuthority" |
138 | 236 | 240 | ||
139 | === modified file 'src/util/ascii_util.cpp' | |||
140 | --- src/util/ascii_util.cpp 2012-11-29 05:00:43 +0000 | |||
141 | +++ src/util/ascii_util.cpp 2013-02-26 01:37:22 +0000 | |||
142 | @@ -40,11 +40,17 @@ | |||
143 | 40 | ostream& printable_char( ostream &o, char c ) { | 40 | ostream& printable_char( ostream &o, char c ) { |
144 | 41 | if ( ascii::is_print( c ) ) | 41 | if ( ascii::is_print( c ) ) |
145 | 42 | o << c; | 42 | o << c; |
151 | 43 | else { | 43 | else |
152 | 44 | ios::fmtflags const old_flags = o.flags(); | 44 | switch ( c ) { |
153 | 45 | o << "#x" << uppercase << hex << (static_cast<unsigned>( c ) & 0xFF); | 45 | case '\n': o << "\\n"; break; |
154 | 46 | o.flags( old_flags ); | 46 | case '\r': o << "\\r"; break; |
155 | 47 | } | 47 | case '\t': o << "\\t"; break; |
156 | 48 | default: { | ||
157 | 49 | ios::fmtflags const old_flags = o.flags(); | ||
158 | 50 | o << "#x" << uppercase << hex << (static_cast<unsigned>( c ) & 0xFF); | ||
159 | 51 | o.flags( old_flags ); | ||
160 | 52 | } | ||
161 | 53 | } | ||
162 | 48 | return o; | 54 | return o; |
163 | 49 | } | 55 | } |
164 | 50 | 56 | ||
165 | 51 | 57 | ||
166 | === modified file 'src/util/regex.cpp' | |||
167 | --- src/util/regex.cpp 2012-10-08 12:09:36 +0000 | |||
168 | +++ src/util/regex.cpp 2013-02-26 01:37:22 +0000 | |||
169 | @@ -51,17 +51,46 @@ | |||
170 | 51 | 51 | ||
171 | 52 | using namespace std; | 52 | using namespace std; |
172 | 53 | 53 | ||
174 | 54 | #define bs_c "\\p{L}\\d.:\\p{M}-" /* \c equivalent contents */ | 54 | #define bs_c "\\p{L}_\\d.:\\p{M}-" /* \c equivalent contents */ |
175 | 55 | #define bs_i "\\p{L}_:" /* \i equivalent contents */ | 55 | #define bs_i "\\p{L}_:" /* \i equivalent contents */ |
176 | 56 | #define bs_W "\\p{P}\\p{Z}\\p{C}" /* \W equivalent contents */ | ||
177 | 57 | |||
178 | 58 | template<typename IntegralType> inline | ||
179 | 59 | typename std::enable_if<ZORBA_TR1_NS::is_integral<IntegralType>::value, | ||
180 | 60 | void>::type | ||
181 | 61 | dec_limit( IntegralType *i, IntegralType limit = 0 ) { | ||
182 | 62 | if ( *i > limit ) | ||
183 | 63 | --*i; | ||
184 | 64 | } | ||
185 | 65 | |||
186 | 66 | static unsigned digits( long n ) { | ||
187 | 67 | unsigned d = 0; | ||
188 | 68 | do { | ||
189 | 69 | ++d; | ||
190 | 70 | } while ( n /= 10 ); | ||
191 | 71 | return d; | ||
192 | 72 | } | ||
193 | 73 | |||
194 | 74 | template<class C> inline | ||
195 | 75 | typename C::value_type peek( C const &c, typename C::const_iterator i ) { | ||
196 | 76 | typedef typename C::value_type value_type; | ||
197 | 77 | return ++i != c.end() ? *i : value_type(); | ||
198 | 78 | } | ||
199 | 79 | |||
200 | 80 | template<class C> inline | ||
201 | 81 | typename C::value_type peek_back( C const &c, typename C::const_iterator i ) { | ||
202 | 82 | typedef typename C::value_type value_type; | ||
203 | 83 | return i != c.begin() ? *--i : value_type(); | ||
204 | 84 | } | ||
205 | 56 | 85 | ||
206 | 57 | namespace zorba { | 86 | namespace zorba { |
207 | 58 | 87 | ||
208 | 59 | /////////////////////////////////////////////////////////////////////////////// | 88 | /////////////////////////////////////////////////////////////////////////////// |
209 | 60 | 89 | ||
211 | 61 | typedef uint32_t icu_flags_t; | 90 | typedef uint32_t icu_flags_type; |
212 | 62 | 91 | ||
215 | 63 | static icu_flags_t convert_xquery_flags( char const *xq_flags ) { | 92 | static icu_flags_type convert_xquery_flags( char const *xq_flags ) { |
216 | 64 | icu_flags_t icu_flags = 0; | 93 | icu_flags_type icu_flags = 0; |
217 | 65 | if ( xq_flags ) { | 94 | if ( xq_flags ) { |
218 | 66 | for ( char const *f = xq_flags; *f; ++f ) { | 95 | for ( char const *f = xq_flags; *f; ++f ) { |
219 | 67 | switch ( *f ) { | 96 | switch ( *f ) { |
220 | @@ -89,9 +118,22 @@ | |||
221 | 89 | return icu_flags; | 118 | return icu_flags; |
222 | 90 | } | 119 | } |
223 | 91 | 120 | ||
224 | 121 | inline bool is_char_range_begin( zstring const &s, | ||
225 | 122 | zstring::const_iterator const &i ) { | ||
226 | 123 | return peek( s, i ) == '-' && peek( s, i + 1 ) != '['; | ||
227 | 124 | } | ||
228 | 125 | |||
229 | 126 | inline bool is_non_capturing_begin( zstring const &s, | ||
230 | 127 | zstring::const_iterator const &i ) { | ||
231 | 128 | return peek_back( s, i ) == '?' && peek_back( s, i - 1 ) == '('; | ||
232 | 129 | } | ||
233 | 130 | |||
234 | 131 | #define IS_CHAR_RANGE_BEGIN (in_char_class && is_char_range_begin( xq_re, i )) | ||
235 | 132 | #define PEEK_C peek( xq_re, i ) | ||
236 | 133 | |||
237 | 92 | void convert_xquery_re( zstring const &xq_re, zstring *icu_re, | 134 | void convert_xquery_re( zstring const &xq_re, zstring *icu_re, |
238 | 93 | char const *xq_flags ) { | 135 | char const *xq_flags ) { |
240 | 94 | icu_flags_t const icu_flags = convert_xquery_flags( xq_flags ); | 136 | icu_flags_type const icu_flags = convert_xquery_flags( xq_flags ); |
241 | 95 | bool const i_flag = (icu_flags & UREGEX_CASE_INSENSITIVE) != 0; | 137 | bool const i_flag = (icu_flags & UREGEX_CASE_INSENSITIVE) != 0; |
242 | 96 | bool const m_flag = (icu_flags & UREGEX_MULTILINE) != 0; | 138 | bool const m_flag = (icu_flags & UREGEX_MULTILINE) != 0; |
243 | 97 | bool const q_flag = (icu_flags & UREGEX_LITERAL) != 0; | 139 | bool const q_flag = (icu_flags & UREGEX_LITERAL) != 0; |
244 | @@ -100,32 +142,44 @@ | |||
245 | 100 | icu_re->clear(); | 142 | icu_re->clear(); |
246 | 101 | icu_re->reserve( xq_re.length() ); // approximate | 143 | icu_re->reserve( xq_re.length() ); // approximate |
247 | 102 | 144 | ||
248 | 145 | char c; // current (raw) XQuery char | ||
249 | 146 | char c_cooked; // current cooked XQuery char | ||
250 | 147 | char prev_c_cooked = 0; // previous c_cooked | ||
251 | 148 | char char_range_begin_cooked; // the 'a' in [a-b] | ||
252 | 149 | |||
253 | 103 | bool got_backslash = false; | 150 | bool got_backslash = false; |
256 | 104 | bool in_char_class = false; // within [...] | 151 | int got_quantifier = 0; |
257 | 105 | bool is_first_char = true; // to check ^ placement | 152 | int in_char_class = 0; // within [...] |
258 | 153 | int in_char_range = 0; // within a-b within [...] | ||
259 | 154 | int is_first_char = 1; // to check ^ placement | ||
260 | 106 | 155 | ||
261 | 107 | bool in_backref = false; // '\'[1-9][0-9]* | 156 | bool in_backref = false; // '\'[1-9][0-9]* |
262 | 108 | unsigned backref_no = 0; // 1-based | 157 | unsigned backref_no = 0; // 1-based |
263 | 158 | |||
264 | 159 | // capture subgroup: true = open; false = closed | ||
265 | 160 | vector<bool> cap_sub; // 0-based | ||
266 | 109 | unsigned cur_cap_sub = 0; // 1-based | 161 | unsigned cur_cap_sub = 0; // 1-based |
267 | 110 | unsigned open_cap_subs = 0; | 162 | unsigned open_cap_subs = 0; |
268 | 111 | 163 | ||
271 | 112 | // capture subgroup: true = open; false = closed | 164 | // parentheses balancing: true = is capture subgroup; false = non-capturing |
272 | 113 | vector<bool> cap_sub; // 0-based | 165 | vector<bool> paren; // 0-based |
273 | 166 | unsigned cur_paren = 0; // 1-based | ||
274 | 114 | 167 | ||
276 | 115 | FOR_EACH( zstring, xq_c, xq_re ) { | 168 | FOR_EACH( zstring, i, xq_re ) { |
277 | 169 | c = c_cooked = *i; | ||
278 | 116 | if ( got_backslash ) { | 170 | if ( got_backslash ) { |
280 | 117 | if ( x_flag && !in_char_class && ascii::is_space( *xq_c ) ) { | 171 | if ( x_flag && !in_char_class && ascii::is_space( c ) ) { |
281 | 118 | // | 172 | // |
282 | 119 | // XQuery 3.0 F&O 5.6.1.1: If [the 'x' flag is] present, whitespace | 173 | // XQuery 3.0 F&O 5.6.1.1: If [the 'x' flag is] present, whitespace |
283 | 120 | // characters ... in the regular expression are removed prior to | 174 | // characters ... in the regular expression are removed prior to |
284 | 121 | // matching with one exception: whitespace characters within character | 175 | // matching with one exception: whitespace characters within character |
285 | 122 | // class expressions ... are not removed. | 176 | // class expressions ... are not removed. |
286 | 123 | // | 177 | // |
288 | 124 | continue; | 178 | goto next; |
289 | 125 | } | 179 | } |
290 | 126 | got_backslash = false; | 180 | got_backslash = false; |
291 | 127 | 181 | ||
293 | 128 | switch ( *xq_c ) { | 182 | switch ( c ) { |
294 | 129 | 183 | ||
295 | 130 | ////////// Back-References //////////////////////////////////////////// | 184 | ////////// Back-References //////////////////////////////////////////// |
296 | 131 | 185 | ||
297 | @@ -139,7 +193,7 @@ | |||
298 | 139 | case '7': | 193 | case '7': |
299 | 140 | case '8': | 194 | case '8': |
300 | 141 | case '9': | 195 | case '9': |
302 | 142 | backref_no = *xq_c - '0'; | 196 | backref_no = c - '0'; |
303 | 143 | if ( !backref_no ) // \0 is illegal | 197 | if ( !backref_no ) // \0 is illegal |
304 | 144 | throw INVALID_RE_EXCEPTION( xq_re, ZED( BackRef0Illegal ) ); | 198 | throw INVALID_RE_EXCEPTION( xq_re, ZED( BackRef0Illegal ) ); |
305 | 145 | if ( in_char_class ) { | 199 | if ( in_char_class ) { |
306 | @@ -168,41 +222,73 @@ | |||
307 | 168 | case '\\': | 222 | case '\\': |
308 | 169 | case ']': | 223 | case ']': |
309 | 170 | case '^': | 224 | case '^': |
310 | 225 | case '{': | ||
311 | 226 | case '|': | ||
312 | 227 | case '}': | ||
313 | 228 | *icu_re += '\\'; | ||
314 | 229 | break; | ||
315 | 230 | |||
316 | 231 | ////////// Multi-Character & Category Escapes ///////////////////////// | ||
317 | 232 | |||
318 | 171 | case 'n': // newline | 233 | case 'n': // newline |
319 | 234 | *icu_re += '\\'; | ||
320 | 235 | c_cooked = '\n'; | ||
321 | 236 | break; | ||
322 | 172 | case 'r': // carriage return | 237 | case 'r': // carriage return |
323 | 238 | *icu_re += '\\'; | ||
324 | 239 | c_cooked = '\r'; | ||
325 | 240 | break; | ||
326 | 173 | case 't': // tab | 241 | case 't': // tab |
334 | 174 | case '{': | 242 | *icu_re += '\\'; |
335 | 175 | case '|': | 243 | c_cooked = '\t'; |
336 | 176 | case '}': | 244 | break; |
330 | 177 | // no break; | ||
331 | 178 | |||
332 | 179 | ////////// Multi-Character & Category Escapes ///////////////////////// | ||
333 | 180 | |||
337 | 181 | case 'd': // [0-9] | 245 | case 'd': // [0-9] |
338 | 182 | case 'D': // [^\d] | 246 | case 'D': // [^\d] |
339 | 183 | case 'p': // category escape | 247 | case 'p': // category escape |
340 | 184 | case 'P': // [^\p] | 248 | case 'P': // [^\p] |
341 | 185 | case 's': // whitespace | 249 | case 's': // whitespace |
342 | 186 | case 'S': // [^\s] | 250 | case 'S': // [^\s] |
343 | 251 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) | ||
344 | 252 | goto not_single_char_esc; | ||
345 | 253 | *icu_re += '\\'; | ||
346 | 254 | break; | ||
347 | 187 | case 'w': // word char | 255 | case 'w': // word char |
348 | 256 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) | ||
349 | 257 | goto not_single_char_esc; | ||
350 | 258 | // | ||
351 | 259 | // Note that we can't simply pass \w through to ICU because what it | ||
352 | 260 | // considers a "word character" is different from what XQuery does. | ||
353 | 261 | // | ||
354 | 262 | *icu_re += "[^" bs_W "]"; | ||
355 | 263 | goto next; | ||
356 | 188 | case 'W': // [^\w] | 264 | case 'W': // [^\w] |
359 | 189 | *icu_re += '\\'; | 265 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) |
360 | 190 | break; | 266 | goto not_single_char_esc; |
361 | 267 | *icu_re += "[" bs_W "]"; | ||
362 | 268 | goto next; | ||
363 | 191 | case 'c': // NameChar | 269 | case 'c': // NameChar |
364 | 270 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) | ||
365 | 271 | goto not_single_char_esc; | ||
366 | 192 | *icu_re += "[" bs_c "]"; | 272 | *icu_re += "[" bs_c "]"; |
368 | 193 | continue; | 273 | goto next; |
369 | 194 | case 'C': // [^\c] | 274 | case 'C': // [^\c] |
370 | 275 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) | ||
371 | 276 | goto not_single_char_esc; | ||
372 | 195 | *icu_re += "[^" bs_c "]"; | 277 | *icu_re += "[^" bs_c "]"; |
374 | 196 | continue; | 278 | goto next; |
375 | 197 | case 'i': // initial NameChar | 279 | case 'i': // initial NameChar |
376 | 280 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) | ||
377 | 281 | goto not_single_char_esc; | ||
378 | 198 | *icu_re += "[" bs_i "]"; | 282 | *icu_re += "[" bs_i "]"; |
380 | 199 | continue; | 283 | goto next; |
381 | 200 | case 'I': // [^\i] | 284 | case 'I': // [^\i] |
382 | 285 | if ( in_char_range || IS_CHAR_RANGE_BEGIN ) | ||
383 | 286 | goto not_single_char_esc; | ||
384 | 201 | *icu_re += "[^" bs_i "]"; | 287 | *icu_re += "[^" bs_i "]"; |
386 | 202 | continue; | 288 | goto next; |
387 | 203 | 289 | ||
388 | 204 | default: | 290 | default: |
390 | 205 | throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexEscape_3 ), *xq_c ); | 291 | throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexEscape_3 ), c ); |
391 | 206 | } | 292 | } |
392 | 207 | } else { | 293 | } else { |
393 | 208 | if ( in_backref ) { | 294 | if ( in_backref ) { |
394 | @@ -214,10 +300,26 @@ | |||
395 | 214 | // back-reference is preceded by NN or more unescaped opening | 300 | // back-reference is preceded by NN or more unescaped opening |
396 | 215 | // parentheses. | 301 | // parentheses. |
397 | 216 | // | 302 | // |
401 | 217 | if ( cap_sub.size() > 9 && ascii::is_digit( *xq_c ) ) | 303 | bool prevent_multidigit_backref = false; |
402 | 218 | backref_no = backref_no * 10 + (*xq_c - '0'); | 304 | if ( ascii::is_digit( c ) ) { |
403 | 219 | else | 305 | if ( digits( cap_sub.size() ) > digits( backref_no ) ) |
404 | 306 | backref_no = backref_no * 10 + (c - '0'); | ||
405 | 307 | else { | ||
406 | 308 | in_backref = false; | ||
407 | 309 | // | ||
408 | 310 | // Unlike XQuery, ICU always takes further digits to be part of the | ||
409 | 311 | // backreference so we have to prevent ICU from doing that. One | ||
410 | 312 | // way to do that is by enclosing said digits in a single-character | ||
411 | 313 | // character class, i.e., [N]. | ||
412 | 314 | // | ||
413 | 315 | *icu_re += '['; | ||
414 | 316 | *icu_re += c; | ||
415 | 317 | *icu_re += ']'; | ||
416 | 318 | prevent_multidigit_backref = true; | ||
417 | 319 | } | ||
418 | 320 | } else | ||
419 | 220 | in_backref = false; | 321 | in_backref = false; |
420 | 322 | |||
421 | 221 | // | 323 | // |
422 | 222 | // XQuery 3.0 F&O 5.6.1: The regular expression is invalid if a back- | 324 | // XQuery 3.0 F&O 5.6.1: The regular expression is invalid if a back- |
423 | 223 | // reference refers to a subexpression that does not exist or whose | 325 | // reference refers to a subexpression that does not exist or whose |
424 | @@ -231,85 +333,170 @@ | |||
425 | 231 | throw INVALID_RE_EXCEPTION( | 333 | throw INVALID_RE_EXCEPTION( |
426 | 232 | xq_re, ZED( NonClosedBackRef_3 ), backref_no | 334 | xq_re, ZED( NonClosedBackRef_3 ), backref_no |
427 | 233 | ); | 335 | ); |
428 | 336 | |||
429 | 337 | if ( prevent_multidigit_backref ) | ||
430 | 338 | goto next; | ||
431 | 234 | } | 339 | } |
433 | 235 | switch ( *xq_c ) { | 340 | |
434 | 341 | switch ( c ) { | ||
435 | 342 | case '$': | ||
436 | 343 | if ( q_flag ) | ||
437 | 344 | *icu_re += '\\'; | ||
438 | 345 | else if ( !m_flag && i + 1 == xq_re.end() ) { | ||
439 | 346 | // | ||
440 | 347 | // XQuery 3.0 F&O 5.6.1: By default, ... $ matches the end of the | ||
441 | 348 | // entire string. [Newlines are treated as any other character.] | ||
442 | 349 | // | ||
443 | 350 | // However, in ICU, $ always matches before any trailing newlines. | ||
444 | 351 | // | ||
445 | 352 | // To make ICU work as XQuery needs it to, substitute \z for $ when | ||
446 | 353 | // it is the last character in the regular expression (and multi- | ||
447 | 354 | // line mode is not set). | ||
448 | 355 | // | ||
449 | 356 | icu_re->append( "\\z" ); | ||
450 | 357 | goto next; | ||
451 | 358 | } | ||
452 | 359 | break; | ||
453 | 360 | case '(': | ||
454 | 361 | if ( q_flag ) | ||
455 | 362 | *icu_re += '\\'; | ||
456 | 363 | else { | ||
457 | 364 | cur_paren = paren.size() + 1; | ||
458 | 365 | zstring::const_iterator j = i; | ||
459 | 366 | if ( ++j != xq_re.end() && *j == '?' && ++j != xq_re.end() ) { | ||
460 | 367 | // | ||
461 | 368 | // Got "(?" sequence: potentially start of "(?:", a non-capturing | ||
462 | 369 | // subgroup. ICU also allows other characters after the "(?" | ||
463 | 370 | // that XQuery does not, so we have to report those as errors. | ||
464 | 371 | // | ||
465 | 372 | if ( *j != ':' ) | ||
466 | 373 | throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexParen_3 ), *j ); | ||
467 | 374 | // | ||
468 | 375 | // Start of non-capturing subgroup. | ||
469 | 376 | // | ||
470 | 377 | paren.push_back( false ); | ||
471 | 378 | } else { | ||
472 | 379 | // | ||
473 | 380 | // Start of capturing subgroup. | ||
474 | 381 | // | ||
475 | 382 | paren.push_back( true ); | ||
476 | 383 | ++open_cap_subs; | ||
477 | 384 | cap_sub.push_back( true ); | ||
478 | 385 | cur_cap_sub = cap_sub.size(); | ||
479 | 386 | is_first_char = 2; | ||
480 | 387 | } | ||
481 | 388 | } | ||
482 | 389 | break; | ||
483 | 390 | case ')': | ||
484 | 391 | if ( q_flag ) | ||
485 | 392 | *icu_re += '\\'; | ||
486 | 393 | else { | ||
487 | 394 | if ( !cur_paren ) | ||
488 | 395 | goto unbalanced_char; | ||
489 | 396 | if ( paren[ --cur_paren ] ) { | ||
490 | 397 | if ( !open_cap_subs || !cur_cap_sub ) | ||
491 | 398 | goto unbalanced_char; | ||
492 | 399 | cap_sub[ --cur_cap_sub ] = false; | ||
493 | 400 | } | ||
494 | 401 | } | ||
495 | 402 | break; | ||
496 | 403 | case ':': | ||
497 | 404 | if ( is_non_capturing_begin( xq_re, i ) ) { | ||
498 | 405 | // | ||
499 | 406 | // This ':' is part of a "(?:" sequence, i.e., a non-capturing | ||
500 | 407 | // subgroup. Therefore, the *next* character will be a "first | ||
501 | 408 | // character" for the purposes of '^'. | ||
502 | 409 | // | ||
503 | 410 | is_first_char = 2; | ||
504 | 411 | } | ||
505 | 412 | break; | ||
506 | 413 | case '*': | ||
507 | 414 | case '+': | ||
508 | 415 | case '?': | ||
509 | 416 | case '{': | ||
510 | 417 | if ( q_flag ) | ||
511 | 418 | *icu_re += '\\'; | ||
512 | 419 | else { | ||
513 | 420 | // | ||
514 | 421 | // ICU allows the multiple quantifiers *+, ++, and ?+, but XQuery | ||
515 | 422 | // does not so we have to check for them. | ||
516 | 423 | // | ||
517 | 424 | if ( got_quantifier && c != '?' ) | ||
518 | 425 | throw INVALID_RE_EXCEPTION( | ||
519 | 426 | xq_re, ZED( BadQuantifierHere_3 ), c | ||
520 | 427 | ); | ||
521 | 428 | got_quantifier = 2; | ||
522 | 429 | } | ||
523 | 430 | break; | ||
524 | 431 | case '-': | ||
525 | 432 | if ( in_char_class && !in_char_range ) { | ||
526 | 433 | char const next_c = PEEK_C; | ||
527 | 434 | if ( next_c == '[' ) { | ||
528 | 435 | // | ||
529 | 436 | // ICU uses "--" to indicate range subtraction, e.g., | ||
530 | 437 | // XQuery [A-Z-[OI]] becomes ICU [A-Z--[OI]]. | ||
531 | 438 | // | ||
532 | 439 | *icu_re += '-'; | ||
533 | 440 | } else if ( prev_c_cooked != '[' && next_c != ']' ) { | ||
534 | 441 | // | ||
535 | 442 | // The '-' is neither the first or last character within a | ||
536 | 443 | // character range (i.e., a literal '-') so therefore it's | ||
537 | 444 | // indicating a character range. | ||
538 | 445 | // | ||
539 | 446 | char_range_begin_cooked = prev_c_cooked; | ||
540 | 447 | in_char_range = 2; | ||
541 | 448 | } | ||
542 | 449 | } | ||
543 | 450 | break; | ||
544 | 451 | case '.': | ||
545 | 452 | case '}': | ||
546 | 453 | if ( q_flag ) | ||
547 | 454 | *icu_re += '\\'; | ||
548 | 455 | break; | ||
549 | 456 | case '[': | ||
550 | 457 | if ( q_flag ) | ||
551 | 458 | *icu_re += '\\'; | ||
552 | 459 | else { | ||
553 | 460 | if ( in_char_class && prev_c_cooked != '-' ) | ||
554 | 461 | goto unescaped_char; | ||
555 | 462 | ++in_char_class; | ||
556 | 463 | is_first_char = 2; | ||
557 | 464 | } | ||
558 | 465 | break; | ||
559 | 236 | case '\\': | 466 | case '\\': |
560 | 237 | got_backslash = true; | 467 | got_backslash = true; |
612 | 238 | continue; | 468 | if ( in_char_range ) |
613 | 239 | case '$': | 469 | ++in_char_range; |
614 | 240 | if ( q_flag ) | 470 | goto next; |
564 | 241 | *icu_re += '\\'; | ||
565 | 242 | else if ( !m_flag ) { | ||
566 | 243 | zstring::const_iterator const temp = xq_c + 1; | ||
567 | 244 | if ( temp == xq_re.end() ) { | ||
568 | 245 | // | ||
569 | 246 | // XQuery 3.0 F&O 5.6.1: By default, ... $ matches the end of the | ||
570 | 247 | // entire string. [Newlines are treated as any other character.] | ||
571 | 248 | // | ||
572 | 249 | // However, in ICU, $ always matches before any trailing | ||
573 | 250 | // newlines. | ||
574 | 251 | // | ||
575 | 252 | // To make ICU work as XQuery needs it to, substitute \z for $ | ||
576 | 253 | // when it is the last character in the regular expression (and | ||
577 | 254 | // multi-line mode is not set). | ||
578 | 255 | // | ||
579 | 256 | icu_re->append( "\\z" ); | ||
580 | 257 | continue; | ||
581 | 258 | } | ||
582 | 259 | } | ||
583 | 260 | break; | ||
584 | 261 | case '(': | ||
585 | 262 | if ( q_flag ) | ||
586 | 263 | *icu_re += '\\'; | ||
587 | 264 | else { | ||
588 | 265 | ++open_cap_subs; | ||
589 | 266 | cap_sub.push_back( true ); | ||
590 | 267 | cur_cap_sub = cap_sub.size(); | ||
591 | 268 | is_first_char = true; | ||
592 | 269 | goto append; | ||
593 | 270 | } | ||
594 | 271 | break; | ||
595 | 272 | case ')': | ||
596 | 273 | if ( q_flag ) | ||
597 | 274 | *icu_re += '\\'; | ||
598 | 275 | else { | ||
599 | 276 | if ( !open_cap_subs || cur_cap_sub == 0 ) | ||
600 | 277 | throw INVALID_RE_EXCEPTION( xq_re, ZED( UnbalancedChar_3 ), ')' ); | ||
601 | 278 | cap_sub[ --cur_cap_sub ] = false; | ||
602 | 279 | } | ||
603 | 280 | break; | ||
604 | 281 | case '[': | ||
605 | 282 | if ( q_flag ) | ||
606 | 283 | *icu_re += '\\'; | ||
607 | 284 | else { | ||
608 | 285 | in_char_class = true; | ||
609 | 286 | goto append; | ||
610 | 287 | } | ||
611 | 288 | break; | ||
615 | 289 | case ']': | 471 | case ']': |
616 | 290 | if ( q_flag ) | 472 | if ( q_flag ) |
617 | 291 | *icu_re += '\\'; | 473 | *icu_re += '\\'; |
618 | 474 | else { | ||
619 | 475 | if ( !in_char_class ) | ||
620 | 476 | goto unbalanced_char; | ||
621 | 477 | --in_char_class; | ||
622 | 478 | in_char_range = 0; | ||
623 | 479 | } | ||
624 | 480 | break; | ||
625 | 481 | case '^': | ||
626 | 482 | if ( q_flag ) | ||
627 | 483 | *icu_re += '\\'; | ||
628 | 484 | else if ( !is_first_char ) { | ||
629 | 485 | if ( in_char_class ) | ||
630 | 486 | goto unescaped_char; | ||
631 | 487 | *icu_re += '\\'; | ||
632 | 488 | } | ||
633 | 489 | break; | ||
634 | 490 | case '|': | ||
635 | 491 | if ( q_flag ) | ||
636 | 492 | *icu_re += '\\'; | ||
637 | 292 | else | 493 | else |
653 | 293 | in_char_class = false; | 494 | is_first_char = 2; |
639 | 294 | break; | ||
640 | 295 | case '^': | ||
641 | 296 | if ( q_flag ) | ||
642 | 297 | *icu_re += '\\'; | ||
643 | 298 | else if ( !is_first_char && !in_char_class ) | ||
644 | 299 | throw INVALID_RE_EXCEPTION( xq_re, ZED( UnescapedChar_3 ), *xq_c ); | ||
645 | 300 | break; | ||
646 | 301 | case '|': | ||
647 | 302 | if ( q_flag ) | ||
648 | 303 | *icu_re += '\\'; | ||
649 | 304 | else { | ||
650 | 305 | is_first_char = true; | ||
651 | 306 | goto append; | ||
652 | 307 | } | ||
654 | 308 | break; | 495 | break; |
655 | 309 | default: | 496 | default: |
657 | 310 | if ( x_flag && ascii::is_space( *xq_c ) ) { | 497 | if ( x_flag && ascii::is_space( c ) ) { |
658 | 311 | if ( !in_char_class ) | 498 | if ( !in_char_class ) |
660 | 312 | continue; | 499 | goto next; |
661 | 313 | // | 500 | // |
662 | 314 | // This is similar to the above case for removing whitespace except | 501 | // This is similar to the above case for removing whitespace except |
663 | 315 | // ICU removes *all* whitespace (even within character classes) | 502 | // ICU removes *all* whitespace (even within character classes) |
664 | @@ -319,11 +506,28 @@ | |||
665 | 319 | } | 506 | } |
666 | 320 | } // switch | 507 | } // switch |
667 | 321 | } // else | 508 | } // else |
671 | 322 | is_first_char = false; | 509 | |
672 | 323 | append: | 510 | if ( in_char_range == 1 && c_cooked < char_range_begin_cooked ) |
673 | 324 | *icu_re += *xq_c; | 511 | throw INVALID_RE_EXCEPTION( |
674 | 512 | xq_re, ZED( BadEndCharInRange_34 ), | ||
675 | 513 | ascii::printable_char( c_cooked ), | ||
676 | 514 | char_range_begin_cooked | ||
677 | 515 | ); | ||
678 | 516 | |||
679 | 517 | *icu_re += c; | ||
680 | 518 | |||
681 | 519 | next: | ||
682 | 520 | dec_limit( &in_char_range ); | ||
683 | 521 | dec_limit( &got_quantifier ); | ||
684 | 522 | dec_limit( &is_first_char ); | ||
685 | 523 | prev_c_cooked = c_cooked; | ||
686 | 325 | } // FOR_EACH | 524 | } // FOR_EACH |
687 | 326 | 525 | ||
688 | 526 | if ( got_backslash ) | ||
689 | 527 | throw INVALID_RE_EXCEPTION( xq_re, ZED( TrailingChar_3 ), '\\' ); | ||
690 | 528 | if ( in_char_class ) | ||
691 | 529 | throw INVALID_RE_EXCEPTION( xq_re, ZED( UnbalancedChar_3 ), '[' ); | ||
692 | 530 | |||
693 | 327 | if ( !q_flag ) { | 531 | if ( !q_flag ) { |
694 | 328 | if ( i_flag ) { | 532 | if ( i_flag ) { |
695 | 329 | // | 533 | // |
696 | @@ -332,12 +536,13 @@ | |||
697 | 332 | // only. | 536 | // only. |
698 | 333 | // | 537 | // |
699 | 334 | // However, ICU lower-cases everything for the 'i' flag; hence we have to | 538 | // However, ICU lower-cases everything for the 'i' flag; hence we have to |
701 | 335 | // turn off the 'i' flag for just the \p{Lu}. | 539 | // turn off the 'i' flag for the \p{Lu} and \P{Lu}. |
702 | 336 | // | 540 | // |
703 | 337 | // Note that the "6" and "12" below are correct since "\\" represents a | 541 | // Note that the "6" and "12" below are correct since "\\" represents a |
704 | 338 | // single '\'. | 542 | // single '\'. |
705 | 339 | // | 543 | // |
706 | 340 | ascii::replace_all( *icu_re, "\\p{Lu}", 6, "(?-i:\\p{Lu})", 12 ); | 544 | ascii::replace_all( *icu_re, "\\p{Lu}", 6, "(?-i:\\p{Lu})", 12 ); |
707 | 545 | ascii::replace_all( *icu_re, "\\P{Lu}", 6, "(?-i:\\P{Lu})", 12 ); | ||
708 | 341 | } | 546 | } |
709 | 342 | 547 | ||
710 | 343 | // | 548 | // |
711 | @@ -352,7 +557,16 @@ | |||
712 | 352 | // Note that the "5" below is correct since "\\" represents a single '\'. | 557 | // Note that the "5" below is correct since "\\" represents a single '\'. |
713 | 353 | // | 558 | // |
714 | 354 | ascii::replace_all( *icu_re, "\\p{Is", 5, "\\p{In", 5 ); | 559 | ascii::replace_all( *icu_re, "\\p{Is", 5, "\\p{In", 5 ); |
715 | 560 | ascii::replace_all( *icu_re, "\\P{Is", 5, "\\P{In", 5 ); | ||
716 | 355 | } // q_flag | 561 | } // q_flag |
717 | 562 | return; | ||
718 | 563 | |||
719 | 564 | not_single_char_esc: | ||
720 | 565 | throw INVALID_RE_EXCEPTION( xq_re, ZED( NotSingleCharEsc_3 ), c ); | ||
721 | 566 | unbalanced_char: | ||
722 | 567 | throw INVALID_RE_EXCEPTION( xq_re, ZED( UnbalancedChar_3 ), c ); | ||
723 | 568 | unescaped_char: | ||
724 | 569 | throw INVALID_RE_EXCEPTION( xq_re, ZED( UnescapedChar_3 ), c ); | ||
725 | 356 | } | 570 | } |
726 | 357 | 571 | ||
727 | 358 | /////////////////////////////////////////////////////////////////////////////// | 572 | /////////////////////////////////////////////////////////////////////////////// |
728 | @@ -362,7 +576,8 @@ | |||
729 | 362 | 576 | ||
730 | 363 | void regex::compile( string const &u_pattern, char const *flags, | 577 | void regex::compile( string const &u_pattern, char const *flags, |
731 | 364 | char const *pattern ) { | 578 | char const *pattern ) { |
733 | 365 | icu_flags_t const icu_flags = convert_xquery_flags( flags ) & ~UREGEX_LITERAL; | 579 | icu_flags_type const icu_flags = |
734 | 580 | convert_xquery_flags( flags ) & ~UREGEX_LITERAL; | ||
735 | 366 | delete matcher_; | 581 | delete matcher_; |
736 | 367 | UErrorCode status = U_ZERO_ERROR; | 582 | UErrorCode status = U_ZERO_ERROR; |
737 | 368 | matcher_ = new RegexMatcher( u_pattern, icu_flags, status ); | 583 | matcher_ = new RegexMatcher( u_pattern, icu_flags, status ); |
738 | @@ -375,9 +590,7 @@ | |||
739 | 375 | icu_error_key = ZED_PREFIX; | 590 | icu_error_key = ZED_PREFIX; |
740 | 376 | icu_error_key += u_errorName( status ); | 591 | icu_error_key += u_errorName( status ); |
741 | 377 | } | 592 | } |
745 | 378 | throw XQUERY_EXCEPTION( | 593 | throw INVALID_RE_EXCEPTION( pattern, icu_error_key ); |
743 | 379 | err::FORX0002, ERROR_PARAMS( pattern, icu_error_key ) | ||
744 | 380 | ); | ||
746 | 381 | } | 594 | } |
747 | 382 | } | 595 | } |
748 | 383 | 596 | ||
749 | 384 | 597 | ||
750 | === modified file 'test/fots/CMakeLists.txt' | |||
751 | --- test/fots/CMakeLists.txt 2013-02-25 16:18:58 +0000 | |||
752 | +++ test/fots/CMakeLists.txt 2013-02-26 01:37:22 +0000 | |||
753 | @@ -344,112 +344,15 @@ | |||
754 | 344 | EXPECTED_FOTS_FAILURE (fn-iri-to-uri fn-iri-to-uri-18A 0) | 344 | EXPECTED_FOTS_FAILURE (fn-iri-to-uri fn-iri-to-uri-18A 0) |
755 | 345 | EXPECTED_FOTS_FAILURE (fn-last last-11 0) | 345 | EXPECTED_FOTS_FAILURE (fn-last last-11 0) |
756 | 346 | EXPECTED_FOTS_FAILURE (fn-last last-24 0) | 346 | EXPECTED_FOTS_FAILURE (fn-last last-24 0) |
863 | 347 | EXPECTED_FOTS_FAILURE (fn-matches caselessmatch10 0) | 347 | EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-038 1131304) |
864 | 348 | EXPECTED_FOTS_FAILURE (fn-matches caselessmatch11 0) | 348 | EXPECTED_FOTS_FAILURE (fn-matches.re re00056 1131984) |
865 | 349 | EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-038 0) | 349 | EXPECTED_FOTS_FAILURE (fn-matches.re re00086 1131984) |
866 | 350 | EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-039 0) | 350 | EXPECTED_FOTS_FAILURE (fn-matches.re re00288 1131985) |
867 | 351 | EXPECTED_FOTS_FAILURE (fn-matches.re re00041 0) | 351 | EXPECTED_FOTS_FAILURE (fn-matches.re re00370 1131985) |
868 | 352 | EXPECTED_FOTS_FAILURE (fn-matches.re re00055 0) | 352 | EXPECTED_FOTS_FAILURE (fn-matches.re re00480 1131985) |
869 | 353 | EXPECTED_FOTS_FAILURE (fn-matches.re re00058 0) | 353 | EXPECTED_FOTS_FAILURE (fn-matches.re re00732 1131988) |
870 | 354 | EXPECTED_FOTS_FAILURE (fn-matches.re re00059 0) | 354 | EXPECTED_FOTS_FAILURE (fn-matches.re re00737 1131990) |
871 | 355 | EXPECTED_FOTS_FAILURE (fn-matches.re re00060 0) | 355 | EXPECTED_FOTS_FAILURE (fn-matches.re re00987 1131313) |
766 | 356 | EXPECTED_FOTS_FAILURE (fn-matches.re re00063 0) | ||
767 | 357 | EXPECTED_FOTS_FAILURE (fn-matches.re re00071 0) | ||
768 | 358 | EXPECTED_FOTS_FAILURE (fn-matches.re re00072 0) | ||
769 | 359 | EXPECTED_FOTS_FAILURE (fn-matches.re re00288 0) | ||
770 | 360 | EXPECTED_FOTS_FAILURE (fn-matches.re re00370 0) | ||
771 | 361 | EXPECTED_FOTS_FAILURE (fn-matches.re re00480 0) | ||
772 | 362 | EXPECTED_FOTS_FAILURE (fn-matches.re re00498 0) | ||
773 | 363 | EXPECTED_FOTS_FAILURE (fn-matches.re re00501 0) | ||
774 | 364 | EXPECTED_FOTS_FAILURE (fn-matches.re re00506 0) | ||
775 | 365 | EXPECTED_FOTS_FAILURE (fn-matches.re re00589 0) | ||
776 | 366 | EXPECTED_FOTS_FAILURE (fn-matches.re re00590 0) | ||
777 | 367 | EXPECTED_FOTS_FAILURE (fn-matches.re re00613 0) | ||
778 | 368 | EXPECTED_FOTS_FAILURE (fn-matches.re re00680 0) | ||
779 | 369 | EXPECTED_FOTS_FAILURE (fn-matches.re re00693 0) | ||
780 | 370 | EXPECTED_FOTS_FAILURE (fn-matches.re re00694 0) | ||
781 | 371 | EXPECTED_FOTS_FAILURE (fn-matches.re re00695 0) | ||
782 | 372 | EXPECTED_FOTS_FAILURE (fn-matches.re re00696 0) | ||
783 | 373 | EXPECTED_FOTS_FAILURE (fn-matches.re re00697 0) | ||
784 | 374 | EXPECTED_FOTS_FAILURE (fn-matches.re re00698 0) | ||
785 | 375 | EXPECTED_FOTS_FAILURE (fn-matches.re re00702 0) | ||
786 | 376 | EXPECTED_FOTS_FAILURE (fn-matches.re re00703 0) | ||
787 | 377 | EXPECTED_FOTS_FAILURE (fn-matches.re re00704 0) | ||
788 | 378 | EXPECTED_FOTS_FAILURE (fn-matches.re re00705 0) | ||
789 | 379 | EXPECTED_FOTS_FAILURE (fn-matches.re re00706 0) | ||
790 | 380 | EXPECTED_FOTS_FAILURE (fn-matches.re re00707 0) | ||
791 | 381 | EXPECTED_FOTS_FAILURE (fn-matches.re re00708 0) | ||
792 | 382 | EXPECTED_FOTS_FAILURE (fn-matches.re re00709 0) | ||
793 | 383 | EXPECTED_FOTS_FAILURE (fn-matches.re re00710 0) | ||
794 | 384 | EXPECTED_FOTS_FAILURE (fn-matches.re re00711 0) | ||
795 | 385 | EXPECTED_FOTS_FAILURE (fn-matches.re re00712 0) | ||
796 | 386 | EXPECTED_FOTS_FAILURE (fn-matches.re re00713 0) | ||
797 | 387 | EXPECTED_FOTS_FAILURE (fn-matches.re re00717 0) | ||
798 | 388 | EXPECTED_FOTS_FAILURE (fn-matches.re re00718 0) | ||
799 | 389 | EXPECTED_FOTS_FAILURE (fn-matches.re re00719 0) | ||
800 | 390 | EXPECTED_FOTS_FAILURE (fn-matches.re re00720 0) | ||
801 | 391 | EXPECTED_FOTS_FAILURE (fn-matches.re re00721 0) | ||
802 | 392 | EXPECTED_FOTS_FAILURE (fn-matches.re re00722 0) | ||
803 | 393 | EXPECTED_FOTS_FAILURE (fn-matches.re re00723 0) | ||
804 | 394 | EXPECTED_FOTS_FAILURE (fn-matches.re re00730 0) | ||
805 | 395 | EXPECTED_FOTS_FAILURE (fn-matches.re re00732 0) | ||
806 | 396 | EXPECTED_FOTS_FAILURE (fn-matches.re re00736 0) | ||
807 | 397 | EXPECTED_FOTS_FAILURE (fn-matches.re re00739 0) | ||
808 | 398 | EXPECTED_FOTS_FAILURE (fn-matches.re re00740 0) | ||
809 | 399 | EXPECTED_FOTS_FAILURE (fn-matches.re re00744 0) | ||
810 | 400 | EXPECTED_FOTS_FAILURE (fn-matches.re re00745 0) | ||
811 | 401 | EXPECTED_FOTS_FAILURE (fn-matches.re re00746 0) | ||
812 | 402 | EXPECTED_FOTS_FAILURE (fn-matches.re re00749 0) | ||
813 | 403 | EXPECTED_FOTS_FAILURE (fn-matches.re re00750 0) | ||
814 | 404 | EXPECTED_FOTS_FAILURE (fn-matches.re re00754 0) | ||
815 | 405 | EXPECTED_FOTS_FAILURE (fn-matches.re re00763 0) | ||
816 | 406 | EXPECTED_FOTS_FAILURE (fn-matches.re re00767 0) | ||
817 | 407 | EXPECTED_FOTS_FAILURE (fn-matches.re re00768 0) | ||
818 | 408 | EXPECTED_FOTS_FAILURE (fn-matches.re re00769 0) | ||
819 | 409 | EXPECTED_FOTS_FAILURE (fn-matches.re re00770 0) | ||
820 | 410 | EXPECTED_FOTS_FAILURE (fn-matches.re re00771 0) | ||
821 | 411 | EXPECTED_FOTS_FAILURE (fn-matches.re re00779 0) | ||
822 | 412 | EXPECTED_FOTS_FAILURE (fn-matches.re re00780 0) | ||
823 | 413 | EXPECTED_FOTS_FAILURE (fn-matches.re re00795 0) | ||
824 | 414 | EXPECTED_FOTS_FAILURE (fn-matches.re re00804 0) | ||
825 | 415 | EXPECTED_FOTS_FAILURE (fn-matches.re re00805 0) | ||
826 | 416 | EXPECTED_FOTS_FAILURE (fn-matches.re re00806 0) | ||
827 | 417 | EXPECTED_FOTS_FAILURE (fn-matches.re re00814 0) | ||
828 | 418 | EXPECTED_FOTS_FAILURE (fn-matches.re re00867 0) | ||
829 | 419 | EXPECTED_FOTS_FAILURE (fn-matches.re re00868 0) | ||
830 | 420 | EXPECTED_FOTS_FAILURE (fn-matches.re re00869 0) | ||
831 | 421 | EXPECTED_FOTS_FAILURE (fn-matches.re re00870 0) | ||
832 | 422 | EXPECTED_FOTS_FAILURE (fn-matches.re re00871 0) | ||
833 | 423 | EXPECTED_FOTS_FAILURE (fn-matches.re re00872 0) | ||
834 | 424 | EXPECTED_FOTS_FAILURE (fn-matches.re re00873 0) | ||
835 | 425 | EXPECTED_FOTS_FAILURE (fn-matches.re re00874 0) | ||
836 | 426 | EXPECTED_FOTS_FAILURE (fn-matches.re re00875 0) | ||
837 | 427 | EXPECTED_FOTS_FAILURE (fn-matches.re re00876 0) | ||
838 | 428 | EXPECTED_FOTS_FAILURE (fn-matches.re re00881 0) | ||
839 | 429 | EXPECTED_FOTS_FAILURE (fn-matches.re re00882 0) | ||
840 | 430 | EXPECTED_FOTS_FAILURE (fn-matches.re re00890 0) | ||
841 | 431 | EXPECTED_FOTS_FAILURE (fn-matches.re re00891 0) | ||
842 | 432 | EXPECTED_FOTS_FAILURE (fn-matches.re re00905 0) | ||
843 | 433 | EXPECTED_FOTS_FAILURE (fn-matches.re re00912 0) | ||
844 | 434 | EXPECTED_FOTS_FAILURE (fn-matches.re re00913 0) | ||
845 | 435 | EXPECTED_FOTS_FAILURE (fn-matches.re re00914 0) | ||
846 | 436 | EXPECTED_FOTS_FAILURE (fn-matches.re re00919 0) | ||
847 | 437 | EXPECTED_FOTS_FAILURE (fn-matches.re re00939 0) | ||
848 | 438 | EXPECTED_FOTS_FAILURE (fn-matches.re re00940 0) | ||
849 | 439 | EXPECTED_FOTS_FAILURE (fn-matches.re re00941 0) | ||
850 | 440 | EXPECTED_FOTS_FAILURE (fn-matches.re re00957 0) | ||
851 | 441 | EXPECTED_FOTS_FAILURE (fn-matches.re re00970 0) | ||
852 | 442 | EXPECTED_FOTS_FAILURE (fn-matches.re re00977 0) | ||
853 | 443 | EXPECTED_FOTS_FAILURE (fn-matches.re re00978 0) | ||
854 | 444 | EXPECTED_FOTS_FAILURE (fn-matches.re re00982 0) | ||
855 | 445 | EXPECTED_FOTS_FAILURE (fn-matches.re re00983 0) | ||
856 | 446 | EXPECTED_FOTS_FAILURE (fn-matches.re re00984 0) | ||
857 | 447 | EXPECTED_FOTS_FAILURE (fn-matches.re re00987 0) | ||
858 | 448 | EXPECTED_FOTS_FAILURE (fn-matches.re re00988 0) | ||
859 | 449 | EXPECTED_FOTS_FAILURE (fn-matches.re re00989 0) | ||
860 | 450 | EXPECTED_FOTS_FAILURE (fn-matches.re re00994 0) | ||
861 | 451 | EXPECTED_FOTS_FAILURE (fn-matches.re re00998 0) | ||
862 | 452 | EXPECTED_FOTS_FAILURE (fn-matches.re re00999 0) | ||
872 | 453 | EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-33 0) | 356 | EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-33 0) |
873 | 454 | EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-35 0) | 357 | EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-35 0) |
874 | 455 | EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-37 0) | 358 | EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-37 0) |
875 | 456 | 359 | ||
876 | === added file 'test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res' | |||
877 | --- test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res 1970-01-01 00:00:00 +0000 | |||
878 | +++ test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res 2013-02-26 01:37:22 +0000 | |||
879 | @@ -0,0 +1,1 @@ | |||
880 | 1 | false | ||
881 | 0 | 2 | ||
882 | === added file 'test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res' | |||
883 | --- test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res 1970-01-01 00:00:00 +0000 | |||
884 | +++ test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res 2013-02-26 01:37:22 +0000 | |||
885 | @@ -0,0 +1,1 @@ | |||
886 | 1 | false | ||
887 | 0 | 2 | ||
888 | === modified file 'test/rbkt/Queries/CMakeLists.txt' | |||
889 | --- test/rbkt/Queries/CMakeLists.txt 2013-02-12 08:27:39 +0000 | |||
890 | +++ test/rbkt/Queries/CMakeLists.txt 2013-02-26 01:37:22 +0000 | |||
891 | @@ -549,15 +549,13 @@ | |||
892 | 549 | EXPECTED_FAILURE(test/rbkt/zorba/http-client/post/post3_binary_element 3391756) | 549 | EXPECTED_FAILURE(test/rbkt/zorba/http-client/post/post3_binary_element 3391756) |
893 | 550 | IF(NOT ZORBA_NO_ICU) | 550 | IF(NOT ZORBA_NO_ICU) |
894 | 551 | IF ( ${ICU_VERSION} VERSION_LESS 4.0.0 ) | 551 | IF ( ${ICU_VERSION} VERSION_LESS 4.0.0 ) |
895 | 552 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m11 866874) | ||
896 | 552 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m40 866874) | 553 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m40 866874) |
897 | 553 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m41 866874) | 554 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m41 866874) |
898 | 554 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err17 1023168) | ||
899 | 555 | ELSE ( ${ICU_VERSION} VERSION_LESS 4.0.0 ) | 555 | ELSE ( ${ICU_VERSION} VERSION_LESS 4.0.0 ) |
900 | 556 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err10 994610) | 556 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err10 994610) |
901 | 557 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err15 866874) | 557 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err15 866874) |
902 | 558 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err16 1023168) | ||
903 | 559 | ENDIF ( ${ICU_VERSION} VERSION_LESS 4.0.0 ) | 558 | ENDIF ( ${ICU_VERSION} VERSION_LESS 4.0.0 ) |
904 | 560 | EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m11 866874) | ||
905 | 561 | ENDIF(NOT ZORBA_NO_ICU) | 559 | ENDIF(NOT ZORBA_NO_ICU) |
906 | 562 | 560 | ||
907 | 563 | IF(ZORBA_NO_ICU) | 561 | IF(ZORBA_NO_ICU) |
908 | 564 | 562 | ||
909 | === removed file 'test/rbkt/Queries/zorba/string/Regex/regex_err25.spec' | |||
910 | --- test/rbkt/Queries/zorba/string/Regex/regex_err25.spec 2011-10-13 15:47:39 +0000 | |||
911 | +++ test/rbkt/Queries/zorba/string/Regex/regex_err25.spec 1970-01-01 00:00:00 +0000 | |||
912 | @@ -1,1 +0,0 @@ | |||
913 | 1 | Error: http://www.w3.org/2005/xqt-errors:FORX0002 | ||
914 | 2 | 0 | ||
915 | === removed file 'test/rbkt/Queries/zorba/string/Regex/regex_err7.spec' | |||
916 | --- test/rbkt/Queries/zorba/string/Regex/regex_err7.spec 2011-10-13 15:47:39 +0000 | |||
917 | +++ test/rbkt/Queries/zorba/string/Regex/regex_err7.spec 1970-01-01 00:00:00 +0000 | |||
918 | @@ -1,1 +0,0 @@ | |||
919 | 1 | Error: http://www.w3.org/2005/xqt-errors:FORX0002 | ||
920 | 2 | 0 | ||
921 | === renamed file 'test/rbkt/Queries/zorba/string/Regex/regex_err7.xq' => 'test/rbkt/Queries/zorba/string/Regex/regex_m54.xq' | |||
922 | === renamed file 'test/rbkt/Queries/zorba/string/Regex/regex_err25.xq' => 'test/rbkt/Queries/zorba/string/Regex/regex_m55.xq' |
Validation queue starting for merge proposal. zorbatest. lambda. nu:8080/ remotequeue/ bug-1123161- 2013-02- 15T17-50- 43.223Z/ log.html
Log at: http://