| ... | ... |
@@ -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 |
} |