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