private boolean cfindloop ( Dfa d , Dfa s , int [ ] coldp ) { int begin ; int end ; int cold ; int open ; /* open and close of range of possible starts */ int close ; int estart ; int estop ; boolean shorter = 0 != ( g . tree . flags & Subre . SHORTER ) ; boolean hitend [ ] = new boolean [ 1 ] ; boolean lookingAt = 0 != ( eflags & Flags . REG_LOOKING_AT ) ; assert d != null && s != null ; close = 0 ; do { int [ ] cold0 = new int [ 1 ] ; /* * Call search NFA to see if this is possible at all. */ if ( lookingAt ) { // in the looking at case, we use the un-search-ified RE. close = d . shortest ( close , close , data . length ( ) , cold0 , null ) ; cold = 0 ; } else { close = s . shortest ( close , close , data . length ( ) , cold0 , null ) ; cold = cold0 [ 0 ] ; } if ( close == - 1 ) { break ; /* NOTE BREAK */ } assert cold != - 1 ; open = cold ; cold = - 1 ; for ( begin = open ; begin <= close ; begin ++ ) { if ( begin > 0 && lookingAt ) { // Is this possible given the looking-at constraint in the call to shortest above? return false ; } estart = begin ; estop = data . length ( ) ; for ( ; ; ) { if ( shorter ) { end = d . shortest ( begin , estart , estop , null , hitend ) ; } else { end = d . longest ( begin , estop , hitend ) ; } if ( hitend [ 0 ] && cold == - 1 ) { cold = begin ; } if ( end == - 1 ) { break ; /* NOTE BREAK OUT */ } for ( int x = 0 ; x < match . size ( ) ; x ++ ) { match . set ( x , null ) ; } int maxsubno = getMaxSubno ( g . tree , 0 ) ; mem = new int [ maxsubno + 1 ] ; boolean matched = cdissect ( g . tree , begin , end ) ; if ( matched ) { // indicate the full match bounds. match . set ( 0 , new RegMatch ( begin , end ) ) ; coldp [ 0 ] = cold ; return true ; } if ( shorter ? end == estop : end == begin ) { /* no point in trying again */ coldp [ 0 ] = cold ; return false ; } /* go around and try again */ if ( shorter ) { estart = end + 1 ; } else { estop = end - 1 ; } } } } while ( close < data . length ( ) ) ; coldp [ 0 ] = cold ; return false ; }
cfindloop - the heart of cfind