package com.oracle.truffle.tools.chromeinspector.util;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.tools.utils.json.JSONArray;
import com.oracle.truffle.tools.utils.json.JSONObject;
public final class LineSearch {
private LineSearch() {
}
public static JSONArray matchLines(Source source, String query, final boolean caseSensitive, final boolean isRegex) throws PatternSyntaxException {
JSONArray matchLines = new JSONArray();
Pattern pattern = isRegex ? Pattern.compile(query, caseSensitive ? 0 : Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE) : null;
for (int lineNumber = 1; lineNumber <= source.getLineCount(); lineNumber++) {
String line = source.getCharacters(lineNumber).toString();
if (isRegex) {
assert pattern != null;
if (pattern.matcher(line).find()) {
addSearchMatch(matchLines, lineNumber, line);
}
} else {
if (caseSensitive && line.contains(query) || !caseSensitive && containsIgnoreCase(line, query)) {
addSearchMatch(matchLines, lineNumber, line);
}
}
}
return matchLines;
}
private static void addSearchMatch(JSONArray matchLines, int lineNumber, String line) {
JSONObject matchLine = new JSONObject();
matchLine.put("lineNumber", lineNumber - 1);
matchLine.put("lineContent", line);
matchLines.put(matchLine);
}
private static boolean containsIgnoreCase(String line, String query) {
int ll = line.length();
int ql = query.length();
if (ll == ql) {
return line.equalsIgnoreCase(query);
} else if (ll > ql) {
for (int li = 0; li <= (ll - ql); li++) {
int k = li;
for (int qi = 0; qi < ql; qi++, k++) {
if (!compareIgnoreCase(line.charAt(k), query.charAt(qi))) {
break;
}
}
if (k == (li + ql)) {
return true;
}
}
}
return false;
}
private static boolean compareIgnoreCase(char c1, char c2) {
if (c1 == c2) {
return true;
}
if (Character.toUpperCase(c1) == Character.toUpperCase(c2) || Character.toLowerCase(c1) == Character.toLowerCase(c2)) {
return true;
}
return false;
}
}