ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/regcomp.c
Revision: 1.1
Committed: Thu Jun 30 14:26:42 2005 UTC (21 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# Content
1 /* regcomp.c
2 */
3
4 /*
5 * "A fair jaw-cracker dwarf-language must be." --Samwise Gamgee
6 */
7
8 /* This file contains functions for compiling a regular expression. See
9 * also regexec.c which funnily enough, contains functions for executing
10 * a regular expression.
11 *
12 * This file is also copied at build time to ext/re/re_comp.c, where
13 * it's built with -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT.
14 * This causes the main functions to be compiled under new names and with
15 * debugging support added, which makes "use re 'debug'" work.
16 */
17
18 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
19 * confused with the original package (see point 3 below). Thanks, Henry!
20 */
21
22 /* Additional note: this code is very heavily munged from Henry's version
23 * in places. In some spots I've traded clarity for efficiency, so don't
24 * blame Henry for some of the lack of readability.
25 */
26
27 /* The names of the functions have been changed from regcomp and
28 * regexec to pregcomp and pregexec in order to avoid conflicts
29 * with the POSIX routines of the same names.
30 */
31
32 #ifdef PERL_EXT_RE_BUILD
33 /* need to replace pregcomp et al, so enable that */
34 # ifndef PERL_IN_XSUB_RE
35 # define PERL_IN_XSUB_RE
36 # endif
37 /* need access to debugger hooks */
38 # if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
39 # define DEBUGGING
40 # endif
41 #endif
42
43 #ifdef PERL_IN_XSUB_RE
44 /* We *really* need to overwrite these symbols: */
45 # define Perl_pregcomp my_regcomp
46 # define Perl_regdump my_regdump
47 # define Perl_regprop my_regprop
48 # define Perl_pregfree my_regfree
49 # define Perl_re_intuit_string my_re_intuit_string
50 /* *These* symbols are masked to allow static link. */
51 # define Perl_regnext my_regnext
52 # define Perl_save_re_context my_save_re_context
53 # define Perl_reginitcolors my_reginitcolors
54
55 # define PERL_NO_GET_CONTEXT
56 #endif
57
58 /*SUPPRESS 112*/
59 /*
60 * pregcomp and pregexec -- regsub and regerror are not used in perl
61 *
62 * Copyright (c) 1986 by University of Toronto.
63 * Written by Henry Spencer. Not derived from licensed software.
64 *
65 * Permission is granted to anyone to use this software for any
66 * purpose on any computer system, and to redistribute it freely,
67 * subject to the following restrictions:
68 *
69 * 1. The author is not responsible for the consequences of use of
70 * this software, no matter how awful, even if they arise
71 * from defects in it.
72 *
73 * 2. The origin of this software must not be misrepresented, either
74 * by explicit claim or by omission.
75 *
76 * 3. Altered versions must be plainly marked as such, and must not
77 * be misrepresented as being the original software.
78 *
79 *
80 **** Alterations to Henry's code are...
81 ****
82 **** Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
83 **** 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
84 ****
85 **** You may distribute under the terms of either the GNU General Public
86 **** License or the Artistic License, as specified in the README file.
87
88 *
89 * Beware that some of this code is subtly aware of the way operator
90 * precedence is structured in regular expressions. Serious changes in
91 * regular-expression syntax might require a total rethink.
92 */
93 #include "EXTERN.h"
94 #define PERL_IN_REGCOMP_C
95 #include "perl.h"
96
97 #ifndef PERL_IN_XSUB_RE
98 # include "INTERN.h"
99 #endif
100
101 #define REG_COMP_C
102 #include "regcomp.h"
103
104 #ifdef op
105 #undef op
106 #endif /* op */
107
108 #ifdef MSDOS
109 # if defined(BUGGY_MSC6)
110 /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
111 # pragma optimize("a",off)
112 /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
113 # pragma optimize("w",on )
114 # endif /* BUGGY_MSC6 */
115 #endif /* MSDOS */
116
117 #ifndef STATIC
118 #define STATIC static
119 #endif
120
121 typedef struct RExC_state_t {
122 U32 flags; /* are we folding, multilining? */
123 char *precomp; /* uncompiled string. */
124 regexp *rx;
125 char *start; /* Start of input for compile */
126 char *end; /* End of input for compile */
127 char *parse; /* Input-scan pointer. */
128 I32 whilem_seen; /* number of WHILEM in this expr */
129 regnode *emit_start; /* Start of emitted-code area */
130 regnode *emit; /* Code-emit pointer; &regdummy = don't = compiling */
131 I32 naughty; /* How bad is this pattern? */
132 I32 sawback; /* Did we see \1, ...? */
133 U32 seen;
134 I32 size; /* Code size. */
135 I32 npar; /* () count. */
136 I32 extralen;
137 I32 seen_zerolen;
138 I32 seen_evals;
139 I32 utf8;
140 #if ADD_TO_REGEXEC
141 char *starttry; /* -Dr: where regtry was called. */
142 #define RExC_starttry (pRExC_state->starttry)
143 #endif
144 } RExC_state_t;
145
146 #define RExC_flags (pRExC_state->flags)
147 #define RExC_precomp (pRExC_state->precomp)
148 #define RExC_rx (pRExC_state->rx)
149 #define RExC_start (pRExC_state->start)
150 #define RExC_end (pRExC_state->end)
151 #define RExC_parse (pRExC_state->parse)
152 #define RExC_whilem_seen (pRExC_state->whilem_seen)
153 #define RExC_offsets (pRExC_state->rx->offsets) /* I am not like the others */
154 #define RExC_emit (pRExC_state->emit)
155 #define RExC_emit_start (pRExC_state->emit_start)
156 #define RExC_naughty (pRExC_state->naughty)
157 #define RExC_sawback (pRExC_state->sawback)
158 #define RExC_seen (pRExC_state->seen)
159 #define RExC_size (pRExC_state->size)
160 #define RExC_npar (pRExC_state->npar)
161 #define RExC_extralen (pRExC_state->extralen)
162 #define RExC_seen_zerolen (pRExC_state->seen_zerolen)
163 #define RExC_seen_evals (pRExC_state->seen_evals)
164 #define RExC_utf8 (pRExC_state->utf8)
165
166 #define ISMULT1(c) ((c) == '*' || (c) == '+' || (c) == '?')
167 #define ISMULT2(s) ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
168 ((*s) == '{' && regcurly(s)))
169
170 #ifdef SPSTART
171 #undef SPSTART /* dratted cpp namespace... */
172 #endif
173 /*
174 * Flags to be passed up and down.
175 */
176 #define WORST 0 /* Worst case. */
177 #define HASWIDTH 0x1 /* Known to match non-null strings. */
178 #define SIMPLE 0x2 /* Simple enough to be STAR/PLUS operand. */
179 #define SPSTART 0x4 /* Starts with * or +. */
180 #define TRYAGAIN 0x8 /* Weeded out a declaration. */
181
182 /* Length of a variant. */
183
184 typedef struct scan_data_t {
185 I32 len_min;
186 I32 len_delta;
187 I32 pos_min;
188 I32 pos_delta;
189 SV *last_found;
190 I32 last_end; /* min value, <0 unless valid. */
191 I32 last_start_min;
192 I32 last_start_max;
193 SV **longest; /* Either &l_fixed, or &l_float. */
194 SV *longest_fixed;
195 I32 offset_fixed;
196 SV *longest_float;
197 I32 offset_float_min;
198 I32 offset_float_max;
199 I32 flags;
200 I32 whilem_c;
201 I32 *last_closep;
202 struct regnode_charclass_class *start_class;
203 } scan_data_t;
204
205 /*
206 * Forward declarations for pregcomp()'s friends.
207 */
208
209 static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0};
211
212 #define SF_BEFORE_EOL (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
213 #define SF_BEFORE_SEOL 0x1
214 #define SF_BEFORE_MEOL 0x2
215 #define SF_FIX_BEFORE_EOL (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
216 #define SF_FL_BEFORE_EOL (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
217
218 #ifdef NO_UNARY_PLUS
219 # define SF_FIX_SHIFT_EOL (0+2)
220 # define SF_FL_SHIFT_EOL (0+4)
221 #else
222 # define SF_FIX_SHIFT_EOL (+2)
223 # define SF_FL_SHIFT_EOL (+4)
224 #endif
225
226 #define SF_FIX_BEFORE_SEOL (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
227 #define SF_FIX_BEFORE_MEOL (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
228
229 #define SF_FL_BEFORE_SEOL (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
230 #define SF_FL_BEFORE_MEOL (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
231 #define SF_IS_INF 0x40
232 #define SF_HAS_PAR 0x80
233 #define SF_IN_PAR 0x100
234 #define SF_HAS_EVAL 0x200
235 #define SCF_DO_SUBSTR 0x400
236 #define SCF_DO_STCLASS_AND 0x0800
237 #define SCF_DO_STCLASS_OR 0x1000
238 #define SCF_DO_STCLASS (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
239 #define SCF_WHILEM_VISITED_POS 0x2000
240
241 #define UTF (RExC_utf8 != 0)
242 #define LOC ((RExC_flags & PMf_LOCALE) != 0)
243 #define FOLD ((RExC_flags & PMf_FOLD) != 0)
244
245 #define OOB_UNICODE 12345678
246 #define OOB_NAMEDCLASS -1
247
248 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
249 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
250
251
252 /* length of regex to show in messages that don't mark a position within */
253 #define RegexLengthToShowInErrorMessages 127
254
255 /*
256 * If MARKER[12] are adjusted, be sure to adjust the constants at the top
257 * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
258 * op/pragma/warn/regcomp.
259 */
260 #define MARKER1 "<-- HERE" /* marker as it appears in the description */
261 #define MARKER2 " <-- HERE " /* marker as it appears within the regex */
262
263 #define REPORT_LOCATION " in regex; marked by " MARKER1 " in m/%.*s" MARKER2 "%s/"
264
265 /*
266 * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
267 * arg. Show regex, up to a maximum length. If it's too long, chop and add
268 * "...".
269 */
270 #define FAIL(msg) STMT_START { \
271 char *ellipses = ""; \
272 IV len = RExC_end - RExC_precomp; \
273 \
274 if (!SIZE_ONLY) \
275 SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx); \
276 if (len > RegexLengthToShowInErrorMessages) { \
277 /* chop 10 shorter than the max, to ensure meaning of "..." */ \
278 len = RegexLengthToShowInErrorMessages - 10; \
279 ellipses = "..."; \
280 } \
281 Perl_croak(aTHX_ "%s in regex m/%.*s%s/", \
282 msg, (int)len, RExC_precomp, ellipses); \
283 } STMT_END
284
285 /*
286 * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
287 * args. Show regex, up to a maximum length. If it's too long, chop and add
288 * "...".
289 */
290 #define FAIL2(pat,msg) STMT_START { \
291 char *ellipses = ""; \
292 IV len = RExC_end - RExC_precomp; \
293 \
294 if (!SIZE_ONLY) \
295 SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx); \
296 if (len > RegexLengthToShowInErrorMessages) { \
297 /* chop 10 shorter than the max, to ensure meaning of "..." */ \
298 len = RegexLengthToShowInErrorMessages - 10; \
299 ellipses = "..."; \
300 } \
301 S_re_croak2(aTHX_ pat, " in regex m/%.*s%s/", \
302 msg, (int)len, RExC_precomp, ellipses); \
303 } STMT_END
304
305
306 /*
307 * Simple_vFAIL -- like FAIL, but marks the current location in the scan
308 */
309 #define Simple_vFAIL(m) STMT_START { \
310 IV offset = RExC_parse - RExC_precomp; \
311 Perl_croak(aTHX_ "%s" REPORT_LOCATION, \
312 m, (int)offset, RExC_precomp, RExC_precomp + offset); \
313 } STMT_END
314
315 /*
316 * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
317 */
318 #define vFAIL(m) STMT_START { \
319 if (!SIZE_ONLY) \
320 SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx); \
321 Simple_vFAIL(m); \
322 } STMT_END
323
324 /*
325 * Like Simple_vFAIL(), but accepts two arguments.
326 */
327 #define Simple_vFAIL2(m,a1) STMT_START { \
328 IV offset = RExC_parse - RExC_precomp; \
329 S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, \
330 (int)offset, RExC_precomp, RExC_precomp + offset); \
331 } STMT_END
332
333 /*
334 * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
335 */
336 #define vFAIL2(m,a1) STMT_START { \
337 if (!SIZE_ONLY) \
338 SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx); \
339 Simple_vFAIL2(m, a1); \
340 } STMT_END
341
342
343 /*
344 * Like Simple_vFAIL(), but accepts three arguments.
345 */
346 #define Simple_vFAIL3(m, a1, a2) STMT_START { \
347 IV offset = RExC_parse - RExC_precomp; \
348 S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, \
349 (int)offset, RExC_precomp, RExC_precomp + offset); \
350 } STMT_END
351
352 /*
353 * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
354 */
355 #define vFAIL3(m,a1,a2) STMT_START { \
356 if (!SIZE_ONLY) \
357 SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx); \
358 Simple_vFAIL3(m, a1, a2); \
359 } STMT_END
360
361 /*
362 * Like Simple_vFAIL(), but accepts four arguments.
363 */
364 #define Simple_vFAIL4(m, a1, a2, a3) STMT_START { \
365 IV offset = RExC_parse - RExC_precomp; \
366 S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3, \
367 (int)offset, RExC_precomp, RExC_precomp + offset); \
368 } STMT_END
369
370 /*
371 * Like Simple_vFAIL(), but accepts five arguments.
372 */
373 #define Simple_vFAIL5(m, a1, a2, a3, a4) STMT_START { \
374 IV offset = RExC_parse - RExC_precomp; \
375 S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3, a4, \
376 (int)offset, RExC_precomp, RExC_precomp + offset); \
377 } STMT_END
378
379
380 #define vWARN(loc,m) STMT_START { \
381 IV offset = loc - RExC_precomp; \
382 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s" REPORT_LOCATION, \
383 m, (int)offset, RExC_precomp, RExC_precomp + offset); \
384 } STMT_END
385
386 #define vWARNdep(loc,m) STMT_START { \
387 IV offset = loc - RExC_precomp; \
388 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP), \
389 "%s" REPORT_LOCATION, \
390 m, (int)offset, RExC_precomp, RExC_precomp + offset); \
391 } STMT_END
392
393
394 #define vWARN2(loc, m, a1) STMT_START { \
395 IV offset = loc - RExC_precomp; \
396 Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
397 a1, (int)offset, RExC_precomp, RExC_precomp + offset); \
398 } STMT_END
399
400 #define vWARN3(loc, m, a1, a2) STMT_START { \
401 IV offset = loc - RExC_precomp; \
402 Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
403 a1, a2, (int)offset, RExC_precomp, RExC_precomp + offset); \
404 } STMT_END
405
406 #define vWARN4(loc, m, a1, a2, a3) STMT_START { \
407 IV offset = loc - RExC_precomp; \
408 Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
409 a1, a2, a3, (int)offset, RExC_precomp, RExC_precomp + offset); \
410 } STMT_END
411
412 #define vWARN5(loc, m, a1, a2, a3, a4) STMT_START { \
413 IV offset = loc - RExC_precomp; \
414 Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
415 a1, a2, a3, a4, (int)offset, RExC_precomp, RExC_precomp + offset); \
416 } STMT_END
417
418
419 /* Allow for side effects in s */
420 #define REGC(c,s) STMT_START { \
421 if (!SIZE_ONLY) *(s) = (c); else (void)(s); \
422 } STMT_END
423
424 /* Macros for recording node offsets. 20001227 mjd@plover.com
425 * Nodes are numbered 1, 2, 3, 4. Node #n's position is recorded in
426 * element 2*n-1 of the array. Element #2n holds the byte length node #n.
427 * Element 0 holds the number n.
428 */
429
430 #define MJD_OFFSET_DEBUG(x)
431 /* #define MJD_OFFSET_DEBUG(x) Perl_warn_nocontext x */
432
433
434 #define Set_Node_Offset_To_R(node,byte) STMT_START { \
435 if (! SIZE_ONLY) { \
436 MJD_OFFSET_DEBUG(("** (%d) offset of node %d is %d.\n", \
437 __LINE__, (node), (byte))); \
438 if((node) < 0) { \
439 Perl_croak(aTHX_ "value of node is %d in Offset macro", node); \
440 } else { \
441 RExC_offsets[2*(node)-1] = (byte); \
442 } \
443 } \
444 } STMT_END
445
446 #define Set_Node_Offset(node,byte) \
447 Set_Node_Offset_To_R((node)-RExC_emit_start, (byte)-RExC_start)
448 #define Set_Cur_Node_Offset Set_Node_Offset(RExC_emit, RExC_parse)
449
450 #define Set_Node_Length_To_R(node,len) STMT_START { \
451 if (! SIZE_ONLY) { \
452 MJD_OFFSET_DEBUG(("** (%d) size of node %d is %d.\n", \
453 __LINE__, (node), (len))); \
454 if((node) < 0) { \
455 Perl_croak(aTHX_ "value of node is %d in Length macro", node); \
456 } else { \
457 RExC_offsets[2*(node)] = (len); \
458 } \
459 } \
460 } STMT_END
461
462 #define Set_Node_Length(node,len) \
463 Set_Node_Length_To_R((node)-RExC_emit_start, len)
464 #define Set_Cur_Node_Length(len) Set_Node_Length(RExC_emit, len)
465 #define Set_Node_Cur_Length(node) \
466 Set_Node_Length(node, RExC_parse - parse_start)
467
468 /* Get offsets and lengths */
469 #define Node_Offset(n) (RExC_offsets[2*((n)-RExC_emit_start)-1])
470 #define Node_Length(n) (RExC_offsets[2*((n)-RExC_emit_start)])
471
472 static void clear_re(pTHX_ void *r);
473
474 /* Mark that we cannot extend a found fixed substring at this point.
475 Updata the longest found anchored substring and the longest found
476 floating substrings if needed. */
477
478 STATIC void
479 S_scan_commit(pTHX_ RExC_state_t *pRExC_state, scan_data_t *data)
480 {
481 STRLEN l = CHR_SVLEN(data->last_found);
482 STRLEN old_l = CHR_SVLEN(*data->longest);
483
484 if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
485 SvSetMagicSV(*data->longest, data->last_found);
486 if (*data->longest == data->longest_fixed) {
487 data->offset_fixed = l ? data->last_start_min : data->pos_min;
488 if (data->flags & SF_BEFORE_EOL)
489 data->flags
490 |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
491 else
492 data->flags &= ~SF_FIX_BEFORE_EOL;
493 }
494 else {
495 data->offset_float_min = l ? data->last_start_min : data->pos_min;
496 data->offset_float_max = (l
497 ? data->last_start_max
498 : data->pos_min + data->pos_delta);
499 if ((U32)data->offset_float_max > (U32)I32_MAX)
500 data->offset_float_max = I32_MAX;
501 if (data->flags & SF_BEFORE_EOL)
502 data->flags
503 |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
504 else
505 data->flags &= ~SF_FL_BEFORE_EOL;
506 }
507 }
508 SvCUR_set(data->last_found, 0);
509 {
510 SV * sv = data->last_found;
511 MAGIC *mg =
512 SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
513 if (mg && mg->mg_len > 0)
514 mg->mg_len = 0;
515 }
516 data->last_end = -1;
517 data->flags &= ~SF_BEFORE_EOL;
518 }
519
520 /* Can match anything (initialization) */
521 STATIC void
522 S_cl_anything(pTHX_ RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
523 {
524 ANYOF_CLASS_ZERO(cl);
525 ANYOF_BITMAP_SETALL(cl);
526 cl->flags = ANYOF_EOS|ANYOF_UNICODE_ALL;
527 if (LOC)
528 cl->flags |= ANYOF_LOCALE;
529 }
530
531 /* Can match anything (initialization) */
532 STATIC int
533 S_cl_is_anything(pTHX_ struct regnode_charclass_class *cl)
534 {
535 int value;
536
537 for (value = 0; value <= ANYOF_MAX; value += 2)
538 if (ANYOF_CLASS_TEST(cl, value) && ANYOF_CLASS_TEST(cl, value + 1))
539 return 1;
540 if (!(cl->flags & ANYOF_UNICODE_ALL))
541 return 0;
542 if (!ANYOF_BITMAP_TESTALLSET(cl))
543 return 0;
544 return 1;
545 }
546
547 /* Can match anything (initialization) */
548 STATIC void
549 S_cl_init(pTHX_ RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
550 {
551 Zero(cl, 1, struct regnode_charclass_class);
552 cl->type = ANYOF;
553 cl_anything(pRExC_state, cl);
554 }
555
556 STATIC void
557 S_cl_init_zero(pTHX_ RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
558 {
559 Zero(cl, 1, struct regnode_charclass_class);
560 cl->type = ANYOF;
561 cl_anything(pRExC_state, cl);
562 if (LOC)
563 cl->flags |= ANYOF_LOCALE;
564 }
565
566 /* 'And' a given class with another one. Can create false positives */
567 /* We assume that cl is not inverted */
568 STATIC void
569 S_cl_and(pTHX_ struct regnode_charclass_class *cl,
570 struct regnode_charclass_class *and_with)
571 {
572 if (!(and_with->flags & ANYOF_CLASS)
573 && !(cl->flags & ANYOF_CLASS)
574 && (and_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
575 && !(and_with->flags & ANYOF_FOLD)
576 && !(cl->flags & ANYOF_FOLD)) {
577 int i;
578
579 if (and_with->flags & ANYOF_INVERT)
580 for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
581 cl->bitmap[i] &= ~and_with->bitmap[i];
582 else
583 for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
584 cl->bitmap[i] &= and_with->bitmap[i];
585 } /* XXXX: logic is complicated otherwise, leave it along for a moment. */
586 if (!(and_with->flags & ANYOF_EOS))
587 cl->flags &= ~ANYOF_EOS;
588
589 if (cl->flags & ANYOF_UNICODE_ALL && and_with->flags & ANYOF_UNICODE &&
590 !(and_with->flags & ANYOF_INVERT)) {
591 cl->flags &= ~ANYOF_UNICODE_ALL;
592 cl->flags |= ANYOF_UNICODE;
593 ARG_SET(cl, ARG(and_with));
594 }
595 if (!(and_with->flags & ANYOF_UNICODE_ALL) &&
596 !(and_with->flags & ANYOF_INVERT))
597 cl->flags &= ~ANYOF_UNICODE_ALL;
598 if (!(and_with->flags & (ANYOF_UNICODE|ANYOF_UNICODE_ALL)) &&
599 !(and_with->flags & ANYOF_INVERT))
600 cl->flags &= ~ANYOF_UNICODE;
601 }
602
603 /* 'OR' a given class with another one. Can create false positives */
604 /* We assume that cl is not inverted */
605 STATIC void
606 S_cl_or(pTHX_ RExC_state_t *pRExC_state, struct regnode_charclass_class *cl, struct regnode_charclass_class *or_with)
607 {
608 if (or_with->flags & ANYOF_INVERT) {
609 /* We do not use
610 * (B1 | CL1) | (!B2 & !CL2) = (B1 | !B2 & !CL2) | (CL1 | (!B2 & !CL2))
611 * <= (B1 | !B2) | (CL1 | !CL2)
612 * which is wasteful if CL2 is small, but we ignore CL2:
613 * (B1 | CL1) | (!B2 & !CL2) <= (B1 | CL1) | !B2 = (B1 | !B2) | CL1
614 * XXXX Can we handle case-fold? Unclear:
615 * (OK1(i) | OK1(i')) | !(OK1(i) | OK1(i')) =
616 * (OK1(i) | OK1(i')) | (!OK1(i) & !OK1(i'))
617 */
618 if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
619 && !(or_with->flags & ANYOF_FOLD)
620 && !(cl->flags & ANYOF_FOLD) ) {
621 int i;
622
623 for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
624 cl->bitmap[i] |= ~or_with->bitmap[i];
625 } /* XXXX: logic is complicated otherwise */
626 else {
627 cl_anything(pRExC_state, cl);
628 }
629 } else {
630 /* (B1 | CL1) | (B2 | CL2) = (B1 | B2) | (CL1 | CL2)) */
631 if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
632 && (!(or_with->flags & ANYOF_FOLD)
633 || (cl->flags & ANYOF_FOLD)) ) {
634 int i;
635
636 /* OR char bitmap and class bitmap separately */
637 for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
638 cl->bitmap[i] |= or_with->bitmap[i];
639 if (or_with->flags & ANYOF_CLASS) {
640 for (i = 0; i < ANYOF_CLASSBITMAP_SIZE; i++)
641 cl->classflags[i] |= or_with->classflags[i];
642 cl->flags |= ANYOF_CLASS;
643 }
644 }
645 else { /* XXXX: logic is complicated, leave it along for a moment. */
646 cl_anything(pRExC_state, cl);
647 }
648 }
649 if (or_with->flags & ANYOF_EOS)
650 cl->flags |= ANYOF_EOS;
651
652 if (cl->flags & ANYOF_UNICODE && or_with->flags & ANYOF_UNICODE &&
653 ARG(cl) != ARG(or_with)) {
654 cl->flags |= ANYOF_UNICODE_ALL;
655 cl->flags &= ~ANYOF_UNICODE;
656 }
657 if (or_with->flags & ANYOF_UNICODE_ALL) {
658 cl->flags |= ANYOF_UNICODE_ALL;
659 cl->flags &= ~ANYOF_UNICODE;
660 }
661 }
662
663 /*
664 * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
665 * These need to be revisited when a newer toolchain becomes available.
666 */
667 #if defined(__sparc64__) && defined(__GNUC__)
668 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
669 # undef SPARC64_GCC_WORKAROUND
670 # define SPARC64_GCC_WORKAROUND 1
671 # endif
672 #endif
673
674 /* REx optimizer. Converts nodes into quickier variants "in place".
675 Finds fixed substrings. */
676
677 /* Stops at toplevel WHILEM as well as at `last'. At end *scanp is set
678 to the position after last scanned or to NULL. */
679
680 STATIC I32
681 S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags)
682 /* scanp: Start here (read-write). */
683 /* deltap: Write maxlen-minlen here. */
684 /* last: Stop before this one. */
685 {
686 I32 min = 0, pars = 0, code;
687 regnode *scan = *scanp, *next;
688 I32 delta = 0;
689 int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
690 int is_inf_internal = 0; /* The studied chunk is infinite */
691 I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
692 scan_data_t data_fake;
693 struct regnode_charclass_class and_with; /* Valid if flags & SCF_DO_STCLASS_OR */
694
695 while (scan && OP(scan) != END && scan < last) {
696 /* Peephole optimizer: */
697
698 if (PL_regkind[(U8)OP(scan)] == EXACT) {
699 /* Merge several consecutive EXACTish nodes into one. */
700 regnode *n = regnext(scan);
701 U32 stringok = 1;
702 #ifdef DEBUGGING
703 regnode *stop = scan;
704 #endif
705
706 next = scan + NODE_SZ_STR(scan);
707 /* Skip NOTHING, merge EXACT*. */
708 while (n &&
709 ( PL_regkind[(U8)OP(n)] == NOTHING ||
710 (stringok && (OP(n) == OP(scan))))
711 && NEXT_OFF(n)
712 && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) {
713 if (OP(n) == TAIL || n > next)
714 stringok = 0;
715 if (PL_regkind[(U8)OP(n)] == NOTHING) {
716 NEXT_OFF(scan) += NEXT_OFF(n);
717 next = n + NODE_STEP_REGNODE;
718 #ifdef DEBUGGING
719 if (stringok)
720 stop = n;
721 #endif
722 n = regnext(n);
723 }
724 else if (stringok) {
725 int oldl = STR_LEN(scan);
726 regnode *nnext = regnext(n);
727
728 if (oldl + STR_LEN(n) > U8_MAX)
729 break;
730 NEXT_OFF(scan) += NEXT_OFF(n);
731 STR_LEN(scan) += STR_LEN(n);
732 next = n + NODE_SZ_STR(n);
733 /* Now we can overwrite *n : */
734 Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char);
735 #ifdef DEBUGGING
736 stop = next - 1;
737 #endif
738 n = nnext;
739 }
740 }
741
742 if (UTF && OP(scan) == EXACTF && STR_LEN(scan) >= 6) {
743 /*
744 Two problematic code points in Unicode casefolding of EXACT nodes:
745
746 U+0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
747 U+03B0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
748
749 which casefold to
750
751 Unicode UTF-8
752
753 U+03B9 U+0308 U+0301 0xCE 0xB9 0xCC 0x88 0xCC 0x81
754 U+03C5 U+0308 U+0301 0xCF 0x85 0xCC 0x88 0xCC 0x81
755
756 This means that in case-insensitive matching (or "loose matching",
757 as Unicode calls it), an EXACTF of length six (the UTF-8 encoded byte
758 length of the above casefolded versions) can match a target string
759 of length two (the byte length of UTF-8 encoded U+0390 or U+03B0).
760 This would rather mess up the minimum length computation.
761
762 What we'll do is to look for the tail four bytes, and then peek
763 at the preceding two bytes to see whether we need to decrease
764 the minimum length by four (six minus two).
765
766 Thanks to the design of UTF-8, there cannot be false matches:
767 A sequence of valid UTF-8 bytes cannot be a subsequence of
768 another valid sequence of UTF-8 bytes.
769
770 */
771 char *s0 = STRING(scan), *s, *t;
772 char *s1 = s0 + STR_LEN(scan) - 1, *s2 = s1 - 4;
773 char *t0 = "\xcc\x88\xcc\x81";
774 char *t1 = t0 + 3;
775
776 for (s = s0 + 2;
777 s < s2 && (t = ninstr(s, s1, t0, t1));
778 s = t + 4) {
779 if (((U8)t[-1] == 0xB9 && (U8)t[-2] == 0xCE) ||
780 ((U8)t[-1] == 0x85 && (U8)t[-2] == 0xCF))
781 min -= 4;
782 }
783 }
784
785 #ifdef DEBUGGING
786 /* Allow dumping */
787 n = scan + NODE_SZ_STR(scan);
788 while (n <= stop) {
789 if (PL_regkind[(U8)OP(n)] != NOTHING || OP(n) == NOTHING) {
790 OP(n) = OPTIMIZED;
791 NEXT_OFF(n) = 0;
792 }
793 n++;
794 }
795 #endif
796 }
797 /* Follow the next-chain of the current node and optimize
798 away all the NOTHINGs from it. */
799 if (OP(scan) != CURLYX) {
800 int max = (reg_off_by_arg[OP(scan)]
801 ? I32_MAX
802 /* I32 may be smaller than U16 on CRAYs! */
803 : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
804 int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
805 int noff;
806 regnode *n = scan;
807
808 /* Skip NOTHING and LONGJMP. */
809 while ((n = regnext(n))
810 && ((PL_regkind[(U8)OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
811 || ((OP(n) == LONGJMP) && (noff = ARG(n))))
812 && off + noff < max)
813 off += noff;
814 if (reg_off_by_arg[OP(scan)])
815 ARG(scan) = off;
816 else
817 NEXT_OFF(scan) = off;
818 }
819 /* The principal pseudo-switch. Cannot be a switch, since we
820 look into several different things. */
821 if (OP(scan) == BRANCH || OP(scan) == BRANCHJ
822 || OP(scan) == IFTHEN || OP(scan) == SUSPEND) {
823 next = regnext(scan);
824 code = OP(scan);
825
826 if (OP(next) == code || code == IFTHEN || code == SUSPEND) {
827 I32 max1 = 0, min1 = I32_MAX, num = 0;
828 struct regnode_charclass_class accum;
829
830 if (flags & SCF_DO_SUBSTR) /* XXXX Add !SUSPEND? */
831 scan_commit(pRExC_state, data); /* Cannot merge strings after this. */
832 if (flags & SCF_DO_STCLASS)
833 cl_init_zero(pRExC_state, &accum);
834 while (OP(scan) == code) {
835 I32 deltanext, minnext, f = 0, fake;
836 struct regnode_charclass_class this_class;
837
838 num++;
839 data_fake.flags = 0;
840 if (data) {
841 data_fake.whilem_c = data->whilem_c;
842 data_fake.last_closep = data->last_closep;
843 }
844 else
845 data_fake.last_closep = &fake;
846 next = regnext(scan);
847 scan = NEXTOPER(scan);
848 if (code != BRANCH)
849 scan = NEXTOPER(scan);
850 if (flags & SCF_DO_STCLASS) {
851 cl_init(pRExC_state, &this_class);
852 data_fake.start_class = &this_class;
853 f = SCF_DO_STCLASS_AND;
854 }
855 if (flags & SCF_WHILEM_VISITED_POS)
856 f |= SCF_WHILEM_VISITED_POS;
857 /* we suppose the run is continuous, last=next...*/
858 minnext = study_chunk(pRExC_state, &scan, &deltanext,
859 next, &data_fake, f);
860 if (min1 > minnext)
861 min1 = minnext;
862 if (max1 < minnext + deltanext)
863 max1 = minnext + deltanext;
864 if (deltanext == I32_MAX)
865 is_inf = is_inf_internal = 1;
866 scan = next;
867 if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
868 pars++;
869 if (data && (data_fake.flags & SF_HAS_EVAL))
870 data->flags |= SF_HAS_EVAL;
871 if (data)
872 data->whilem_c = data_fake.whilem_c;
873 if (flags & SCF_DO_STCLASS)
874 cl_or(pRExC_state, &accum, &this_class);
875 if (code == SUSPEND)
876 break;
877 }
878 if (code == IFTHEN && num < 2) /* Empty ELSE branch */
879 min1 = 0;
880 if (flags & SCF_DO_SUBSTR) {
881 data->pos_min += min1;
882 data->pos_delta += max1 - min1;
883 if (max1 != min1 || is_inf)
884 data->longest = &(data->longest_float);
885 }
886 min += min1;
887 delta += max1 - min1;
888 if (flags & SCF_DO_STCLASS_OR) {
889 cl_or(pRExC_state, data->start_class, &accum);
890 if (min1) {
891 cl_and(data->start_class, &and_with);
892 flags &= ~SCF_DO_STCLASS;
893 }
894 }
895 else if (flags & SCF_DO_STCLASS_AND) {
896 if (min1) {
897 cl_and(data->start_class, &accum);
898 flags &= ~SCF_DO_STCLASS;
899 }
900 else {
901 /* Switch to OR mode: cache the old value of
902 * data->start_class */
903 StructCopy(data->start_class, &and_with,
904 struct regnode_charclass_class);
905 flags &= ~SCF_DO_STCLASS_AND;
906 StructCopy(&accum, data->start_class,
907 struct regnode_charclass_class);
908 flags |= SCF_DO_STCLASS_OR;
909 data->start_class->flags |= ANYOF_EOS;
910 }
911 }
912 }
913 else if (code == BRANCHJ) /* single branch is optimized. */
914 scan = NEXTOPER(NEXTOPER(scan));
915 else /* single branch is optimized. */
916 scan = NEXTOPER(scan);
917 continue;
918 }
919 else if (OP(scan) == EXACT) {
920 I32 l = STR_LEN(scan);
921 UV uc = *((U8*)STRING(scan));
922 if (UTF) {
923 U8 *s = (U8*)STRING(scan);
924 l = utf8_length(s, s + l);
925 uc = utf8_to_uvchr(s, NULL);
926 }
927 min += l;
928 if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
929 /* The code below prefers earlier match for fixed
930 offset, later match for variable offset. */
931 if (data->last_end == -1) { /* Update the start info. */
932 data->last_start_min = data->pos_min;
933 data->last_start_max = is_inf
934 ? I32_MAX : data->pos_min + data->pos_delta;
935 }
936 sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
937 {
938 SV * sv = data->last_found;
939 MAGIC *mg = SvUTF8(sv) && SvMAGICAL(sv) ?
940 mg_find(sv, PERL_MAGIC_utf8) : NULL;
941 if (mg && mg->mg_len >= 0)
942 mg->mg_len += utf8_length((U8*)STRING(scan),
943 (U8*)STRING(scan)+STR_LEN(scan));
944 }
945 if (UTF)
946 SvUTF8_on(data->last_found);
947 data->last_end = data->pos_min + l;
948 data->pos_min += l; /* As in the first entry. */
949 data->flags &= ~SF_BEFORE_EOL;
950 }
951 if (flags & SCF_DO_STCLASS_AND) {
952 /* Check whether it is compatible with what we know already! */
953 int compat = 1;
954
955 if (uc >= 0x100 ||
956 (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
957 && !ANYOF_BITMAP_TEST(data->start_class, uc)
958 && (!(data->start_class->flags & ANYOF_FOLD)
959 || !ANYOF_BITMAP_TEST(data->start_class, PL_fold[uc])))
960 )
961 compat = 0;
962 ANYOF_CLASS_ZERO(data->start_class);
963 ANYOF_BITMAP_ZERO(data->start_class);
964 if (compat)
965 ANYOF_BITMAP_SET(data->start_class, uc);
966 data->start_class->flags &= ~ANYOF_EOS;
967 if (uc < 0x100)
968 data->start_class->flags &= ~ANYOF_UNICODE_ALL;
969 }
970 else if (flags & SCF_DO_STCLASS_OR) {
971 /* false positive possible if the class is case-folded */
972 if (uc < 0x100)
973 ANYOF_BITMAP_SET(data->start_class, uc);
974 else
975 data->start_class->flags |= ANYOF_UNICODE_ALL;
976 data->start_class->flags &= ~ANYOF_EOS;
977 cl_and(data->start_class, &and_with);
978 }
979 flags &= ~SCF_DO_STCLASS;
980 }
981 else if (PL_regkind[(U8)OP(scan)] == EXACT) { /* But OP != EXACT! */
982 I32 l = STR_LEN(scan);
983 UV uc = *((U8*)STRING(scan));
984
985 /* Search for fixed substrings supports EXACT only. */
986 if (flags & SCF_DO_SUBSTR)
987 scan_commit(pRExC_state, data);
988 if (UTF) {
989 U8 *s = (U8 *)STRING(scan);
990 l = utf8_length(s, s + l);
991 uc = utf8_to_uvchr(s, NULL);
992 }
993 min += l;
994 if (data && (flags & SCF_DO_SUBSTR))
995 data->pos_min += l;
996 if (flags & SCF_DO_STCLASS_AND) {
997 /* Check whether it is compatible with what we know already! */
998 int compat = 1;
999
1000 if (uc >= 0x100 ||
1001 (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
1002 && !ANYOF_BITMAP_TEST(data->start_class, uc)
1003 && !ANYOF_BITMAP_TEST(data->start_class, PL_fold[uc])))
1004 compat = 0;
1005 ANYOF_CLASS_ZERO(data->start_class);
1006 ANYOF_BITMAP_ZERO(data->start_class);
1007 if (compat) {
1008 ANYOF_BITMAP_SET(data->start_class, uc);
1009 data->start_class->flags &= ~ANYOF_EOS;
1010 data->start_class->flags |= ANYOF_FOLD;
1011 if (OP(scan) == EXACTFL)
1012 data->start_class->flags |= ANYOF_LOCALE;
1013 }
1014 }
1015 else if (flags & SCF_DO_STCLASS_OR) {
1016 if (data->start_class->flags & ANYOF_FOLD) {
1017 /* false positive possible if the class is case-folded.
1018 Assume that the locale settings are the same... */
1019 if (uc < 0x100)
1020 ANYOF_BITMAP_SET(data->start_class, uc);
1021 data->start_class->flags &= ~ANYOF_EOS;
1022 }
1023 cl_and(data->start_class, &and_with);
1024 }
1025 flags &= ~SCF_DO_STCLASS;
1026 }
1027 else if (strchr((char*)PL_varies,OP(scan))) {
1028 I32 mincount, maxcount, minnext, deltanext, fl = 0;
1029 I32 f = flags, pos_before = 0;
1030 regnode *oscan = scan;
1031 struct regnode_charclass_class this_class;
1032 struct regnode_charclass_class *oclass = NULL;
1033 I32 next_is_eval = 0;
1034
1035 switch (PL_regkind[(U8)OP(scan)]) {
1036 case WHILEM: /* End of (?:...)* . */
1037 scan = NEXTOPER(scan);
1038 goto finish;
1039 case PLUS:
1040 if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
1041 next = NEXTOPER(scan);
1042 if (OP(next) == EXACT || (flags & SCF_DO_STCLASS)) {
1043 mincount = 1;
1044 maxcount = REG_INFTY;
1045 next = regnext(scan);
1046 scan = NEXTOPER(scan);
1047 goto do_curly;
1048 }
1049 }
1050 if (flags & SCF_DO_SUBSTR)
1051 data->pos_min++;
1052 min++;
1053 /* Fall through. */
1054 case STAR:
1055 if (flags & SCF_DO_STCLASS) {
1056 mincount = 0;
1057 maxcount = REG_INFTY;
1058 next = regnext(scan);
1059 scan = NEXTOPER(scan);
1060 goto do_curly;
1061 }
1062 is_inf = is_inf_internal = 1;
1063 scan = regnext(scan);
1064 if (flags & SCF_DO_SUBSTR) {
1065 scan_commit(pRExC_state, data); /* Cannot extend fixed substrings */
1066 data->longest = &(data->longest_float);
1067 }
1068 goto optimize_curly_tail;
1069 case CURLY:
1070 mincount = ARG1(scan);
1071 maxcount = ARG2(scan);
1072 next = regnext(scan);
1073 if (OP(scan) == CURLYX) {
1074 I32 lp = (data ? *(data->last_closep) : 0);
1075
1076 scan->flags = ((lp <= U8_MAX) ? lp : U8_MAX);
1077 }
1078 scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
1079 next_is_eval = (OP(scan) == EVAL);
1080 do_curly:
1081 if (flags & SCF_DO_SUBSTR) {
1082 if (mincount == 0) scan_commit(pRExC_state,data); /* Cannot extend fixed substrings */
1083 pos_before = data->pos_min;
1084 }
1085 if (data) {
1086 fl = data->flags;
1087 data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
1088 if (is_inf)
1089 data->flags |= SF_IS_INF;
1090 }
1091 if (flags & SCF_DO_STCLASS) {
1092 cl_init(pRExC_state, &this_class);
1093 oclass = data->start_class;
1094 data->start_class = &this_class;
1095 f |= SCF_DO_STCLASS_AND;
1096 f &= ~SCF_DO_STCLASS_OR;
1097 }
1098 /* These are the cases when once a subexpression
1099 fails at a particular position, it cannot succeed
1100 even after backtracking at the enclosing scope.
1101
1102 XXXX what if minimal match and we are at the
1103 initial run of {n,m}? */
1104 if ((mincount != maxcount - 1) && (maxcount != REG_INFTY))
1105 f &= ~SCF_WHILEM_VISITED_POS;
1106
1107 /* This will finish on WHILEM, setting scan, or on NULL: */
1108 minnext = study_chunk(pRExC_state, &scan, &deltanext, last, data,
1109 mincount == 0
1110 ? (f & ~SCF_DO_SUBSTR) : f);
1111
1112 if (flags & SCF_DO_STCLASS)
1113 data->start_class = oclass;
1114 if (mincount == 0 || minnext == 0) {
1115 if (flags & SCF_DO_STCLASS_OR) {
1116 cl_or(pRExC_state, data->start_class, &this_class);
1117 }
1118 else if (flags & SCF_DO_STCLASS_AND) {
1119 /* Switch to OR mode: cache the old value of
1120 * data->start_class */
1121 StructCopy(data->start_class, &and_with,
1122 struct regnode_charclass_class);
1123 flags &= ~SCF_DO_STCLASS_AND;
1124 StructCopy(&this_class, data->start_class,
1125 struct regnode_charclass_class);
1126 flags |= SCF_DO_STCLASS_OR;
1127 data->start_class->flags |= ANYOF_EOS;
1128 }
1129 } else { /* Non-zero len */
1130 if (flags & SCF_DO_STCLASS_OR) {
1131 cl_or(pRExC_state, data->start_class, &this_class);
1132 cl_and(data->start_class, &and_with);
1133 }
1134 else if (flags & SCF_DO_STCLASS_AND)
1135 cl_and(data->start_class, &this_class);
1136 flags &= ~SCF_DO_STCLASS;
1137 }
1138 if (!scan) /* It was not CURLYX, but CURLY. */
1139 scan = next;
1140 if (ckWARN(WARN_REGEXP)
1141 /* ? quantifier ok, except for (?{ ... }) */
1142 && (next_is_eval || !(mincount == 0 && maxcount == 1))
1143 && (minnext == 0) && (deltanext == 0)
1144 && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
1145 && maxcount <= REG_INFTY/3) /* Complement check for big count */
1146 {
1147 vWARN(RExC_parse,
1148 "Quantifier unexpected on zero-length expression");
1149 }
1150
1151 min += minnext * mincount;
1152 is_inf_internal |= ((maxcount == REG_INFTY
1153 && (minnext + deltanext) > 0)
1154 || deltanext == I32_MAX);
1155 is_inf |= is_inf_internal;
1156 delta += (minnext + deltanext) * maxcount - minnext * mincount;
1157
1158 /* Try powerful optimization CURLYX => CURLYN. */
1159 if ( OP(oscan) == CURLYX && data
1160 && data->flags & SF_IN_PAR
1161 && !(data->flags & SF_HAS_EVAL)
1162 && !deltanext && minnext == 1 ) {
1163 /* Try to optimize to CURLYN. */
1164 regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
1165 regnode *nxt1 = nxt;
1166 #ifdef DEBUGGING
1167 regnode *nxt2;
1168 #endif
1169
1170 /* Skip open. */
1171 nxt = regnext(nxt);
1172 if (!strchr((char*)PL_simple,OP(nxt))
1173 && !(PL_regkind[(U8)OP(nxt)] == EXACT
1174 && STR_LEN(nxt) == 1))
1175 goto nogo;
1176 #ifdef DEBUGGING
1177 nxt2 = nxt;
1178 #endif
1179 nxt = regnext(nxt);
1180 if (OP(nxt) != CLOSE)
1181 goto nogo;
1182 /* Now we know that nxt2 is the only contents: */
1183 oscan->flags = (U8)ARG(nxt);
1184 OP(oscan) = CURLYN;
1185 OP(nxt1) = NOTHING; /* was OPEN. */
1186 #ifdef DEBUGGING
1187 OP(nxt1 + 1) = OPTIMIZED; /* was count. */
1188 NEXT_OFF(nxt1+ 1) = 0; /* just for consistancy. */
1189 NEXT_OFF(nxt2) = 0; /* just for consistancy with CURLY. */
1190 OP(nxt) = OPTIMIZED; /* was CLOSE. */
1191 OP(nxt + 1) = OPTIMIZED; /* was count. */
1192 NEXT_OFF(nxt+ 1) = 0; /* just for consistancy. */
1193 #endif
1194 }
1195 nogo:
1196
1197 /* Try optimization CURLYX => CURLYM. */
1198 if ( OP(oscan) == CURLYX && data
1199 && !(data->flags & SF_HAS_PAR)
1200 && !(data->flags & SF_HAS_EVAL)
1201 && !deltanext /* atom is fixed width */
1202 && minnext != 0 /* CURLYM can't handle zero width */
1203 ) {
1204 /* XXXX How to optimize if data == 0? */
1205 /* Optimize to a simpler form. */
1206 regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
1207 regnode *nxt2;
1208
1209 OP(oscan) = CURLYM;
1210 while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
1211 && (OP(nxt2) != WHILEM))
1212 nxt = nxt2;
1213 OP(nxt2) = SUCCEED; /* Whas WHILEM */
1214 /* Need to optimize away parenths. */
1215 if (data->flags & SF_IN_PAR) {
1216 /* Set the parenth number. */
1217 regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
1218
1219 if (OP(nxt) != CLOSE)
1220 FAIL("Panic opt close");
1221 oscan->flags = (U8)ARG(nxt);
1222 OP(nxt1) = OPTIMIZED; /* was OPEN. */
1223 OP(nxt) = OPTIMIZED; /* was CLOSE. */
1224 #ifdef DEBUGGING
1225 OP(nxt1 + 1) = OPTIMIZED; /* was count. */
1226 OP(nxt + 1) = OPTIMIZED; /* was count. */
1227 NEXT_OFF(nxt1 + 1) = 0; /* just for consistancy. */
1228 NEXT_OFF(nxt + 1) = 0; /* just for consistancy. */
1229 #endif
1230 #if 0
1231 while ( nxt1 && (OP(nxt1) != WHILEM)) {
1232 regnode *nnxt = regnext(nxt1);
1233
1234 if (nnxt == nxt) {
1235 if (reg_off_by_arg[OP(nxt1)])
1236 ARG_SET(nxt1, nxt2 - nxt1);
1237 else if (nxt2 - nxt1 < U16_MAX)
1238 NEXT_OFF(nxt1) = nxt2 - nxt1;
1239 else
1240 OP(nxt) = NOTHING; /* Cannot beautify */
1241 }
1242 nxt1 = nnxt;
1243 }
1244 #endif
1245 /* Optimize again: */
1246 study_chunk(pRExC_state, &nxt1, &deltanext, nxt,
1247 NULL, 0);
1248 }
1249 else
1250 oscan->flags = 0;
1251 }
1252 else if ((OP(oscan) == CURLYX)
1253 && (flags & SCF_WHILEM_VISITED_POS)
1254 /* See the comment on a similar expression above.
1255 However, this time it not a subexpression
1256 we care about, but the expression itself. */
1257 && (maxcount == REG_INFTY)
1258 && data && ++data->whilem_c < 16) {
1259 /* This stays as CURLYX, we can put the count/of pair. */
1260 /* Find WHILEM (as in regexec.c) */
1261 regnode *nxt = oscan + NEXT_OFF(oscan);
1262
1263 if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
1264 nxt += ARG(nxt);
1265 PREVOPER(nxt)->flags = (U8)(data->whilem_c
1266 | (RExC_whilem_seen << 4)); /* On WHILEM */
1267 }
1268 if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
1269 pars++;
1270 if (flags & SCF_DO_SUBSTR) {
1271 SV *last_str = Nullsv;
1272 int counted = mincount != 0;
1273
1274 if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
1275 #if defined(SPARC64_GCC_WORKAROUND)
1276 I32 b = 0;
1277 STRLEN l = 0;
1278 char *s = NULL;
1279 I32 old = 0;
1280
1281 if (pos_before >= data->last_start_min)
1282 b = pos_before;
1283 else
1284 b = data->last_start_min;
1285
1286 l = 0;
1287 s = SvPV(data->last_found, l);
1288 old = b - data->last_start_min;
1289
1290 #else
1291 I32 b = pos_before >= data->last_start_min
1292 ? pos_before : data->last_start_min;
1293 STRLEN l;
1294 char *s = SvPV(data->last_found, l);
1295 I32 old = b - data->last_start_min;
1296 #endif
1297
1298 if (UTF)
1299 old = utf8_hop((U8*)s, old) - (U8*)s;
1300
1301 l -= old;
1302 /* Get the added string: */
1303 last_str = newSVpvn(s + old, l);
1304 if (UTF)
1305 SvUTF8_on(last_str);
1306 if (deltanext == 0 && pos_before == b) {
1307 /* What was added is a constant string */
1308 if (mincount > 1) {
1309 SvGROW(last_str, (mincount * l) + 1);
1310 repeatcpy(SvPVX(last_str) + l,
1311 SvPVX(last_str), l, mincount - 1);
1312 SvCUR(last_str) *= mincount;
1313 /* Add additional parts. */
1314 SvCUR_set(data->last_found,
1315 SvCUR(data->last_found) - l);
1316 sv_catsv(data->last_found, last_str);
1317 {
1318 SV * sv = data->last_found;
1319 MAGIC *mg =
1320 SvUTF8(sv) && SvMAGICAL(sv) ?
1321 mg_find(sv, PERL_MAGIC_utf8) : NULL;
1322 if (mg && mg->mg_len >= 0)
1323 mg->mg_len += CHR_SVLEN(last_str);
1324 }
1325 data->last_end += l * (mincount - 1);
1326 }
1327 } else {
1328 /* start offset must point into the last copy */
1329 data->last_start_min += minnext * (mincount - 1);
1330 data->last_start_max += is_inf ? I32_MAX
1331 : (maxcount - 1) * (minnext + data->pos_delta);
1332 }
1333 }
1334 /* It is counted once already... */
1335 data->pos_min += minnext * (mincount - counted);
1336 data->pos_delta += - counted * deltanext +
1337 (minnext + deltanext) * maxcount - minnext * mincount;
1338 if (mincount != maxcount) {
1339 /* Cannot extend fixed substrings found inside
1340 the group. */
1341 scan_commit(pRExC_state,data);
1342 if (mincount && last_str) {
1343 sv_setsv(data->last_found, last_str);
1344 data->last_end = data->pos_min;
1345 data->last_start_min =
1346 data->pos_min - CHR_SVLEN(last_str);
1347 data->last_start_max = is_inf
1348 ? I32_MAX
1349 : data->pos_min + data->pos_delta
1350 - CHR_SVLEN(last_str);
1351 }
1352 data->longest = &(data->longest_float);
1353 }
1354 SvREFCNT_dec(last_str);
1355 }
1356 if (data && (fl & SF_HAS_EVAL))
1357 data->flags |= SF_HAS_EVAL;
1358 optimize_curly_tail:
1359 if (OP(oscan) != CURLYX) {
1360 while (PL_regkind[(U8)OP(next = regnext(oscan))] == NOTHING
1361 && NEXT_OFF(next))
1362 NEXT_OFF(oscan) += NEXT_OFF(next);
1363 }
1364 continue;
1365 default: /* REF and CLUMP only? */
1366 if (flags & SCF_DO_SUBSTR) {
1367 scan_commit(pRExC_state,data); /* Cannot expect anything... */
1368 data->longest = &(data->longest_float);
1369 }
1370 is_inf = is_inf_internal = 1;
1371 if (flags & SCF_DO_STCLASS_OR)
1372 cl_anything(pRExC_state, data->start_class);
1373 flags &= ~SCF_DO_STCLASS;
1374 break;
1375 }
1376 }
1377 else if (strchr((char*)PL_simple,OP(scan))) {
1378 int value = 0;
1379
1380 if (flags & SCF_DO_SUBSTR) {
1381 scan_commit(pRExC_state,data);
1382 data->pos_min++;
1383 }
1384 min++;
1385 if (flags & SCF_DO_STCLASS) {
1386 data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
1387
1388 /* Some of the logic below assumes that switching
1389 locale on will only add false positives. */
1390 switch (PL_regkind[(U8)OP(scan)]) {
1391 case SANY:
1392 default:
1393 do_default:
1394 /* Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", OP(scan)); */
1395 if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
1396 cl_anything(pRExC_state, data->start_class);
1397 break;
1398 case REG_ANY:
1399 if (OP(scan) == SANY)
1400 goto do_default;
1401 if (flags & SCF_DO_STCLASS_OR) { /* Everything but \n */
1402 value = (ANYOF_BITMAP_TEST(data->start_class,'\n')
1403 || (data->start_class->flags & ANYOF_CLASS));
1404 cl_anything(pRExC_state, data->start_class);
1405 }
1406 if (flags & SCF_DO_STCLASS_AND || !value)
1407 ANYOF_BITMAP_CLEAR(data->start_class,'\n');
1408 break;
1409 case ANYOF:
1410 if (flags & SCF_DO_STCLASS_AND)
1411 cl_and(data->start_class,
1412 (struct regnode_charclass_class*)scan);
1413 else
1414 cl_or(pRExC_state, data->start_class,
1415 (struct regnode_charclass_class*)scan);
1416 break;
1417 case ALNUM:
1418 if (flags & SCF_DO_STCLASS_AND) {
1419 if (!(data->start_class->flags & ANYOF_LOCALE)) {
1420 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
1421 for (value = 0; value < 256; value++)
1422 if (!isALNUM(value))
1423 ANYOF_BITMAP_CLEAR(data->start_class, value);
1424 }
1425 }
1426 else {
1427 if (data->start_class->flags & ANYOF_LOCALE)
1428 ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
1429 else {
1430 for (value = 0; value < 256; value++)
1431 if (isALNUM(value))
1432 ANYOF_BITMAP_SET(data->start_class, value);
1433 }
1434 }
1435 break;
1436 case ALNUML:
1437 if (flags & SCF_DO_STCLASS_AND) {
1438 if (data->start_class->flags & ANYOF_LOCALE)
1439 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
1440 }
1441 else {
1442 ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
1443 data->start_class->flags |= ANYOF_LOCALE;
1444 }
1445 break;
1446 case NALNUM:
1447 if (flags & SCF_DO_STCLASS_AND) {
1448 if (!(data->start_class->flags & ANYOF_LOCALE)) {
1449 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
1450 for (value = 0; value < 256; value++)
1451 if (isALNUM(value))
1452 ANYOF_BITMAP_CLEAR(data->start_class, value);
1453 }
1454 }
1455 else {
1456 if (data->start_class->flags & ANYOF_LOCALE)
1457 ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
1458 else {
1459 for (value = 0; value < 256; value++)
1460 if (!isALNUM(value))
1461 ANYOF_BITMAP_SET(data->start_class, value);
1462 }
1463 }
1464 break;
1465 case NALNUML:
1466 if (flags & SCF_DO_STCLASS_AND) {
1467 if (data->start_class->flags & ANYOF_LOCALE)
1468 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
1469 }
1470 else {
1471 data->start_class->flags |= ANYOF_LOCALE;
1472 ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
1473 }
1474 break;
1475 case SPACE:
1476 if (flags & SCF_DO_STCLASS_AND) {
1477 if (!(data->start_class->flags & ANYOF_LOCALE)) {
1478 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
1479 for (value = 0; value < 256; value++)
1480 if (!isSPACE(value))
1481 ANYOF_BITMAP_CLEAR(data->start_class, value);
1482 }
1483 }
1484 else {
1485 if (data->start_class->flags & ANYOF_LOCALE)
1486 ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
1487 else {
1488 for (value = 0; value < 256; value++)
1489 if (isSPACE(value))
1490 ANYOF_BITMAP_SET(data->start_class, value);
1491 }
1492 }
1493 break;
1494 case SPACEL:
1495 if (flags & SCF_DO_STCLASS_AND) {
1496 if (data->start_class->flags & ANYOF_LOCALE)
1497 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
1498 }
1499 else {
1500 data->start_class->flags |= ANYOF_LOCALE;
1501 ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
1502 }
1503 break;
1504 case NSPACE:
1505 if (flags & SCF_DO_STCLASS_AND) {
1506 if (!(data->start_class->flags & ANYOF_LOCALE)) {
1507 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
1508 for (value = 0; value < 256; value++)
1509 if (isSPACE(value))
1510 ANYOF_BITMAP_CLEAR(data->start_class, value);
1511 }
1512 }
1513 else {
1514 if (data->start_class->flags & ANYOF_LOCALE)
1515 ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
1516 else {
1517 for (value = 0; value < 256; value++)
1518 if (!isSPACE(value))
1519 ANYOF_BITMAP_SET(data->start_class, value);
1520 }
1521 }
1522 break;
1523 case NSPACEL:
1524 if (flags & SCF_DO_STCLASS_AND) {
1525 if (data->start_class->flags & ANYOF_LOCALE) {
1526 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
1527 for (value = 0; value < 256; value++)
1528 if (!isSPACE(value))
1529 ANYOF_BITMAP_CLEAR(data->start_class, value);
1530 }
1531 }
1532 else {
1533 data->start_class->flags |= ANYOF_LOCALE;
1534 ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
1535 }
1536 break;
1537 case DIGIT:
1538 if (flags & SCF_DO_STCLASS_AND) {
1539 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NDIGIT);
1540 for (value = 0; value < 256; value++)
1541 if (!isDIGIT(value))
1542 ANYOF_BITMAP_CLEAR(data->start_class, value);
1543 }
1544 else {
1545 if (data->start_class->flags & ANYOF_LOCALE)
1546 ANYOF_CLASS_SET(data->start_class,ANYOF_DIGIT);
1547 else {
1548 for (value = 0; value < 256; value++)
1549 if (isDIGIT(value))
1550 ANYOF_BITMAP_SET(data->start_class, value);
1551 }
1552 }
1553 break;
1554 case NDIGIT:
1555 if (flags & SCF_DO_STCLASS_AND) {
1556 ANYOF_CLASS_CLEAR(data->start_class,ANYOF_DIGIT);
1557 for (value = 0; value < 256; value++)
1558 if (isDIGIT(value))
1559 ANYOF_BITMAP_CLEAR(data->start_class, value);
1560 }
1561 else {
1562 if (data->start_class->flags & ANYOF_LOCALE)
1563 ANYOF_CLASS_SET(data->start_class,ANYOF_NDIGIT);
1564 else {
1565 for (value = 0; value < 256; value++)
1566 if (!isDIGIT(value))
1567 ANYOF_BITMAP_SET(data->start_class, value);
1568 }
1569 }
1570 break;
1571 }
1572 if (flags & SCF_DO_STCLASS_OR)
1573 cl_and(data->start_class, &and_with);
1574 flags &= ~SCF_DO_STCLASS;
1575 }
1576 }
1577 else if (PL_regkind[(U8)OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
1578 data->flags |= (OP(scan) == MEOL
1579 ? SF_BEFORE_MEOL
1580 : SF_BEFORE_SEOL);
1581 }
1582 else if ( PL_regkind[(U8)OP(scan)] == BRANCHJ
1583 /* Lookbehind, or need to calculate parens/evals/stclass: */
1584 && (scan->flags || data || (flags & SCF_DO_STCLASS))
1585 && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
1586 /* Lookahead/lookbehind */
1587 I32 deltanext, minnext, fake = 0;
1588 regnode *nscan;
1589 struct regnode_charclass_class intrnl;
1590 int f = 0;
1591
1592 data_fake.flags = 0;
1593 if (data) {
1594 data_fake.whilem_c = data->whilem_c;
1595 data_fake.last_closep = data->last_closep;
1596 }
1597 else
1598 data_fake.last_closep = &fake;
1599 if ( flags & SCF_DO_STCLASS && !scan->flags
1600 && OP(scan) == IFMATCH ) { /* Lookahead */
1601 cl_init(pRExC_state, &intrnl);
1602 data_fake.start_class = &intrnl;
1603 f |= SCF_DO_STCLASS_AND;
1604 }
1605 if (flags & SCF_WHILEM_VISITED_POS)
1606 f |= SCF_WHILEM_VISITED_POS;
1607 next = regnext(scan);
1608 nscan = NEXTOPER(NEXTOPER(scan));
1609 minnext = study_chunk(pRExC_state, &nscan, &deltanext, last, &data_fake, f);
1610 if (scan->flags) {
1611 if (deltanext) {
1612 vFAIL("Variable length lookbehind not implemented");
1613 }
1614 else if (minnext > U8_MAX) {
1615 vFAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
1616 }
1617 scan->flags = (U8)minnext;
1618 }
1619 if (data && data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
1620 pars++;
1621 if (data && (data_fake.flags & SF_HAS_EVAL))
1622 data->flags |= SF_HAS_EVAL;
1623 if (data)
1624 data->whilem_c = data_fake.whilem_c;
1625 if (f & SCF_DO_STCLASS_AND) {
1626 int was = (data->start_class->flags & ANYOF_EOS);
1627
1628 cl_and(data->start_class, &intrnl);
1629 if (was)
1630 data->start_class->flags |= ANYOF_EOS;
1631 }
1632 }
1633 else if (OP(scan) == OPEN) {
1634 pars++;
1635 }
1636 else if (OP(scan) == CLOSE) {
1637 if ((I32)ARG(scan) == is_par) {
1638 next = regnext(scan);
1639
1640 if ( next && (OP(next) != WHILEM) && next < last)
1641 is_par = 0; /* Disable optimization */
1642 }
1643 if (data)
1644 *(data->last_closep) = ARG(scan);
1645 }
1646 else if (OP(scan) == EVAL) {
1647 if (data)
1648 data->flags |= SF_HAS_EVAL;
1649 }
1650 else if (OP(scan) == LOGICAL && scan->flags == 2) { /* Embedded follows */
1651 if (flags & SCF_DO_SUBSTR) {
1652 scan_commit(pRExC_state,data);
1653 data->longest = &(data->longest_float);
1654 }
1655 is_inf = is_inf_internal = 1;
1656 if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
1657 cl_anything(pRExC_state, data->start_class);
1658 flags &= ~SCF_DO_STCLASS;
1659 }
1660 /* Else: zero-length, ignore. */
1661 scan = regnext(scan);
1662 }
1663
1664 finish:
1665 *scanp = scan;
1666 *deltap = is_inf_internal ? I32_MAX : delta;
1667 if (flags & SCF_DO_SUBSTR && is_inf)
1668 data->pos_delta = I32_MAX - data->pos_min;
1669 if (is_par > U8_MAX)
1670 is_par = 0;
1671 if (is_par && pars==1 && data) {
1672 data->flags |= SF_IN_PAR;
1673 data->flags &= ~SF_HAS_PAR;
1674 }
1675 else if (pars && data) {
1676 data->flags |= SF_HAS_PAR;
1677 data->flags &= ~SF_IN_PAR;
1678 }
1679 if (flags & SCF_DO_STCLASS_OR)
1680 cl_and(data->start_class, &and_with);
1681 return min;
1682 }
1683
1684 STATIC I32
1685 S_add_data(pTHX_ RExC_state_t *pRExC_state, I32 n, char *s)
1686 {
1687 if (RExC_rx->data) {
1688 Renewc(RExC_rx->data,
1689 sizeof(*RExC_rx->data) + sizeof(void*) * (RExC_rx->data->count + n - 1),
1690 char, struct reg_data);
1691 Renew(RExC_rx->data->what, RExC_rx->data->count + n, U8);
1692 RExC_rx->data->count += n;
1693 }
1694 else {
1695 Newc(1207, RExC_rx->data, sizeof(*RExC_rx->data) + sizeof(void*) * (n - 1),
1696 char, struct reg_data);
1697 New(1208, RExC_rx->data->what, n, U8);
1698 RExC_rx->data->count = n;
1699 }
1700 Copy(s, RExC_rx->data->what + RExC_rx->data->count - n, n, U8);
1701 return RExC_rx->data->count - n;
1702 }
1703
1704 void
1705 Perl_reginitcolors(pTHX)
1706 {
1707 int i = 0;
1708 char *s = PerlEnv_getenv("PERL_RE_COLORS");
1709
1710 if (s) {
1711 PL_colors[0] = s = savepv(s);
1712 while (++i < 6) {
1713 s = strchr(s, '\t');
1714 if (s) {
1715 *s = '\0';
1716 PL_colors[i] = ++s;
1717 }
1718 else
1719 PL_colors[i] = s = "";
1720 }
1721 } else {
1722 while (i < 6)
1723 PL_colors[i++] = "";
1724 }
1725 PL_colorset = 1;
1726 }
1727
1728
1729 /*
1730 - pregcomp - compile a regular expression into internal code
1731 *
1732 * We can't allocate space until we know how big the compiled form will be,
1733 * but we can't compile it (and thus know how big it is) until we've got a
1734 * place to put the code. So we cheat: we compile it twice, once with code
1735 * generation turned off and size counting turned on, and once "for real".
1736 * This also means that we don't allocate space until we are sure that the
1737 * thing really will compile successfully, and we never have to move the
1738 * code and thus invalidate pointers into it. (Note that it has to be in
1739 * one piece because free() must be able to free it all.) [NB: not true in perl]
1740 *
1741 * Beware that the optimization-preparation code in here knows about some
1742 * of the structure of the compiled regexp. [I'll say.]
1743 */
1744 regexp *
1745 Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm)
1746 {
1747 register regexp *r;
1748 regnode *scan;
1749 regnode *first;
1750 I32 flags;
1751 I32 minlen = 0;
1752 I32 sawplus = 0;
1753 I32 sawopen = 0;
1754 scan_data_t data;
1755 RExC_state_t RExC_state;
1756 RExC_state_t *pRExC_state = &RExC_state;
1757
1758 if (exp == NULL)
1759 FAIL("NULL regexp argument");
1760
1761 RExC_utf8 = pm->op_pmdynflags & PMdf_CMP_UTF8;
1762
1763 RExC_precomp = exp;
1764 DEBUG_r({
1765 if (!PL_colorset) reginitcolors();
1766 PerlIO_printf(Perl_debug_log, "%sCompiling REx%s `%s%*s%s'\n",
1767 PL_colors[4],PL_colors[5],PL_colors[0],
1768 (int)(xend - exp), RExC_precomp, PL_colors[1]);
1769 });
1770 RExC_flags = pm->op_pmflags;
1771 RExC_sawback = 0;
1772
1773 RExC_seen = 0;
1774 RExC_seen_zerolen = *exp == '^' ? -1 : 0;
1775 RExC_seen_evals = 0;
1776 RExC_extralen = 0;
1777
1778 /* First pass: determine size, legality. */
1779 RExC_parse = exp;
1780 RExC_start = exp;
1781 RExC_end = xend;
1782 RExC_naughty = 0;
1783 RExC_npar = 1;
1784 RExC_size = 0L;
1785 RExC_emit = &PL_regdummy;
1786 RExC_whilem_seen = 0;
1787 #if 0 /* REGC() is (currently) a NOP at the first pass.
1788 * Clever compilers notice this and complain. --jhi */
1789 REGC((U8)REG_MAGIC, (char*)RExC_emit);
1790 #endif
1791 if (reg(pRExC_state, 0, &flags) == NULL) {
1792 RExC_precomp = Nullch;
1793 return(NULL);
1794 }
1795 DEBUG_r(PerlIO_printf(Perl_debug_log, "size %"IVdf" ", (IV)RExC_size));
1796
1797 /* Small enough for pointer-storage convention?
1798 If extralen==0, this means that we will not need long jumps. */
1799 if (RExC_size >= 0x10000L && RExC_extralen)
1800 RExC_size += RExC_extralen;
1801 else
1802 RExC_extralen = 0;
1803 if (RExC_whilem_seen > 15)
1804 RExC_whilem_seen = 15;
1805
1806 /* Allocate space and initialize. */
1807 Newc(1001, r, sizeof(regexp) + (unsigned)RExC_size * sizeof(regnode),
1808 char, regexp);
1809 if (r == NULL)
1810 FAIL("Regexp out of space");
1811
1812 #ifdef DEBUGGING
1813 /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
1814 Zero(r, sizeof(regexp) + (unsigned)RExC_size * sizeof(regnode), char);
1815 #endif
1816 r->refcnt = 1;
1817 r->prelen = xend - exp;
1818 r->precomp = savepvn(RExC_precomp, r->prelen);
1819 r->subbeg = NULL;
1820 r->reganch = pm->op_pmflags & PMf_COMPILETIME;
1821 r->nparens = RExC_npar - 1; /* set early to validate backrefs */
1822
1823 r->substrs = 0; /* Useful during FAIL. */
1824 r->startp = 0; /* Useful during FAIL. */
1825 r->endp = 0; /* Useful during FAIL. */
1826
1827 Newz(1304, r->offsets, 2*RExC_size+1, U32); /* MJD 20001228 */
1828 if (r->offsets) {
1829 r->offsets[0] = RExC_size;
1830 }
1831 DEBUG_r(PerlIO_printf(Perl_debug_log,
1832 "%s %"UVuf" bytes for offset annotations.\n",
1833 r->offsets ? "Got" : "Couldn't get",
1834 (UV)((2*RExC_size+1) * sizeof(U32))));
1835
1836 RExC_rx = r;
1837
1838 /* Second pass: emit code. */
1839 RExC_flags = pm->op_pmflags; /* don't let top level (?i) bleed */
1840 RExC_parse = exp;
1841 RExC_end = xend;
1842 RExC_naughty = 0;
1843 RExC_npar = 1;
1844 RExC_emit_start = r->program;
1845 RExC_emit = r->program;
1846 /* Store the count of eval-groups for security checks: */
1847 RExC_emit->next_off = (U16)((RExC_seen_evals > U16_MAX) ? U16_MAX : RExC_seen_evals);
1848 REGC((U8)REG_MAGIC, (char*) RExC_emit++);
1849 r->data = 0;
1850 if (reg(pRExC_state, 0, &flags) == NULL)
1851 return(NULL);
1852
1853 /* Dig out information for optimizations. */
1854 r->reganch = pm->op_pmflags & PMf_COMPILETIME; /* Again? */
1855 pm->op_pmflags = RExC_flags;
1856 if (UTF)
1857 r->reganch |= ROPT_UTF8; /* Unicode in it? */
1858 r->regstclass = NULL;
1859 if (RExC_naughty >= 10) /* Probably an expensive pattern. */
1860 r->reganch |= ROPT_NAUGHTY;
1861 scan = r->program + 1; /* First BRANCH. */
1862
1863 /* XXXX To minimize changes to RE engine we always allocate
1864 3-units-long substrs field. */
1865 Newz(1004, r->substrs, 1, struct reg_substr_data);
1866
1867 StructCopy(&zero_scan_data, &data, scan_data_t);
1868 /* XXXX Should not we check for something else? Usually it is OPEN1... */
1869 if (OP(scan) != BRANCH) { /* Only one top-level choice. */
1870 I32 fake;
1871 STRLEN longest_float_length, longest_fixed_length;
1872 struct regnode_charclass_class ch_class;
1873 int stclass_flag;
1874 I32 last_close = 0;
1875
1876 first = scan;
1877 /* Skip introductions and multiplicators >= 1. */
1878 while ((OP(first) == OPEN && (sawopen = 1)) ||
1879 /* An OR of *one* alternative - should not happen now. */
1880 (OP(first) == BRANCH && OP(regnext(first)) != BRANCH) ||
1881 (OP(first) == PLUS) ||
1882 (OP(first) == MINMOD) ||
1883 /* An {n,m} with n>0 */
1884 (PL_regkind[(U8)OP(first)] == CURLY && ARG1(first) > 0) ) {
1885 if (OP(first) == PLUS)
1886 sawplus = 1;
1887 else
1888 first += regarglen[(U8)OP(first)];
1889 first = NEXTOPER(first);
1890 }
1891
1892 /* Starting-point info. */
1893 again:
1894 if (PL_regkind[(U8)OP(first)] == EXACT) {
1895 if (OP(first) == EXACT)
1896 ; /* Empty, get anchored substr later. */
1897 else if ((OP(first) == EXACTF || OP(first) == EXACTFL))
1898 r->regstclass = first;
1899 }
1900 else if (strchr((char*)PL_simple,OP(first)))
1901 r->regstclass = first;
1902 else if (PL_regkind[(U8)OP(first)] == BOUND ||
1903 PL_regkind[(U8)OP(first)] == NBOUND)
1904 r->regstclass = first;
1905 else if (PL_regkind[(U8)OP(first)] == BOL) {
1906 r->reganch |= (OP(first) == MBOL
1907 ? ROPT_ANCH_MBOL
1908 : (OP(first) == SBOL
1909 ? ROPT_ANCH_SBOL
1910 : ROPT_ANCH_BOL));
1911 first = NEXTOPER(first);
1912 goto again;
1913 }
1914 else if (OP(first) == GPOS) {
1915 r->reganch |= ROPT_ANCH_GPOS;
1916 first = NEXTOPER(first);
1917 goto again;
1918 }
1919 else if (!sawopen && (OP(first) == STAR &&
1920 PL_regkind[(U8)OP(NEXTOPER(first))] == REG_ANY) &&
1921 !(r->reganch & ROPT_ANCH) )
1922 {
1923 /* turn .* into ^.* with an implied $*=1 */
1924 int type = OP(NEXTOPER(first));
1925
1926 if (type == REG_ANY)
1927 type = ROPT_ANCH_MBOL;
1928 else
1929 type = ROPT_ANCH_SBOL;
1930
1931 r->reganch |= type | ROPT_IMPLICIT;
1932 first = NEXTOPER(first);
1933 goto again;
1934 }
1935 if (sawplus && (!sawopen || !RExC_sawback)
1936 && !(RExC_seen & REG_SEEN_EVAL)) /* May examine pos and $& */
1937 /* x+ must match at the 1st pos of run of x's */
1938 r->reganch |= ROPT_SKIP;
1939
1940 /* Scan is after the zeroth branch, first is atomic matcher. */
1941 DEBUG_r(PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
1942 (IV)(first - scan + 1)));
1943 /*
1944 * If there's something expensive in the r.e., find the
1945 * longest literal string that must appear and make it the
1946 * regmust. Resolve ties in favor of later strings, since
1947 * the regstart check works with the beginning of the r.e.
1948 * and avoiding duplication strengthens checking. Not a
1949 * strong reason, but sufficient in the absence of others.
1950 * [Now we resolve ties in favor of the earlier string if
1951 * it happens that c_offset_min has been invalidated, since the
1952 * earlier string may buy us something the later one won't.]
1953 */
1954 minlen = 0;
1955
1956 data.longest_fixed = newSVpvn("",0);
1957 data.longest_float = newSVpvn("",0);
1958 data.last_found = newSVpvn("",0);
1959 data.longest = &(data.longest_fixed);
1960 first = scan;
1961 if (!r->regstclass) {
1962 cl_init(pRExC_state, &ch_class);
1963 data.start_class = &ch_class;
1964 stclass_flag = SCF_DO_STCLASS_AND;
1965 } else /* XXXX Check for BOUND? */
1966 stclass_flag = 0;
1967 data.last_closep = &last_close;
1968
1969 minlen = study_chunk(pRExC_state, &first, &fake, scan + RExC_size, /* Up to end */
1970 &data, SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag);
1971 if ( RExC_npar == 1 && data.longest == &(data.longest_fixed)
1972 && data.last_start_min == 0 && data.last_end > 0
1973 && !RExC_seen_zerolen
1974 && (!(RExC_seen & REG_SEEN_GPOS) || (r->reganch & ROPT_ANCH_GPOS)))
1975 r->reganch |= ROPT_CHECK_ALL;
1976 scan_commit(pRExC_state, &data);
1977 SvREFCNT_dec(data.last_found);
1978
1979 longest_float_length = CHR_SVLEN(data.longest_float);
1980 if (longest_float_length
1981 || (data.flags & SF_FL_BEFORE_EOL
1982 && (!(data.flags & SF_FL_BEFORE_MEOL)
1983 || (RExC_flags & PMf_MULTILINE)))) {
1984 int t;
1985
1986 if (SvCUR(data.longest_fixed) /* ok to leave SvCUR */
1987 && data.offset_fixed == data.offset_float_min
1988 && SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
1989 goto remove_float; /* As in (a)+. */
1990
1991 if (SvUTF8(data.longest_float)) {
1992 r->float_utf8 = data.longest_float;
1993 r->float_substr = Nullsv;
1994 } else {
1995 r->float_substr = data.longest_float;
1996 r->float_utf8 = Nullsv;
1997 }
1998 r->float_min_offset = data.offset_float_min;
1999 r->float_max_offset = data.offset_float_max;
2000 t = (data.flags & SF_FL_BEFORE_EOL /* Can't have SEOL and MULTI */
2001 && (!(data.flags & SF_FL_BEFORE_MEOL)
2002 || (RExC_flags & PMf_MULTILINE)));
2003 fbm_compile(data.longest_float, t ? FBMcf_TAIL : 0);
2004 }
2005 else {
2006 remove_float:
2007 r->float_substr = r->float_utf8 = Nullsv;
2008 SvREFCNT_dec(data.longest_float);
2009 longest_float_length = 0;
2010 }
2011
2012 longest_fixed_length = CHR_SVLEN(data.longest_fixed);
2013 if (longest_fixed_length
2014 || (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
2015 && (!(data.flags & SF_FIX_BEFORE_MEOL)
2016 || (RExC_flags & PMf_MULTILINE)))) {
2017 int t;
2018
2019 if (SvUTF8(data.longest_fixed)) {
2020 r->anchored_utf8 = data.longest_fixed;
2021 r->anchored_substr = Nullsv;
2022 } else {
2023 r->anchored_substr = data.longest_fixed;
2024 r->anchored_utf8 = Nullsv;
2025 }
2026 r->anchored_offset = data.offset_fixed;
2027 t = (data.flags & SF_FIX_BEFORE_EOL /* Can't have SEOL and MULTI */
2028 && (!(data.flags & SF_FIX_BEFORE_MEOL)
2029 || (RExC_flags & PMf_MULTILINE)));
2030 fbm_compile(data.longest_fixed, t ? FBMcf_TAIL : 0);
2031 }
2032 else {
2033 r->anchored_substr = r->anchored_utf8 = Nullsv;
2034 SvREFCNT_dec(data.longest_fixed);
2035 longest_fixed_length = 0;
2036 }
2037 if (r->regstclass
2038 && (OP(r->regstclass) == REG_ANY || OP(r->regstclass) == SANY))
2039 r->regstclass = NULL;
2040 if ((!(r->anchored_substr || r->anchored_utf8) || r->anchored_offset)
2041 && stclass_flag
2042 && !(data.start_class->flags & ANYOF_EOS)
2043 && !cl_is_anything(data.start_class))
2044 {
2045 I32 n = add_data(pRExC_state, 1, "f");
2046
2047 New(1006, RExC_rx->data->data[n], 1,
2048 struct regnode_charclass_class);
2049 StructCopy(data.start_class,
2050 (struct regnode_charclass_class*)RExC_rx->data->data[n],
2051 struct regnode_charclass_class);
2052 r->regstclass = (regnode*)RExC_rx->data->data[n];
2053 r->reganch &= ~ROPT_SKIP; /* Used in find_byclass(). */
2054 PL_regdata = r->data; /* for regprop() */
2055 DEBUG_r({ SV *sv = sv_newmortal();
2056 regprop(sv, (regnode*)data.start_class);
2057 PerlIO_printf(Perl_debug_log,
2058 "synthetic stclass `%s'.\n",
2059 SvPVX(sv));});
2060 }
2061
2062 /* A temporary algorithm prefers floated substr to fixed one to dig more info. */
2063 if (longest_fixed_length > longest_float_length) {
2064 r->check_substr = r->anchored_substr;
2065 r->check_utf8 = r->anchored_utf8;
2066 r->check_offset_min = r->check_offset_max = r->anchored_offset;
2067 if (r->reganch & ROPT_ANCH_SINGLE)
2068 r->reganch |= ROPT_NOSCAN;
2069 }
2070 else {
2071 r->check_substr = r->float_substr;
2072 r->check_utf8 = r->float_utf8;
2073 r->check_offset_min = data.offset_float_min;
2074 r->check_offset_max = data.offset_float_max;
2075 }
2076 /* XXXX Currently intuiting is not compatible with ANCH_GPOS.
2077 This should be changed ASAP! */
2078 if ((r->check_substr || r->check_utf8) && !(r->reganch & ROPT_ANCH_GPOS)) {
2079 r->reganch |= RE_USE_INTUIT;
2080 if (SvTAIL(r->check_substr ? r->check_substr : r->check_utf8))
2081 r->reganch |= RE_INTUIT_TAIL;
2082 }
2083 }
2084 else {
2085 /* Several toplevels. Best we can is to set minlen. */
2086 I32 fake;
2087 struct regnode_charclass_class ch_class;
2088 I32 last_close = 0;
2089
2090 DEBUG_r(PerlIO_printf(Perl_debug_log, "\n"));
2091 scan = r->program + 1;
2092 cl_init(pRExC_state, &ch_class);
2093 data.start_class = &ch_class;
2094 data.last_closep = &last_close;
2095 minlen = study_chunk(pRExC_state, &scan, &fake, scan + RExC_size, &data, SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS);
2096 r->check_substr = r->check_utf8 = r->anchored_substr = r->anchored_utf8
2097 = r->float_substr = r->float_utf8 = Nullsv;
2098 if (!(data.start_class->flags & ANYOF_EOS)
2099 && !cl_is_anything(data.start_class))
2100 {
2101 I32 n = add_data(pRExC_state, 1, "f");
2102
2103 New(1006, RExC_rx->data->data[n], 1,
2104 struct regnode_charclass_class);
2105 StructCopy(data.start_class,
2106 (struct regnode_charclass_class*)RExC_rx->data->data[n],
2107 struct regnode_charclass_class);
2108 r->regstclass = (regnode*)RExC_rx->data->data[n];
2109 r->reganch &= ~ROPT_SKIP; /* Used in find_byclass(). */
2110 DEBUG_r({ SV* sv = sv_newmortal();
2111 regprop(sv, (regnode*)data.start_class);
2112 PerlIO_printf(Perl_debug_log,
2113 "synthetic stclass `%s'.\n",
2114 SvPVX(sv));});
2115 }
2116 }
2117
2118 r->minlen = minlen;
2119 if (RExC_seen & REG_SEEN_GPOS)
2120 r->reganch |= ROPT_GPOS_SEEN;
2121 if (RExC_seen & REG_SEEN_LOOKBEHIND)
2122 r->reganch |= ROPT_LOOKBEHIND_SEEN;
2123 if (RExC_seen & REG_SEEN_EVAL)
2124 r->reganch |= ROPT_EVAL_SEEN;
2125 if (RExC_seen & REG_SEEN_CANY)
2126 r->reganch |= ROPT_CANY_SEEN;
2127 Newz(1002, r->startp, RExC_npar, I32);
2128 Newz(1002, r->endp, RExC_npar, I32);
2129 PL_regdata = r->data; /* for regprop() */
2130 DEBUG_r(regdump(r));
2131 return(r);
2132 }
2133
2134 /*
2135 - reg - regular expression, i.e. main body or parenthesized thing
2136 *
2137 * Caller must absorb opening parenthesis.
2138 *
2139 * Combining parenthesis handling with the base level of regular expression
2140 * is a trifle forced, but the need to tie the tails of the branches to what
2141 * follows makes it hard to avoid.
2142 */
2143 STATIC regnode *
2144 S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp)
2145 /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
2146 {
2147 register regnode *ret; /* Will be the head of the group. */
2148 register regnode *br;
2149 register regnode *lastbr;
2150 register regnode *ender = 0;
2151 register I32 parno = 0;
2152 I32 flags, oregflags = RExC_flags, have_branch = 0, open = 0;
2153
2154 /* for (?g), (?gc), and (?o) warnings; warning
2155 about (?c) will warn about (?g) -- japhy */
2156
2157 I32 wastedflags = 0x00,
2158 wasted_o = 0x01,
2159 wasted_g = 0x02,
2160 wasted_gc = 0x02 | 0x04,
2161 wasted_c = 0x04;
2162
2163 char * parse_start = RExC_parse; /* MJD */
2164 char *oregcomp_parse = RExC_parse;
2165 char c;
2166
2167 *flagp = 0; /* Tentatively. */
2168
2169
2170 /* Make an OPEN node, if parenthesized. */
2171 if (paren) {
2172 if (*RExC_parse == '?') { /* (?...) */
2173 U32 posflags = 0, negflags = 0;
2174 U32 *flagsp = &posflags;
2175 int logical = 0;
2176 char *seqstart = RExC_parse;
2177
2178 RExC_parse++;
2179 paren = *RExC_parse++;
2180 ret = NULL; /* For look-ahead/behind. */
2181 switch (paren) {
2182 case '<': /* (?<...) */
2183 RExC_seen |= REG_SEEN_LOOKBEHIND;
2184 if (*RExC_parse == '!')
2185 paren = ',';
2186 if (*RExC_parse != '=' && *RExC_parse != '!')
2187 goto unknown;
2188 RExC_parse++;
2189 case '=': /* (?=...) */
2190 case '!': /* (?!...) */
2191 RExC_seen_zerolen++;
2192 case ':': /* (?:...) */
2193 case '>': /* (?>...) */
2194 break;
2195 case '$': /* (?$...) */
2196 case '@': /* (?@...) */
2197 vFAIL2("Sequence (?%c...) not implemented", (int)paren);
2198 break;
2199 case '#': /* (?#...) */
2200 while (*RExC_parse && *RExC_parse != ')')
2201 RExC_parse++;
2202 if (*RExC_parse != ')')
2203 FAIL("Sequence (?#... not terminated");
2204 nextchar(pRExC_state);
2205 *flagp = TRYAGAIN;
2206 return NULL;
2207 case 'p': /* (?p...) */
2208 if (SIZE_ONLY && ckWARN2(WARN_DEPRECATED, WARN_REGEXP))
2209 vWARNdep(RExC_parse, "(?p{}) is deprecated - use (??{})");
2210 /* FALL THROUGH*/
2211 case '?': /* (??...) */
2212 logical = 1;
2213 if (*RExC_parse != '{')
2214 goto unknown;
2215 paren = *RExC_parse++;
2216 /* FALL THROUGH */
2217 case '{': /* (?{...}) */
2218 {
2219 I32 count = 1, n = 0;
2220 char c;
2221 char *s = RExC_parse;
2222 SV *sv;
2223 OP_4tree *sop, *rop;
2224
2225 RExC_seen_zerolen++;
2226 RExC_seen |= REG_SEEN_EVAL;
2227 while (count && (c = *RExC_parse)) {
2228 if (c == '\\' && RExC_parse[1])
2229 RExC_parse++;
2230 else if (c == '{')
2231 count++;
2232 else if (c == '}')
2233 count--;
2234 RExC_parse++;
2235 }
2236 if (*RExC_parse != ')')
2237 {
2238 RExC_parse = s;
2239 vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
2240 }
2241 if (!SIZE_ONLY) {
2242 PAD *pad;
2243
2244 if (RExC_parse - 1 - s)
2245 sv = newSVpvn(s, RExC_parse - 1 - s);
2246 else
2247 sv = newSVpvn("", 0);
2248
2249 ENTER;
2250 Perl_save_re_context(aTHX);
2251 rop = sv_compile_2op(sv, &sop, "re", &pad);
2252 sop->op_private |= OPpREFCOUNTED;
2253 /* re_dup will OpREFCNT_inc */
2254 OpREFCNT_set(sop, 1);
2255 LEAVE;
2256
2257 n = add_data(pRExC_state, 3, "nop");
2258 RExC_rx->data->data[n] = (void*)rop;
2259 RExC_rx->data->data[n+1] = (void*)sop;
2260 RExC_rx->data->data[n+2] = (void*)pad;
2261 SvREFCNT_dec(sv);
2262 }
2263 else { /* First pass */
2264 if (PL_reginterp_cnt < ++RExC_seen_evals
2265 && IN_PERL_RUNTIME)
2266 /* No compiled RE interpolated, has runtime
2267 components ===> unsafe. */
2268 FAIL("Eval-group not allowed at runtime, use re 'eval'");
2269 if (PL_tainting && PL_tainted)
2270 FAIL("Eval-group in insecure regular expression");
2271 }
2272
2273 nextchar(pRExC_state);
2274 if (logical) {
2275 ret = reg_node(pRExC_state, LOGICAL);
2276 if (!SIZE_ONLY)
2277 ret->flags = 2;
2278 regtail(pRExC_state, ret, reganode(pRExC_state, EVAL, n));
2279 /* deal with the length of this later - MJD */
2280 return ret;
2281 }
2282 ret = reganode(pRExC_state, EVAL, n);
2283 Set_Node_Length(ret, RExC_parse - parse_start + 1);
2284 Set_Node_Offset(ret, parse_start);
2285 return ret;
2286 }
2287 case '(': /* (?(?{...})...) and (?(?=...)...) */
2288 {
2289 if (RExC_parse[0] == '?') { /* (?(?...)) */
2290 if (RExC_parse[1] == '=' || RExC_parse[1] == '!'
2291 || RExC_parse[1] == '<'
2292 || RExC_parse[1] == '{') { /* Lookahead or eval. */
2293 I32 flag;
2294
2295 ret = reg_node(pRExC_state, LOGICAL);
2296 if (!SIZE_ONLY)
2297 ret->flags = 1;
2298 regtail(pRExC_state, ret, reg(pRExC_state, 1, &flag));
2299 goto insert_if;
2300 }
2301 }
2302 else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
2303 /* (?(1)...) */
2304 parno = atoi(RExC_parse++);
2305
2306 while (isDIGIT(*RExC_parse))
2307 RExC_parse++;
2308 ret = reganode(pRExC_state, GROUPP, parno);
2309
2310 if ((c = *nextchar(pRExC_state)) != ')')
2311 vFAIL("Switch condition not recognized");
2312 insert_if:
2313 regtail(pRExC_state, ret, reganode(pRExC_state, IFTHEN, 0));
2314 br = regbranch(pRExC_state, &flags, 1);
2315 if (br == NULL)
2316 br = reganode(pRExC_state, LONGJMP, 0);
2317 else
2318 regtail(pRExC_state, br, reganode(pRExC_state, LONGJMP, 0));
2319 c = *nextchar(pRExC_state);
2320 if (flags&HASWIDTH)
2321 *flagp |= HASWIDTH;
2322 if (c == '|') {
2323 lastbr = reganode(pRExC_state, IFTHEN, 0); /* Fake one for optimizer. */
2324 regbranch(pRExC_state, &flags, 1);
2325 regtail(pRExC_state, ret, lastbr);
2326 if (flags&HASWIDTH)
2327 *flagp |= HASWIDTH;
2328 c = *nextchar(pRExC_state);
2329 }
2330 else
2331 lastbr = NULL;
2332 if (c != ')')
2333 vFAIL("Switch (?(condition)... contains too many branches");
2334 ender = reg_node(pRExC_state, TAIL);
2335 regtail(pRExC_state, br, ender);
2336 if (lastbr) {
2337 regtail(pRExC_state, lastbr, ender);
2338 regtail(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
2339 }
2340 else
2341 regtail(pRExC_state, ret, ender);
2342 return ret;
2343 }
2344 else {
2345 vFAIL2("Unknown switch condition (?(%.2s", RExC_parse);
2346 }
2347 }
2348 case 0:
2349 RExC_parse--; /* for vFAIL to print correctly */
2350 vFAIL("Sequence (? incomplete");
2351 break;
2352 default:
2353 --RExC_parse;
2354 parse_flags: /* (?i) */
2355 while (*RExC_parse && strchr("iogcmsx", *RExC_parse)) {
2356 /* (?g), (?gc) and (?o) are useless here
2357 and must be globally applied -- japhy */
2358
2359 if (*RExC_parse == 'o' || *RExC_parse == 'g') {
2360 if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
2361 I32 wflagbit = *RExC_parse == 'o' ? wasted_o : wasted_g;
2362 if (! (wastedflags & wflagbit) ) {
2363 wastedflags |= wflagbit;
2364 vWARN5(
2365 RExC_parse + 1,
2366 "Useless (%s%c) - %suse /%c modifier",
2367 flagsp == &negflags ? "?-" : "?",
2368 *RExC_parse,
2369 flagsp == &negflags ? "don't " : "",
2370 *RExC_parse
2371 );
2372 }
2373 }
2374 }
2375 else if (*RExC_parse == 'c') {
2376 if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
2377 if (! (wastedflags & wasted_c) ) {
2378 wastedflags |= wasted_gc;
2379 vWARN3(
2380 RExC_parse + 1,
2381 "Useless (%sc) - %suse /gc modifier",
2382 flagsp == &negflags ? "?-" : "?",
2383 flagsp == &negflags ? "don't " : ""
2384 );
2385 }
2386 }
2387 }
2388 else { pmflag(flagsp, *RExC_parse); }
2389
2390 ++RExC_parse;
2391 }
2392 if (*RExC_parse == '-') {
2393 flagsp = &negflags;
2394 wastedflags = 0; /* reset so (?g-c) warns twice */
2395 ++RExC_parse;
2396 goto parse_flags;
2397 }
2398 RExC_flags |= posflags;
2399 RExC_flags &= ~negflags;
2400 if (*RExC_parse == ':') {
2401 RExC_parse++;
2402 paren = ':';
2403 break;
2404 }
2405 unknown:
2406 if (*RExC_parse != ')') {
2407 RExC_parse++;
2408 vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
2409 }
2410 nextchar(pRExC_state);
2411 *flagp = TRYAGAIN;
2412 return NULL;
2413 }
2414 }
2415 else { /* (...) */
2416 parno = RExC_npar;
2417 RExC_npar++;
2418 ret = reganode(pRExC_state, OPEN, parno);
2419 Set_Node_Length(ret, 1); /* MJD */
2420 Set_Node_Offset(ret, RExC_parse); /* MJD */
2421 open = 1;
2422 }
2423 }
2424 else /* ! paren */
2425 ret = NULL;
2426
2427 /* Pick up the branches, linking them together. */
2428 parse_start = RExC_parse; /* MJD */
2429 br = regbranch(pRExC_state, &flags, 1);
2430 /* branch_len = (paren != 0); */
2431
2432 if (br == NULL)
2433 return(NULL);
2434 if (*RExC_parse == '|') {
2435 if (!SIZE_ONLY && RExC_extralen) {
2436 reginsert(pRExC_state, BRANCHJ, br);
2437 }
2438 else { /* MJD */
2439 reginsert(pRExC_state, BRANCH, br);
2440 Set_Node_Length(br, paren != 0);
2441 Set_Node_Offset_To_R(br-RExC_emit_start, parse_start-RExC_start);
2442 }
2443 have_branch = 1;
2444 if (SIZE_ONLY)
2445 RExC_extralen += 1; /* For BRANCHJ-BRANCH. */
2446 }
2447 else if (paren == ':') {
2448 *flagp |= flags&SIMPLE;
2449 }
2450 if (open) { /* Starts with OPEN. */
2451 regtail(pRExC_state, ret, br); /* OPEN -> first. */
2452 }
2453 else if (paren != '?') /* Not Conditional */
2454 ret = br;
2455 *flagp |= flags & (SPSTART | HASWIDTH);
2456 lastbr = br;
2457 while (*RExC_parse == '|') {
2458 if (!SIZE_ONLY && RExC_extralen) {
2459 ender = reganode(pRExC_state, LONGJMP,0);
2460 regtail(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
2461 }
2462 if (SIZE_ONLY)
2463 RExC_extralen += 2; /* Account for LONGJMP. */
2464 nextchar(pRExC_state);
2465 br = regbranch(pRExC_state, &flags, 0);
2466
2467 if (br == NULL)
2468 return(NULL);
2469 regtail(pRExC_state, lastbr, br); /* BRANCH -> BRANCH. */
2470 lastbr = br;
2471 if (flags&HASWIDTH)
2472 *flagp |= HASWIDTH;
2473 *flagp |= flags&SPSTART;
2474 }
2475
2476 if (have_branch || paren != ':') {
2477 /* Make a closing node, and hook it on the end. */
2478 switch (paren) {
2479 case ':':
2480 ender = reg_node(pRExC_state, TAIL);
2481 break;
2482 case 1:
2483 ender = reganode(pRExC_state, CLOSE, parno);
2484 Set_Node_Offset(ender,RExC_parse+1); /* MJD */
2485 Set_Node_Length(ender,1); /* MJD */
2486 break;
2487 case '<':
2488 case ',':
2489 case '=':
2490 case '!':
2491 *flagp &= ~HASWIDTH;
2492 /* FALL THROUGH */
2493 case '>':
2494 ender = reg_node(pRExC_state, SUCCEED);
2495 break;
2496 case 0:
2497 ender = reg_node(pRExC_state, END);
2498 break;
2499 }
2500 regtail(pRExC_state, lastbr, ender);
2501
2502 if (have_branch) {
2503 /* Hook the tails of the branches to the closing node. */
2504 for (br = ret; br != NULL; br = regnext(br)) {
2505 regoptail(pRExC_state, br, ender);
2506 }
2507 }
2508 }
2509
2510 {
2511 char *p;
2512 static char parens[] = "=!<,>";
2513
2514 if (paren && (p = strchr(parens, paren))) {
2515 U8 node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
2516 int flag = (p - parens) > 1;
2517
2518 if (paren == '>')
2519 node = SUSPEND, flag = 0;
2520 reginsert(pRExC_state, node,ret);
2521 Set_Node_Cur_Length(ret);
2522 Set_Node_Offset(ret, parse_start + 1);
2523 ret->flags = flag;
2524 regtail(pRExC_state, ret, reg_node(pRExC_state, TAIL));
2525 }
2526 }
2527
2528 /* Check for proper termination. */
2529 if (paren) {
2530 RExC_flags = oregflags;
2531 if (RExC_parse >= RExC_end || *nextchar(pRExC_state) != ')') {
2532 RExC_parse = oregcomp_parse;
2533 vFAIL("Unmatched (");
2534 }
2535 }
2536 else if (!paren && RExC_parse < RExC_end) {
2537 if (*RExC_parse == ')') {
2538 RExC_parse++;
2539 vFAIL("Unmatched )");
2540 }
2541 else
2542 FAIL("Junk on end of regexp"); /* "Can't happen". */
2543 /* NOTREACHED */
2544 }
2545
2546 return(ret);
2547 }
2548
2549 /*
2550 - regbranch - one alternative of an | operator
2551 *
2552 * Implements the concatenation operator.
2553 */
2554 STATIC regnode *
2555 S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first)
2556 {
2557 register regnode *ret;
2558 register regnode *chain = NULL;
2559 register regnode *latest;
2560 I32 flags = 0, c = 0;
2561
2562 if (first)
2563 ret = NULL;
2564 else {
2565 if (!SIZE_ONLY && RExC_extralen)
2566 ret = reganode(pRExC_state, BRANCHJ,0);
2567 else {
2568 ret = reg_node(pRExC_state, BRANCH);
2569 Set_Node_Length(ret, 1);
2570 }
2571 }
2572
2573 if (!first && SIZE_ONLY)
2574 RExC_extralen += 1; /* BRANCHJ */
2575
2576 *flagp = WORST; /* Tentatively. */
2577
2578 RExC_parse--;
2579 nextchar(pRExC_state);
2580 while (RExC_parse < RExC_end && *RExC_parse != '|' && *RExC_parse != ')') {
2581 flags &= ~TRYAGAIN;
2582 latest = regpiece(pRExC_state, &flags);
2583 if (latest == NULL) {
2584 if (flags & TRYAGAIN)
2585 continue;
2586 return(NULL);
2587 }
2588 else if (ret == NULL)
2589 ret = latest;
2590 *flagp |= flags&HASWIDTH;
2591 if (chain == NULL) /* First piece. */
2592 *flagp |= flags&SPSTART;
2593 else {
2594 RExC_naughty++;
2595 regtail(pRExC_state, chain, latest);
2596 }
2597 chain = latest;
2598 c++;
2599 }
2600 if (chain == NULL) { /* Loop ran zero times. */
2601 chain = reg_node(pRExC_state, NOTHING);
2602 if (ret == NULL)
2603 ret = chain;
2604 }
2605 if (c == 1) {
2606 *flagp |= flags&SIMPLE;
2607 }
2608
2609 return(ret);
2610 }
2611
2612 /*
2613 - regpiece - something followed by possible [*+?]
2614 *
2615 * Note that the branching code sequences used for ? and the general cases
2616 * of * and + are somewhat optimized: they use the same NOTHING node as
2617 * both the endmarker for their branch list and the body of the last branch.
2618 * It might seem that this node could be dispensed with entirely, but the
2619 * endmarker role is not redundant.
2620 */
2621 STATIC regnode *
2622 S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp)
2623 {
2624 register regnode *ret;
2625 register char op;
2626 register char *next;
2627 I32 flags;
2628 char *origparse = RExC_parse;
2629 char *maxpos;
2630 I32 min;
2631 I32 max = REG_INFTY;
2632 char *parse_start;
2633
2634 ret = regatom(pRExC_state, &flags);
2635 if (ret == NULL) {
2636 if (flags & TRYAGAIN)
2637 *flagp |= TRYAGAIN;
2638 return(NULL);
2639 }
2640
2641 op = *RExC_parse;
2642
2643 if (op == '{' && regcurly(RExC_parse)) {
2644 parse_start = RExC_parse; /* MJD */
2645 next = RExC_parse + 1;
2646 maxpos = Nullch;
2647 while (isDIGIT(*next) || *next == ',') {
2648 if (*next == ',') {
2649 if (maxpos)
2650 break;
2651 else
2652 maxpos = next;
2653 }
2654 next++;
2655 }
2656 if (*next == '}') { /* got one */
2657 if (!maxpos)
2658 maxpos = next;
2659 RExC_parse++;
2660 min = atoi(RExC_parse);
2661 if (*maxpos == ',')
2662 maxpos++;
2663 else
2664 maxpos = RExC_parse;
2665 max = atoi(maxpos);
2666 if (!max && *maxpos != '0')
2667 max = REG_INFTY; /* meaning "infinity" */
2668 else if (max >= REG_INFTY)
2669 vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
2670 RExC_parse = next;
2671 nextchar(pRExC_state);
2672
2673 do_curly:
2674 if ((flags&SIMPLE)) {
2675 RExC_naughty += 2 + RExC_naughty / 2;
2676 reginsert(pRExC_state, CURLY, ret);
2677 Set_Node_Offset(ret, parse_start+1); /* MJD */
2678 Set_Node_Cur_Length(ret);
2679 }
2680 else {
2681 regnode *w = reg_node(pRExC_state, WHILEM);
2682
2683 w->flags = 0;
2684 regtail(pRExC_state, ret, w);
2685 if (!SIZE_ONLY && RExC_extralen) {
2686 reginsert(pRExC_state, LONGJMP,ret);
2687 reginsert(pRExC_state, NOTHING,ret);
2688 NEXT_OFF(ret) = 3; /* Go over LONGJMP. */
2689 }
2690 reginsert(pRExC_state, CURLYX,ret);
2691 /* MJD hk */
2692 Set_Node_Offset(ret, parse_start+1);
2693 Set_Node_Length(ret,
2694 op == '{' ? (RExC_parse - parse_start) : 1);
2695
2696 if (!SIZE_ONLY && RExC_extralen)
2697 NEXT_OFF(ret) = 3; /* Go over NOTHING to LONGJMP. */
2698 regtail(pRExC_state, ret, reg_node(pRExC_state, NOTHING));
2699 if (SIZE_ONLY)
2700 RExC_whilem_seen++, RExC_extralen += 3;
2701 RExC_naughty += 4 + RExC_naughty; /* compound interest */
2702 }
2703 ret->flags = 0;
2704
2705 if (min > 0)
2706 *flagp = WORST;
2707 if (max > 0)
2708 *flagp |= HASWIDTH;
2709 if (max && max < min)
2710 vFAIL("Can't do {n,m} with n > m");
2711 if (!SIZE_ONLY) {
2712 ARG1_SET(ret, (U16)min);
2713 ARG2_SET(ret, (U16)max);
2714 }
2715
2716 goto nest_check;
2717 }
2718 }
2719
2720 if (!ISMULT1(op)) {
2721 *flagp = flags;
2722 return(ret);
2723 }
2724
2725 #if 0 /* Now runtime fix should be reliable. */
2726
2727 /* if this is reinstated, don't forget to put this back into perldiag:
2728
2729 =item Regexp *+ operand could be empty at {#} in regex m/%s/
2730
2731 (F) The part of the regexp subject to either the * or + quantifier
2732 could match an empty string. The {#} shows in the regular
2733 expression about where the problem was discovered.
2734
2735 */
2736
2737 if (!(flags&HASWIDTH) && op != '?')
2738 vFAIL("Regexp *+ operand could be empty");
2739 #endif
2740
2741 parse_start = RExC_parse;
2742 nextchar(pRExC_state);
2743
2744 *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
2745
2746 if (op == '*' && (flags&SIMPLE)) {
2747 reginsert(pRExC_state, STAR, ret);
2748 ret->flags = 0;
2749 RExC_naughty += 4;
2750 }
2751 else if (op == '*') {
2752 min = 0;
2753 goto do_curly;
2754 }
2755 else if (op == '+' && (flags&SIMPLE)) {
2756 reginsert(pRExC_state, PLUS, ret);
2757 ret->flags = 0;
2758 RExC_naughty += 3;
2759 }
2760 else if (op == '+') {
2761 min = 1;
2762 goto do_curly;
2763 }
2764 else if (op == '?') {
2765 min = 0; max = 1;
2766 goto do_curly;
2767 }
2768 nest_check:
2769 if (ckWARN(WARN_REGEXP) && !SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3) {
2770 vWARN3(RExC_parse,
2771 "%.*s matches null string many times",
2772 RExC_parse - origparse,
2773 origparse);
2774 }
2775
2776 if (*RExC_parse == '?') {
2777 nextchar(pRExC_state);
2778 reginsert(pRExC_state, MINMOD, ret);
2779 regtail(pRExC_state, ret, ret + NODE_STEP_REGNODE);
2780 }
2781 if (ISMULT2(RExC_parse)) {
2782 RExC_parse++;
2783 vFAIL("Nested quantifiers");
2784 }
2785
2786 return(ret);
2787 }
2788
2789 /*
2790 - regatom - the lowest level
2791 *
2792 * Optimization: gobbles an entire sequence of ordinary characters so that
2793 * it can turn them into a single node, which is smaller to store and
2794 * faster to run. Backslashed characters are exceptions, each becoming a
2795 * separate node; the code is simpler that way and it's not worth fixing.
2796 *
2797 * [Yes, it is worth fixing, some scripts can run twice the speed.] */
2798 STATIC regnode *
2799 S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp)
2800 {
2801 register regnode *ret = 0;
2802 I32 flags;
2803 char *parse_start = RExC_parse;
2804
2805 *flagp = WORST; /* Tentatively. */
2806
2807 tryagain:
2808 switch (*RExC_parse) {
2809 case '^':
2810 RExC_seen_zerolen++;
2811 nextchar(pRExC_state);
2812 if (RExC_flags & PMf_MULTILINE)
2813 ret = reg_node(pRExC_state, MBOL);
2814 else if (RExC_flags & PMf_SINGLELINE)
2815 ret = reg_node(pRExC_state, SBOL);
2816 else
2817 ret = reg_node(pRExC_state, BOL);
2818 Set_Node_Length(ret, 1); /* MJD */
2819 break;
2820 case '$':
2821 nextchar(pRExC_state);
2822 if (*RExC_parse)
2823 RExC_seen_zerolen++;
2824 if (RExC_flags & PMf_MULTILINE)
2825 ret = reg_node(pRExC_state, MEOL);
2826 else if (RExC_flags & PMf_SINGLELINE)
2827 ret = reg_node(pRExC_state, SEOL);
2828 else
2829 ret = reg_node(pRExC_state, EOL);
2830 Set_Node_Length(ret, 1); /* MJD */
2831 break;
2832 case '.':
2833 nextchar(pRExC_state);
2834 if (RExC_flags & PMf_SINGLELINE)
2835 ret = reg_node(pRExC_state, SANY);
2836 else
2837 ret = reg_node(pRExC_state, REG_ANY);
2838 *flagp |= HASWIDTH|SIMPLE;
2839 RExC_naughty++;
2840 Set_Node_Length(ret, 1); /* MJD */
2841 break;
2842 case '[':
2843 {
2844 char *oregcomp_parse = ++RExC_parse;
2845 ret = regclass(pRExC_state);
2846 if (*RExC_parse != ']') {
2847 RExC_parse = oregcomp_parse;
2848 vFAIL("Unmatched [");
2849 }
2850 nextchar(pRExC_state);
2851 *flagp |= HASWIDTH|SIMPLE;
2852 Set_Node_Length(ret, RExC_parse - oregcomp_parse + 1); /* MJD */
2853 break;
2854 }
2855 case '(':
2856 nextchar(pRExC_state);
2857 ret = reg(pRExC_state, 1, &flags);
2858 if (ret == NULL) {
2859 if (flags & TRYAGAIN) {
2860 if (RExC_parse == RExC_end) {
2861 /* Make parent create an empty node if needed. */
2862 *flagp |= TRYAGAIN;
2863 return(NULL);
2864 }
2865 goto tryagain;
2866 }
2867 return(NULL);
2868 }
2869 *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE);
2870 break;
2871 case '|':
2872 case ')':
2873 if (flags & TRYAGAIN) {
2874 *flagp |= TRYAGAIN;
2875 return NULL;
2876 }
2877 vFAIL("Internal urp");
2878 /* Supposed to be caught earlier. */
2879 break;
2880 case '{':
2881 if (!regcurly(RExC_parse)) {
2882 RExC_parse++;
2883 goto defchar;
2884 }
2885 /* FALL THROUGH */
2886 case '?':
2887 case '+':
2888 case '*':
2889 RExC_parse++;
2890 vFAIL("Quantifier follows nothing");
2891 break;
2892 case '\\':
2893 switch (*++RExC_parse) {
2894 case 'A':
2895 RExC_seen_zerolen++;
2896 ret = reg_node(pRExC_state, SBOL);
2897 *flagp |= SIMPLE;
2898 nextchar(pRExC_state);
2899 Set_Node_Length(ret, 2); /* MJD */
2900 break;
2901 case 'G':
2902 ret = reg_node(pRExC_state, GPOS);
2903 RExC_seen |= REG_SEEN_GPOS;
2904 *flagp |= SIMPLE;
2905 nextchar(pRExC_state);
2906 Set_Node_Length(ret, 2); /* MJD */
2907 break;
2908 case 'Z':
2909 ret = reg_node(pRExC_state, SEOL);
2910 *flagp |= SIMPLE;
2911 RExC_seen_zerolen++; /* Do not optimize RE away */
2912 nextchar(pRExC_state);
2913 break;
2914 case 'z':
2915 ret = reg_node(pRExC_state, EOS);
2916 *flagp |= SIMPLE;
2917 RExC_seen_zerolen++; /* Do not optimize RE away */
2918 nextchar(pRExC_state);
2919 Set_Node_Length(ret, 2); /* MJD */
2920 break;
2921 case 'C':
2922 ret = reg_node(pRExC_state, CANY);
2923 RExC_seen |= REG_SEEN_CANY;
2924 *flagp |= HASWIDTH|SIMPLE;
2925 nextchar(pRExC_state);
2926 Set_Node_Length(ret, 2); /* MJD */
2927 break;
2928 case 'X':
2929 ret = reg_node(pRExC_state, CLUMP);
2930 *flagp |= HASWIDTH;
2931 nextchar(pRExC_state);
2932 Set_Node_Length(ret, 2); /* MJD */
2933 break;
2934 case 'w':
2935 ret = reg_node(pRExC_state, (U8)(LOC ? ALNUML : ALNUM));
2936 *flagp |= HASWIDTH|SIMPLE;
2937 nextchar(pRExC_state);
2938 Set_Node_Length(ret, 2); /* MJD */
2939 break;
2940 case 'W':
2941 ret = reg_node(pRExC_state, (U8)(LOC ? NALNUML : NALNUM));
2942 *flagp |= HASWIDTH|SIMPLE;
2943 nextchar(pRExC_state);
2944 Set_Node_Length(ret, 2); /* MJD */
2945 break;
2946 case 'b':
2947 RExC_seen_zerolen++;
2948 RExC_seen |= REG_SEEN_LOOKBEHIND;
2949 ret = reg_node(pRExC_state, (U8)(LOC ? BOUNDL : BOUND));
2950 *flagp |= SIMPLE;
2951 nextchar(pRExC_state);
2952 Set_Node_Length(ret, 2); /* MJD */
2953 break;
2954 case 'B':
2955 RExC_seen_zerolen++;
2956 RExC_seen |= REG_SEEN_LOOKBEHIND;
2957 ret = reg_node(pRExC_state, (U8)(LOC ? NBOUNDL : NBOUND));
2958 *flagp |= SIMPLE;
2959 nextchar(pRExC_state);
2960 Set_Node_Length(ret, 2); /* MJD */
2961 break;
2962 case 's':
2963 ret = reg_node(pRExC_state, (U8)(LOC ? SPACEL : SPACE));
2964 *flagp |= HASWIDTH|SIMPLE;
2965 nextchar(pRExC_state);
2966 Set_Node_Length(ret, 2); /* MJD */
2967 break;
2968 case 'S':
2969 ret = reg_node(pRExC_state, (U8)(LOC ? NSPACEL : NSPACE));
2970 *flagp |= HASWIDTH|SIMPLE;
2971 nextchar(pRExC_state);
2972 Set_Node_Length(ret, 2); /* MJD */
2973 break;
2974 case 'd':
2975 ret = reg_node(pRExC_state, DIGIT);
2976 *flagp |= HASWIDTH|SIMPLE;
2977 nextchar(pRExC_state);
2978 Set_Node_Length(ret, 2); /* MJD */
2979 break;
2980 case 'D':
2981 ret = reg_node(pRExC_state, NDIGIT);
2982 *flagp |= HASWIDTH|SIMPLE;
2983 nextchar(pRExC_state);
2984 Set_Node_Length(ret, 2); /* MJD */
2985 break;
2986 case 'p':
2987 case 'P':
2988 {
2989 char* oldregxend = RExC_end;
2990 char* parse_start = RExC_parse - 2;
2991
2992 if (RExC_parse[1] == '{') {
2993 /* a lovely hack--pretend we saw [\pX] instead */
2994 RExC_end = strchr(RExC_parse, '}');
2995 if (!RExC_end) {
2996 U8 c = (U8)*RExC_parse;
2997 RExC_parse += 2;
2998 RExC_end = oldregxend;
2999 vFAIL2("Missing right brace on \\%c{}", c);
3000 }
3001 RExC_end++;
3002 }
3003 else {
3004 RExC_end = RExC_parse + 2;
3005 if (RExC_end > oldregxend)
3006 RExC_end = oldregxend;
3007 }
3008 RExC_parse--;
3009
3010 ret = regclass(pRExC_state);
3011
3012 RExC_end = oldregxend;
3013 RExC_parse--;
3014
3015 Set_Node_Offset(ret, parse_start + 2);
3016 Set_Node_Cur_Length(ret);
3017 nextchar(pRExC_state);
3018 *flagp |= HASWIDTH|SIMPLE;
3019 }
3020 break;
3021 case 'n':
3022 case 'r':
3023 case 't':
3024 case 'f':
3025 case 'e':
3026 case 'a':
3027 case 'x':
3028 case 'c':
3029 case '0':
3030 goto defchar;
3031 case '1': case '2': case '3': case '4':
3032 case '5': case '6': case '7': case '8': case '9':
3033 {
3034 I32 num = atoi(RExC_parse);
3035
3036 if (num > 9 && num >= RExC_npar)
3037 goto defchar;
3038 else {
3039 char * parse_start = RExC_parse - 1; /* MJD */
3040 while (isDIGIT(*RExC_parse))
3041 RExC_parse++;
3042
3043 if (!SIZE_ONLY && num > (I32)RExC_rx->nparens)
3044 vFAIL("Reference to nonexistent group");
3045 RExC_sawback = 1;
3046 ret = reganode(pRExC_state,
3047 (U8)(FOLD ? (LOC ? REFFL : REFF) : REF),
3048 num);
3049 *flagp |= HASWIDTH;
3050
3051 /* override incorrect value set in reganode MJD */
3052 Set_Node_Offset(ret, parse_start+1);
3053 Set_Node_Cur_Length(ret); /* MJD */
3054 RExC_parse--;
3055 nextchar(pRExC_state);
3056 }
3057 }
3058 break;
3059 case '\0':
3060 if (RExC_parse >= RExC_end)
3061 FAIL("Trailing \\");
3062 /* FALL THROUGH */
3063 default:
3064 /* Do not generate `unrecognized' warnings here, we fall
3065 back into the quick-grab loop below */
3066 parse_start--;
3067 goto defchar;
3068 }
3069 break;
3070
3071 case '#':
3072 if (RExC_flags & PMf_EXTENDED) {
3073 while (RExC_parse < RExC_end && *RExC_parse != '\n') RExC_parse++;
3074 if (RExC_parse < RExC_end)
3075 goto tryagain;
3076 }
3077 /* FALL THROUGH */
3078
3079 default: {
3080 register STRLEN len;
3081 register UV ender;
3082 register char *p;
3083 char *oldp, *s;
3084 STRLEN numlen;
3085 STRLEN foldlen;
3086 U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
3087
3088 parse_start = RExC_parse - 1;
3089
3090 RExC_parse++;
3091
3092 defchar:
3093 ender = 0;
3094 ret = reg_node(pRExC_state,
3095 (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
3096 s = STRING(ret);
3097 for (len = 0, p = RExC_parse - 1;
3098 len < 127 && p < RExC_end;
3099 len++)
3100 {
3101 oldp = p;
3102
3103 if (RExC_flags & PMf_EXTENDED)
3104 p = regwhite(p, RExC_end);
3105 switch (*p) {
3106 case '^':
3107 case '$':
3108 case '.':
3109 case '[':
3110 case '(':
3111 case ')':
3112 case '|':
3113 goto loopdone;
3114 case '\\':
3115 switch (*++p) {
3116 case 'A':
3117 case 'C':
3118 case 'X':
3119 case 'G':
3120 case 'Z':
3121 case 'z':
3122 case 'w':
3123 case 'W':
3124 case 'b':
3125 case 'B':
3126 case 's':
3127 case 'S':
3128 case 'd':
3129 case 'D':
3130 case 'p':
3131 case 'P':
3132 --p;
3133 goto loopdone;
3134 case 'n':
3135 ender = '\n';
3136 p++;
3137 break;
3138 case 'r':
3139 ender = '\r';
3140 p++;
3141 break;
3142 case 't':
3143 ender = '\t';
3144 p++;
3145 break;
3146 case 'f':
3147 ender = '\f';
3148 p++;
3149 break;
3150 case 'e':
3151 ender = ASCII_TO_NATIVE('\033');
3152 p++;
3153 break;
3154 case 'a':
3155 ender = ASCII_TO_NATIVE('\007');
3156 p++;
3157 break;
3158 case 'x':
3159 if (*++p == '{') {
3160 char* e = strchr(p, '}');
3161
3162 if (!e) {
3163 RExC_parse = p + 1;
3164 vFAIL("Missing right brace on \\x{}");
3165 }
3166 else {
3167 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
3168 | PERL_SCAN_DISALLOW_PREFIX;
3169 numlen = e - p - 1;
3170 ender = grok_hex(p + 1, &numlen, &flags, NULL);
3171 if (ender > 0xff)
3172 RExC_utf8 = 1;
3173 p = e + 1;
3174 }
3175 }
3176 else {
3177 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
3178 numlen = 2;
3179 ender = grok_hex(p, &numlen, &flags, NULL);
3180 p += numlen;
3181 }
3182 break;
3183 case 'c':
3184 p++;
3185 ender = UCHARAT(p++);
3186 ender = toCTRL(ender);
3187 break;
3188 case '0': case '1': case '2': case '3':case '4':
3189 case '5': case '6': case '7': case '8':case '9':
3190 if (*p == '0' ||
3191 (isDIGIT(p[1]) && atoi(p) >= RExC_npar) ) {
3192 I32 flags = 0;
3193 numlen = 3;
3194 ender = grok_oct(p, &numlen, &flags, NULL);
3195 p += numlen;
3196 }
3197 else {
3198 --p;
3199 goto loopdone;
3200 }
3201 break;
3202 case '\0':
3203 if (p >= RExC_end)
3204 FAIL("Trailing \\");
3205 /* FALL THROUGH */
3206 default:
3207 if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(*p))
3208 vWARN2(p + 1, "Unrecognized escape \\%c passed through", UCHARAT(p));
3209 goto normal_default;
3210 }
3211 break;
3212 default:
3213 normal_default:
3214 if (UTF8_IS_START(*p) && UTF) {
3215 ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
3216 &numlen, 0);
3217 p += numlen;
3218 }
3219 else
3220 ender = *p++;
3221 break;
3222 }
3223 if (RExC_flags & PMf_EXTENDED)
3224 p = regwhite(p, RExC_end);
3225 if (UTF && FOLD) {
3226 /* Prime the casefolded buffer. */
3227 ender = toFOLD_uni(ender, tmpbuf, &foldlen);
3228 }
3229 if (ISMULT2(p)) { /* Back off on ?+*. */
3230 if (len)
3231 p = oldp;
3232 else if (UTF) {
3233 STRLEN unilen;
3234
3235 if (FOLD) {
3236 /* Emit all the Unicode characters. */
3237 for (foldbuf = tmpbuf;
3238 foldlen;
3239 foldlen -= numlen) {
3240 ender = utf8_to_uvchr(foldbuf, &numlen);
3241 if (numlen > 0) {
3242 reguni(pRExC_state, ender, s, &unilen);
3243 s += unilen;
3244 len += unilen;
3245 /* In EBCDIC the numlen
3246 * and unilen can differ. */
3247 foldbuf += numlen;
3248 if (numlen >= foldlen)
3249 break;
3250 }
3251 else
3252 break; /* "Can't happen." */
3253 }
3254 }
3255 else {
3256 reguni(pRExC_state, ender, s, &unilen);
3257 if (unilen > 0) {
3258 s += unilen;
3259 len += unilen;
3260 }
3261 }
3262 }
3263 else {
3264 len++;
3265 REGC((char)ender, s++);
3266 }
3267 break;
3268 }
3269 if (UTF) {
3270 STRLEN unilen;
3271
3272 if (FOLD) {
3273 /* Emit all the Unicode characters. */
3274 for (foldbuf = tmpbuf;
3275 foldlen;
3276 foldlen -= numlen) {
3277 ender = utf8_to_uvchr(foldbuf, &numlen);
3278 if (numlen > 0) {
3279 reguni(pRExC_state, ender, s, &unilen);
3280 len += unilen;
3281 s += unilen;
3282 /* In EBCDIC the numlen
3283 * and unilen can differ. */
3284 foldbuf += numlen;
3285 if (numlen >= foldlen)
3286 break;
3287 }
3288 else
3289 break;
3290 }
3291 }
3292 else {
3293 reguni(pRExC_state, ender, s, &unilen);
3294 if (unilen > 0) {
3295 s += unilen;
3296 len += unilen;
3297 }
3298 }
3299 len--;
3300 }
3301 else
3302 REGC((char)ender, s++);
3303 }
3304 loopdone:
3305 RExC_parse = p - 1;
3306 Set_Node_Cur_Length(ret); /* MJD */
3307 nextchar(pRExC_state);
3308 {
3309 /* len is STRLEN which is unsigned, need to copy to signed */
3310 IV iv = len;
3311 if (iv < 0)
3312 vFAIL("Internal disaster");
3313 }
3314 if (len > 0)
3315 *flagp |= HASWIDTH;
3316 if (len == 1 && UNI_IS_INVARIANT(ender))
3317 *flagp |= SIMPLE;
3318 if (!SIZE_ONLY)
3319 STR_LEN(ret) = len;
3320 if (SIZE_ONLY)
3321 RExC_size += STR_SZ(len);
3322 else
3323 RExC_emit += STR_SZ(len);
3324 }
3325 break;
3326 }
3327
3328 /* If the encoding pragma is in effect recode the text of
3329 * any EXACT-kind nodes. */
3330 if (PL_encoding && PL_regkind[(U8)OP(ret)] == EXACT) {
3331 STRLEN oldlen = STR_LEN(ret);
3332 SV *sv = sv_2mortal(newSVpvn(STRING(ret), oldlen));
3333
3334 if (RExC_utf8)
3335 SvUTF8_on(sv);
3336 if (sv_utf8_downgrade(sv, TRUE)) {
3337 char *s = sv_recode_to_utf8(sv, PL_encoding);
3338 STRLEN newlen = SvCUR(sv);
3339
3340 if (SvUTF8(sv))
3341 RExC_utf8 = 1;
3342 if (!SIZE_ONLY) {
3343 DEBUG_r(PerlIO_printf(Perl_debug_log, "recode %*s to %*s\n",
3344 (int)oldlen, STRING(ret),
3345 (int)newlen, s));
3346 Copy(s, STRING(ret), newlen, char);
3347 STR_LEN(ret) += newlen - oldlen;
3348 RExC_emit += STR_SZ(newlen) - STR_SZ(oldlen);
3349 } else
3350 RExC_size += STR_SZ(newlen) - STR_SZ(oldlen);
3351 }
3352 }
3353
3354 return(ret);
3355 }
3356
3357 STATIC char *
3358 S_regwhite(pTHX_ char *p, char *e)
3359 {
3360 while (p < e) {
3361 if (isSPACE(*p))
3362 ++p;
3363 else if (*p == '#') {
3364 do {
3365 p++;
3366 } while (p < e && *p != '\n');
3367 }
3368 else
3369 break;
3370 }
3371 return p;
3372 }
3373
3374 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
3375 Character classes ([:foo:]) can also be negated ([:^foo:]).
3376 Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
3377 Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
3378 but trigger failures because they are currently unimplemented. */
3379
3380 #define POSIXCC_DONE(c) ((c) == ':')
3381 #define POSIXCC_NOTYET(c) ((c) == '=' || (c) == '.')
3382 #define POSIXCC(c) (POSIXCC_DONE(c) || POSIXCC_NOTYET(c))
3383
3384 STATIC I32
3385 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value)
3386 {
3387 char *posixcc = 0;
3388 I32 namedclass = OOB_NAMEDCLASS;
3389
3390 if (value == '[' && RExC_parse + 1 < RExC_end &&
3391 /* I smell either [: or [= or [. -- POSIX has been here, right? */
3392 POSIXCC(UCHARAT(RExC_parse))) {
3393 char c = UCHARAT(RExC_parse);
3394 char* s = RExC_parse++;
3395
3396 while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != c)
3397 RExC_parse++;
3398 if (RExC_parse == RExC_end)
3399 /* Grandfather lone [:, [=, [. */
3400 RExC_parse = s;
3401 else {
3402 char* t = RExC_parse++; /* skip over the c */
3403
3404 assert(*t == c);
3405
3406 if (UCHARAT(RExC_parse) == ']') {
3407 RExC_parse++; /* skip over the ending ] */
3408 posixcc = s + 1;
3409 if (*s == ':') {
3410 I32 complement = *posixcc == '^' ? *posixcc++ : 0;
3411 I32 skip = t - posixcc;
3412
3413 /* Initially switch on the length of the name. */
3414 switch (skip) {
3415 case 4:
3416 if (memEQ(posixcc, "word", 4)) {
3417 /* this is not POSIX, this is the Perl \w */;
3418 namedclass
3419 = complement ? ANYOF_NALNUM : ANYOF_ALNUM;
3420 }
3421 break;
3422 case 5:
3423 /* Names all of length 5. */
3424 /* alnum alpha ascii blank cntrl digit graph lower
3425 print punct space upper */
3426 /* Offset 4 gives the best switch position. */
3427 switch (posixcc[4]) {
3428 case 'a':
3429 if (memEQ(posixcc, "alph", 4)) {
3430 /* a */
3431 namedclass
3432 = complement ? ANYOF_NALPHA : ANYOF_ALPHA;
3433 }
3434 break;
3435 case 'e':
3436 if (memEQ(posixcc, "spac", 4)) {
3437 /* e */
3438 namedclass
3439 = complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
3440 }
3441 break;
3442 case 'h':
3443 if (memEQ(posixcc, "grap", 4)) {
3444 /* h */
3445 namedclass
3446 = complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
3447 }
3448 break;
3449 case 'i':
3450 if (memEQ(posixcc, "asci", 4)) {
3451 /* i */
3452 namedclass
3453 = complement ? ANYOF_NASCII : ANYOF_ASCII;
3454 }
3455 break;
3456 case 'k':
3457 if (memEQ(posixcc, "blan", 4)) {
3458 /* k */
3459 namedclass
3460 = complement ? ANYOF_NBLANK : ANYOF_BLANK;
3461 }
3462 break;
3463 case 'l':
3464 if (memEQ(posixcc, "cntr", 4)) {
3465 /* l */
3466 namedclass
3467 = complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
3468 }
3469 break;
3470 case 'm':
3471 if (memEQ(posixcc, "alnu", 4)) {
3472 /* m */
3473 namedclass
3474 = complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
3475 }
3476 break;
3477 case 'r':
3478 if (memEQ(posixcc, "lowe", 4)) {
3479 /* r */
3480 namedclass
3481 = complement ? ANYOF_NLOWER : ANYOF_LOWER;
3482 }
3483 if (memEQ(posixcc, "uppe", 4)) {
3484 /* r */
3485 namedclass
3486 = complement ? ANYOF_NUPPER : ANYOF_UPPER;
3487 }
3488 break;
3489 case 't':
3490 if (memEQ(posixcc, "digi", 4)) {
3491 /* t */
3492 namedclass
3493 = complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
3494 }
3495 if (memEQ(posixcc, "prin", 4)) {
3496 /* t */
3497 namedclass
3498 = complement ? ANYOF_NPRINT : ANYOF_PRINT;
3499 }
3500 if (memEQ(posixcc, "punc", 4)) {
3501 /* t */
3502 namedclass
3503 = complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
3504 }
3505 break;
3506 }
3507 break;
3508 case 6:
3509 if (memEQ(posixcc, "xdigit", 6)) {
3510 namedclass
3511 = complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
3512 }
3513 break;
3514 }
3515
3516 if (namedclass == OOB_NAMEDCLASS)
3517 {
3518 Simple_vFAIL3("POSIX class [:%.*s:] unknown",
3519 t - s - 1, s + 1);
3520 }
3521 assert (posixcc[skip] == ':');
3522 assert (posixcc[skip+1] == ']');
3523 } else if (!SIZE_ONLY) {
3524 /* [[=foo=]] and [[.foo.]] are still future. */
3525
3526 /* adjust RExC_parse so the warning shows after
3527 the class closes */
3528 while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse) != ']')
3529 RExC_parse++;
3530 Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
3531 }
3532 } else {
3533 /* Maternal grandfather:
3534 * "[:" ending in ":" but not in ":]" */
3535 RExC_parse = s;
3536 }
3537 }
3538 }
3539
3540 return namedclass;
3541 }
3542
3543 STATIC void
3544 S_checkposixcc(pTHX_ RExC_state_t *pRExC_state)
3545 {
3546 if (!SIZE_ONLY && POSIXCC(UCHARAT(RExC_parse))) {
3547 char *s = RExC_parse;
3548 char c = *s++;
3549
3550 while(*s && isALNUM(*s))
3551 s++;
3552 if (*s && c == *s && s[1] == ']') {
3553 if (ckWARN(WARN_REGEXP))
3554 vWARN3(s+2,
3555 "POSIX syntax [%c %c] belongs inside character classes",
3556 c, c);
3557
3558 /* [[=foo=]] and [[.foo.]] are still future. */
3559 if (POSIXCC_NOTYET(c)) {
3560 /* adjust RExC_parse so the error shows after
3561 the class closes */
3562 while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse++) != ']')
3563 ;
3564 Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
3565 }
3566 }
3567 }
3568 }
3569
3570 STATIC regnode *
3571 S_regclass(pTHX_ RExC_state_t *pRExC_state)
3572 {
3573 register UV value;
3574 register UV nextvalue;
3575 register IV prevvalue = OOB_UNICODE;
3576 register IV range = 0;
3577 register regnode *ret;
3578 STRLEN numlen;
3579 IV namedclass;
3580 char *rangebegin = 0;
3581 bool need_class = 0;
3582 SV *listsv = Nullsv;
3583 register char *e;
3584 UV n;
3585 bool optimize_invert = TRUE;
3586 AV* unicode_alternate = 0;
3587 #ifdef EBCDIC
3588 UV literal_endpoint = 0;
3589 #endif
3590
3591 ret = reganode(pRExC_state, ANYOF, 0);
3592
3593 if (!SIZE_ONLY)
3594 ANYOF_FLAGS(ret) = 0;
3595
3596 if (UCHARAT(RExC_parse) == '^') { /* Complement of range. */
3597 RExC_naughty++;
3598 RExC_parse++;
3599 if (!SIZE_ONLY)
3600 ANYOF_FLAGS(ret) |= ANYOF_INVERT;
3601 }
3602
3603 if (SIZE_ONLY)
3604 RExC_size += ANYOF_SKIP;
3605 else {
3606 RExC_emit += ANYOF_SKIP;
3607 if (FOLD)
3608 ANYOF_FLAGS(ret) |= ANYOF_FOLD;
3609 if (LOC)
3610 ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
3611 ANYOF_BITMAP_ZERO(ret);
3612 listsv = newSVpvn("# comment\n", 10);
3613 }
3614
3615 nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
3616
3617 if (!SIZE_ONLY && POSIXCC(nextvalue))
3618 checkposixcc(pRExC_state);
3619
3620 /* allow 1st char to be ] (allowing it to be - is dealt with later) */
3621 if (UCHARAT(RExC_parse) == ']')
3622 goto charclassloop;
3623
3624 while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
3625
3626 charclassloop:
3627
3628 namedclass = OOB_NAMEDCLASS; /* initialize as illegal */
3629
3630 if (!range)
3631 rangebegin = RExC_parse;
3632 if (UTF) {
3633 value = utf8n_to_uvchr((U8*)RExC_parse,
3634 RExC_end - RExC_parse,
3635 &numlen, 0);
3636 RExC_parse += numlen;
3637 }
3638 else
3639 value = UCHARAT(RExC_parse++);
3640 nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
3641 if (value == '[' && POSIXCC(nextvalue))
3642 namedclass = regpposixcc(pRExC_state, value);
3643 else if (value == '\\') {
3644 if (UTF) {
3645 value = utf8n_to_uvchr((U8*)RExC_parse,
3646 RExC_end - RExC_parse,
3647 &numlen, 0);
3648 RExC_parse += numlen;
3649 }
3650 else
3651 value = UCHARAT(RExC_parse++);
3652 /* Some compilers cannot handle switching on 64-bit integer
3653 * values, therefore value cannot be an UV. Yes, this will
3654 * be a problem later if we want switch on Unicode.
3655 * A similar issue a little bit later when switching on
3656 * namedclass. --jhi */
3657 switch ((I32)value) {
3658 case 'w': namedclass = ANYOF_ALNUM; break;
3659 case 'W': namedclass = ANYOF_NALNUM; break;
3660 case 's': namedclass = ANYOF_SPACE; break;
3661 case 'S': namedclass = ANYOF_NSPACE; break;
3662 case 'd': namedclass = ANYOF_DIGIT; break;
3663 case 'D': namedclass = ANYOF_NDIGIT; break;
3664 case 'p':
3665 case 'P':
3666 if (RExC_parse >= RExC_end)
3667 vFAIL2("Empty \\%c{}", (U8)value);
3668 if (*RExC_parse == '{') {
3669 U8 c = (U8)value;
3670 e = strchr(RExC_parse++, '}');
3671 if (!e)
3672 vFAIL2("Missing right brace on \\%c{}", c);
3673 while (isSPACE(UCHARAT(RExC_parse)))
3674 RExC_parse++;
3675 if (e == RExC_parse)
3676 vFAIL2("Empty \\%c{}", c);
3677 n = e - RExC_parse;
3678 while (isSPACE(UCHARAT(RExC_parse + n - 1)))
3679 n--;
3680 }
3681 else {
3682 e = RExC_parse;
3683 n = 1;
3684 }
3685 if (!SIZE_ONLY) {
3686 if (UCHARAT(RExC_parse) == '^') {
3687 RExC_parse++;
3688 n--;
3689 value = value == 'p' ? 'P' : 'p'; /* toggle */
3690 while (isSPACE(UCHARAT(RExC_parse))) {
3691 RExC_parse++;
3692 n--;
3693 }
3694 }
3695 if (value == 'p')
3696 Perl_sv_catpvf(aTHX_ listsv,
3697 "+utf8::%.*s\n", (int)n, RExC_parse);
3698 else
3699 Perl_sv_catpvf(aTHX_ listsv,
3700 "!utf8::%.*s\n", (int)n, RExC_parse);
3701 }
3702 RExC_parse = e + 1;
3703 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
3704 namedclass = ANYOF_MAX; /* no official name, but it's named */
3705 break;
3706 case 'n': value = '\n'; break;
3707 case 'r': value = '\r'; break;
3708 case 't': value = '\t'; break;
3709 case 'f': value = '\f'; break;
3710 case 'b': value = '\b'; break;
3711 case 'e': value = ASCII_TO_NATIVE('\033');break;
3712 case 'a': value = ASCII_TO_NATIVE('\007');break;
3713 case 'x':
3714 if (*RExC_parse == '{') {
3715 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
3716 | PERL_SCAN_DISALLOW_PREFIX;
3717 e = strchr(RExC_parse++, '}');
3718 if (!e)
3719 vFAIL("Missing right brace on \\x{}");
3720
3721 numlen = e - RExC_parse;
3722 value = grok_hex(RExC_parse, &numlen, &flags, NULL);
3723 RExC_parse = e + 1;
3724 }
3725 else {
3726 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
3727 numlen = 2;
3728 value = grok_hex(RExC_parse, &numlen, &flags, NULL);
3729 RExC_parse += numlen;
3730 }
3731 break;
3732 case 'c':
3733 value = UCHARAT(RExC_parse++);
3734 value = toCTRL(value);
3735 break;
3736 case '0': case '1': case '2': case '3': case '4':
3737 case '5': case '6': case '7': case '8': case '9':
3738 {
3739 I32 flags = 0;
3740 numlen = 3;
3741 value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
3742 RExC_parse += numlen;
3743 break;
3744 }
3745 default:
3746 if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
3747 vWARN2(RExC_parse,
3748 "Unrecognized escape \\%c in character class passed through",
3749 (int)value);
3750 break;
3751 }
3752 } /* end of \blah */
3753 #ifdef EBCDIC
3754 else
3755 literal_endpoint++;
3756 #endif
3757
3758 if (namedclass > OOB_NAMEDCLASS) { /* this is a named class \blah */
3759
3760 if (!SIZE_ONLY && !need_class)
3761 ANYOF_CLASS_ZERO(ret);
3762
3763 need_class = 1;
3764
3765 /* a bad range like a-\d, a-[:digit:] ? */
3766 if (range) {
3767 if (!SIZE_ONLY) {
3768 if (ckWARN(WARN_REGEXP))
3769 vWARN4(RExC_parse,
3770 "False [] range \"%*.*s\"",
3771 RExC_parse - rangebegin,
3772 RExC_parse - rangebegin,
3773 rangebegin);
3774 if (prevvalue < 256) {
3775 ANYOF_BITMAP_SET(ret, prevvalue);
3776 ANYOF_BITMAP_SET(ret, '-');
3777 }
3778 else {
3779 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
3780 Perl_sv_catpvf(aTHX_ listsv,
3781 "%04"UVxf"\n%04"UVxf"\n", (UV)prevvalue, (UV) '-');
3782 }
3783 }
3784
3785 range = 0; /* this was not a true range */
3786 }
3787
3788 if (!SIZE_ONLY) {
3789 const char *what = NULL;
3790 char yesno = 0;
3791
3792 if (namedclass > OOB_NAMEDCLASS)
3793 optimize_invert = FALSE;
3794 /* Possible truncation here but in some 64-bit environments
3795 * the compiler gets heartburn about switch on 64-bit values.
3796 * A similar issue a little earlier when switching on value.
3797 * --jhi */
3798 switch ((I32)namedclass) {
3799 case ANYOF_ALNUM:
3800 if (LOC)
3801 ANYOF_CLASS_SET(ret, ANYOF_ALNUM);
3802 else {
3803 for (value = 0; value < 256; value++)
3804 if (isALNUM(value))
3805 ANYOF_BITMAP_SET(ret, value);
3806 }
3807 yesno = '+';
3808 what = "Word";
3809 break;
3810 case ANYOF_NALNUM:
3811 if (LOC)
3812 ANYOF_CLASS_SET(ret, ANYOF_NALNUM);
3813 else {
3814 for (value = 0; value < 256; value++)
3815 if (!isALNUM(value))
3816 ANYOF_BITMAP_SET(ret, value);
3817 }
3818 yesno = '!';
3819 what = "Word";
3820 break;
3821 case ANYOF_ALNUMC:
3822 if (LOC)
3823 ANYOF_CLASS_SET(ret, ANYOF_ALNUMC);
3824 else {
3825 for (value = 0; value < 256; value++)
3826 if (isALNUMC(value))
3827 ANYOF_BITMAP_SET(ret, value);
3828 }
3829 yesno = '+';
3830 what = "Alnum";
3831 break;
3832 case ANYOF_NALNUMC:
3833 if (LOC)
3834 ANYOF_CLASS_SET(ret, ANYOF_NALNUMC);
3835 else {
3836 for (value = 0; value < 256; value++)
3837 if (!isALNUMC(value))
3838 ANYOF_BITMAP_SET(ret, value);
3839 }
3840 yesno = '!';
3841 what = "Alnum";
3842 break;
3843 case ANYOF_ALPHA:
3844 if (LOC)
3845 ANYOF_CLASS_SET(ret, ANYOF_ALPHA);
3846 else {
3847 for (value = 0; value < 256; value++)
3848 if (isALPHA(value))
3849 ANYOF_BITMAP_SET(ret, value);
3850 }
3851 yesno = '+';
3852 what = "Alpha";
3853 break;
3854 case ANYOF_NALPHA:
3855 if (LOC)
3856 ANYOF_CLASS_SET(ret, ANYOF_NALPHA);
3857 else {
3858 for (value = 0; value < 256; value++)
3859 if (!isALPHA(value))
3860 ANYOF_BITMAP_SET(ret, value);
3861 }
3862 yesno = '!';
3863 what = "Alpha";
3864 break;
3865 case ANYOF_ASCII:
3866 if (LOC)
3867 ANYOF_CLASS_SET(ret, ANYOF_ASCII);
3868 else {
3869 #ifndef EBCDIC
3870 for (value = 0; value < 128; value++)
3871 ANYOF_BITMAP_SET(ret, value);
3872 #else /* EBCDIC */
3873 for (value = 0; value < 256; value++) {
3874 if (isASCII(value))
3875 ANYOF_BITMAP_SET(ret, value);
3876 }
3877 #endif /* EBCDIC */
3878 }
3879 yesno = '+';
3880 what = "ASCII";
3881 break;
3882 case ANYOF_NASCII:
3883 if (LOC)
3884 ANYOF_CLASS_SET(ret, ANYOF_NASCII);
3885 else {
3886 #ifndef EBCDIC
3887 for (value = 128; value < 256; value++)
3888 ANYOF_BITMAP_SET(ret, value);
3889 #else /* EBCDIC */
3890 for (value = 0; value < 256; value++) {
3891 if (!isASCII(value))
3892 ANYOF_BITMAP_SET(ret, value);
3893 }
3894 #endif /* EBCDIC */
3895 }
3896 yesno = '!';
3897 what = "ASCII";
3898 break;
3899 case ANYOF_BLANK:
3900 if (LOC)
3901 ANYOF_CLASS_SET(ret, ANYOF_BLANK);
3902 else {
3903 for (value = 0; value < 256; value++)
3904 if (isBLANK(value))
3905 ANYOF_BITMAP_SET(ret, value);
3906 }
3907 yesno = '+';
3908 what = "Blank";
3909 break;
3910 case ANYOF_NBLANK:
3911 if (LOC)
3912 ANYOF_CLASS_SET(ret, ANYOF_NBLANK);
3913 else {
3914 for (value = 0; value < 256; value++)
3915 if (!isBLANK(value))
3916 ANYOF_BITMAP_SET(ret, value);
3917 }
3918 yesno = '!';
3919 what = "Blank";
3920 break;
3921 case ANYOF_CNTRL:
3922 if (LOC)
3923 ANYOF_CLASS_SET(ret, ANYOF_CNTRL);
3924 else {
3925 for (value = 0; value < 256; value++)
3926 if (isCNTRL(value))
3927 ANYOF_BITMAP_SET(ret, value);
3928 }
3929 yesno = '+';
3930 what = "Cntrl";
3931 break;
3932 case ANYOF_NCNTRL:
3933 if (LOC)
3934 ANYOF_CLASS_SET(ret, ANYOF_NCNTRL);
3935 else {
3936 for (value = 0; value < 256; value++)
3937 if (!isCNTRL(value))
3938 ANYOF_BITMAP_SET(ret, value);
3939 }
3940 yesno = '!';
3941 what = "Cntrl";
3942 break;
3943 case ANYOF_DIGIT:
3944 if (LOC)
3945 ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
3946 else {
3947 /* consecutive digits assumed */
3948 for (value = '0'; value <= '9'; value++)
3949 ANYOF_BITMAP_SET(ret, value);
3950 }
3951 yesno = '+';
3952 what = "Digit";
3953 break;
3954 case ANYOF_NDIGIT:
3955 if (LOC)
3956 ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
3957 else {
3958 /* consecutive digits assumed */
3959 for (value = 0; value < '0'; value++)
3960 ANYOF_BITMAP_SET(ret, value);
3961 for (value = '9' + 1; value < 256; value++)
3962 ANYOF_BITMAP_SET(ret, value);
3963 }
3964 yesno = '!';
3965 what = "Digit";
3966 break;
3967 case ANYOF_GRAPH:
3968 if (LOC)
3969 ANYOF_CLASS_SET(ret, ANYOF_GRAPH);
3970 else {
3971 for (value = 0; value < 256; value++)
3972 if (isGRAPH(value))
3973 ANYOF_BITMAP_SET(ret, value);
3974 }
3975 yesno = '+';
3976 what = "Graph";
3977 break;
3978 case ANYOF_NGRAPH:
3979 if (LOC)
3980 ANYOF_CLASS_SET(ret, ANYOF_NGRAPH);
3981 else {
3982 for (value = 0; value < 256; value++)
3983 if (!isGRAPH(value))
3984 ANYOF_BITMAP_SET(ret, value);
3985 }
3986 yesno = '!';
3987 what = "Graph";
3988 break;
3989 case ANYOF_LOWER:
3990 if (LOC)
3991 ANYOF_CLASS_SET(ret, ANYOF_LOWER);
3992 else {
3993 for (value = 0; value < 256; value++)
3994 if (isLOWER(value))
3995 ANYOF_BITMAP_SET(ret, value);
3996 }
3997 yesno = '+';
3998 what = "Lower";
3999 break;
4000 case ANYOF_NLOWER:
4001 if (LOC)
4002 ANYOF_CLASS_SET(ret, ANYOF_NLOWER);
4003 else {
4004 for (value = 0; value < 256; value++)
4005 if (!isLOWER(value))
4006 ANYOF_BITMAP_SET(ret, value);
4007 }
4008 yesno = '!';
4009 what = "Lower";
4010 break;
4011 case ANYOF_PRINT:
4012 if (LOC)
4013 ANYOF_CLASS_SET(ret, ANYOF_PRINT);
4014 else {
4015 for (value = 0; value < 256; value++)
4016 if (isPRINT(value))
4017 ANYOF_BITMAP_SET(ret, value);
4018 }
4019 yesno = '+';
4020 what = "Print";
4021 break;
4022 case ANYOF_NPRINT:
4023 if (LOC)
4024 ANYOF_CLASS_SET(ret, ANYOF_NPRINT);
4025 else {
4026 for (value = 0; value < 256; value++)
4027 if (!isPRINT(value))
4028 ANYOF_BITMAP_SET(ret, value);
4029 }
4030 yesno = '!';
4031 what = "Print";
4032 break;
4033 case ANYOF_PSXSPC:
4034 if (LOC)
4035 ANYOF_CLASS_SET(ret, ANYOF_PSXSPC);
4036 else {
4037 for (value = 0; value < 256; value++)
4038 if (isPSXSPC(value))
4039 ANYOF_BITMAP_SET(ret, value);
4040 }
4041 yesno = '+';
4042 what = "Space";
4043 break;
4044 case ANYOF_NPSXSPC:
4045 if (LOC)
4046 ANYOF_CLASS_SET(ret, ANYOF_NPSXSPC);
4047 else {
4048 for (value = 0; value < 256; value++)
4049 if (!isPSXSPC(value))
4050 ANYOF_BITMAP_SET(ret, value);
4051 }
4052 yesno = '!';
4053 what = "Space";
4054 break;
4055 case ANYOF_PUNCT:
4056 if (LOC)
4057 ANYOF_CLASS_SET(ret, ANYOF_PUNCT);
4058 else {
4059 for (value = 0; value < 256; value++)
4060 if (isPUNCT(value))
4061 ANYOF_BITMAP_SET(ret, value);
4062 }
4063 yesno = '+';
4064 what = "Punct";
4065 break;
4066 case ANYOF_NPUNCT:
4067 if (LOC)
4068 ANYOF_CLASS_SET(ret, ANYOF_NPUNCT);
4069 else {
4070 for (value = 0; value < 256; value++)
4071 if (!isPUNCT(value))
4072 ANYOF_BITMAP_SET(ret, value);
4073 }
4074 yesno = '!';
4075 what = "Punct";
4076 break;
4077 case ANYOF_SPACE:
4078 if (LOC)
4079 ANYOF_CLASS_SET(ret, ANYOF_SPACE);
4080 else {
4081 for (value = 0; value < 256; value++)
4082 if (isSPACE(value))
4083 ANYOF_BITMAP_SET(ret, value);
4084 }
4085 yesno = '+';
4086 what = "SpacePerl";
4087 break;
4088 case ANYOF_NSPACE:
4089 if (LOC)
4090 ANYOF_CLASS_SET(ret, ANYOF_NSPACE);
4091 else {
4092 for (value = 0; value < 256; value++)
4093 if (!isSPACE(value))
4094 ANYOF_BITMAP_SET(ret, value);
4095 }
4096 yesno = '!';
4097 what = "SpacePerl";
4098 break;
4099 case ANYOF_UPPER:
4100 if (LOC)
4101 ANYOF_CLASS_SET(ret, ANYOF_UPPER);
4102 else {
4103 for (value = 0; value < 256; value++)
4104 if (isUPPER(value))
4105 ANYOF_BITMAP_SET(ret, value);
4106 }
4107 yesno = '+';
4108 what = "Upper";
4109 break;
4110 case ANYOF_NUPPER:
4111 if (LOC)
4112 ANYOF_CLASS_SET(ret, ANYOF_NUPPER);
4113 else {
4114 for (value = 0; value < 256; value++)
4115 if (!isUPPER(value))
4116 ANYOF_BITMAP_SET(ret, value);
4117 }
4118 yesno = '!';
4119 what = "Upper";
4120 break;
4121 case ANYOF_XDIGIT:
4122 if (LOC)
4123 ANYOF_CLASS_SET(ret, ANYOF_XDIGIT);
4124 else {
4125 for (value = 0; value < 256; value++)
4126 if (isXDIGIT(value))
4127 ANYOF_BITMAP_SET(ret, value);
4128 }
4129 yesno = '+';
4130 what = "XDigit";
4131 break;
4132 case ANYOF_NXDIGIT:
4133 if (LOC)
4134 ANYOF_CLASS_SET(ret, ANYOF_NXDIGIT);
4135 else {
4136 for (value = 0; value < 256; value++)
4137 if (!isXDIGIT(value))
4138 ANYOF_BITMAP_SET(ret, value);
4139 }
4140 yesno = '!';
4141 what = "XDigit";
4142 break;
4143 case ANYOF_MAX:
4144 /* this is to handle \p and \P */
4145 break;
4146 default:
4147 vFAIL("Invalid [::] class");
4148 break;
4149 }
4150 if (what) {
4151 /* Strings such as "+utf8::isWord\n" */
4152 Perl_sv_catpvf(aTHX_ listsv, "%cutf8::Is%s\n", yesno, what);
4153 }
4154 if (LOC)
4155 ANYOF_FLAGS(ret) |= ANYOF_CLASS;
4156 continue;
4157 }
4158 } /* end of namedclass \blah */
4159
4160 if (range) {
4161 if (prevvalue > (IV)value) /* b-a */ {
4162 Simple_vFAIL4("Invalid [] range \"%*.*s\"",
4163 RExC_parse - rangebegin,
4164 RExC_parse - rangebegin,
4165 rangebegin);
4166 range = 0; /* not a valid range */
4167 }
4168 }
4169 else {
4170 prevvalue = value; /* save the beginning of the range */
4171 if (*RExC_parse == '-' && RExC_parse+1 < RExC_end &&
4172 RExC_parse[1] != ']') {
4173 RExC_parse++;
4174
4175 /* a bad range like \w-, [:word:]- ? */
4176 if (namedclass > OOB_NAMEDCLASS) {
4177 if (ckWARN(WARN_REGEXP))
4178 vWARN4(RExC_parse,
4179 "False [] range \"%*.*s\"",
4180 RExC_parse - rangebegin,
4181 RExC_parse - rangebegin,
4182 rangebegin);
4183 if (!SIZE_ONLY)
4184 ANYOF_BITMAP_SET(ret, '-');
4185 } else
4186 range = 1; /* yeah, it's a range! */
4187 continue; /* but do it the next time */
4188 }
4189 }
4190
4191 /* now is the next time */
4192 if (!SIZE_ONLY) {
4193 IV i;
4194
4195 if (prevvalue < 256) {
4196 IV ceilvalue = value < 256 ? value : 255;
4197
4198 #ifdef EBCDIC
4199 /* In EBCDIC [\x89-\x91] should include
4200 * the \x8e but [i-j] should not. */
4201 if (literal_endpoint == 2 &&
4202 ((isLOWER(prevvalue) && isLOWER(ceilvalue)) ||
4203 (isUPPER(prevvalue) && isUPPER(ceilvalue))))
4204 {
4205 if (isLOWER(prevvalue)) {
4206 for (i = prevvalue; i <= ceilvalue; i++)
4207 if (isLOWER(i))
4208 ANYOF_BITMAP_SET(ret, i);
4209 } else {
4210 for (i = prevvalue; i <= ceilvalue; i++)
4211 if (isUPPER(i))
4212 ANYOF_BITMAP_SET(ret, i);
4213 }
4214 }
4215 else
4216 #endif
4217 for (i = prevvalue; i <= ceilvalue; i++)
4218 ANYOF_BITMAP_SET(ret, i);
4219 }
4220 if (value > 255 || UTF) {
4221 UV prevnatvalue = NATIVE_TO_UNI(prevvalue);
4222 UV natvalue = NATIVE_TO_UNI(value);
4223
4224 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
4225 if (prevnatvalue < natvalue) { /* what about > ? */
4226 Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
4227 prevnatvalue, natvalue);
4228 }
4229 else if (prevnatvalue == natvalue) {
4230 Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", natvalue);
4231 if (FOLD) {
4232 U8 foldbuf[UTF8_MAXBYTES_CASE+1];
4233 STRLEN foldlen;
4234 UV f = to_uni_fold(natvalue, foldbuf, &foldlen);
4235
4236 /* If folding and foldable and a single
4237 * character, insert also the folded version
4238 * to the charclass. */
4239 if (f != value) {
4240 if (foldlen == (STRLEN)UNISKIP(f))
4241 Perl_sv_catpvf(aTHX_ listsv,
4242 "%04"UVxf"\n", f);
4243 else {
4244 /* Any multicharacter foldings
4245 * require the following transform:
4246 * [ABCDEF] -> (?:[ABCabcDEFd]|pq|rst)
4247 * where E folds into "pq" and F folds
4248 * into "rst", all other characters
4249 * fold to single characters. We save
4250 * away these multicharacter foldings,
4251 * to be later saved as part of the
4252 * additional "s" data. */
4253 SV *sv;
4254
4255 if (!unicode_alternate)
4256 unicode_alternate = newAV();
4257 sv = newSVpvn((char*)foldbuf, foldlen);
4258 SvUTF8_on(sv);
4259 av_push(unicode_alternate, sv);
4260 }
4261 }
4262
4263 /* If folding and the value is one of the Greek
4264 * sigmas insert a few more sigmas to make the
4265 * folding rules of the sigmas to work right.
4266 * Note that not all the possible combinations
4267 * are handled here: some of them are handled
4268 * by the standard folding rules, and some of
4269 * them (literal or EXACTF cases) are handled
4270 * during runtime in regexec.c:S_find_byclass(). */
4271 if (value == UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA) {
4272 Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
4273 (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA);
4274 Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
4275 (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
4276 }
4277 else if (value == UNICODE_GREEK_CAPITAL_LETTER_SIGMA)
4278 Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
4279 (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
4280 }
4281 }
4282 }
4283 #ifdef EBCDIC
4284 literal_endpoint = 0;
4285 #endif
4286 }
4287
4288 range = 0; /* this range (if it was one) is done now */
4289 }
4290
4291 if (need_class) {
4292 ANYOF_FLAGS(ret) |= ANYOF_LARGE;
4293 if (SIZE_ONLY)
4294 RExC_size += ANYOF_CLASS_ADD_SKIP;
4295 else
4296 RExC_emit += ANYOF_CLASS_ADD_SKIP;
4297 }
4298
4299 /* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
4300 if (!SIZE_ONLY &&
4301 /* If the only flag is folding (plus possibly inversion). */
4302 ((ANYOF_FLAGS(ret) & (ANYOF_FLAGS_ALL ^ ANYOF_INVERT)) == ANYOF_FOLD)
4303 ) {
4304 for (value = 0; value < 256; ++value) {
4305 if (ANYOF_BITMAP_TEST(ret, value)) {
4306 UV fold = PL_fold[value];
4307
4308 if (fold != value)
4309 ANYOF_BITMAP_SET(ret, fold);
4310 }
4311 }
4312 ANYOF_FLAGS(ret) &= ~ANYOF_FOLD;
4313 }
4314
4315 /* optimize inverted simple patterns (e.g. [^a-z]) */
4316 if (!SIZE_ONLY && optimize_invert &&
4317 /* If the only flag is inversion. */
4318 (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT) {
4319 for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
4320 ANYOF_BITMAP(ret)[value] ^= ANYOF_FLAGS_ALL;
4321 ANYOF_FLAGS(ret) = ANYOF_UNICODE_ALL;
4322 }
4323
4324 if (!SIZE_ONLY) {
4325 AV *av = newAV();
4326 SV *rv;
4327
4328 /* The 0th element stores the character class description
4329 * in its textual form: used later (regexec.c:Perl_regclass_swash())
4330 * to initialize the appropriate swash (which gets stored in
4331 * the 1st element), and also useful for dumping the regnode.
4332 * The 2nd element stores the multicharacter foldings,
4333 * used later (regexec.c:S_reginclass()). */
4334 av_store(av, 0, listsv);
4335 av_store(av, 1, NULL);
4336 av_store(av, 2, (SV*)unicode_alternate);
4337 rv = newRV_noinc((SV*)av);
4338 n = add_data(pRExC_state, 1, "s");
4339 RExC_rx->data->data[n] = (void*)rv;
4340 ARG_SET(ret, n);
4341 }
4342
4343 return ret;
4344 }
4345
4346 STATIC char*
4347 S_nextchar(pTHX_ RExC_state_t *pRExC_state)
4348 {
4349 char* retval = RExC_parse++;
4350
4351 for (;;) {
4352 if (*RExC_parse == '(' && RExC_parse[1] == '?' &&
4353 RExC_parse[2] == '#') {
4354 while (*RExC_parse != ')') {
4355 if (RExC_parse == RExC_end)
4356 FAIL("Sequence (?#... not terminated");
4357 RExC_parse++;
4358 }
4359 RExC_parse++;
4360 continue;
4361 }
4362 if (RExC_flags & PMf_EXTENDED) {
4363 if (isSPACE(*RExC_parse)) {
4364 RExC_parse++;
4365 continue;
4366 }
4367 else if (*RExC_parse == '#') {
4368 while (RExC_parse < RExC_end)
4369 if (*RExC_parse++ == '\n') break;
4370 continue;
4371 }
4372 }
4373 return retval;
4374 }
4375 }
4376
4377 /*
4378 - reg_node - emit a node
4379 */
4380 STATIC regnode * /* Location. */
4381 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
4382 {
4383 register regnode *ret;
4384 register regnode *ptr;
4385
4386 ret = RExC_emit;
4387 if (SIZE_ONLY) {
4388 SIZE_ALIGN(RExC_size);
4389 RExC_size += 1;
4390 return(ret);
4391 }
4392
4393 NODE_ALIGN_FILL(ret);
4394 ptr = ret;
4395 FILL_ADVANCE_NODE(ptr, op);
4396 if (RExC_offsets) { /* MJD */
4397 MJD_OFFSET_DEBUG(("%s:%u: (op %s) %s %u <- %u (len %u) (max %u).\n",
4398 "reg_node", __LINE__,
4399 reg_name[op],
4400 RExC_emit - RExC_emit_start > RExC_offsets[0]
4401 ? "Overwriting end of array!\n" : "OK",
4402 RExC_emit - RExC_emit_start,
4403 RExC_parse - RExC_start,
4404 RExC_offsets[0]));
4405 Set_Node_Offset(RExC_emit, RExC_parse + (op == END));
4406 }
4407
4408 RExC_emit = ptr;
4409
4410 return(ret);
4411 }
4412
4413 /*
4414 - reganode - emit a node with an argument
4415 */
4416 STATIC regnode * /* Location. */
4417 S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
4418 {
4419 register regnode *ret;
4420 register regnode *ptr;
4421
4422 ret = RExC_emit;
4423 if (SIZE_ONLY) {
4424 SIZE_ALIGN(RExC_size);
4425 RExC_size += 2;
4426 return(ret);
4427 }
4428
4429 NODE_ALIGN_FILL(ret);
4430 ptr = ret;
4431 FILL_ADVANCE_NODE_ARG(ptr, op, arg);
4432 if (RExC_offsets) { /* MJD */
4433 MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %u <- %u (max %u).\n",
4434 "reganode",
4435 __LINE__,
4436 reg_name[op],
4437 RExC_emit - RExC_emit_start > RExC_offsets[0] ?
4438 "Overwriting end of array!\n" : "OK",
4439 RExC_emit - RExC_emit_start,
4440 RExC_parse - RExC_start,
4441 RExC_offsets[0]));
4442 Set_Cur_Node_Offset;
4443 }
4444
4445 RExC_emit = ptr;
4446
4447 return(ret);
4448 }
4449
4450 /*
4451 - reguni - emit (if appropriate) a Unicode character
4452 */
4453 STATIC void
4454 S_reguni(pTHX_ RExC_state_t *pRExC_state, UV uv, char* s, STRLEN* lenp)
4455 {
4456 *lenp = SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
4457 }
4458
4459 /*
4460 - reginsert - insert an operator in front of already-emitted operand
4461 *
4462 * Means relocating the operand.
4463 */
4464 STATIC void
4465 S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd)
4466 {
4467 register regnode *src;
4468 register regnode *dst;
4469 register regnode *place;
4470 register int offset = regarglen[(U8)op];
4471
4472 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
4473
4474 if (SIZE_ONLY) {
4475 RExC_size += NODE_STEP_REGNODE + offset;
4476 return;
4477 }
4478
4479 src = RExC_emit;
4480 RExC_emit += NODE_STEP_REGNODE + offset;
4481 dst = RExC_emit;
4482 while (src > opnd) {
4483 StructCopy(--src, --dst, regnode);
4484 if (RExC_offsets) { /* MJD 20010112 */
4485 MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s copy %u -> %u (max %u).\n",
4486 "reg_insert",
4487 __LINE__,
4488 reg_name[op],
4489 dst - RExC_emit_start > RExC_offsets[0]
4490 ? "Overwriting end of array!\n" : "OK",
4491 src - RExC_emit_start,
4492 dst - RExC_emit_start,
4493 RExC_offsets[0]));
4494 Set_Node_Offset_To_R(dst-RExC_emit_start, Node_Offset(src));
4495 Set_Node_Length_To_R(dst-RExC_emit_start, Node_Length(src));
4496 }
4497 }
4498
4499
4500 place = opnd; /* Op node, where operand used to be. */
4501 if (RExC_offsets) { /* MJD */
4502 MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %u <- %u (max %u).\n",
4503 "reginsert",
4504 __LINE__,
4505 reg_name[op],
4506 place - RExC_emit_start > RExC_offsets[0]
4507 ? "Overwriting end of array!\n" : "OK",
4508 place - RExC_emit_start,
4509 RExC_parse - RExC_start,
4510 RExC_offsets[0]));
4511 Set_Node_Offset(place, RExC_parse);
4512 Set_Node_Length(place, 1);
4513 }
4514 src = NEXTOPER(place);
4515 FILL_ADVANCE_NODE(place, op);
4516 Zero(src, offset, regnode);
4517 }
4518
4519 /*
4520 - regtail - set the next-pointer at the end of a node chain of p to val.
4521 */
4522 STATIC void
4523 S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p, regnode *val)
4524 {
4525 register regnode *scan;
4526 register regnode *temp;
4527
4528 if (SIZE_ONLY)
4529 return;
4530
4531 /* Find last node. */
4532 scan = p;
4533 for (;;) {
4534 temp = regnext(scan);
4535 if (temp == NULL)
4536 break;
4537 scan = temp;
4538 }
4539
4540 if (reg_off_by_arg[OP(scan)]) {
4541 ARG_SET(scan, val - scan);
4542 }
4543 else {
4544 NEXT_OFF(scan) = val - scan;
4545 }
4546 }
4547
4548 /*
4549 - regoptail - regtail on operand of first argument; nop if operandless
4550 */
4551 STATIC void
4552 S_regoptail(pTHX_ RExC_state_t *pRExC_state, regnode *p, regnode *val)
4553 {
4554 /* "Operandless" and "op != BRANCH" are synonymous in practice. */
4555 if (p == NULL || SIZE_ONLY)
4556 return;
4557 if (PL_regkind[(U8)OP(p)] == BRANCH) {
4558 regtail(pRExC_state, NEXTOPER(p), val);
4559 }
4560 else if ( PL_regkind[(U8)OP(p)] == BRANCHJ) {
4561 regtail(pRExC_state, NEXTOPER(NEXTOPER(p)), val);
4562 }
4563 else
4564 return;
4565 }
4566
4567 /*
4568 - regcurly - a little FSA that accepts {\d+,?\d*}
4569 */
4570 STATIC I32
4571 S_regcurly(pTHX_ register char *s)
4572 {
4573 if (*s++ != '{')
4574 return FALSE;
4575 if (!isDIGIT(*s))
4576 return FALSE;
4577 while (isDIGIT(*s))
4578 s++;
4579 if (*s == ',')
4580 s++;
4581 while (isDIGIT(*s))
4582 s++;
4583 if (*s != '}')
4584 return FALSE;
4585 return TRUE;
4586 }
4587
4588
4589 #ifdef DEBUGGING
4590
4591 STATIC regnode *
4592 S_dumpuntil(pTHX_ regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
4593 {
4594 register U8 op = EXACT; /* Arbitrary non-END op. */
4595 register regnode *next;
4596
4597 while (op != END && (!last || node < last)) {
4598 /* While that wasn't END last time... */
4599
4600 NODE_ALIGN(node);
4601 op = OP(node);
4602 if (op == CLOSE)
4603 l--;
4604 next = regnext(node);
4605 /* Where, what. */
4606 if (OP(node) == OPTIMIZED)
4607 goto after_print;
4608 regprop(sv, node);
4609 PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
4610 (int)(2*l + 1), "", SvPVX(sv));
4611 if (next == NULL) /* Next ptr. */
4612 PerlIO_printf(Perl_debug_log, "(0)");
4613 else
4614 PerlIO_printf(Perl_debug_log, "(%"IVdf")", (IV)(next - start));
4615 (void)PerlIO_putc(Perl_debug_log, '\n');
4616 after_print:
4617 if (PL_regkind[(U8)op] == BRANCHJ) {
4618 register regnode *nnode = (OP(next) == LONGJMP
4619 ? regnext(next)
4620 : next);
4621 if (last && nnode > last)
4622 nnode = last;
4623 node = dumpuntil(start, NEXTOPER(NEXTOPER(node)), nnode, sv, l + 1);
4624 }
4625 else if (PL_regkind[(U8)op] == BRANCH) {
4626 node = dumpuntil(start, NEXTOPER(node), next, sv, l + 1);
4627 }
4628 else if ( op == CURLY) { /* `next' might be very big: optimizer */
4629 node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
4630 NEXTOPER(node) + EXTRA_STEP_2ARGS + 1, sv, l + 1);
4631 }
4632 else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
4633 node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
4634 next, sv, l + 1);
4635 }
4636 else if ( op == PLUS || op == STAR) {
4637 node = dumpuntil(start, NEXTOPER(node), NEXTOPER(node) + 1, sv, l + 1);
4638 }
4639 else if (op == ANYOF) {
4640 /* arglen 1 + class block */
4641 node += 1 + ((ANYOF_FLAGS(node) & ANYOF_LARGE)
4642 ? ANYOF_CLASS_SKIP : ANYOF_SKIP);
4643 node = NEXTOPER(node);
4644 }
4645 else if (PL_regkind[(U8)op] == EXACT) {
4646 /* Literal string, where present. */
4647 node += NODE_SZ_STR(node) - 1;
4648 node = NEXTOPER(node);
4649 }
4650 else {
4651 node = NEXTOPER(node);
4652 node += regarglen[(U8)op];
4653 }
4654 if (op == CURLYX || op == OPEN)
4655 l++;
4656 else if (op == WHILEM)
4657 l--;
4658 }
4659 return node;
4660 }
4661
4662 #endif /* DEBUGGING */
4663
4664 /*
4665 - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
4666 */
4667 void
4668 Perl_regdump(pTHX_ regexp *r)
4669 {
4670 #ifdef DEBUGGING
4671 SV *sv = sv_newmortal();
4672
4673 (void)dumpuntil(r->program, r->program + 1, NULL, sv, 0);
4674
4675 /* Header fields of interest. */
4676 if (r->anchored_substr)
4677 PerlIO_printf(Perl_debug_log,
4678 "anchored `%s%.*s%s'%s at %"IVdf" ",
4679 PL_colors[0],
4680 (int)(SvCUR(r->anchored_substr) - (SvTAIL(r->anchored_substr)!=0)),
4681 SvPVX(r->anchored_substr),
4682 PL_colors[1],
4683 SvTAIL(r->anchored_substr) ? "$" : "",
4684 (IV)r->anchored_offset);
4685 else if (r->anchored_utf8)
4686 PerlIO_printf(Perl_debug_log,
4687 "anchored utf8 `%s%.*s%s'%s at %"IVdf" ",
4688 PL_colors[0],
4689 (int)(SvCUR(r->anchored_utf8) - (SvTAIL(r->anchored_utf8)!=0)),
4690 SvPVX(r->anchored_utf8),
4691 PL_colors[1],
4692 SvTAIL(r->anchored_utf8) ? "$" : "",
4693 (IV)r->anchored_offset);
4694 if (r->float_substr)
4695 PerlIO_printf(Perl_debug_log,
4696 "floating `%s%.*s%s'%s at %"IVdf"..%"UVuf" ",
4697 PL_colors[0],
4698 (int)(SvCUR(r->float_substr) - (SvTAIL(r->float_substr)!=0)),
4699 SvPVX(r->float_substr),
4700 PL_colors[1],
4701 SvTAIL(r->float_substr) ? "$" : "",
4702 (IV)r->float_min_offset, (UV)r->float_max_offset);
4703 else if (r->float_utf8)
4704 PerlIO_printf(Perl_debug_log,
4705 "floating utf8 `%s%.*s%s'%s at %"IVdf"..%"UVuf" ",
4706 PL_colors[0],
4707 (int)(SvCUR(r->float_utf8) - (SvTAIL(r->float_utf8)!=0)),
4708 SvPVX(r->float_utf8),
4709 PL_colors[1],
4710 SvTAIL(r->float_utf8) ? "$" : "",
4711 (IV)r->float_min_offset, (UV)r->float_max_offset);
4712 if (r->check_substr || r->check_utf8)
4713 PerlIO_printf(Perl_debug_log,
4714 r->check_substr == r->float_substr
4715 && r->check_utf8 == r->float_utf8
4716 ? "(checking floating" : "(checking anchored");
4717 if (r->reganch & ROPT_NOSCAN)
4718 PerlIO_printf(Perl_debug_log, " noscan");
4719 if (r->reganch & ROPT_CHECK_ALL)
4720 PerlIO_printf(Perl_debug_log, " isall");
4721 if (r->check_substr || r->check_utf8)
4722 PerlIO_printf(Perl_debug_log, ") ");
4723
4724 if (r->regstclass) {
4725 regprop(sv, r->regstclass);
4726 PerlIO_printf(Perl_debug_log, "stclass `%s' ", SvPVX(sv));
4727 }
4728 if (r->reganch & ROPT_ANCH) {
4729 PerlIO_printf(Perl_debug_log, "anchored");
4730 if (r->reganch & ROPT_ANCH_BOL)
4731 PerlIO_printf(Perl_debug_log, "(BOL)");
4732 if (r->reganch & ROPT_ANCH_MBOL)
4733 PerlIO_printf(Perl_debug_log, "(MBOL)");
4734 if (r->reganch & ROPT_ANCH_SBOL)
4735 PerlIO_printf(Perl_debug_log, "(SBOL)");
4736 if (r->reganch & ROPT_ANCH_GPOS)
4737 PerlIO_printf(Perl_debug_log, "(GPOS)");
4738 PerlIO_putc(Perl_debug_log, ' ');
4739 }
4740 if (r->reganch & ROPT_GPOS_SEEN)
4741 PerlIO_printf(Perl_debug_log, "GPOS ");
4742 if (r->reganch & ROPT_SKIP)
4743 PerlIO_printf(Perl_debug_log, "plus ");
4744 if (r->reganch & ROPT_IMPLICIT)
4745 PerlIO_printf(Perl_debug_log, "implicit ");
4746 PerlIO_printf(Perl_debug_log, "minlen %ld ", (long) r->minlen);
4747 if (r->reganch & ROPT_EVAL_SEEN)
4748 PerlIO_printf(Perl_debug_log, "with eval ");
4749 PerlIO_printf(Perl_debug_log, "\n");
4750 if (r->offsets) {
4751 U32 i;
4752 U32 len = r->offsets[0];
4753 PerlIO_printf(Perl_debug_log, "Offsets: [%"UVuf"]\n\t", (UV)r->offsets[0]);
4754 for (i = 1; i <= len; i++)
4755 PerlIO_printf(Perl_debug_log, "%"UVuf"[%"UVuf"] ",
4756 (UV)r->offsets[i*2-1],
4757 (UV)r->offsets[i*2]);
4758 PerlIO_printf(Perl_debug_log, "\n");
4759 }
4760 #endif /* DEBUGGING */
4761 }
4762
4763 #ifdef DEBUGGING
4764
4765 STATIC void
4766 S_put_byte(pTHX_ SV *sv, int c)
4767 {
4768 if (isCNTRL(c) || c == 255 || !isPRINT(c))
4769 Perl_sv_catpvf(aTHX_ sv, "\\%o", c);
4770 else if (c == '-' || c == ']' || c == '\\' || c == '^')
4771 Perl_sv_catpvf(aTHX_ sv, "\\%c", c);
4772 else
4773 Perl_sv_catpvf(aTHX_ sv, "%c", c);
4774 }
4775
4776 #endif /* DEBUGGING */
4777
4778 /*
4779 - regprop - printable representation of opcode
4780 */
4781 void
4782 Perl_regprop(pTHX_ SV *sv, regnode *o)
4783 {
4784 #ifdef DEBUGGING
4785 register int k;
4786
4787 sv_setpvn(sv, "", 0);
4788 if (OP(o) >= reg_num) /* regnode.type is unsigned */
4789 /* It would be nice to FAIL() here, but this may be called from
4790 regexec.c, and it would be hard to supply pRExC_state. */
4791 Perl_croak(aTHX_ "Corrupted regexp opcode");
4792 sv_catpv(sv, (char*)reg_name[OP(o)]); /* Take off const! */
4793
4794 k = PL_regkind[(U8)OP(o)];
4795
4796 if (k == EXACT) {
4797 SV *dsv = sv_2mortal(newSVpvn("", 0));
4798 /* Using is_utf8_string() is a crude hack but it may
4799 * be the best for now since we have no flag "this EXACTish
4800 * node was UTF-8" --jhi */
4801 bool do_utf8 = is_utf8_string((U8*)STRING(o), STR_LEN(o));
4802 char *s = do_utf8 ?
4803 pv_uni_display(dsv, (U8*)STRING(o), STR_LEN(o), 60,
4804 UNI_DISPLAY_REGEX) :
4805 STRING(o);
4806 int len = do_utf8 ?
4807 strlen(s) :
4808 STR_LEN(o);
4809 Perl_sv_catpvf(aTHX_ sv, " <%s%.*s%s>",
4810 PL_colors[0],
4811 len, s,
4812 PL_colors[1]);
4813 }
4814 else if (k == CURLY) {
4815 if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
4816 Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
4817 Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
4818 }
4819 else if (k == WHILEM && o->flags) /* Ordinal/of */
4820 Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
4821 else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP )
4822 Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o)); /* Parenth number */
4823 else if (k == LOGICAL)
4824 Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* 2: embedded, otherwise 1 */
4825 else if (k == ANYOF) {
4826 int i, rangestart = -1;
4827 U8 flags = ANYOF_FLAGS(o);
4828 const char * const anyofs[] = { /* Should be synchronized with
4829 * ANYOF_ #xdefines in regcomp.h */
4830 "\\w",
4831 "\\W",
4832 "\\s",
4833 "\\S",
4834 "\\d",
4835 "\\D",
4836 "[:alnum:]",
4837 "[:^alnum:]",
4838 "[:alpha:]",
4839 "[:^alpha:]",
4840 "[:ascii:]",
4841 "[:^ascii:]",
4842 "[:ctrl:]",
4843 "[:^ctrl:]",
4844 "[:graph:]",
4845 "[:^graph:]",
4846 "[:lower:]",
4847 "[:^lower:]",
4848 "[:print:]",
4849 "[:^print:]",
4850 "[:punct:]",
4851 "[:^punct:]",
4852 "[:upper:]",
4853 "[:^upper:]",
4854 "[:xdigit:]",
4855 "[:^xdigit:]",
4856 "[:space:]",
4857 "[:^space:]",
4858 "[:blank:]",
4859 "[:^blank:]"
4860 };
4861
4862 if (flags & ANYOF_LOCALE)
4863 sv_catpv(sv, "{loc}");
4864 if (flags & ANYOF_FOLD)
4865 sv_catpv(sv, "{i}");
4866 Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
4867 if (flags & ANYOF_INVERT)
4868 sv_catpv(sv, "^");
4869 for (i = 0; i <= 256; i++) {
4870 if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
4871 if (rangestart == -1)
4872 rangestart = i;
4873 } else if (rangestart != -1) {
4874 if (i <= rangestart + 3)
4875 for (; rangestart < i; rangestart++)
4876 put_byte(sv, rangestart);
4877 else {
4878 put_byte(sv, rangestart);
4879 sv_catpv(sv, "-");
4880 put_byte(sv, i - 1);
4881 }
4882 rangestart = -1;
4883 }
4884 }
4885
4886 if (o->flags & ANYOF_CLASS)
4887 for (i = 0; i < sizeof(anyofs)/sizeof(char*); i++)
4888 if (ANYOF_CLASS_TEST(o,i))
4889 sv_catpv(sv, anyofs[i]);
4890
4891 if (flags & ANYOF_UNICODE)
4892 sv_catpv(sv, "{unicode}");
4893 else if (flags & ANYOF_UNICODE_ALL)
4894 sv_catpv(sv, "{unicode_all}");
4895
4896 {
4897 SV *lv;
4898 SV *sw = regclass_swash(o, FALSE, &lv, 0);
4899
4900 if (lv) {
4901 if (sw) {
4902 U8 s[UTF8_MAXBYTES_CASE+1];
4903
4904 for (i = 0; i <= 256; i++) { /* just the first 256 */
4905 U8 *e = uvchr_to_utf8(s, i);
4906
4907 if (i < 256 && swash_fetch(sw, s, TRUE)) {
4908 if (rangestart == -1)
4909 rangestart = i;
4910 } else if (rangestart != -1) {
4911 U8 *p;
4912
4913 if (i <= rangestart + 3)
4914 for (; rangestart < i; rangestart++) {
4915 for(e = uvchr_to_utf8(s, rangestart), p = s; p < e; p++)
4916 put_byte(sv, *p);
4917 }
4918 else {
4919 for (e = uvchr_to_utf8(s, rangestart), p = s; p < e; p++)
4920 put_byte(sv, *p);
4921 sv_catpv(sv, "-");
4922 for (e = uvchr_to_utf8(s, i - 1), p = s; p < e; p++)
4923 put_byte(sv, *p);
4924 }
4925 rangestart = -1;
4926 }
4927 }
4928
4929 sv_catpv(sv, "..."); /* et cetera */
4930 }
4931
4932 {
4933 char *s = savesvpv(lv);
4934 char *origs = s;
4935
4936 while(*s && *s != '\n') s++;
4937
4938 if (*s == '\n') {
4939 char *t = ++s;
4940
4941 while (*s) {
4942 if (*s == '\n')
4943 *s = ' ';
4944 s++;
4945 }
4946 if (s[-1] == ' ')
4947 s[-1] = 0;
4948
4949 sv_catpv(sv, t);
4950 }
4951
4952 Safefree(origs);
4953 }
4954 }
4955 }
4956
4957 Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
4958 }
4959 else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
4960 Perl_sv_catpvf(aTHX_ sv, "[-%d]", o->flags);
4961 #endif /* DEBUGGING */
4962 }
4963
4964 SV *
4965 Perl_re_intuit_string(pTHX_ regexp *prog)
4966 { /* Assume that RE_INTUIT is set */
4967 DEBUG_r(
4968 { STRLEN n_a;
4969 char *s = SvPV(prog->check_substr
4970 ? prog->check_substr : prog->check_utf8, n_a);
4971
4972 if (!PL_colorset) reginitcolors();
4973 PerlIO_printf(Perl_debug_log,
4974 "%sUsing REx %ssubstr:%s `%s%.60s%s%s'\n",
4975 PL_colors[4],
4976 prog->check_substr ? "" : "utf8 ",
4977 PL_colors[5],PL_colors[0],
4978 s,
4979 PL_colors[1],
4980 (strlen(s) > 60 ? "..." : ""));
4981 } );
4982
4983 return prog->check_substr ? prog->check_substr : prog->check_utf8;
4984 }
4985
4986 void
4987 Perl_pregfree(pTHX_ struct regexp *r)
4988 {
4989 #ifdef DEBUGGING
4990 SV *dsv = PERL_DEBUG_PAD_ZERO(0);
4991 #endif
4992
4993 if (!r || (--r->refcnt > 0))
4994 return;
4995 DEBUG_r({
4996 int len;
4997 char *s;
4998
4999 s = (r->reganch & ROPT_UTF8) ? pv_uni_display(dsv, (U8*)r->precomp,
5000 r->prelen, 60, UNI_DISPLAY_REGEX)
5001 : pv_display(dsv, r->precomp, r->prelen, 0, 60);
5002 len = SvCUR(dsv);
5003 if (!PL_colorset)
5004 reginitcolors();
5005 PerlIO_printf(Perl_debug_log,
5006 "%sFreeing REx:%s `%s%*.*s%s%s'\n",
5007 PL_colors[4],PL_colors[5],PL_colors[0],
5008 len, len, s,
5009 PL_colors[1],
5010 len > 60 ? "..." : "");
5011 });
5012
5013 if (r->precomp)
5014 Safefree(r->precomp);
5015 if (r->offsets) /* 20010421 MJD */
5016 Safefree(r->offsets);
5017 if (RX_MATCH_COPIED(r))
5018 Safefree(r->subbeg);
5019 if (r->substrs) {
5020 if (r->anchored_substr)
5021 SvREFCNT_dec(r->anchored_substr);
5022 if (r->anchored_utf8)
5023 SvREFCNT_dec(r->anchored_utf8);
5024 if (r->float_substr)
5025 SvREFCNT_dec(r->float_substr);
5026 if (r->float_utf8)
5027 SvREFCNT_dec(r->float_utf8);
5028 Safefree(r->substrs);
5029 }
5030 if (r->data) {
5031 int n = r->data->count;
5032 PAD* new_comppad = NULL;
5033 PAD* old_comppad;
5034 PADOFFSET refcnt;
5035
5036 while (--n >= 0) {
5037 /* If you add a ->what type here, update the comment in regcomp.h */
5038 switch (r->data->what[n]) {
5039 case 's':
5040 SvREFCNT_dec((SV*)r->data->data[n]);
5041 break;
5042 case 'f':
5043 Safefree(r->data->data[n]);
5044 break;
5045 case 'p':
5046 new_comppad = (AV*)r->data->data[n];
5047 break;
5048 case 'o':
5049 if (new_comppad == NULL)
5050 Perl_croak(aTHX_ "panic: pregfree comppad");
5051 PAD_SAVE_LOCAL(old_comppad,
5052 /* Watch out for global destruction's random ordering. */
5053 (SvTYPE(new_comppad) == SVt_PVAV) ?
5054 new_comppad : Null(PAD *)
5055 );
5056 OP_REFCNT_LOCK;
5057 refcnt = OpREFCNT_dec((OP_4tree*)r->data->data[n]);
5058 OP_REFCNT_UNLOCK;
5059 if (!refcnt)
5060 op_free((OP_4tree*)r->data->data[n]);
5061
5062 PAD_RESTORE_LOCAL(old_comppad);
5063 SvREFCNT_dec((SV*)new_comppad);
5064 new_comppad = NULL;
5065 break;
5066 case 'n':
5067 break;
5068 default:
5069 Perl_croak(aTHX_ "panic: regfree data code '%c'", r->data->what[n]);
5070 }
5071 }
5072 Safefree(r->data->what);
5073 Safefree(r->data);
5074 }
5075 Safefree(r->startp);
5076 Safefree(r->endp);
5077 Safefree(r);
5078 }
5079
5080 /*
5081 - regnext - dig the "next" pointer out of a node
5082 *
5083 * [Note, when REGALIGN is defined there are two places in regmatch()
5084 * that bypass this code for speed.]
5085 */
5086 regnode *
5087 Perl_regnext(pTHX_ register regnode *p)
5088 {
5089 register I32 offset;
5090
5091 if (p == &PL_regdummy)
5092 return(NULL);
5093
5094 offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
5095 if (offset == 0)
5096 return(NULL);
5097
5098 return(p+offset);
5099 }
5100
5101 STATIC void
5102 S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
5103 {
5104 va_list args;
5105 STRLEN l1 = strlen(pat1);
5106 STRLEN l2 = strlen(pat2);
5107 char buf[512];
5108 SV *msv;
5109 char *message;
5110
5111 if (l1 > 510)
5112 l1 = 510;
5113 if (l1 + l2 > 510)
5114 l2 = 510 - l1;
5115 Copy(pat1, buf, l1 , char);
5116 Copy(pat2, buf + l1, l2 , char);
5117 buf[l1 + l2] = '\n';
5118 buf[l1 + l2 + 1] = '\0';
5119 #ifdef I_STDARG
5120 /* ANSI variant takes additional second argument */
5121 va_start(args, pat2);
5122 #else
5123 va_start(args);
5124 #endif
5125 msv = vmess(buf, &args);
5126 va_end(args);
5127 message = SvPV(msv,l1);
5128 if (l1 > 512)
5129 l1 = 512;
5130 Copy(message, buf, l1 , char);
5131 buf[l1-1] = '\0'; /* Overwrite \n */
5132 Perl_croak(aTHX_ "%s", buf);
5133 }
5134
5135 /* XXX Here's a total kludge. But we need to re-enter for swash routines. */
5136
5137 void
5138 Perl_save_re_context(pTHX)
5139 {
5140 SAVEI32(PL_reg_flags); /* from regexec.c */
5141 SAVEPPTR(PL_bostr);
5142 SAVEPPTR(PL_reginput); /* String-input pointer. */
5143 SAVEPPTR(PL_regbol); /* Beginning of input, for ^ check. */
5144 SAVEPPTR(PL_regeol); /* End of input, for $ check. */
5145 SAVEVPTR(PL_regstartp); /* Pointer to startp array. */
5146 SAVEVPTR(PL_regendp); /* Ditto for endp. */
5147 SAVEVPTR(PL_reglastparen); /* Similarly for lastparen. */
5148 SAVEVPTR(PL_reglastcloseparen); /* Similarly for lastcloseparen. */
5149 SAVEPPTR(PL_regtill); /* How far we are required to go. */
5150 SAVEGENERICPV(PL_reg_start_tmp); /* from regexec.c */
5151 PL_reg_start_tmp = 0;
5152 SAVEI32(PL_reg_start_tmpl); /* from regexec.c */
5153 PL_reg_start_tmpl = 0;
5154 SAVEVPTR(PL_regdata);
5155 SAVEI32(PL_reg_eval_set); /* from regexec.c */
5156 SAVEI32(PL_regnarrate); /* from regexec.c */
5157 SAVEVPTR(PL_regprogram); /* from regexec.c */
5158 SAVEINT(PL_regindent); /* from regexec.c */
5159 SAVEVPTR(PL_regcc); /* from regexec.c */
5160 SAVEVPTR(PL_curcop);
5161 SAVEVPTR(PL_reg_call_cc); /* from regexec.c */
5162 SAVEVPTR(PL_reg_re); /* from regexec.c */
5163 SAVEPPTR(PL_reg_ganch); /* from regexec.c */
5164 SAVESPTR(PL_reg_sv); /* from regexec.c */
5165 SAVEBOOL(PL_reg_match_utf8); /* from regexec.c */
5166 SAVEVPTR(PL_reg_magic); /* from regexec.c */
5167 SAVEI32(PL_reg_oldpos); /* from regexec.c */
5168 SAVEVPTR(PL_reg_oldcurpm); /* from regexec.c */
5169 SAVEVPTR(PL_reg_curpm); /* from regexec.c */
5170 SAVEPPTR(PL_reg_oldsaved); /* old saved substr during match */
5171 PL_reg_oldsaved = Nullch;
5172 SAVEI32(PL_reg_oldsavedlen); /* old length of saved substr during match */
5173 PL_reg_oldsavedlen = 0;
5174 SAVEI32(PL_reg_maxiter); /* max wait until caching pos */
5175 PL_reg_maxiter = 0;
5176 SAVEI32(PL_reg_leftiter); /* wait until caching pos */
5177 PL_reg_leftiter = 0;
5178 SAVEGENERICPV(PL_reg_poscache); /* cache of pos of WHILEM */
5179 PL_reg_poscache = Nullch;
5180 SAVEI32(PL_reg_poscache_size); /* size of pos cache of WHILEM */
5181 PL_reg_poscache_size = 0;
5182 SAVEPPTR(PL_regprecomp); /* uncompiled string. */
5183 SAVEI32(PL_regnpar); /* () count. */
5184 SAVEI32(PL_regsize); /* from regexec.c */
5185
5186 {
5187 /* Save $1..$n (#18107: UTF-8 s/(\w+)/uc($1)/e); AMS 20021106. */
5188 U32 i;
5189 GV *mgv;
5190 REGEXP *rx;
5191 char digits[TYPE_CHARS(long)];
5192
5193 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
5194 for (i = 1; i <= rx->nparens; i++) {
5195 sprintf(digits, "%lu", (long)i);
5196 if ((mgv = gv_fetchpv(digits, FALSE, SVt_PV)))
5197 save_scalar(mgv);
5198 }
5199 }
5200 }
5201
5202 #ifdef DEBUGGING
5203 SAVEPPTR(PL_reg_starttry); /* from regexec.c */
5204 #endif
5205 }
5206
5207 static void
5208 clear_re(pTHX_ void *r)
5209 {
5210 ReREFCNT_dec((regexp *)r);
5211 }
5212
5213 /*
5214 * Local variables:
5215 * c-indentation-style: bsd
5216 * c-basic-offset: 4
5217 * indent-tabs-mode: t
5218 * End:
5219 *
5220 * vim: shiftwidth=4:
5221 */