/[pcre]/code/trunk/pcre_fullinfo.c
ViewVC logotype

Contents of /code/trunk/pcre_fullinfo.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1404 - (hide annotations) (download)
Tue Nov 19 15:36:57 2013 UTC (8 months ago) by ph10
File MIME type: text/plain
File size: 7819 byte(s)
Source tidies for 8.34-RC1.

1 nigel 77 /*************************************************
2     * Perl-Compatible Regular Expressions *
3     *************************************************/
4    
5 ph10 305 /* PCRE is a library of functions to support regular expressions whose syntax
6 nigel 77 and semantics are as close as possible to those of the Perl 5 language.
7    
8     Written by Philip Hazel
9 ph10 1313 Copyright (c) 1997-2013 University of Cambridge
10 nigel 77
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 ph10 200 #ifdef HAVE_CONFIG_H
46 ph10 236 #include "config.h"
47 ph10 200 #endif
48 ph10 199
49 nigel 77 #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 chpe 1055 #if defined COMPILE_PCRE8
69 ph10 359 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
70 zherczeg 852 pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data,
71     int what, void *where)
72 chpe 1055 #elif defined COMPILE_PCRE16
73 ph10 836 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
74 zherczeg 852 pcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data,
75     int what, void *where)
76 chpe 1055 #elif defined COMPILE_PCRE32
77     PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
78     pcre32_fullinfo(const pcre32 *argument_re, const pcre32_extra *extra_data,
79     int what, void *where)
80 ph10 836 #endif
81 nigel 77 {
82 zherczeg 852 const REAL_PCRE *re = (const REAL_PCRE *)argument_re;
83 nigel 77 const pcre_study_data *study = NULL;
84    
85     if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
86    
87     if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
88     study = (const pcre_study_data *)extra_data->study_data;
89    
90 ph10 836 /* Check that the first field in the block is the magic number. If it is not,
91     return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
92     REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
93     means that the pattern is likely compiled with different endianness. */
94    
95 nigel 77 if (re->magic_number != MAGIC_NUMBER)
96 ph10 836 return re->magic_number == REVERSED_MAGIC_NUMBER?
97     PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
98 ph10 842
99 ph10 836 /* Check that this pattern was compiled in the correct bit mode */
100 ph10 842
101 ph10 836 if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
102 nigel 77
103     switch (what)
104     {
105     case PCRE_INFO_OPTIONS:
106 ph10 389 *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_OPTIONS;
107 nigel 77 break;
108    
109     case PCRE_INFO_SIZE:
110     *((size_t *)where) = re->size;
111     break;
112    
113     case PCRE_INFO_STUDYSIZE:
114     *((size_t *)where) = (study == NULL)? 0 : study->size;
115     break;
116 ph10 788
117 ph10 836 case PCRE_INFO_JITSIZE:
118     #ifdef SUPPORT_JIT
119     *((size_t *)where) =
120     (extra_data != NULL &&
121     (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
122     extra_data->executable_jit != NULL)?
123     PRIV(jit_get_size)(extra_data->executable_jit) : 0;
124     #else
125     *((size_t *)where) = 0;
126     #endif
127     break;
128    
129 nigel 77 case PCRE_INFO_CAPTURECOUNT:
130     *((int *)where) = re->top_bracket;
131     break;
132    
133     case PCRE_INFO_BACKREFMAX:
134     *((int *)where) = re->top_backref;
135     break;
136    
137     case PCRE_INFO_FIRSTBYTE:
138     *((int *)where) =
139 chpe 1134 ((re->flags & PCRE_FIRSTSET) != 0)? (int)re->first_char :
140 ph10 230 ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;
141 nigel 77 break;
142    
143 chpe 1113 case PCRE_INFO_FIRSTCHARACTER:
144 chpe 1080 *((pcre_uint32 *)where) =
145     (re->flags & PCRE_FIRSTSET) != 0 ? re->first_char : 0;
146     break;
147    
148 chpe 1113 case PCRE_INFO_FIRSTCHARACTERFLAGS:
149 chpe 1080 *((int *)where) =
150     ((re->flags & PCRE_FIRSTSET) != 0) ? 1 :
151     ((re->flags & PCRE_STARTLINE) != 0) ? 2 : 0;
152     break;
153    
154 nigel 77 /* Make sure we pass back the pointer to the bit vector in the external
155     block, not the internal copy (with flipped integer fields). */
156    
157     case PCRE_INFO_FIRSTTABLE:
158 ph10 836 *((const pcre_uint8 **)where) =
159 ph10 455 (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)?
160 nigel 77 ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
161     break;
162 ph10 461
163 ph10 455 case PCRE_INFO_MINLENGTH:
164     *((int *)where) =
165     (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)?
166 ph10 904 (int)(study->minlength) : -1;
167 ph10 461 break;
168 nigel 77
169 ph10 666 case PCRE_INFO_JIT:
170 ph10 691 *((int *)where) = extra_data != NULL &&
171 ph10 666 (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
172     extra_data->executable_jit != NULL;
173     break;
174    
175 nigel 77 case PCRE_INFO_LASTLITERAL:
176     *((int *)where) =
177 chpe 1134 ((re->flags & PCRE_REQCHSET) != 0)? (int)re->req_char : -1;
178 nigel 77 break;
179    
180 chpe 1113 case PCRE_INFO_REQUIREDCHAR:
181 chpe 1080 *((pcre_uint32 *)where) =
182     ((re->flags & PCRE_REQCHSET) != 0) ? re->req_char : 0;
183     break;
184    
185 chpe 1113 case PCRE_INFO_REQUIREDCHARFLAGS:
186 chpe 1080 *((int *)where) =
187     ((re->flags & PCRE_REQCHSET) != 0);
188     break;
189    
190 nigel 77 case PCRE_INFO_NAMEENTRYSIZE:
191     *((int *)where) = re->name_entry_size;
192     break;
193    
194     case PCRE_INFO_NAMECOUNT:
195     *((int *)where) = re->name_count;
196     break;
197    
198     case PCRE_INFO_NAMETABLE:
199 ph10 836 *((const pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset;
200 nigel 77 break;
201    
202     case PCRE_INFO_DEFAULT_TABLES:
203 ph10 836 *((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables));
204 nigel 77 break;
205 ph10 172
206 ph10 426 /* From release 8.00 this will always return TRUE because NOPARTIAL is
207     no longer ever set (the restrictions have been removed). */
208 ph10 461
209 ph10 169 case PCRE_INFO_OKPARTIAL:
210 ph10 230 *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;
211 ph10 169 break;
212 ph10 172
213 ph10 169 case PCRE_INFO_JCHANGED:
214 ph10 230 *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;
215 ph10 172 break;
216 nigel 77
217 ph10 226 case PCRE_INFO_HASCRORLF:
218 ph10 230 *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;
219 ph10 226 break;
220 ph10 975
221     case PCRE_INFO_MAXLOOKBEHIND:
222 ph10 932 *((int *)where) = re->max_lookbehind;
223 ph10 975 break;
224 ph10 1320
225 ph10 1313 case PCRE_INFO_MATCHLIMIT:
226     if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET;
227 ph10 1323 *((pcre_uint32 *)where) = re->limit_match;
228 ph10 1320 break;
229 ph10 226
230 ph10 1313 case PCRE_INFO_RECURSIONLIMIT:
231     if ((re->flags & PCRE_RLSET) == 0) return PCRE_ERROR_UNSET;
232 ph10 1323 *((pcre_uint32 *)where) = re->limit_recursion;
233 ph10 1320 break;
234 ph10 1404
235     case PCRE_INFO_MATCH_EMPTY:
236 ph10 1348 *((int *)where) = (re->flags & PCRE_MATCH_EMPTY) != 0;
237 ph10 1404 break;
238 ph10 1313
239 nigel 77 default: return PCRE_ERROR_BADOPTION;
240     }
241    
242     return 0;
243     }
244    
245     /* End of pcre_fullinfo.c */

Properties

Name Value
svn:eol-style native
svn:keywords "Author Date Id Revision Url"

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12