src/main/java/com/basistech/tclre/Runtime.java
private boolean cbrdissect(RuntimeSubexpression t, int begin, int end) {
        int i;
        int n = t.number;
        int len;
        int paren;
        int p;
        int stop;
        int min = t.min;
        int max = t.max;

        assert t.op == 'b';
        assert n >= 0;

        //TODO: could this get be out of range?
        if (match.get(n) == null) {
            return false;
        }
        paren = match.get(n).start;
        len = match.get(n).end - match.get(n).start;

    /* no room to maneuver -- retries are pointless */
        if (0 != mem[t.retry]) {
            return false;
        }
        mem[t.retry] = 1;

    /* special-case zero-length string */
        if (len == 0) {
            return begin == end;
        }

        /* and too-short string */
        assert end >= begin;
        if ((end - begin) < len) {
            return false;
        }
        stop = end - len;

    /* count occurrences */
        i = 0;
        for (p = begin; p <= stop && (i < max || max == Compiler.INFINITY); p += len) {
            // paren is index of

            if (g.compare.compare(data, paren, p, len) != 0) {
                break;
            }
            i++;
        }

    /* and sort it out */
        if (p != end) {         /* didn't consume all of it */
            return false;
        }
        return min <= i && (i <= max || max == Compiler.INFINITY);
    }
private boolean cbrdissect(RuntimeSubexpression t, int begin, int end) {
        int i;
        int n = t.number;
        int len;
        int paren;
        int p;
        int stop;
        int min = t.min;
        int max = t.max;

        assert t.op == 'b';
        assert n >= 0;

        //TODO: could this get be out of range?
        if (match.get(n) == null) {
            return false;
        }
        paren = match.get(n).start;
        len = match.get(n).end - match.get(n).start;

    /* no room to maneuver -- retries are pointless */
        if (0 != mem[t.retry]) {
            return false;
        }
        mem[t.retry] = 1;

    /* special-case zero-length string */
        if (len == 0) {
            return begin == end;
        }

        /* and too-short string */
        assert end >= begin;
        if ((end - begin) < len) {
            return false;
        }
        stop = end - len;

    /* count occurrences */
        i = 0;
        for (p = begin; p <= stop && (i < max || max == Compiler.INFINITY); p += len) {
            // paren is index of

            if (g.compare.compare(data, paren, p, len) != 0) {
                break;
            }
            i++;
        }

    /* and sort it out */
        if (p != end) {         /* didn't consume all of it */
            return false;
        }
        return min <= i && (i <= max || max == Compiler.INFINITY);
    }
private boolean cbrdissect ( RuntimeSubexpression t , int begin , int end ) { int i ; int n = t . number ; int len ; int paren ; int p ; int stop ; int min = t . min ; int max = t . max ; assert t . op == ' ' ; assert n >= 0 ; //TODO: could this get be out of range? if ( match . get ( n ) == null ) { return false ; } paren = match . get ( n ) . start ; len = match . get ( n ) . end - match . get ( n ) . start ; /* no room to maneuver -- retries are pointless */ if ( 0 != mem [ t . retry ] ) { return false ; } mem [ t . retry ] = 1 ; /* special-case zero-length string */ if ( len == 0 ) { return begin == end ; } /* and too-short string */ assert end >= begin ; if ( ( end - begin ) < len ) { return false ; } stop = end - len ; /* count occurrences */ i = 0 ; for ( p = begin ; p <= stop && ( i < max || max == Compiler . INFINITY ) ; p += len ) { // paren is index of if ( g . compare . compare ( data , paren , p , len ) != 0 ) { break ; } i ++ ; } /* and sort it out */ if ( p != end ) { /* didn't consume all of it */ return false ; } return min <= i && ( i <= max || max == Compiler . INFINITY ) ; }
cbrdissect - determine backref subexpression matches
cbrdissect - determine backref subexpression matches