Check in polyglot-1.4w10UCIb15
[polyglot.git] / square.cpp
1 \r
2 // square.cpp\r
3 \r
4 // includes\r
5 \r
6 #include "colour.h"\r
7 #include "square.h"\r
8 #include "util.h"\r
9 \r
10 // "constants"\r
11 \r
12 static const uint8 SquareFrom64[64] = {\r
13    A1, B1, C1, D1, E1, F1, G1, H1,\r
14    A2, B2, C2, D2, E2, F2, G2, H2,\r
15    A3, B3, C3, D3, E3, F3, G3, H3,\r
16    A4, B4, C4, D4, E4, F4, G4, H4,\r
17    A5, B5, C5, D5, E5, F5, G5, H5,\r
18    A6, B6, C6, D6, E6, F6, G6, H6,\r
19    A7, B7, C7, D7, E7, F7, G7, H7,\r
20    A8, B8, C8, D8, E8, F8, G8, H8,\r
21 };\r
22 \r
23 // variables\r
24 \r
25 static sint8 SquareTo64[SquareNb];\r
26 \r
27 // functions\r
28 \r
29 // square_init()\r
30 \r
31 void square_init() {\r
32 \r
33    int sq;\r
34 \r
35    for (sq = 0; sq < SquareNb; sq++) SquareTo64[sq] = -1;\r
36 \r
37    for (sq = 0; sq < 64; sq++) {\r
38       SquareTo64[SquareFrom64[sq]] = sq;\r
39    }\r
40 }\r
41 \r
42 // square_is_ok()\r
43 \r
44 bool square_is_ok(int square) {\r
45 \r
46    if (square < 0 || square >= SquareNb) return false;\r
47 \r
48    if (SquareTo64[square] < 0) return false;\r
49 \r
50    return true;\r
51 }\r
52 \r
53 // square_make()\r
54 \r
55 int square_make(int file, int rank) {\r
56 \r
57    int sq_64;\r
58 \r
59    ASSERT(file>=0&&file<8);\r
60    ASSERT(rank>=0&&rank<8);\r
61 \r
62    sq_64 = (rank << 3) | file;\r
63 \r
64    return square_from_64(sq_64);\r
65 }\r
66 \r
67 // square_file()\r
68 \r
69 int square_file(int square) {\r
70 \r
71    int file;\r
72 \r
73    ASSERT(square_is_ok(square));\r
74 \r
75    file = (square - 4) & 7;\r
76    ASSERT(file==(square_to_64(square)&7));\r
77 \r
78    return file;\r
79 }\r
80 \r
81 // square_rank()\r
82 \r
83 int square_rank(int square) {\r
84 \r
85    int rank;\r
86 \r
87    ASSERT(square_is_ok(square));\r
88 \r
89    rank = (square >> 4) - 2;\r
90    ASSERT(rank==square_to_64(square)>>3);\r
91 \r
92    return rank;\r
93 }\r
94 \r
95 // square_side_rank()\r
96 \r
97 int square_side_rank(int square, int colour) {\r
98 \r
99    int rank;\r
100 \r
101    ASSERT(square_is_ok(square));\r
102    ASSERT(colour_is_ok(colour));\r
103 \r
104    rank = square_rank(square);\r
105    if (colour_is_black(colour)) rank = 7-rank;\r
106 \r
107    return rank;\r
108 }\r
109 \r
110 // square_from_64()\r
111 \r
112 int square_from_64(int square) {\r
113 \r
114    ASSERT(square>=0&&square<64);\r
115 \r
116    return SquareFrom64[square];\r
117 }\r
118 \r
119 // square_to_64()\r
120 \r
121 int square_to_64(int square) {\r
122 \r
123    ASSERT(square_is_ok(square));\r
124 \r
125    return SquareTo64[square];\r
126 }\r
127 \r
128 // square_is_promote()\r
129 \r
130 bool square_is_promote(int square) {\r
131 \r
132    int rank;\r
133 \r
134    ASSERT(square_is_ok(square));\r
135 \r
136    rank = square_rank(square);\r
137 \r
138    return rank == Rank1 || rank == Rank8;\r
139 }\r
140 \r
141 // square_ep_dual()\r
142 \r
143 int square_ep_dual(int square) {\r
144 \r
145    ASSERT(square_is_ok(square));\r
146    ASSERT(square_rank(square)>=2&&square_rank(square)<=5);\r
147 \r
148    return square ^ 16;\r
149 }\r
150 \r
151 // square_colour()\r
152 \r
153 int square_colour(int square) {\r
154 \r
155    ASSERT(square_is_ok(square));\r
156 \r
157    return (square ^ (square >> 4)) & 1;\r
158 }\r
159 \r
160 // file_from_char()\r
161 \r
162 int file_from_char(int c) {\r
163 \r
164    ASSERT(c>='a'&&c<='h');\r
165 \r
166    return c - 'a';\r
167 }\r
168 \r
169 // rank_from_char()\r
170 \r
171 int rank_from_char(int c) {\r
172 \r
173    ASSERT(c>='1'&&c<='8');\r
174 \r
175    return c - '1';\r
176 }\r
177 \r
178 // file_to_char()\r
179 \r
180 int file_to_char(int file) {\r
181 \r
182    ASSERT(file>=0&&file<8);\r
183 \r
184    return 'a' + file;\r
185 }\r
186 \r
187 // rank_to_char()\r
188 \r
189 int rank_to_char(int rank) {\r
190 \r
191    ASSERT(rank>=0&&rank<8);\r
192 \r
193    return '1' + rank;\r
194 }\r
195 \r
196 // char_is_file()\r
197 \r
198 bool char_is_file(int c) {\r
199 \r
200    return c >= 'a' && c <= 'h';\r
201 }\r
202 \r
203 // char_is_rank()\r
204 \r
205 bool char_is_rank(int c) {\r
206 \r
207    return c >= '1' && c <= '8';\r
208 }\r
209 \r
210 // square_to_string()\r
211 \r
212 bool square_to_string(int square, char string[], int size) {\r
213 \r
214    ASSERT(square_is_ok(square));\r
215    ASSERT(string!=NULL);\r
216    ASSERT(size>=3);\r
217 \r
218    if (size < 3) return false;\r
219 \r
220    string[0] = 'a' + square_file(square);\r
221    string[1] = '1' + square_rank(square);\r
222    string[2] = '\0';\r
223 \r
224    return true;\r
225 }\r
226 \r
227 // square_from_string()\r
228 \r
229 int square_from_string(const char string[]) {\r
230 \r
231    int file, rank;\r
232 \r
233    ASSERT(string!=NULL);\r
234 \r
235    if (string[0] < 'a' || string[0] > 'h') return SquareNone;\r
236    if (string[1] < '1' || string[1] > '8') return SquareNone;\r
237    if (string[2] != '\0') return SquareNone;\r
238 \r
239    file = file_from_char(string[0]);\r
240    rank = rank_from_char(string[1]);\r
241 \r
242    return square_make(file,rank);\r
243 }\r
244 \r
245 // end of square.cpp\r
246 \r