Annotation of embedaddon/pcre/pcre_fullinfo.c, revision 1.1.1.2
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
1.1.1.2 ! misho 9: Copyright (c) 1997-2012 University of Cambridge
1.1 misho 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:
1.1.1.2 ! misho 68: #ifdef COMPILE_PCRE8
1.1 misho 69: PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
1.1.1.2 ! misho 70: pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data,
! 71: int what, void *where)
! 72: #else
! 73: PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
! 74: pcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data,
! 75: int what, void *where)
! 76: #endif
1.1 misho 77: {
1.1.1.2 ! misho 78: const REAL_PCRE *re = (const REAL_PCRE *)argument_re;
1.1 misho 79: const pcre_study_data *study = NULL;
80:
81: if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
82:
83: if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
84: study = (const pcre_study_data *)extra_data->study_data;
85:
1.1.1.2 ! misho 86: /* Check that the first field in the block is the magic number. If it is not,
! 87: return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
! 88: REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
! 89: means that the pattern is likely compiled with different endianness. */
! 90:
1.1 misho 91: if (re->magic_number != MAGIC_NUMBER)
1.1.1.2 ! misho 92: return re->magic_number == REVERSED_MAGIC_NUMBER?
! 93: PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
! 94:
! 95: /* Check that this pattern was compiled in the correct bit mode */
! 96:
! 97: if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
1.1 misho 98:
99: switch (what)
100: {
101: case PCRE_INFO_OPTIONS:
102: *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_OPTIONS;
103: break;
104:
105: case PCRE_INFO_SIZE:
106: *((size_t *)where) = re->size;
107: break;
108:
109: case PCRE_INFO_STUDYSIZE:
110: *((size_t *)where) = (study == NULL)? 0 : study->size;
111: break;
112:
113: case PCRE_INFO_JITSIZE:
114: #ifdef SUPPORT_JIT
115: *((size_t *)where) =
116: (extra_data != NULL &&
117: (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
118: extra_data->executable_jit != NULL)?
1.1.1.2 ! misho 119: PRIV(jit_get_size)(extra_data->executable_jit) : 0;
1.1 misho 120: #else
121: *((size_t *)where) = 0;
122: #endif
123: break;
124:
125: case PCRE_INFO_CAPTURECOUNT:
126: *((int *)where) = re->top_bracket;
127: break;
128:
129: case PCRE_INFO_BACKREFMAX:
130: *((int *)where) = re->top_backref;
131: break;
132:
133: case PCRE_INFO_FIRSTBYTE:
134: *((int *)where) =
1.1.1.2 ! misho 135: ((re->flags & PCRE_FIRSTSET) != 0)? re->first_char :
1.1 misho 136: ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;
137: break;
138:
139: /* Make sure we pass back the pointer to the bit vector in the external
140: block, not the internal copy (with flipped integer fields). */
141:
142: case PCRE_INFO_FIRSTTABLE:
1.1.1.2 ! misho 143: *((const pcre_uint8 **)where) =
1.1 misho 144: (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)?
145: ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
146: break;
147:
148: case PCRE_INFO_MINLENGTH:
149: *((int *)where) =
150: (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)?
1.1.1.2 ! misho 151: (int)(study->minlength) : -1;
1.1 misho 152: break;
153:
154: case PCRE_INFO_JIT:
155: *((int *)where) = extra_data != NULL &&
156: (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
157: extra_data->executable_jit != NULL;
158: break;
159:
160: case PCRE_INFO_LASTLITERAL:
161: *((int *)where) =
1.1.1.2 ! misho 162: ((re->flags & PCRE_REQCHSET) != 0)? re->req_char : -1;
1.1 misho 163: break;
164:
165: case PCRE_INFO_NAMEENTRYSIZE:
166: *((int *)where) = re->name_entry_size;
167: break;
168:
169: case PCRE_INFO_NAMECOUNT:
170: *((int *)where) = re->name_count;
171: break;
172:
173: case PCRE_INFO_NAMETABLE:
1.1.1.2 ! misho 174: *((const pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset;
1.1 misho 175: break;
176:
177: case PCRE_INFO_DEFAULT_TABLES:
1.1.1.2 ! misho 178: *((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables));
1.1 misho 179: break;
180:
181: /* From release 8.00 this will always return TRUE because NOPARTIAL is
182: no longer ever set (the restrictions have been removed). */
183:
184: case PCRE_INFO_OKPARTIAL:
185: *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;
186: break;
187:
188: case PCRE_INFO_JCHANGED:
189: *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;
190: break;
191:
192: case PCRE_INFO_HASCRORLF:
193: *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;
194: break;
195:
196: default: return PCRE_ERROR_BADOPTION;
197: }
198:
199: return 0;
200: }
201:
202: /* End of pcre_fullinfo.c */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>