@@ -6495,8 +6495,63 @@ for (;; pptr++)
64956495 req_caseopt = ((options & PCRE2_CASELESS ) != 0 )? REQ_CASELESS : 0 ;
64966496 break ;
64976497
6498+ /* ===================================================================*/
6499+ /* Handle scan substring. Scan substring assertion starts with META_SCS,
6500+ which recursively calls compile_branch. The first opcode processed by
6501+ this recursive call is always META_OFFSET. */
6502+
64986503 case META_OFFSET :
6499- GETPLUSOFFSET (offset , pptr );
6504+ if (lengthptr != NULL )
6505+ {
6506+ pptr = PRIV (compile_parse_scan_substr_args )(pptr , errorcodeptr , cb , lengthptr );
6507+ if (pptr == NULL )
6508+ return 0 ;
6509+ break ;
6510+ }
6511+
6512+ while (TRUE)
6513+ {
6514+ int count , index ;
6515+ named_group * ng ;
6516+
6517+ switch (META_CODE (* pptr ))
6518+ {
6519+ case META_OFFSET :
6520+ pptr ++ ;
6521+ SKIPOFFSET (pptr );
6522+ continue ;
6523+
6524+ case META_CAPTURE_NAME :
6525+ ng = cb -> named_groups + pptr [1 ];
6526+ pptr += 2 ;
6527+ count = 0 ;
6528+ index = 0 ;
6529+
6530+ if (!PRIV (compile_find_dupname_details )(ng -> name , ng -> length , & index ,
6531+ & count , errorcodeptr , cb )) return 0 ;
6532+
6533+ code [0 ] = OP_DNCREF ;
6534+ PUT2 (code , 1 , index );
6535+ PUT2 (code , 1 + IMM2_SIZE , count );
6536+ code += 1 + 2 * IMM2_SIZE ;
6537+ continue ;
6538+
6539+ case META_CAPTURE_NUMBER :
6540+ pptr += 2 ;
6541+ if (pptr [-1 ] == 0 ) continue ;
6542+
6543+ code [0 ] = OP_CREF ;
6544+ PUT2 (code , 1 , pptr [-1 ]);
6545+ code += 1 + IMM2_SIZE ;
6546+ continue ;
6547+
6548+ default :
6549+ break ;
6550+ }
6551+
6552+ break ;
6553+ }
6554+ -- pptr ;
65006555 break ;
65016556
65026557 case META_SCS :
@@ -6515,7 +6570,6 @@ for (;; pptr++)
65156570 case META_COND_RNUMBER : /* (?(Rdigits) */
65166571 case META_COND_NAME : /* (?(name) or (?'name') or ?(<name>) */
65176572 case META_COND_RNAME : /* (?(R&name) - test for recursion */
6518- case META_CAPTURE_NAME : /* Generic capture name */
65196573 bravalue = OP_COND ;
65206574
65216575 if (lengthptr != NULL )
@@ -6526,10 +6580,7 @@ for (;; pptr++)
65266580 uint32_t * start_pptr = pptr ;
65276581 uint32_t length = * (++ pptr );
65286582
6529- if (meta == META_CAPTURE_NAME )
6530- offset += meta_arg ;
6531- else
6532- GETPLUSOFFSET (offset , pptr );
6583+ GETPLUSOFFSET (offset , pptr );
65336584 name = cb -> start_pattern + offset ;
65346585
65356586 /* In the first pass, the names generated in the pre-pass are available,
@@ -6592,12 +6643,6 @@ for (;; pptr++)
65926643 start_pptr [0 ] = meta ;
65936644 start_pptr [1 ] = ng -> number ;
65946645
6595- if (meta == META_CAPTURE_NAME )
6596- {
6597- code += 1 + IMM2_SIZE ;
6598- break ;
6599- }
6600-
66016646 skipunits = 1 + IMM2_SIZE ;
66026647 goto GROUP_PROCESS_NOTE_EMPTY ;
66036648 }
@@ -6608,12 +6653,6 @@ for (;; pptr++)
66086653 start_pptr [0 ] = meta | 1 ;
66096654 start_pptr [1 ] = (uint32_t )(ng - cb -> named_groups );
66106655
6611- if (meta == META_CAPTURE_NAME )
6612- {
6613- code += 1 + 2 * IMM2_SIZE ;
6614- break ;
6615- }
6616-
66176656 /* A duplicated name was found. Note that if an R<digits> name is found
66186657 (META_COND_RNUMBER), it is a reference test, not a recursion test. */
66196658 skipunits = 1 + 2 * IMM2_SIZE ;
@@ -6639,15 +6678,6 @@ for (;; pptr++)
66396678
66406679 if (meta_arg == 0 )
66416680 {
6642- if (meta == META_CAPTURE_NAME )
6643- {
6644- code [0 ] = OP_CREF ;
6645- PUT2 (code , 1 , pptr [1 ]);
6646- code += 1 + IMM2_SIZE ;
6647- pptr ++ ;
6648- break ;
6649- }
6650-
66516681 code [1 + LINK_SIZE ] = (meta == META_COND_RNAME )? OP_RREF : OP_CREF ;
66526682 PUT2 (code , 2 + LINK_SIZE , pptr [1 ]);
66536683 skipunits = 1 + IMM2_SIZE ;
@@ -6663,16 +6693,6 @@ for (;; pptr++)
66636693 if (!PRIV (compile_find_dupname_details )(ng -> name , ng -> length , & index ,
66646694 & count , errorcodeptr , cb )) return 0 ;
66656695
6666- if (meta == META_CAPTURE_NAME )
6667- {
6668- code [0 ] = OP_DNCREF ;
6669- PUT2 (code , 1 , index );
6670- PUT2 (code , 1 + IMM2_SIZE , count );
6671- code += 1 + 2 * IMM2_SIZE ;
6672- pptr ++ ;
6673- break ;
6674- }
6675-
66766696 /* A duplicated name was found. Note that if an R<digits> name is found
66776697 (META_COND_RNUMBER), it is a reference test, not a recursion test. */
66786698
@@ -6702,12 +6722,8 @@ for (;; pptr++)
67026722 /* Conditional test of a group's being set. */
67036723
67046724 case META_COND_NUMBER :
6705- case META_CAPTURE_NUMBER :
67066725 bravalue = OP_COND ;
6707- if (meta == META_CAPTURE_NUMBER )
6708- offset += meta_arg ;
6709- else
6710- GETPLUSOFFSET (offset , pptr );
6726+ GETPLUSOFFSET (offset , pptr );
67116727
67126728 groupnumber = * (++ pptr );
67136729 if (groupnumber > cb -> bracount )
@@ -6718,14 +6734,6 @@ for (;; pptr++)
67186734 }
67196735 if (groupnumber > cb -> top_backref ) cb -> top_backref = groupnumber ;
67206736
6721- if (meta == META_CAPTURE_NUMBER )
6722- {
6723- code [0 ] = OP_CREF ;
6724- PUT2 (code , 1 , groupnumber );
6725- code += 1 + IMM2_SIZE ;
6726- break ;
6727- }
6728-
67296737 /* Point at initial ( for too many branches error */
67306738 offset -= 2 ;
67316739 code [1 + LINK_SIZE ] = OP_CREF ;
0 commit comments