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

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