# HG changeset patch
# User Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
# Date 1600861907 -7200
# Node ID f15d2ac35932a02591c8dfe03e140baf4c7a77fe
# Parent  159c628527c410951292af6906c33123e23547db
Optimize HeaderLineParser.parse() method by replacing regionMatches() calls by direct character array comparisons.
Also found (and now corrected) that old regionMatches() calls did not match the first character (offset was 1 and should have been 0).

diff --git a/src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java b/src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java
--- a/src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java
@@ -52,9 +52,10 @@ public final class HeaderLineParser exte
 		int pos = 0;
 		boolean foundChar = false;
 		boolean nameFound = false;
+		int i;
 
 		// find header name searching from the end of the line
-		for (int i = len - 1; i >= 0; i--) {
+		for (i = len - 1; i >= 0; i--) {
 			switch (chrLine[i]) {
 				case ' ':
 				case '\n':
@@ -84,27 +85,32 @@ public final class HeaderLineParser exte
 
 		// depending on the name of the header, we continue
 		int type = 0;
+		i = pos;
 		switch (len - pos) {
 			case 4:
-				// source.regionMatches(pos + 1, "name", 1, 3)
-				if (chrLine[pos] == 'n' && chrLine[pos+1] == 'a' && chrLine[pos+2] == 'm' && chrLine[pos+3] == 'e') {
+				// source.regionMatches(pos + 1, "name", 0, 4)
+				if (chrLine[i] == 'n' && chrLine[++i] == 'a' && chrLine[++i] == 'm' && chrLine[++i] == 'e') {
 					getValues(chrLine, 2, pos - 3);
 					type = NAME;
 				} else
-				// source.regionMatches(pos + 1, "type", 1, 3)
-				if (chrLine[pos] == 't' && chrLine[pos+1] == 'y' && chrLine[pos+2] == 'p' && chrLine[pos+3] == 'e') {
+				// source.regionMatches(pos + 1, "type", 0, 4)
+				if (chrLine[i] == 't' && chrLine[++i] == 'y' && chrLine[++i] == 'p' && chrLine[++i] == 'e') {
 					getValues(chrLine, 2, pos - 3);
 					type = TYPE;
 				}
 				break;
 			case 6:
-				if (source.regionMatches(pos + 1, "length", 1, 5)) {
+				// source.regionMatches(pos + 1, "length", 0, 6)
+				if (chrLine[ i ] == 'l' && chrLine[++i] == 'e' && chrLine[++i] == 'n' && chrLine[++i] == 'g'
+				 && chrLine[++i] == 't' && chrLine[++i] == 'h') {
 					getIntValues(chrLine, 2, pos - 3);
 					type = LENGTH;
 				}
 				break;
 			case 10:
-				if (source.regionMatches(pos + 1, "table_name", 1, 9)) {
+				// source.regionMatches(pos + 1, "table_name", 0, 10)
+				if (chrLine[ i ] == 't' && chrLine[++i] == 'a' && chrLine[++i] == 'b' && chrLine[++i] == 'l' && chrLine[++i] == 'e'
+				 && chrLine[++i] == '_' && chrLine[++i] == 'n' && chrLine[++i] == 'a' && chrLine[++i] == 'm' && chrLine[++i] == 'e') {
 					getValues(chrLine, 2, pos - 3);
 					type = TABLE;
 				}