Browse code

Use a lookup table for precompute_bonuses

John Hawthorn authored on 10/07/2016 19:46:59
Showing 1 changed files

... ...
@@ -55,28 +55,38 @@ void mat_print(score_t *mat, char name, const char *needle, const char *haystack
55 55
 }
56 56
 #endif
57 57
 
58
+const score_t bonus_states[][256] = {
59
+	{ 0 },
60
+	{
61
+		['/'] = SCORE_MATCH_SLASH,
62
+		['-'] = SCORE_MATCH_WORD,
63
+		['_'] = SCORE_MATCH_WORD,
64
+		[' '] = SCORE_MATCH_WORD,
65
+		['.'] = SCORE_MATCH_DOT,
66
+	},
67
+	{
68
+		['a' ... 'z'] = SCORE_MATCH_CAPITAL,
69
+		['/'] = SCORE_MATCH_SLASH,
70
+		['-'] = SCORE_MATCH_WORD,
71
+		['_'] = SCORE_MATCH_WORD,
72
+		[' '] = SCORE_MATCH_WORD,
73
+		['.'] = SCORE_MATCH_DOT,
74
+	},
75
+};
76
+
77
+const size_t bonus_index[256] = {
78
+	['A' ... 'Z'] = 2,
79
+	['a' ... 'z'] = 1,
80
+	['0' ... '9'] = 1,
81
+};
82
+
58 83
 static void precompute_bonus(const char *haystack, score_t *match_bonus) {
59 84
 	/* Which positions are beginning of words */
60 85
 	int m = strlen(haystack);
61
-	char last_ch = '\0';
86
+	char last_ch = '/';
62 87
 	for (int i = 0; i < m; i++) {
63 88
 		char ch = haystack[i];
64
-
65
-		score_t score = 0;
66
-		if (isalnum(ch)) {
67
-			if (!last_ch || last_ch == '/') {
68
-				score = SCORE_MATCH_SLASH;
69
-			} else if (last_ch == '-' || last_ch == '_' || last_ch == ' ') {
70
-				score = SCORE_MATCH_WORD;
71
-			} else if (last_ch >= 'a' && last_ch <= 'z' && ch >= 'A' && ch <= 'Z') {
72
-				/* CamelCase */
73
-				score = SCORE_MATCH_CAPITAL;
74
-			} else if (last_ch == '.') {
75
-				score = SCORE_MATCH_DOT;
76
-			}
77
-		}
78
-
79
-		match_bonus[i] = score;
89
+		match_bonus[i] = bonus_states[bonus_index[(size_t)ch]][(size_t)last_ch];
80 90
 		last_ch = ch;
81 91
 	}
82 92
 }