function scanForBracket(cm, where, dir, style, config) {
    var maxScanLen = (config && config.maxScanLineLength) || 10000;
    var maxScanLines = (config && config.maxScanLines) || 1000;

    var stack = [];
    var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;
    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);
    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
      var line = cm.getLine(lineNo);
      if (!line) continue;
      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
      if (line.length > maxScanLen) continue;
      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
      for (; pos != end; pos += dir) {
        var ch = line.charAt(pos);
        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
          var match = matching[ch];
          if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
          else stack.pop();
        }
      }
    }
    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
  }
function scanForBracket(cm, where, dir, style, config) {
    var maxScanLen = (config && config.maxScanLineLength) || 10000;
    var maxScanLines = (config && config.maxScanLines) || 1000;

    var stack = [];
    var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;
    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);
    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
      var line = cm.getLine(lineNo);
      if (!line) continue;
      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
      if (line.length > maxScanLen) continue;
      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
      for (; pos != end; pos += dir) {
        var ch = line.charAt(pos);
        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
          var match = matching[ch];
          if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
          else stack.pop();
        }
      }
    }
    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
  }
function scanForBracket ( cm , where , dir , style , config ) { var maxScanLen = ( config && config . maxScanLineLength ) || 10000 ; var maxScanLines = ( config && config . maxScanLines ) || 1000 ; var stack = [ ] ; var re = config && config . bracketRegex ? config . bracketRegex : / [(){}[\]] / ; var lineEnd = dir > 0 ? Math . min ( where . line + maxScanLines , cm . lastLine ( ) + 1 ) : Math . max ( cm . firstLine ( ) - 1 , where . line - maxScanLines ) ; for ( var lineNo = where . line ; lineNo != lineEnd ; lineNo += dir ) { var line = cm . getLine ( lineNo ) ; if ( ! line ) continue ; var pos = dir > 0 ? 0 : line . length - 1 , end = dir > 0 ? line . length : - 1 ; if ( line . length > maxScanLen ) continue ; if ( lineNo == where . line ) pos = where . ch - ( dir < 0 ? 1 : 0 ) ; for ( ; pos != end ; pos += dir ) { var ch = line . charAt ( pos ) ; if ( re . test ( ch ) && ( style === undefined || cm . getTokenTypeAt ( Pos ( lineNo , pos + 1 ) ) == style ) ) { var match = matching [ ch ] ; if ( ( match . charAt ( 1 ) == ">" ) == ( dir > 0 ) ) stack . push ( ch ) ; else if ( ! stack . length ) return { pos : Pos ( lineNo , pos ) , ch : ch } ; else stack . pop ( ) ; } } } return lineNo - dir == ( dir > 0 ? cm . lastLine ( ) : cm . firstLine ( ) ) ? false : null ; }
bracketRegex is used to specify which type of bracket to scan should be a regexp, e.g. /[[\]]/  Note: If "where" is on an open bracket, then this bracket is ignored.  Returns false when no bracket was found, null when it reached maxScanLines and gave up
bracketRegex is used to specify which type of bracket to scan should be a regexp e . g . / [[ \ ]] / Note : If where is on an open bracket then this bracket is ignored . Returns false when no bracket was found null when it reached maxScanLines and gave up