/[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 809 - (hide annotations) (download)
Mon Dec 19 11:04:45 2011 UTC (2 years, 3 months ago) by zherczeg
Original Path: code/branches/pcre16/pcre_byte_order.c
File MIME type: text/plain
File size: 8019 byte(s)
fixing existing and adding new byte-order related functions
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 455 Copyright (c) 1997-2009 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     loaeded form the disk. It also sets the tables pointer, which
88     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 zherczeg 809 #ifdef COMPILE_PCRE8
99     PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *argument_re,
100     pcre_extra *extra_data, const unsigned char *tables)
101     #else
102     PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre *argument_re,
103     pcre_extra *extra_data, const unsigned char *tables)
104     #endif
105 nigel 77 {
106 zherczeg 809 real_pcre *re = (real_pcre *)argument_re;
107     pcre_study_data *study;
108     #ifndef COMPILE_PCRE8
109     pcre_uchar *ptr;
110     int length;
111     #ifdef SUPPORT_UTF
112     BOOL utf;
113     BOOL utf16_char;
114     #endif /* SUPPORT_UTF */
115     #endif /* !COMPILE_PCRE8 */
116 nigel 77
117 zherczeg 809 if (re == NULL) return PCRE_ERROR_NULL;
118     if (re->magic_number == MAGIC_NUMBER)
119     {
120     if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
121     re->tables = tables;
122     return 0;
123     }
124 nigel 77
125 zherczeg 809 if (re->magic_number != REVERSED_MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
126     if ((swap_uint16(re->flags) & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
127    
128     re->magic_number = MAGIC_NUMBER;
129     re->size = swap_uint32(re->size);
130     re->options = swap_uint32(re->options);
131     re->flags = swap_uint16(re->flags);
132     re->top_bracket = swap_uint16(re->top_bracket);
133     re->top_backref = swap_uint16(re->top_backref);
134     re->first_char = swap_uint16(re->first_char);
135     re->req_char = swap_uint16(re->req_char);
136     re->name_table_offset = swap_uint16(re->name_table_offset);
137     re->name_entry_size = swap_uint16(re->name_entry_size);
138     re->name_count = swap_uint16(re->name_count);
139     re->ref_count = swap_uint16(re->ref_count);
140    
141     if (extra_data != NULL && (re->flags & PCRE_EXTRA_STUDY_DATA) != 0)
142 nigel 77 {
143 zherczeg 809 study = (pcre_study_data *)extra_data->study_data;
144     study->size = swap_uint32(study->size);
145     study->flags = swap_uint32(study->flags);
146     study->minlength = swap_uint32(study->minlength);
147 nigel 77 }
148    
149 zherczeg 809 #ifndef COMPILE_PCRE8
150     ptr = (pcre_uchar *)re + re->name_table_offset;
151     length = re->name_count * re->name_entry_size;
152     #ifdef SUPPORT_UTF
153     utf = (re->options & PCRE_UTF16) != 0;
154     utf16_char = FALSE;
155     #endif
156    
157     while(TRUE)
158     {
159     /* Swap previous characters. */
160     while (length-- > 0)
161     {
162     *ptr = swap_uint16(*ptr);
163     ptr++;
164     }
165     #ifdef SUPPORT_UTF
166     if (utf16_char)
167     {
168     if (HAS_EXTRALEN(ptr[-1]))
169     {
170     /* We know that there is only one extra character in UTF-16. */
171     *ptr = swap_uint16(*ptr);
172     ptr++;
173     }
174     }
175     utf16_char = FALSE;
176     #endif /* SUPPORT_UTF */
177    
178     /* Get next opcode. */
179     length = 0;
180     *ptr = swap_uint16(*ptr);
181     switch (*ptr)
182     {
183     case OP_END:
184     return 0;
185    
186     case OP_CHAR:
187     case OP_CHARI:
188     case OP_NOT:
189     case OP_NOTI:
190     case OP_STAR:
191     case OP_MINSTAR:
192     case OP_PLUS:
193     case OP_MINPLUS:
194     case OP_QUERY:
195     case OP_MINQUERY:
196     case OP_UPTO:
197     case OP_MINUPTO:
198     case OP_EXACT:
199     case OP_POSSTAR:
200     case OP_POSPLUS:
201     case OP_POSQUERY:
202     case OP_POSUPTO:
203     case OP_STARI:
204     case OP_MINSTARI:
205     case OP_PLUSI:
206     case OP_MINPLUSI:
207     case OP_QUERYI:
208     case OP_MINQUERYI:
209     case OP_UPTOI:
210     case OP_MINUPTOI:
211     case OP_EXACTI:
212     case OP_POSSTARI:
213     case OP_POSPLUSI:
214     case OP_POSQUERYI:
215     case OP_POSUPTOI:
216     case OP_NOTSTAR:
217     case OP_NOTMINSTAR:
218     case OP_NOTPLUS:
219     case OP_NOTMINPLUS:
220     case OP_NOTQUERY:
221     case OP_NOTMINQUERY:
222     case OP_NOTUPTO:
223     case OP_NOTMINUPTO:
224     case OP_NOTEXACT:
225     case OP_NOTPOSSTAR:
226     case OP_NOTPOSPLUS:
227     case OP_NOTPOSQUERY:
228     case OP_NOTPOSUPTO:
229     case OP_NOTSTARI:
230     case OP_NOTMINSTARI:
231     case OP_NOTPLUSI:
232     case OP_NOTMINPLUSI:
233     case OP_NOTQUERYI:
234     case OP_NOTMINQUERYI:
235     case OP_NOTUPTOI:
236     case OP_NOTMINUPTOI:
237     case OP_NOTEXACTI:
238     case OP_NOTPOSSTARI:
239     case OP_NOTPOSPLUSI:
240     case OP_NOTPOSQUERYI:
241     case OP_NOTPOSUPTOI:
242     utf16_char = TRUE;
243     length = PRIV(OP_lengths)[*ptr] - 1;
244     break;
245    
246     case OP_CLASS:
247     case OP_NCLASS:
248     /* Skip the character bit map. */
249     ptr += 32/sizeof(pcre_uchar);
250     length = 0;
251     break;
252    
253     case OP_XCLASS:
254     /* Reverse the size of the XCLASS instance. */
255     ptr++;
256     *ptr = swap_uint16(*ptr);
257     if (LINK_SIZE > 1)
258     {
259     /* LINK_SIZE can be 1 or 2 in 16 bit mode. */
260     ptr++;
261     *ptr = swap_uint16(*ptr);
262     }
263     ptr++;
264     length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1);
265     *ptr = swap_uint16(*ptr);
266     if ((*ptr & XCL_MAP) != 0)
267     {
268     /* Skip the character bit map. */
269     ptr += 32/sizeof(pcre_uchar);
270     length -= 32/sizeof(pcre_uchar);
271     }
272     break;
273    
274     default:
275     length = PRIV(OP_lengths)[*ptr] - 1;
276     break;
277     }
278     ptr++;
279     }
280     /* Control should never reach here in 16 bit mode. */
281     #endif /* !COMPILE_PCRE8 */
282    
283     return 0;
284 nigel 77 }
285    
286 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