tools/pcre/pcre_try_flipped.c
author Nicholas Hastings <skamonkey@gmail.com>
Sun Jul 15 12:31:06 2012 -0400 (2012-07-15)
changeset 3579 6d730190a3e4
parent 2762 d2d467bf1b5a
permissions -rw-r--r--
Added missing files to each core and logic makefiles (NPOTB).
dvander@2762
     1
/*************************************************
dvander@2762
     2
*      Perl-Compatible Regular Expressions       *
dvander@2762
     3
*************************************************/
dvander@2762
     4
dvander@2762
     5
/* PCRE is a library of functions to support regular expressions whose syntax
dvander@2762
     6
and semantics are as close as possible to those of the Perl 5 language.
dvander@2762
     7
dvander@2762
     8
                       Written by Philip Hazel
dvander@2762
     9
           Copyright (c) 1997-2008 University of Cambridge
dvander@2762
    10
dvander@2762
    11
-----------------------------------------------------------------------------
dvander@2762
    12
Redistribution and use in source and binary forms, with or without
dvander@2762
    13
modification, are permitted provided that the following conditions are met:
dvander@2762
    14
dvander@2762
    15
    * Redistributions of source code must retain the above copyright notice,
dvander@2762
    16
      this list of conditions and the following disclaimer.
dvander@2762
    17
dvander@2762
    18
    * Redistributions in binary form must reproduce the above copyright
dvander@2762
    19
      notice, this list of conditions and the following disclaimer in the
dvander@2762
    20
      documentation and/or other materials provided with the distribution.
dvander@2762
    21
dvander@2762
    22
    * Neither the name of the University of Cambridge nor the names of its
dvander@2762
    23
      contributors may be used to endorse or promote products derived from
dvander@2762
    24
      this software without specific prior written permission.
dvander@2762
    25
dvander@2762
    26
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
dvander@2762
    27
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
dvander@2762
    28
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
dvander@2762
    29
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
dvander@2762
    30
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dvander@2762
    31
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
dvander@2762
    32
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
dvander@2762
    33
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
dvander@2762
    34
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
dvander@2762
    35
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
dvander@2762
    36
POSSIBILITY OF SUCH DAMAGE.
dvander@2762
    37
-----------------------------------------------------------------------------
dvander@2762
    38
*/
dvander@2762
    39
dvander@2762
    40
dvander@2762
    41
/* This module contains an internal function that tests a compiled pattern to
dvander@2762
    42
see if it was compiled with the opposite endianness. If so, it uses an
dvander@2762
    43
auxiliary local function to flip the appropriate bytes. */
dvander@2762
    44
dvander@2762
    45
dvander@2762
    46
#ifdef HAVE_CONFIG_H
dvander@2762
    47
#include "config.h"
dvander@2762
    48
#endif
dvander@2762
    49
dvander@2762
    50
#include "pcre_internal.h"
dvander@2762
    51
dvander@2762
    52
dvander@2762
    53
/*************************************************
dvander@2762
    54
*         Flip bytes in an integer               *
dvander@2762
    55
*************************************************/
dvander@2762
    56
dvander@2762
    57
/* This function is called when the magic number in a regex doesn't match, in
dvander@2762
    58
order to flip its bytes to see if we are dealing with a pattern that was
dvander@2762
    59
compiled on a host of different endianness. If so, this function is used to
dvander@2762
    60
flip other byte values.
dvander@2762
    61
dvander@2762
    62
Arguments:
dvander@2762
    63
  value        the number to flip
dvander@2762
    64
  n            the number of bytes to flip (assumed to be 2 or 4)
dvander@2762
    65
dvander@2762
    66
Returns:       the flipped value
dvander@2762
    67
*/
dvander@2762
    68
dvander@2762
    69
static unsigned long int
dvander@2762
    70
byteflip(unsigned long int value, int n)
dvander@2762
    71
{
dvander@2762
    72
if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8);
dvander@2762
    73
return ((value & 0x000000ff) << 24) |
dvander@2762
    74
       ((value & 0x0000ff00) <<  8) |
dvander@2762
    75
       ((value & 0x00ff0000) >>  8) |
dvander@2762
    76
       ((value & 0xff000000) >> 24);
dvander@2762
    77
}
dvander@2762
    78
dvander@2762
    79
dvander@2762
    80
dvander@2762
    81
/*************************************************
dvander@2762
    82
*       Test for a byte-flipped compiled regex   *
dvander@2762
    83
*************************************************/
dvander@2762
    84
dvander@2762
    85
/* This function is called from pcre_exec(), pcre_dfa_exec(), and also from
dvander@2762
    86
pcre_fullinfo(). Its job is to test whether the regex is byte-flipped - that
dvander@2762
    87
is, it was compiled on a system of opposite endianness. The function is called
dvander@2762
    88
only when the native MAGIC_NUMBER test fails. If the regex is indeed flipped,
dvander@2762
    89
we flip all the relevant values into a different data block, and return it.
dvander@2762
    90
dvander@2762
    91
Arguments:
dvander@2762
    92
  re               points to the regex
dvander@2762
    93
  study            points to study data, or NULL
dvander@2762
    94
  internal_re      points to a new regex block
dvander@2762
    95
  internal_study   points to a new study block
dvander@2762
    96
dvander@2762
    97
Returns:           the new block if is is indeed a byte-flipped regex
dvander@2762
    98
                   NULL if it is not
dvander@2762
    99
*/
dvander@2762
   100
dvander@2762
   101
real_pcre *
dvander@2762
   102
_pcre_try_flipped(const real_pcre *re, real_pcre *internal_re,
dvander@2762
   103
  const pcre_study_data *study, pcre_study_data *internal_study)
dvander@2762
   104
{
dvander@2762
   105
if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER)
dvander@2762
   106
  return NULL;
dvander@2762
   107
dvander@2762
   108
*internal_re = *re;           /* To copy other fields */
dvander@2762
   109
internal_re->size = byteflip(re->size, sizeof(re->size));
dvander@2762
   110
internal_re->options = byteflip(re->options, sizeof(re->options));
dvander@2762
   111
internal_re->flags = (pcre_uint16)byteflip(re->flags, sizeof(re->flags));
dvander@2762
   112
internal_re->top_bracket =
dvander@2762
   113
  (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket));
dvander@2762
   114
internal_re->top_backref =
dvander@2762
   115
  (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref));
dvander@2762
   116
internal_re->first_byte =
dvander@2762
   117
  (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte));
dvander@2762
   118
internal_re->req_byte =
dvander@2762
   119
  (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte));
dvander@2762
   120
internal_re->name_table_offset =
dvander@2762
   121
  (pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset));
dvander@2762
   122
internal_re->name_entry_size =
dvander@2762
   123
  (pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size));
dvander@2762
   124
internal_re->name_count =
dvander@2762
   125
  (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count));
dvander@2762
   126
dvander@2762
   127
if (study != NULL)
dvander@2762
   128
  {
dvander@2762
   129
  *internal_study = *study;   /* To copy other fields */
dvander@2762
   130
  internal_study->size = byteflip(study->size, sizeof(study->size));
dvander@2762
   131
  internal_study->options = byteflip(study->options, sizeof(study->options));
dvander@2762
   132
  }
dvander@2762
   133
dvander@2762
   134
return internal_re;
dvander@2762
   135
}
dvander@2762
   136
dvander@2762
   137
/* End of pcre_tryflipped.c */