whole_func_string: 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;
    }
func_code_string: 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;
    }
func_documentation_string: 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