Annotation of embedaddon/pcre/pcre_byte_order.c, revision 1.1.1.1
1.1 misho 1: /*************************************************
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: Copyright (c) 1997-2012 University of Cambridge
10:
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: #ifdef HAVE_CONFIG_H
47: #include "config.h"
48: #endif
49:
50: #include "pcre_internal.h"
51:
52:
53: /*************************************************
54: * Swap byte functions *
55: *************************************************/
56:
57: /* The following functions swap the bytes of a pcre_uint16
58: and pcre_uint32 value.
59:
60: Arguments:
61: value any number
62:
63: Returns: the byte swapped value
64: */
65:
66: static pcre_uint32
67: swap_uint32(pcre_uint32 value)
68: {
69: return ((value & 0x000000ff) << 24) |
70: ((value & 0x0000ff00) << 8) |
71: ((value & 0x00ff0000) >> 8) |
72: (value >> 24);
73: }
74:
75: static pcre_uint16
76: swap_uint16(pcre_uint16 value)
77: {
78: return (value >> 8) | (value << 8);
79: }
80:
81:
82: /*************************************************
83: * Test for a byte-flipped compiled regex *
84: *************************************************/
85:
86: /* This function swaps the bytes of a compiled pattern usually
87: loaded form the disk. It also sets the tables pointer, which
88: is likely an invalid pointer after reload.
89:
90: Arguments:
91: 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:
95: Returns: 0 if the swap is successful, negative on error
96: */
97:
98: #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(pcre16 *argument_re,
103: pcre16_extra *extra_data, const unsigned char *tables)
104: #endif
105: {
106: 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:
117: 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:
125: 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: re->tables = tables;
141:
142: if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
143: {
144: study = (pcre_study_data *)extra_data->study_data;
145: study->size = swap_uint32(study->size);
146: study->flags = swap_uint32(study->flags);
147: study->minlength = swap_uint32(study->minlength);
148: }
149:
150: #ifndef COMPILE_PCRE8
151: ptr = (pcre_uchar *)re + re->name_table_offset;
152: length = re->name_count * re->name_entry_size;
153: #ifdef SUPPORT_UTF
154: utf = (re->options & PCRE_UTF16) != 0;
155: utf16_char = FALSE;
156: #endif
157:
158: while(TRUE)
159: {
160: /* Swap previous characters. */
161: while (length-- > 0)
162: {
163: *ptr = swap_uint16(*ptr);
164: ptr++;
165: }
166: #ifdef SUPPORT_UTF
167: if (utf16_char)
168: {
169: if (HAS_EXTRALEN(ptr[-1]))
170: {
171: /* We know that there is only one extra character in UTF-16. */
172: *ptr = swap_uint16(*ptr);
173: ptr++;
174: }
175: }
176: utf16_char = FALSE;
177: #endif /* SUPPORT_UTF */
178:
179: /* Get next opcode. */
180: length = 0;
181: *ptr = swap_uint16(*ptr);
182: switch (*ptr)
183: {
184: case OP_END:
185: return 0;
186:
187: #ifdef SUPPORT_UTF
188: case OP_CHAR:
189: case OP_CHARI:
190: case OP_NOT:
191: case OP_NOTI:
192: case OP_STAR:
193: case OP_MINSTAR:
194: case OP_PLUS:
195: case OP_MINPLUS:
196: case OP_QUERY:
197: case OP_MINQUERY:
198: case OP_UPTO:
199: case OP_MINUPTO:
200: case OP_EXACT:
201: case OP_POSSTAR:
202: case OP_POSPLUS:
203: case OP_POSQUERY:
204: case OP_POSUPTO:
205: case OP_STARI:
206: case OP_MINSTARI:
207: case OP_PLUSI:
208: case OP_MINPLUSI:
209: case OP_QUERYI:
210: case OP_MINQUERYI:
211: case OP_UPTOI:
212: case OP_MINUPTOI:
213: case OP_EXACTI:
214: case OP_POSSTARI:
215: case OP_POSPLUSI:
216: case OP_POSQUERYI:
217: case OP_POSUPTOI:
218: case OP_NOTSTAR:
219: case OP_NOTMINSTAR:
220: case OP_NOTPLUS:
221: case OP_NOTMINPLUS:
222: case OP_NOTQUERY:
223: case OP_NOTMINQUERY:
224: case OP_NOTUPTO:
225: case OP_NOTMINUPTO:
226: case OP_NOTEXACT:
227: case OP_NOTPOSSTAR:
228: case OP_NOTPOSPLUS:
229: case OP_NOTPOSQUERY:
230: case OP_NOTPOSUPTO:
231: case OP_NOTSTARI:
232: case OP_NOTMINSTARI:
233: case OP_NOTPLUSI:
234: case OP_NOTMINPLUSI:
235: case OP_NOTQUERYI:
236: case OP_NOTMINQUERYI:
237: case OP_NOTUPTOI:
238: case OP_NOTMINUPTOI:
239: case OP_NOTEXACTI:
240: case OP_NOTPOSSTARI:
241: case OP_NOTPOSPLUSI:
242: case OP_NOTPOSQUERYI:
243: case OP_NOTPOSUPTOI:
244: if (utf) utf16_char = TRUE;
245: #endif
246: /* Fall through. */
247:
248: default:
249: length = PRIV(OP_lengths)[*ptr] - 1;
250: break;
251:
252: case OP_CLASS:
253: case OP_NCLASS:
254: /* Skip the character bit map. */
255: ptr += 32/sizeof(pcre_uchar);
256: length = 0;
257: break;
258:
259: case OP_XCLASS:
260: /* Reverse the size of the XCLASS instance. */
261: ptr++;
262: *ptr = swap_uint16(*ptr);
263: if (LINK_SIZE > 1)
264: {
265: /* LINK_SIZE can be 1 or 2 in 16 bit mode. */
266: ptr++;
267: *ptr = swap_uint16(*ptr);
268: }
269: ptr++;
270: length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1);
271: *ptr = swap_uint16(*ptr);
272: if ((*ptr & XCL_MAP) != 0)
273: {
274: /* Skip the character bit map. */
275: ptr += 32/sizeof(pcre_uchar);
276: length -= 32/sizeof(pcre_uchar);
277: }
278: break;
279: }
280: ptr++;
281: }
282: /* Control should never reach here in 16 bit mode. */
283: #endif /* !COMPILE_PCRE8 */
284:
285: return 0;
286: }
287:
288: /* End of pcre_byte_order.c */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>