Annotation of embedaddon/pcre/pcre_byte_order.c, revision 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>