File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pcre / pcre_byte_order.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:50:25 2012 UTC (12 years, 4 months ago) by misho
Branches: pcre, MAIN
CVS tags: v8_31, v8_30, HEAD
pcre

    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>