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>