/[pcre]/code/trunk/pcre_byte_order.c
ViewVC logotype

Contents of /code/trunk/pcre_byte_order.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1313 - (hide annotations) (download)
Wed Apr 24 12:07:09 2013 UTC (4 weeks, 2 days ago) by ph10
File MIME type: text/plain
File size: 9161 byte(s)
Code (but not yet documentation) for *LIMIT_MATCH and *LIMIT_RECURSION.

1 nigel 77 /*************************************************
2     * Perl-Compatible Regular Expressions *
3     *************************************************/
4    
5     /* PCRE is a library of functions to support regular expressions whose syntax
6     and semantics are as close as possible to those of the Perl 5 language.
7    
8     Written by Philip Hazel
9 ph10 1313 Copyright (c) 1997-2013 University of Cambridge
10 nigel 77
11     -----------------------------------------------------------------------------
12     Redistribution and use in source and binary forms, with or without
13     modification, are permitted provided that the following conditions are met:
14    
15     * Redistributions of source code must retain the above copyright notice,
16     this list of conditions and the following disclaimer.
17    
18     * Redistributions in binary form must reproduce the above copyright
19     notice, this list of conditions and the following disclaimer in the
20     documentation and/or other materials provided with the distribution.
21    
22     * Neither the name of the University of Cambridge nor the names of its
23     contributors may be used to endorse or promote products derived from
24     this software without specific prior written permission.
25    
26     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29     ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30     LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36     POSSIBILITY OF SUCH DAMAGE.
37     -----------------------------------------------------------------------------
38     */
39    
40    
41     /* This module contains an internal function that tests a compiled pattern to
42     see if it was compiled with the opposite endianness. If so, it uses an
43     auxiliary local function to flip the appropriate bytes. */
44    
45    
46 ph10 200 #ifdef HAVE_CONFIG_H
47 ph10 236 #include "config.h"
48 ph10 200 #endif
49 ph10 199
50 nigel 77 #include "pcre_internal.h"
51    
52    
53     /*************************************************
54 zherczeg 809 * Swap byte functions *
55 nigel 77 *************************************************/
56    
57 zherczeg 809 /* The following functions swap the bytes of a pcre_uint16
58     and pcre_uint32 value.
59 nigel 77
60     Arguments:
61 zherczeg 809 value any number
62 nigel 77
63 zherczeg 809 Returns: the byte swapped value
64 nigel 77 */
65    
66 zherczeg 809 static pcre_uint32
67     swap_uint32(pcre_uint32 value)
68 nigel 77 {
69     return ((value & 0x000000ff) << 24) |
70     ((value & 0x0000ff00) << 8) |
71     ((value & 0x00ff0000) >> 8) |
72 zherczeg 809 (value >> 24);
73 nigel 77 }
74    
75 zherczeg 809 static pcre_uint16
76     swap_uint16(pcre_uint16 value)
77     {
78     return (value >> 8) | (value << 8);
79     }
80 nigel 77
81    
82     /*************************************************
83     * Test for a byte-flipped compiled regex *
84     *************************************************/
85    
86 zherczeg 809 /* This function swaps the bytes of a compiled pattern usually
87 zherczeg 811 loaded form the disk. It also sets the tables pointer, which
88 zherczeg 809 is likely an invalid pointer after reload.
89 nigel 77
90     Arguments:
91 zherczeg 809 argument_re points to the compiled expression
92     extra_data points to extra data or is NULL
93     tables points to the character tables or NULL
94 nigel 77
95 zherczeg 809 Returns: 0 if the swap is successful, negative on error
96 nigel 77 */
97    
98 chpe 1055 #if defined COMPILE_PCRE8
99 zherczeg 809 PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *argument_re,
100     pcre_extra *extra_data, const unsigned char *tables)
101 chpe 1055 #elif defined COMPILE_PCRE16
102 zherczeg 852 PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *argument_re,
103 zherczeg 850 pcre16_extra *extra_data, const unsigned char *tables)
104 chpe 1055 #elif defined COMPILE_PCRE32
105     PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *argument_re,
106     pcre32_extra *extra_data, const unsigned char *tables)
107 zherczeg 809 #endif
108 nigel 77 {
109 zherczeg 852 REAL_PCRE *re = (REAL_PCRE *)argument_re;
110 zherczeg 809 pcre_study_data *study;
111     #ifndef COMPILE_PCRE8
112     pcre_uchar *ptr;
113     int length;
114 chpe 1055 #if defined SUPPORT_UTF && defined COMPILE_PCRE16
115 zherczeg 809 BOOL utf;
116     BOOL utf16_char;
117 chpe 1055 #endif /* SUPPORT_UTF && COMPILE_PCRE16 */
118 zherczeg 809 #endif /* !COMPILE_PCRE8 */
119 nigel 77
120 zherczeg 809 if (re == NULL) return PCRE_ERROR_NULL;
121     if (re->magic_number == MAGIC_NUMBER)
122     {
123     if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
124     re->tables = tables;
125     return 0;
126     }
127 nigel 77
128 zherczeg 809 if (re->magic_number != REVERSED_MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
129 ph10 1313 if ((swap_uint32(re->flags) & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
130 zherczeg 809
131     re->magic_number = MAGIC_NUMBER;
132     re->size = swap_uint32(re->size);
133     re->options = swap_uint32(re->options);
134 ph10 1313 re->flags = swap_uint32(re->flags);
135     re->limit_match = swap_uint32(re->limit_match);
136     re->limit_recursion = swap_uint32(re->limit_recursion);
137    
138 chpe 1055 #if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
139 zherczeg 809 re->first_char = swap_uint16(re->first_char);
140     re->req_char = swap_uint16(re->req_char);
141 chpe 1055 #elif defined COMPILE_PCRE32
142     re->first_char = swap_uint32(re->first_char);
143     re->req_char = swap_uint32(re->req_char);
144     #endif
145 ph10 1313
146     re->max_lookbehind = swap_uint16(re->max_lookbehind);
147     re->top_bracket = swap_uint16(re->top_bracket);
148     re->top_backref = swap_uint16(re->top_backref);
149 zherczeg 809 re->name_table_offset = swap_uint16(re->name_table_offset);
150     re->name_entry_size = swap_uint16(re->name_entry_size);
151     re->name_count = swap_uint16(re->name_count);
152     re->ref_count = swap_uint16(re->ref_count);
153 zherczeg 811 re->tables = tables;
154 zherczeg 809
155 zherczeg 839 if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
156 nigel 77 {
157 zherczeg 809 study = (pcre_study_data *)extra_data->study_data;
158     study->size = swap_uint32(study->size);
159     study->flags = swap_uint32(study->flags);
160     study->minlength = swap_uint32(study->minlength);
161 nigel 77 }
162    
163 zherczeg 809 #ifndef COMPILE_PCRE8
164     ptr = (pcre_uchar *)re + re->name_table_offset;
165     length = re->name_count * re->name_entry_size;
166 chpe 1055 #if defined SUPPORT_UTF && defined COMPILE_PCRE16
167 zherczeg 809 utf = (re->options & PCRE_UTF16) != 0;
168     utf16_char = FALSE;
169 chpe 1055 #endif /* SUPPORT_UTF && COMPILE_PCRE16 */
170 zherczeg 809
171     while(TRUE)
172     {
173     /* Swap previous characters. */
174     while (length-- > 0)
175     {
176 chpe 1055 #if defined COMPILE_PCRE16
177 zherczeg 809 *ptr = swap_uint16(*ptr);
178 chpe 1055 #elif defined COMPILE_PCRE32
179     *ptr = swap_uint32(*ptr);
180     #endif
181 zherczeg 809 ptr++;
182     }
183 chpe 1055 #if defined SUPPORT_UTF && defined COMPILE_PCRE16
184 zherczeg 809 if (utf16_char)
185     {
186     if (HAS_EXTRALEN(ptr[-1]))
187     {
188     /* We know that there is only one extra character in UTF-16. */
189     *ptr = swap_uint16(*ptr);
190     ptr++;
191     }
192     }
193     utf16_char = FALSE;
194     #endif /* SUPPORT_UTF */
195    
196     /* Get next opcode. */
197     length = 0;
198 chpe 1055 #if defined COMPILE_PCRE16
199 zherczeg 809 *ptr = swap_uint16(*ptr);
200 chpe 1055 #elif defined COMPILE_PCRE32
201     *ptr = swap_uint32(*ptr);
202     #endif
203 zherczeg 809 switch (*ptr)
204     {
205     case OP_END:
206     return 0;
207    
208 chpe 1055 #if defined SUPPORT_UTF && defined COMPILE_PCRE16
209 zherczeg 809 case OP_CHAR:
210     case OP_CHARI:
211     case OP_NOT:
212     case OP_NOTI:
213     case OP_STAR:
214     case OP_MINSTAR:
215     case OP_PLUS:
216     case OP_MINPLUS:
217     case OP_QUERY:
218     case OP_MINQUERY:
219     case OP_UPTO:
220     case OP_MINUPTO:
221     case OP_EXACT:
222     case OP_POSSTAR:
223     case OP_POSPLUS:
224     case OP_POSQUERY:
225     case OP_POSUPTO:
226     case OP_STARI:
227     case OP_MINSTARI:
228     case OP_PLUSI:
229     case OP_MINPLUSI:
230     case OP_QUERYI:
231     case OP_MINQUERYI:
232     case OP_UPTOI:
233     case OP_MINUPTOI:
234     case OP_EXACTI:
235     case OP_POSSTARI:
236     case OP_POSPLUSI:
237     case OP_POSQUERYI:
238     case OP_POSUPTOI:
239     case OP_NOTSTAR:
240     case OP_NOTMINSTAR:
241     case OP_NOTPLUS:
242     case OP_NOTMINPLUS:
243     case OP_NOTQUERY:
244     case OP_NOTMINQUERY:
245     case OP_NOTUPTO:
246     case OP_NOTMINUPTO:
247     case OP_NOTEXACT:
248     case OP_NOTPOSSTAR:
249     case OP_NOTPOSPLUS:
250     case OP_NOTPOSQUERY:
251     case OP_NOTPOSUPTO:
252     case OP_NOTSTARI:
253     case OP_NOTMINSTARI:
254     case OP_NOTPLUSI:
255     case OP_NOTMINPLUSI:
256     case OP_NOTQUERYI:
257     case OP_NOTMINQUERYI:
258     case OP_NOTUPTOI:
259     case OP_NOTMINUPTOI:
260     case OP_NOTEXACTI:
261     case OP_NOTPOSSTARI:
262     case OP_NOTPOSPLUSI:
263     case OP_NOTPOSQUERYI:
264     case OP_NOTPOSUPTOI:
265 ph10 813 if (utf) utf16_char = TRUE;
266 zherczeg 816 #endif
267     /* Fall through. */
268    
269     default:
270 zherczeg 809 length = PRIV(OP_lengths)[*ptr] - 1;
271     break;
272    
273     case OP_CLASS:
274     case OP_NCLASS:
275     /* Skip the character bit map. */
276     ptr += 32/sizeof(pcre_uchar);
277     length = 0;
278     break;
279    
280     case OP_XCLASS:
281     /* Reverse the size of the XCLASS instance. */
282     ptr++;
283 chpe 1055 #if defined COMPILE_PCRE16
284 zherczeg 809 *ptr = swap_uint16(*ptr);
285 chpe 1055 #elif defined COMPILE_PCRE32
286     *ptr = swap_uint32(*ptr);
287     #endif
288     #ifndef COMPILE_PCRE32
289 zherczeg 809 if (LINK_SIZE > 1)
290     {
291     /* LINK_SIZE can be 1 or 2 in 16 bit mode. */
292     ptr++;
293     *ptr = swap_uint16(*ptr);
294     }
295 chpe 1055 #endif
296 zherczeg 809 ptr++;
297     length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1);
298 chpe 1055 #if defined COMPILE_PCRE16
299 zherczeg 809 *ptr = swap_uint16(*ptr);
300 chpe 1055 #elif defined COMPILE_PCRE32
301     *ptr = swap_uint32(*ptr);
302     #endif
303 zherczeg 809 if ((*ptr & XCL_MAP) != 0)
304     {
305     /* Skip the character bit map. */
306     ptr += 32/sizeof(pcre_uchar);
307     length -= 32/sizeof(pcre_uchar);
308     }
309     break;
310     }
311     ptr++;
312     }
313 chpe 1055 /* Control should never reach here in 16/32 bit mode. */
314 zherczeg 809 #endif /* !COMPILE_PCRE8 */
315    
316     return 0;
317 nigel 77 }
318    
319 zherczeg 809 /* End of pcre_byte_order.c */

Properties

Name Value
svn:eol-style native
svn:keywords "Author Date Id Revision Url"

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12