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>