Annotation of embedaddon/pcre/pcre_fullinfo.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-2011 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 the external function pcre_fullinfo(), which returns
        !            42: information about a compiled pattern. */
        !            43: 
        !            44: 
        !            45: #ifdef HAVE_CONFIG_H
        !            46: #include "config.h"
        !            47: #endif
        !            48: 
        !            49: #include "pcre_internal.h"
        !            50: 
        !            51: 
        !            52: /*************************************************
        !            53: *        Return info about compiled pattern      *
        !            54: *************************************************/
        !            55: 
        !            56: /* This is a newer "info" function which has an extensible interface so
        !            57: that additional items can be added compatibly.
        !            58: 
        !            59: Arguments:
        !            60:   argument_re      points to compiled code
        !            61:   extra_data       points extra data, or NULL
        !            62:   what             what information is required
        !            63:   where            where to put the information
        !            64: 
        !            65: Returns:           0 if data returned, negative on error
        !            66: */
        !            67: 
        !            68: PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
        !            69: pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what,
        !            70:   void *where)
        !            71: {
        !            72: real_pcre internal_re;
        !            73: pcre_study_data internal_study;
        !            74: const real_pcre *re = (const real_pcre *)argument_re;
        !            75: const pcre_study_data *study = NULL;
        !            76: 
        !            77: if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
        !            78: 
        !            79: if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
        !            80:   study = (const pcre_study_data *)extra_data->study_data;
        !            81: 
        !            82: if (re->magic_number != MAGIC_NUMBER)
        !            83:   {
        !            84:   re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
        !            85:   if (re == NULL) return PCRE_ERROR_BADMAGIC;
        !            86:   if (study != NULL) study = &internal_study;
        !            87:   }
        !            88: 
        !            89: switch (what)
        !            90:   {
        !            91:   case PCRE_INFO_OPTIONS:
        !            92:   *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_OPTIONS;
        !            93:   break;
        !            94: 
        !            95:   case PCRE_INFO_SIZE:
        !            96:   *((size_t *)where) = re->size;
        !            97:   break;
        !            98: 
        !            99:   case PCRE_INFO_STUDYSIZE:
        !           100:   *((size_t *)where) = (study == NULL)? 0 : study->size;
        !           101:   break;
        !           102: 
        !           103:   case PCRE_INFO_JITSIZE:
        !           104: #ifdef SUPPORT_JIT
        !           105:   *((size_t *)where) =
        !           106:       (extra_data != NULL &&
        !           107:       (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
        !           108:       extra_data->executable_jit != NULL)?
        !           109:     _pcre_jit_get_size(extra_data->executable_jit) : 0;
        !           110: #else
        !           111:   *((size_t *)where) = 0;
        !           112: #endif
        !           113: 
        !           114:   break;
        !           115: 
        !           116:   case PCRE_INFO_CAPTURECOUNT:
        !           117:   *((int *)where) = re->top_bracket;
        !           118:   break;
        !           119: 
        !           120:   case PCRE_INFO_BACKREFMAX:
        !           121:   *((int *)where) = re->top_backref;
        !           122:   break;
        !           123: 
        !           124:   case PCRE_INFO_FIRSTBYTE:
        !           125:   *((int *)where) =
        !           126:     ((re->flags & PCRE_FIRSTSET) != 0)? re->first_byte :
        !           127:     ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;
        !           128:   break;
        !           129: 
        !           130:   /* Make sure we pass back the pointer to the bit vector in the external
        !           131:   block, not the internal copy (with flipped integer fields). */
        !           132: 
        !           133:   case PCRE_INFO_FIRSTTABLE:
        !           134:   *((const uschar **)where) =
        !           135:     (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)?
        !           136:       ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
        !           137:   break;
        !           138: 
        !           139:   case PCRE_INFO_MINLENGTH:
        !           140:   *((int *)where) =
        !           141:     (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)?
        !           142:       study->minlength : -1;
        !           143:   break;
        !           144: 
        !           145:   case PCRE_INFO_JIT:
        !           146:   *((int *)where) = extra_data != NULL &&
        !           147:                     (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
        !           148:                     extra_data->executable_jit != NULL;
        !           149:   break;
        !           150: 
        !           151:   case PCRE_INFO_LASTLITERAL:
        !           152:   *((int *)where) =
        !           153:     ((re->flags & PCRE_REQCHSET) != 0)? re->req_byte : -1;
        !           154:   break;
        !           155: 
        !           156:   case PCRE_INFO_NAMEENTRYSIZE:
        !           157:   *((int *)where) = re->name_entry_size;
        !           158:   break;
        !           159: 
        !           160:   case PCRE_INFO_NAMECOUNT:
        !           161:   *((int *)where) = re->name_count;
        !           162:   break;
        !           163: 
        !           164:   case PCRE_INFO_NAMETABLE:
        !           165:   *((const uschar **)where) = (const uschar *)re + re->name_table_offset;
        !           166:   break;
        !           167: 
        !           168:   case PCRE_INFO_DEFAULT_TABLES:
        !           169:   *((const uschar **)where) = (const uschar *)(_pcre_default_tables);
        !           170:   break;
        !           171: 
        !           172:   /* From release 8.00 this will always return TRUE because NOPARTIAL is
        !           173:   no longer ever set (the restrictions have been removed). */
        !           174: 
        !           175:   case PCRE_INFO_OKPARTIAL:
        !           176:   *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;
        !           177:   break;
        !           178: 
        !           179:   case PCRE_INFO_JCHANGED:
        !           180:   *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;
        !           181:   break;
        !           182: 
        !           183:   case PCRE_INFO_HASCRORLF:
        !           184:   *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;
        !           185:   break;
        !           186: 
        !           187:   default: return PCRE_ERROR_BADOPTION;
        !           188:   }
        !           189: 
        !           190: return 0;
        !           191: }
        !           192: 
        !           193: /* End of pcre_fullinfo.c */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>