2727 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2828 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929 *
30- * $PostgreSQL: pgsql/src/backend/regex/regexec.c,v 1.27 2005/10/15 02:49:24 momjian Exp $
30+ * $PostgreSQL: pgsql/src/backend/regex/regexec.c,v 1.28 2010/02/01 02:45:29 tgl Exp $
3131 *
3232 */
3333
@@ -141,6 +141,7 @@ static int dissect(struct vars *, struct subre *, chr *, chr *);
141141static int condissect (struct vars * , struct subre * , chr * , chr * );
142142static int altdissect (struct vars * , struct subre * , chr * , chr * );
143143static int cdissect (struct vars * , struct subre * , chr * , chr * );
144+ static int ccaptdissect (struct vars * , struct subre * , chr * , chr * );
144145static int ccondissect (struct vars * , struct subre * , chr * , chr * );
145146static int crevdissect (struct vars * , struct subre * , chr * , chr * );
146147static int cbrdissect (struct vars * , struct subre * , chr * , chr * );
@@ -560,27 +561,21 @@ dissect(struct vars * v,
560561 case '=' : /* terminal node */
561562 assert (t -> left == NULL && t -> right == NULL );
562563 return REG_OKAY ; /* no action, parent did the work */
563- break ;
564564 case '|' : /* alternation */
565565 assert (t -> left != NULL );
566566 return altdissect (v , t , begin , end );
567- break ;
568567 case 'b' : /* back ref -- shouldn't be calling us! */
569568 return REG_ASSERT ;
570- break ;
571569 case '.' : /* concatenation */
572570 assert (t -> left != NULL && t -> right != NULL );
573571 return condissect (v , t , begin , end );
574- break ;
575572 case '(' : /* capturing */
576573 assert (t -> left != NULL && t -> right == NULL );
577574 assert (t -> subno > 0 );
578575 subset (v , t , begin , end );
579576 return dissect (v , t -> left , begin , end );
580- break ;
581577 default :
582578 return REG_ASSERT ;
583- break ;
584579 }
585580}
586581
@@ -710,8 +705,6 @@ cdissect(struct vars * v,
710705 chr * begin , /* beginning of relevant substring */
711706 chr * end ) /* end of same */
712707{
713- int er ;
714-
715708 assert (t != NULL );
716709 MDEBUG (("cdissect %ld-%ld %c\n" , LOFF (begin ), LOFF (end ), t -> op ));
717710
@@ -720,33 +713,42 @@ cdissect(struct vars * v,
720713 case '=' : /* terminal node */
721714 assert (t -> left == NULL && t -> right == NULL );
722715 return REG_OKAY ; /* no action, parent did the work */
723- break ;
724716 case '|' : /* alternation */
725717 assert (t -> left != NULL );
726718 return caltdissect (v , t , begin , end );
727- break ;
728719 case 'b' : /* back ref -- shouldn't be calling us! */
729720 assert (t -> left == NULL && t -> right == NULL );
730721 return cbrdissect (v , t , begin , end );
731- break ;
732722 case '.' : /* concatenation */
733723 assert (t -> left != NULL && t -> right != NULL );
734724 return ccondissect (v , t , begin , end );
735- break ;
736725 case '(' : /* capturing */
737726 assert (t -> left != NULL && t -> right == NULL );
738- assert (t -> subno > 0 );
739- er = cdissect (v , t -> left , begin , end );
740- if (er == REG_OKAY )
741- subset (v , t , begin , end );
742- return er ;
743- break ;
727+ return ccaptdissect (v , t , begin , end );
744728 default :
745729 return REG_ASSERT ;
746- break ;
747730 }
748731}
749732
733+ /*
734+ * ccaptdissect - capture subexpression matches (with complications)
735+ */
736+ static int /* regexec return code */
737+ ccaptdissect (struct vars * v ,
738+ struct subre * t ,
739+ chr * begin , /* beginning of relevant substring */
740+ chr * end ) /* end of same */
741+ {
742+ int er ;
743+
744+ assert (t -> subno > 0 );
745+
746+ er = cdissect (v , t -> left , begin , end );
747+ if (er == REG_OKAY )
748+ subset (v , t , begin , end );
749+ return er ;
750+ }
751+
750752/*
751753 * ccondissect - concatenation subexpression matches (with complications)
752754 * The retry memory stores the offset of the trial midpoint from begin,
@@ -804,17 +806,27 @@ ccondissect(struct vars * v,
804806 for (;;)
805807 {
806808 /* try this midpoint on for size */
807- er = cdissect (v , t -> left , begin , mid );
808- if (er == REG_OKAY &&
809- longest (v , d2 , mid , end , (int * ) NULL ) == end &&
810- (er = cdissect (v , t -> right , mid , end )) ==
811- REG_OKAY )
812- break ; /* NOTE BREAK OUT */
813- if (er != REG_OKAY && er != REG_NOMATCH )
809+ if (longest (v , d2 , mid , end , (int * ) NULL ) == end )
814810 {
815- freedfa (d );
816- freedfa (d2 );
817- return er ;
811+ er = cdissect (v , t -> left , begin , mid );
812+ if (er == REG_OKAY )
813+ {
814+ er = cdissect (v , t -> right , mid , end );
815+ if (er == REG_OKAY )
816+ {
817+ /* satisfaction */
818+ MDEBUG (("successful\n" ));
819+ freedfa (d );
820+ freedfa (d2 );
821+ return REG_OKAY ;
822+ }
823+ }
824+ if (er != REG_OKAY && er != REG_NOMATCH )
825+ {
826+ freedfa (d );
827+ freedfa (d2 );
828+ return er ;
829+ }
818830 }
819831
820832 /* that midpoint didn't work, find a new one */
@@ -841,11 +853,8 @@ ccondissect(struct vars * v,
841853 zapmem (v , t -> right );
842854 }
843855
844- /* satisfaction */
845- MDEBUG (("successful\n" ));
846- freedfa (d );
847- freedfa (d2 );
848- return REG_OKAY ;
856+ /* can't get here */
857+ return REG_ASSERT ;
849858}
850859
851860/*
@@ -904,17 +913,27 @@ crevdissect(struct vars * v,
904913 for (;;)
905914 {
906915 /* try this midpoint on for size */
907- er = cdissect (v , t -> left , begin , mid );
908- if (er == REG_OKAY &&
909- longest (v , d2 , mid , end , (int * ) NULL ) == end &&
910- (er = cdissect (v , t -> right , mid , end )) ==
911- REG_OKAY )
912- break ; /* NOTE BREAK OUT */
913- if (er != REG_OKAY && er != REG_NOMATCH )
916+ if (longest (v , d2 , mid , end , (int * ) NULL ) == end )
914917 {
915- freedfa (d );
916- freedfa (d2 );
917- return er ;
918+ er = cdissect (v , t -> left , begin , mid );
919+ if (er == REG_OKAY )
920+ {
921+ er = cdissect (v , t -> right , mid , end );
922+ if (er == REG_OKAY )
923+ {
924+ /* satisfaction */
925+ MDEBUG (("successful\n" ));
926+ freedfa (d );
927+ freedfa (d2 );
928+ return REG_OKAY ;
929+ }
930+ }
931+ if (er != REG_OKAY && er != REG_NOMATCH )
932+ {
933+ freedfa (d );
934+ freedfa (d2 );
935+ return er ;
936+ }
918937 }
919938
920939 /* that midpoint didn't work, find a new one */
@@ -941,11 +960,8 @@ crevdissect(struct vars * v,
941960 zapmem (v , t -> right );
942961 }
943962
944- /* satisfaction */
945- MDEBUG (("successful\n" ));
946- freedfa (d );
947- freedfa (d2 );
948- return REG_OKAY ;
963+ /* can't get here */
964+ return REG_ASSERT ;
949965}
950966
951967/*
0 commit comments