Browse code

Use standards-compliant lookup table

John Hawthorn authored on 10/07/2016 19:42:06
Showing 2 changed files

1 1
new file mode 100644
... ...
@@ -0,0 +1,124 @@
1
+#ifndef BONUS_H
2
+#define BONUS_H BONUS_H
3
+
4
+#include "../config.h"
5
+
6
+const score_t bonus_states[3][256] = {
7
+	{ 0 },
8
+	{
9
+		['/'] = SCORE_MATCH_SLASH,
10
+		['-'] = SCORE_MATCH_WORD,
11
+		['_'] = SCORE_MATCH_WORD,
12
+		[' '] = SCORE_MATCH_WORD,
13
+		['.'] = SCORE_MATCH_DOT,
14
+	},
15
+	{
16
+		['/'] = SCORE_MATCH_SLASH,
17
+		['-'] = SCORE_MATCH_WORD,
18
+		['_'] = SCORE_MATCH_WORD,
19
+		[' '] = SCORE_MATCH_WORD,
20
+		['.'] = SCORE_MATCH_DOT,
21
+
22
+		/* ['a' ... 'z'] = SCORE_MATCH_CAPITAL, */
23
+		['a'] = SCORE_MATCH_CAPITAL,
24
+		['b'] = SCORE_MATCH_CAPITAL,
25
+		['c'] = SCORE_MATCH_CAPITAL,
26
+		['d'] = SCORE_MATCH_CAPITAL,
27
+		['e'] = SCORE_MATCH_CAPITAL,
28
+		['f'] = SCORE_MATCH_CAPITAL,
29
+		['g'] = SCORE_MATCH_CAPITAL,
30
+		['h'] = SCORE_MATCH_CAPITAL,
31
+		['i'] = SCORE_MATCH_CAPITAL,
32
+		['j'] = SCORE_MATCH_CAPITAL,
33
+		['k'] = SCORE_MATCH_CAPITAL,
34
+		['l'] = SCORE_MATCH_CAPITAL,
35
+		['m'] = SCORE_MATCH_CAPITAL,
36
+		['n'] = SCORE_MATCH_CAPITAL,
37
+		['o'] = SCORE_MATCH_CAPITAL,
38
+		['p'] = SCORE_MATCH_CAPITAL,
39
+		['q'] = SCORE_MATCH_CAPITAL,
40
+		['r'] = SCORE_MATCH_CAPITAL,
41
+		['s'] = SCORE_MATCH_CAPITAL,
42
+		['t'] = SCORE_MATCH_CAPITAL,
43
+		['u'] = SCORE_MATCH_CAPITAL,
44
+		['v'] = SCORE_MATCH_CAPITAL,
45
+		['w'] = SCORE_MATCH_CAPITAL,
46
+		['x'] = SCORE_MATCH_CAPITAL,
47
+		['y'] = SCORE_MATCH_CAPITAL,
48
+		['z'] = SCORE_MATCH_CAPITAL,
49
+	},
50
+};
51
+
52
+const size_t bonus_index[256] = {
53
+	/* ['A' ... 'Z'] = 2 */
54
+	['A'] = 2,
55
+	['B'] = 2,
56
+	['C'] = 2,
57
+	['D'] = 2,
58
+	['E'] = 2,
59
+	['F'] = 2,
60
+	['G'] = 2,
61
+	['H'] = 2,
62
+	['I'] = 2,
63
+	['J'] = 2,
64
+	['K'] = 2,
65
+	['L'] = 2,
66
+	['M'] = 2,
67
+	['N'] = 2,
68
+	['O'] = 2,
69
+	['P'] = 2,
70
+	['Q'] = 2,
71
+	['R'] = 2,
72
+	['S'] = 2,
73
+	['T'] = 2,
74
+	['U'] = 2,
75
+	['V'] = 2,
76
+	['W'] = 2,
77
+	['X'] = 2,
78
+	['Y'] = 2,
79
+	['Z'] = 2,
80
+
81
+	/* ['a' ... 'z'] = 1 */
82
+	['a'] = 1,
83
+	['b'] = 1,
84
+	['c'] = 1,
85
+	['d'] = 1,
86
+	['e'] = 1,
87
+	['f'] = 1,
88
+	['g'] = 1,
89
+	['h'] = 1,
90
+	['i'] = 1,
91
+	['j'] = 1,
92
+	['k'] = 1,
93
+	['l'] = 1,
94
+	['m'] = 1,
95
+	['n'] = 1,
96
+	['o'] = 1,
97
+	['p'] = 1,
98
+	['q'] = 1,
99
+	['r'] = 1,
100
+	['s'] = 1,
101
+	['t'] = 1,
102
+	['u'] = 1,
103
+	['v'] = 1,
104
+	['w'] = 1,
105
+	['x'] = 1,
106
+	['y'] = 1,
107
+	['z'] = 1,
108
+
109
+	/* ['0' ... '9'] = 1 */
110
+	['0'] = 1,
111
+	['1'] = 1,
112
+	['2'] = 1,
113
+	['3'] = 1,
114
+	['4'] = 1,
115
+	['5'] = 1,
116
+	['6'] = 1,
117
+	['7'] = 1,
118
+	['8'] = 1,
119
+	['9'] = 1
120
+};
121
+
122
+#define COMPUTE_BONUS(last_ch, ch) (bonus_states[bonus_index[(size_t)(ch)]][(size_t)(last_ch)])
123
+
124
+#endif
... ...
@@ -6,6 +6,7 @@
6 6
 #include <math.h>
7 7
 
8 8
 #include "match.h"
9
+#include "bonus.h"
9 10
 
10 11
 #include "../config.h"
11 12
 
... ...
@@ -55,38 +56,13 @@ void mat_print(score_t *mat, char name, const char *needle, const char *haystack
55 56
 }
56 57
 #endif
57 58
 
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
-
83 59
 static void precompute_bonus(const char *haystack, score_t *match_bonus) {
84 60
 	/* Which positions are beginning of words */
85 61
 	int m = strlen(haystack);
86 62
 	char last_ch = '/';
87 63
 	for (int i = 0; i < m; i++) {
88 64
 		char ch = haystack[i];
89
-		match_bonus[i] = bonus_states[bonus_index[(size_t)ch]][(size_t)last_ch];
65
+		match_bonus[i] = COMPUTE_BONUS(last_ch, ch);
90 66
 		last_ch = ch;
91 67
 	}
92 68
 }