tools/pcre/pcre_fullinfo.c
author David Anderson <dvander@alliedmods.net>
Tue Jul 28 17:51:34 2009 -0400 (2009-07-28)
changeset 2762 d2d467bf1b5a
child 3831 babd0eee3c5e
permissions -rw-r--r--
Check-in of pcre-7.9 source code and win32 static lib (bug 3923).
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-2009 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 the external function pcre_fullinfo(), which returns
dvander@2762
    42
information about a compiled pattern. */
dvander@2762
    43
dvander@2762
    44
dvander@2762
    45
#ifdef HAVE_CONFIG_H
dvander@2762
    46
#include "config.h"
dvander@2762
    47
#endif
dvander@2762
    48
dvander@2762
    49
#include "pcre_internal.h"
dvander@2762
    50
dvander@2762
    51
dvander@2762
    52
/*************************************************
dvander@2762
    53
*        Return info about compiled pattern      *
dvander@2762
    54
*************************************************/
dvander@2762
    55
dvander@2762
    56
/* This is a newer "info" function which has an extensible interface so
dvander@2762
    57
that additional items can be added compatibly.
dvander@2762
    58
dvander@2762
    59
Arguments:
dvander@2762
    60
  argument_re      points to compiled code
dvander@2762
    61
  extra_data       points extra data, or NULL
dvander@2762
    62
  what             what information is required
dvander@2762
    63
  where            where to put the information
dvander@2762
    64
dvander@2762
    65
Returns:           0 if data returned, negative on error
dvander@2762
    66
*/
dvander@2762
    67
dvander@2762
    68
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
dvander@2762
    69
pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what,
dvander@2762
    70
  void *where)
dvander@2762
    71
{
dvander@2762
    72
real_pcre internal_re;
dvander@2762
    73
pcre_study_data internal_study;
dvander@2762
    74
const real_pcre *re = (const real_pcre *)argument_re;
dvander@2762
    75
const pcre_study_data *study = NULL;
dvander@2762
    76
dvander@2762
    77
if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
dvander@2762
    78
dvander@2762
    79
if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
dvander@2762
    80
  study = (const pcre_study_data *)extra_data->study_data;
dvander@2762
    81
dvander@2762
    82
if (re->magic_number != MAGIC_NUMBER)
dvander@2762
    83
  {
dvander@2762
    84
  re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
dvander@2762
    85
  if (re == NULL) return PCRE_ERROR_BADMAGIC;
dvander@2762
    86
  if (study != NULL) study = &internal_study;
dvander@2762
    87
  }
dvander@2762
    88
dvander@2762
    89
switch (what)
dvander@2762
    90
  {
dvander@2762
    91
  case PCRE_INFO_OPTIONS:
dvander@2762
    92
  *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_OPTIONS;
dvander@2762
    93
  break;
dvander@2762
    94
dvander@2762
    95
  case PCRE_INFO_SIZE:
dvander@2762
    96
  *((size_t *)where) = re->size;
dvander@2762
    97
  break;
dvander@2762
    98
dvander@2762
    99
  case PCRE_INFO_STUDYSIZE:
dvander@2762
   100
  *((size_t *)where) = (study == NULL)? 0 : study->size;
dvander@2762
   101
  break;
dvander@2762
   102
dvander@2762
   103
  case PCRE_INFO_CAPTURECOUNT:
dvander@2762
   104
  *((int *)where) = re->top_bracket;
dvander@2762
   105
  break;
dvander@2762
   106
dvander@2762
   107
  case PCRE_INFO_BACKREFMAX:
dvander@2762
   108
  *((int *)where) = re->top_backref;
dvander@2762
   109
  break;
dvander@2762
   110
dvander@2762
   111
  case PCRE_INFO_FIRSTBYTE:
dvander@2762
   112
  *((int *)where) =
dvander@2762
   113
    ((re->flags & PCRE_FIRSTSET) != 0)? re->first_byte :
dvander@2762
   114
    ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;
dvander@2762
   115
  break;
dvander@2762
   116
dvander@2762
   117
  /* Make sure we pass back the pointer to the bit vector in the external
dvander@2762
   118
  block, not the internal copy (with flipped integer fields). */
dvander@2762
   119
dvander@2762
   120
  case PCRE_INFO_FIRSTTABLE:
dvander@2762
   121
  *((const uschar **)where) =
dvander@2762
   122
    (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
dvander@2762
   123
      ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
dvander@2762
   124
  break;
dvander@2762
   125
dvander@2762
   126
  case PCRE_INFO_LASTLITERAL:
dvander@2762
   127
  *((int *)where) =
dvander@2762
   128
    ((re->flags & PCRE_REQCHSET) != 0)? re->req_byte : -1;
dvander@2762
   129
  break;
dvander@2762
   130
dvander@2762
   131
  case PCRE_INFO_NAMEENTRYSIZE:
dvander@2762
   132
  *((int *)where) = re->name_entry_size;
dvander@2762
   133
  break;
dvander@2762
   134
dvander@2762
   135
  case PCRE_INFO_NAMECOUNT:
dvander@2762
   136
  *((int *)where) = re->name_count;
dvander@2762
   137
  break;
dvander@2762
   138
dvander@2762
   139
  case PCRE_INFO_NAMETABLE:
dvander@2762
   140
  *((const uschar **)where) = (const uschar *)re + re->name_table_offset;
dvander@2762
   141
  break;
dvander@2762
   142
dvander@2762
   143
  case PCRE_INFO_DEFAULT_TABLES:
dvander@2762
   144
  *((const uschar **)where) = (const uschar *)(_pcre_default_tables);
dvander@2762
   145
  break;
dvander@2762
   146
dvander@2762
   147
  case PCRE_INFO_OKPARTIAL:
dvander@2762
   148
  *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;
dvander@2762
   149
  break;
dvander@2762
   150
dvander@2762
   151
  case PCRE_INFO_JCHANGED:
dvander@2762
   152
  *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;
dvander@2762
   153
  break;
dvander@2762
   154
dvander@2762
   155
  case PCRE_INFO_HASCRORLF:
dvander@2762
   156
  *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;
dvander@2762
   157
  break;
dvander@2762
   158
dvander@2762
   159
  default: return PCRE_ERROR_BADOPTION;
dvander@2762
   160
  }
dvander@2762
   161
dvander@2762
   162
return 0;
dvander@2762
   163
}
dvander@2762
   164
dvander@2762
   165
/* End of pcre_fullinfo.c */