1 #pragma once
2 /* *INDENT-OFF* */
3 /*>>> epddefs.h: Extended Position Description definitions */
4 /* Revised: 1996.06.23 */
5 /*
6    Copyright (C) 1996 by Steven J. Edwards (sje@mv.mv.com)
7    All rights reserved.  This code may be freely redistibuted and used by
8    both research and commerical applications.  No warranty exists.
9  */
10 /*
11    Everything in this source file is independent of the host program.
12    Requests for changes and additions should be communicated to the author
13    via the e-mail address given above.
14  */
15 /*
16    This file was originally prepared on an Apple Macintosh using the
17    Metrowerks CodeWarrior 6 ANSI C compiler.  Tabs are set at every
18    four columns.  Further testing and development was performed on a
19    generic PC running Linux 1.3.20 and using the gcc 2.7.0 compiler.
20  */
21 /* inclusion telltale */
22 #  if (!defined(_epddefs))
23 #    define _epddefs 1
24 /* subprogram storage class for non-statics (usually empty definition) */
25 #    define nonstatic
26 /* a bit */
27 #    define bit 0x01
28 /* bit positions */
29 #    define bit_00 (bit <<  0)
30 #    define bit_01 (bit <<  1)
31 #    define bit_02 (bit <<  2)
32 #    define bit_03 (bit <<  3)
33 #    define bit_04 (bit <<  4)
34 #    define bit_05 (bit <<  5)
35 #    define bit_06 (bit <<  6)
36 #    define bit_07 (bit <<  7)
37 #    define bit_08 (bit <<  8)
38 #    define bit_09 (bit <<  9)
39 #    define bit_10 (bit << 10)
40 #    define bit_11 (bit << 11)
41 #    define bit_12 (bit << 12)
42 #    define bit_13 (bit << 13)
43 #    define bit_14 (bit << 14)
44 #    define bit_15 (bit << 15)
45 /* bit width constants */
46 #    define nybbW  4
47 #    define byteW  8
48 /* simple masks */
49 #    define nybbM 0x000f
50 /* useful types */
51 typedef void *voidptrT;
52 typedef unsigned char byteT, *byteptrT;
53 typedef char *charptrT;
54 typedef short int siT, *siptrT;
55 typedef long int liT, *liptrT;
56 typedef float srT, *srptrT;
57 typedef double lrT, *lrptrT;
58 typedef FILE *fptrT;
59 
60 /* text I/O buffer length */
61 #    define tL 256
62 /* EPD I/O buffer length */
63 #    define epdL 4096
64 /* the standard algebraic notation character vector type */
65 #    define sanL 16
66 		/* must be at least 8; extra room for alternatives */
67 typedef char sanT[sanL];
68 typedef sanT *sanptrT;
69 
70 /* SAN style attributes, priority ordered (used for encoding) */
71 typedef siT ssaT;
72 
73 #    define ssaL 12
74 #    define ssa_nil (-1)
75 #    define ssa_capt  0 /* 5 way: capture indicator */
76 #    define ssa_case  1 /* 2 way: letter case */
77 #    define ssa_chec  2 /* 3 way: checking */
78 #    define ssa_cast  3 /* 5 way: castling */
79 #    define ssa_prom  4 /* 4 way: promoting */
80 #    define ssa_ptar  5 /* 2 way: pawn target rank skip */
81 #    define ssa_chmt  6 /* 4 way: checkmating */
82 #    define ssa_epct  7 /* 2 way: en passant capture */
83 #    define ssa_draw  8 /* 2 way: drawing */
84 #    define ssa_move  9 /* 2 way: movement indicator */
85 #    define ssa_edcf 10 /* 2 way: extra disambiguating character (file) */
86 #    define ssa_edcr 11 /* 2 way: extra disambiguating character (rank) */
87 /* SAN style vector */
88 typedef siT ssavT[ssaL];
89 
90 /* colors (ordering is critical) */
91 typedef siT cT, *cptrT;
92 
93 #    define cQ 2
94 #    define cL (bit << cQ)
95 #    define rcQ 1
96 #    define rcL (bit << rcQ)
97 #    define c_nil (-1)
98 #    define c_w 0
99 		/* white */
100 #    define c_b 1
101 		/* black */
102 #    define c_v 2
103 		/* vacant */
104 #    define c_x 3
105 		/* extra */
106 /* pieces (ordering is critical) */
107 typedef siT pT, *pptrT;
108 
109 #    define pL 8
110 #    define rpL 6
111 #    define p_nil (-1)
112 #    define p_p 0
113 		/* pawn */
114 #    define p_n 1
115 		/* knight */
116 #    define p_b 2
117 		/* bishop */
118 #    define p_r 3
119 		/* rook */
120 #    define p_q 4
121 		/* queen */
122 #    define p_k 5
123 		/* king */
124 #    define p_v 6
125 		/* vacant */
126 #    define p_x 7
127 		/* extra */
128 /* color piece combinations (ordering is critical) */
129 typedef siT cpT;
130 
131 #    define cpL 16
132 #    define rcpL 12
133 #    define cp_nil (-1)
134 #    define cp_wp  0	/* white pawn */
135 #    define cp_wn  1	/* white knight */
136 #    define cp_wb  2	/* white bishop */
137 #    define cp_wr  3	/* white rook */
138 #    define cp_wq  4	/* white queen */
139 #    define cp_wk  5	/* white king */
140 #    define cp_bp  6	/* black pawn */
141 #    define cp_bn  7	/* black knight */
142 #    define cp_bb  8	/* black bishop */
143 #    define cp_br  9	/* black rook */
144 #    define cp_bq 10	/* black queen */
145 #    define cp_bk 11	/* black king */
146 #    define cp_v0 12	/* vacant */
147 #    define cp_x0 13	/* extra 0 */
148 #    define cp_x1 14	/* extra 1 */
149 #    define cp_x2 15	/* extra 2 */
150 /* ranks */
151 typedef siT rankT;
152 
153 #    define rankM (0x0007)
154 #    define rankQ 3
155 #    define rankL (bit << rankQ)
156 #    define rank_nil (-1)
157 #    define rank_1 0
158 #    define rank_2 1
159 #    define rank_3 2
160 #    define rank_4 3
161 #    define rank_5 4
162 #    define rank_6 5
163 #    define rank_7 6
164 #    define rank_8 7
165 /* files */
166 typedef siT fileT;
167 
168 #    define fileM (0x0007)
169 #    define fileQ 3
170 #    define fileL (bit << fileQ)
171 #    define file_nil (-1)
172 #    define file_a 0	/* QR */
173 #    define file_b 1	/* QN */
174 #    define file_c 2	/* QB */
175 #    define file_d 3	/* Q */
176 #    define file_e 4	/* K */
177 #    define file_f 5	/* KB */
178 #    define file_g 6	/* KN */
179 #    define file_h 7	/* KR */
180 /* location mappings */
181 #    define map_sq(r, f) (((r) << fileQ | (f)))
182 #    define map_file(sq) ((sq) & 0x07)
183 #    define map_rank(sq) ((sq) >> fileQ)
184 /* squares */
185 typedef siT sqT, *sqptrT;
186 
187 #    define sqM (0x003f)
188 #    define sqQ (rankQ + fileQ)
189 #    define sqL (bit << sqQ)
190 #    define sq_nil (-1)
191 #    define sq_a1 map_sq(rank_1, file_a)
192 #    define sq_b1 map_sq(rank_1, file_b)
193 #    define sq_c1 map_sq(rank_1, file_c)
194 #    define sq_d1 map_sq(rank_1, file_d)
195 #    define sq_e1 map_sq(rank_1, file_e)
196 #    define sq_f1 map_sq(rank_1, file_f)
197 #    define sq_g1 map_sq(rank_1, file_g)
198 #    define sq_h1 map_sq(rank_1, file_h)
199 #    define sq_a2 map_sq(rank_2, file_a)
200 #    define sq_b2 map_sq(rank_2, file_b)
201 #    define sq_c2 map_sq(rank_2, file_c)
202 #    define sq_d2 map_sq(rank_2, file_d)
203 #    define sq_e2 map_sq(rank_2, file_e)
204 #    define sq_f2 map_sq(rank_2, file_f)
205 #    define sq_g2 map_sq(rank_2, file_g)
206 #    define sq_h2 map_sq(rank_2, file_h)
207 #    define sq_a3 map_sq(rank_3, file_a)
208 #    define sq_b3 map_sq(rank_3, file_b)
209 #    define sq_c3 map_sq(rank_3, file_c)
210 #    define sq_d3 map_sq(rank_3, file_d)
211 #    define sq_e3 map_sq(rank_3, file_e)
212 #    define sq_f3 map_sq(rank_3, file_f)
213 #    define sq_g3 map_sq(rank_3, file_g)
214 #    define sq_h3 map_sq(rank_3, file_h)
215 #    define sq_a4 map_sq(rank_4, file_a)
216 #    define sq_b4 map_sq(rank_4, file_b)
217 #    define sq_c4 map_sq(rank_4, file_c)
218 #    define sq_d4 map_sq(rank_4, file_d)
219 #    define sq_e4 map_sq(rank_4, file_e)
220 #    define sq_f4 map_sq(rank_4, file_f)
221 #    define sq_g4 map_sq(rank_4, file_g)
222 #    define sq_h4 map_sq(rank_4, file_h)
223 #    define sq_a5 map_sq(rank_5, file_a)
224 #    define sq_b5 map_sq(rank_5, file_b)
225 #    define sq_c5 map_sq(rank_5, file_c)
226 #    define sq_d5 map_sq(rank_5, file_d)
227 #    define sq_e5 map_sq(rank_5, file_e)
228 #    define sq_f5 map_sq(rank_5, file_f)
229 #    define sq_g5 map_sq(rank_5, file_g)
230 #    define sq_h5 map_sq(rank_5, file_h)
231 #    define sq_a6 map_sq(rank_6, file_a)
232 #    define sq_b6 map_sq(rank_6, file_b)
233 #    define sq_c6 map_sq(rank_6, file_c)
234 #    define sq_d6 map_sq(rank_6, file_d)
235 #    define sq_e6 map_sq(rank_6, file_e)
236 #    define sq_f6 map_sq(rank_6, file_f)
237 #    define sq_g6 map_sq(rank_6, file_g)
238 #    define sq_h6 map_sq(rank_6, file_h)
239 #    define sq_a7 map_sq(rank_7, file_a)
240 #    define sq_b7 map_sq(rank_7, file_b)
241 #    define sq_c7 map_sq(rank_7, file_c)
242 #    define sq_d7 map_sq(rank_7, file_d)
243 #    define sq_e7 map_sq(rank_7, file_e)
244 #    define sq_f7 map_sq(rank_7, file_f)
245 #    define sq_g7 map_sq(rank_7, file_g)
246 #    define sq_h7 map_sq(rank_7, file_h)
247 #    define sq_a8 map_sq(rank_8, file_a)
248 #    define sq_b8 map_sq(rank_8, file_b)
249 #    define sq_c8 map_sq(rank_8, file_c)
250 #    define sq_d8 map_sq(rank_8, file_d)
251 #    define sq_e8 map_sq(rank_8, file_e)
252 #    define sq_f8 map_sq(rank_8, file_f)
253 #    define sq_g8 map_sq(rank_8, file_g)
254 #    define sq_h8 map_sq(rank_8, file_h)
255 /* regular board */
256 typedef union rbU {
257   cpT rbm[rankL][fileL];	/* rank/file indexing */
258   cpT rbv[sqL]; 		/* square indexing */
259 } rbT, *rbptrT;
260 
261 /* nybble board vector */
262 #    define nbL (sqL / (byteW / nybbW))
263 typedef byteT nbvT[nbL];
264 
265 /* flanks */
266 typedef siT flankT;
267 
268 #    define flankL 2
269 #    define flank_nil (-1)
270 #    define flank_k 0	/* kingside */
271 #    define flank_q 1	/* queenside */
272 /* direction indices */
273 typedef siT dxT;
274 
275 #    define dxQ 4
276 #    define dxL (bit << dxQ)
277 #    define dx_nil (-1)
278 #    define dx_0  0
279 #    define dx_1  1
280 #    define dx_2  2
281 #    define dx_3  3
282 #    define dx_4  4
283 #    define dx_5  5
284 #    define dx_6  6
285 #    define dx_7  7
286 #    define dx_8  8
287 #    define dx_9  9
288 #    define dx_a 10
289 #    define dx_b 11
290 #    define dx_c 12
291 #    define dx_d 13
292 #    define dx_e 14
293 #    define dx_f 15
294 /* direction vector displacements */
295 typedef siT dvT;
296 
297 #    define dv_0 (( 0 * fileL) + 1)
298 #    define dv_1 (( 1 * fileL) + 0)
299 #    define dv_2 (( 0 * fileL) - 1)
300 #    define dv_3 ((-1 * fileL) - 0)
301 #    define dv_4 (( 1 * fileL) + 1)
302 #    define dv_5 (( 1 * fileL) - 1)
303 #    define dv_6 ((-1 * fileL) - 1)
304 #    define dv_7 ((-1 * fileL) + 1)
305 #    define dv_8 (( 1 * fileL) + 2)
306 #    define dv_9 (( 2 * fileL) + 1)
307 #    define dv_a (( 2 * fileL) - 1)
308 #    define dv_b (( 1 * fileL) - 2)
309 #    define dv_c ((-1 * fileL) - 2)
310 #    define dv_d ((-2 * fileL) - 1)
311 #    define dv_e ((-2 * fileL) + 1)
312 #    define dv_f ((-1 * fileL) + 2)
313 /* extended direction vector offsets */
314 typedef siT xdvT;
315 
316 #    define xdv_0 (( 0 * xfileL) + 1)
317 #    define xdv_1 (( 1 * xfileL) + 0)
318 #    define xdv_2 (( 0 * xfileL) - 1)
319 #    define xdv_3 ((-1 * xfileL) - 0)
320 #    define xdv_4 (( 1 * xfileL) + 1)
321 #    define xdv_5 (( 1 * xfileL) - 1)
322 #    define xdv_6 ((-1 * xfileL) - 1)
323 #    define xdv_7 ((-1 * xfileL) + 1)
324 #    define xdv_8 (( 1 * xfileL) + 2)
325 #    define xdv_9 (( 2 * xfileL) + 1)
326 #    define xdv_a (( 2 * xfileL) - 1)
327 #    define xdv_b (( 1 * xfileL) - 2)
328 #    define xdv_c ((-1 * xfileL) - 2)
329 #    define xdv_d ((-2 * xfileL) - 1)
330 #    define xdv_e ((-2 * xfileL) + 1)
331 #    define xdv_f ((-1 * xfileL) + 2)
332 /* extended rank, file, and square types */
333 typedef siT xrankT;
334 
335 #    define xrankQ (rankQ + 1)
336 #    define xrankL (bit << xrankQ)
337 typedef siT xfileT;
338 
339 #    define xfileQ (fileQ + 1)
340 #    define xfileM 0x0f
341 #    define xfileL (bit << xfileQ)
342 typedef siT xsqT, *xsqptrT;
343 
344 #    define xsqQ (xrankQ + xfileQ)
345 #    define xsqL (bit << xsqQ)
346 /* the extended board type */
347 typedef union xbU {
348   cpT xbm[xrankL][xfileL];
349   cpT xbv[xsqL];
350 } xbT, *xbptrT;
351 
352 /* extended board mapping macros */
353 #    define map_xrank_xsq(xsq) ((xsq) >> xfileQ)
354 #    define map_xfile_xsq(xsq) ((xsq) & xfileM)
355 #    define map_xsq_xrank_xfile(xrank, xfile) (((xrank) << xfileQ) | (xfile))
356 /* extended conversion macros */
357 #    define xbdrL 4
358 #    define map_xfile_file(file) ((file) + xbdrL)
359 #    define map_xrank_rank(rank) ((rank) + xbdrL)
360 #    define map_file_xfile(xfile) ((xfile) - xbdrL)
361 #    define map_rank_xrank(xrank) ((xrank) - xbdrL)
362 #    define map_sq_xsq(xsq) \
363 	(((((xsq) >> xfileQ) - xbdrL) << fileQ) | (((xsq) & xfileM) - xbdrL))
364 #    define map_xsq_sq(sq) \
365 	((((((sq) >> fileQ) & fileM) + xbdrL) << xfileQ) | \
366 	(((sq) & fileM) + xbdrL))
367 /* castling availability indicators */
368 typedef siT caiT;
369 
370 #    define caiL (rcL * flankL)
371 #    define cai_nil (-1)
372 #    define cai_wk ((c_w * flankL) + flank_k)
373 #    define cai_wq ((c_w * flankL) + flank_q)
374 #    define cai_bk ((c_b * flankL) + flank_k)
375 #    define cai_bq ((c_b * flankL) + flank_q)
376 /* castling index mapper */
377 #    define castim(cai) (bit << (cai))
378 /* castling flags */
379 typedef siT castT;
380 typedef castT *castptrT;
381 
382 #    define cf_wk castim(cai_wk)
383 #    define cf_wq castim(cai_wq)
384 #    define cf_bk castim(cai_bk)
385 #    define cf_bq castim(cai_bq)
386 /* centipawn evaluation */
387 typedef siT cpevT, *cpevptrT;
388 
389 /* some interesting centipawn evaluations */
390 #    define cpev_best ((cpevT) ((((liT) bit) << 15) - 1))
391 #    define cpev_bust (-cpev_best)
392 #    define cpev_draw 0
393 #    define cpev_mate cpev_best
394 #    define cpev_wrck (cpev_bust - 1)
395 /* mate and loss synthesis macros (fullmove distance argument) */
396 #    define synth_mate(n) (cpev_mate - ((n) * 2) + 1)
397 #    define synth_loss(n) (cpev_bust + ((n) * 2))
398 /* distance to mate/loss macros (mate/loss centipawn argument) */
399 #    define synth_distance_mate(cpev)  ((siT) (((cpev_mate - (cpev)) + 1) / 2))
400 #    define synth_distance_loss(cpev)  ((siT) (((cpev) - cpev_bust) / 2))
401 /* maximum distance to mate/loss (fullmove distance count) */
402 #    define max_dist_mateL 1024
403 #    define max_dist_lossL 1024
404 /* forced mate/loss detection macros (mate/loss centipawn argument) */
405 #    define forced_mate(cpev) ((cpev) >= ((cpev_mate - (max_dist_mateL * 2)) + 1))
406 #    define forced_loss(cpev) ((cpev) <= (cpev_bust + (max_dist_lossL * 2)))
407 /* move flag bits */
408 typedef siT mfT;
409 
410 #    define mf_bust (bit << 0)	/* illegal move */
411 #    define mf_chec (bit << 1)	/* checking */
412 #    define mf_chmt (bit << 2)	/* checkmating */
413 #    define mf_draw (bit << 3)	/* drawing (includes stalemating) */
414 #    define mf_exec (bit << 4)	/* executed at least once */
415 #    define mf_null (bit << 5)	/* special null move */
416 #    define mf_sanf (bit << 6)	/* needs file disambiguation */
417 #    define mf_sanr (bit << 7)	/* needs rank disambiguation */
418 #    define mf_stmt (bit << 8)	/* stalemating */
419 /* special case move type */
420 typedef siT scmvT;
421 
422 #    define scmvQ 3
423 #    define scmvL (bit << scmvQ)
424 #    define scmv_nil (-1)
425 #    define scmv_reg 0	/* regular */
426 #    define scmv_epc 1	/* en passant capture */
427 #    define scmv_cks 2	/* castles kingside */
428 #    define scmv_cqs 3	/* castles queenside */
429 #    define scmv_ppn 4	/* pawn promotes to knight */
430 #    define scmv_ppb 5	/* pawn promotes to bishop */
431 #    define scmv_ppr 6	/* pawn promotes to rook */
432 #    define scmv_ppq 7	/* pawn promotes to queen */
433 /* move type */
434 typedef struct mS {
435   mfT m_flag;			/* move flags */
436   sqT m_frsq;			/* from square */
437   sqT m_tosq;			/* to square */
438   cpT m_frcp;			/* from color-piece */
439   cpT m_tocp;			/* to color-piece */
440   scmvT m_scmv; 		/* special case move indication */
441 } mT, *mptrT;
442 
443 /* game termination indicator markers */
444 typedef siT gtimT, *gtimptrT;
445 
446 #    define gtimL 4
447 #    define gtim_nil (-1)
448 #    define gtim_w 0	/* White won */
449 #    define gtim_b 1	/* Black won */
450 #    define gtim_d 2	/* draw */
451 #    define gtim_u 3	/* unknown */
452 /* clockstamp length hh:mm:ss */
453 #    define clockstampL (2 + 1 + 2 + 1 + 2 + 1)
454 /* datestamp length YYYY.MM.DD */
455 #    define datestampL (4 + 1 + 2 + 1 + 2 + 1)
456 /* duration length dddd:hh:mm:ss */
457 #    define durationL (4 + 1 + 2 + 1 + 2 + 1 + 2 + 1)
458 /* EPD operand basetype */
459 typedef siT eobT;
460 
461 #    define eobL 2
462 #    define eob_nil (-1)
463 #    define eob_string 0	/* quoted string */
464 #    define eob_symbol 1	/* unquoted symbol */
465 /* EPD operand value type */
466 typedef struct eovS {
467   eobT eov_eob; 		/* basetype */
468   charptrT eov_str;		/* string value */
469   struct eovS *eov_prev;	/* previous operand */
470   struct eovS *eov_next;	/* next operand */
471 } eovT, *eovptrT;
472 
473 /* EPD operation type */
474 typedef struct eopS {
475   charptrT eop_opsym;		/* operation code symbol */
476   eovptrT eop_headeov;		/* head of operand value list */
477   eovptrT eop_taileov;		/* tail of operand value list */
478   struct eopS *eop_prev;	/* previous operation */
479   struct eopS *eop_next;	/* next operation */
480 } eopT, *eopptrT;
481 
482 /* EPD record type */
483 typedef struct epdS {
484   nbvT epd_nbv; 		/* piece placement nybble board vector */
485   cT epd_actc;			/* active color */
486   castT epd_cast;		/* castling availability */
487   sqT epd_epsq; 		/* en passant target square */
488   eopptrT epd_headeop;		/* head of operation list */
489   eopptrT epd_taileop;		/* tail of operation list */
490 } epdT, *epdptrT;
491 
492 /* EPD standard operators */
493 typedef siT epdsoT, *epdsoptrT;
494 
495 #    define epdsoL 51
496 #    define epdso_nil (-1)
497 #    define epdso_acd	       0	/* analysis count: depth */
498 #    define epdso_acn	       1	/* analysis count: nodes */
499 #    define epdso_acs	       2	/* analysis count: seconds */
500 #    define epdso_am	       3	/* avoid move(s) */
501 #    define epdso_bm	       4	/* best move(s) */
502 #    define epdso_c0	       5	/* comment slot 0 */
503 #    define epdso_c1	       6	/* comment slot 1 */
504 #    define epdso_c2	       7	/* comment slot 2 */
505 #    define epdso_c3	       8	/* comment slot 3 */
506 #    define epdso_c4	       9	/* comment slot 4 */
507 #    define epdso_c5	      10	/* comment slot 5 */
508 #    define epdso_c6	      11	/* comment slot 6 */
509 #    define epdso_c7	      12	/* comment slot 7 */
510 #    define epdso_c8	      13	/* comment slot 8 */
511 #    define epdso_c9	      14	/* comment slot 9 */
512 #    define epdso_cc	      15	/* chess clock */
513 #    define epdso_ce	      16	/* centipawn evaluation */
514 #    define epdso_dm	      17	/* direct move count */
515 #    define epdso_draw_accept 18	/* draw accept */
516 #    define epdso_draw_claim  19	/* draw claim */
517 #    define epdso_draw_offer  20	/* draw offer */
518 #    define epdso_draw_reject 21	/* draw reject */
519 #    define epdso_eco	      22	/* ECO code */
520 #    define epdso_fmvn	      23	/* fullmove number */
521 #    define epdso_hmvc	      24	/* halfmove clock */
522 #    define epdso_id	      25	/* position identification */
523 #    define epdso_nic	      26	/* NIC code */
524 #    define epdso_noop	      27	/* no operation */
525 #    define epdso_pm	      28	/* predicted move */
526 #    define epdso_ptp	      29	/* PGN tag pair(s) */
527 #    define epdso_pv	      30	/* predicted variation */
528 #    define epdso_rc	      31	/* repetition count */
529 #    define epdso_refcom      32	/* referee command */
530 #    define epdso_refreq      33	/* referee request */
531 #    define epdso_resign      34	/* resign */
532 #    define epdso_sm	      35	/* supplied move */
533 #    define epdso_sv	      36	/* supplied variation */
534 #    define epdso_tcgs	      37	/* telecommunications: game selector */
535 #    define epdso_tcri	      38	/* telecommunications: receiver identification */
536 #    define epdso_tcsi	      39	/* telecommunications: sender identification */
537 #    define epdso_ts	      40	/* timestamp */
538 #    define epdso_v0	      41	/* variation slot 0 */
539 #    define epdso_v1	      42	/* variation slot 1 */
540 #    define epdso_v2	      43	/* variation slot 2 */
541 #    define epdso_v3	      44	/* variation slot 3 */
542 #    define epdso_v4	      45	/* variation slot 4 */
543 #    define epdso_v5	      46	/* variation slot 5 */
544 #    define epdso_v6	      47	/* variation slot 6 */
545 #    define epdso_v7	      48	/* variation slot 7 */
546 #    define epdso_v8	      49	/* variation slot 8 */
547 #    define epdso_v9	      50	/* variation slot 9 */
548 /* referee commands */
549 typedef siT refcomT, *refcomptrT;
550 
551 #    define refcomL 7
552 #    define refcom_nil (-1)
553 #    define refcom_conclude   0
554 #    define refcom_disconnect 1
555 #    define refcom_execute    2
556 #    define refcom_fault      3
557 #    define refcom_inform     4
558 #    define refcom_respond    5
559 #    define refcom_reset      6
560 /* referee requests */
561 typedef siT refreqT, *refreqptrT;
562 
563 #    define refreqL 4
564 #    define refreq_nil (-1)
565 #    define refreq_fault    0
566 #    define refreq_reply    1
567 #    define refreq_sign_on  2
568 #    define refreq_sign_off 3
569 /* referee interface procedure type */
570 typedef epdptrT(*refintptrT) (epdptrT epdptr, siptrT flagptr);
571 
572 /* PGN Seven Tag Roster names */
573 typedef siT pgnstrT, *pgnstrptrT;
574 
575 #    define pgnstrL 7
576 #    define pgnstr_nil (-1)
577 #    define pgnstr_event  0
578 #    define pgnstr_site   1
579 #    define pgnstr_date   2
580 #    define pgnstr_round  3
581 #    define pgnstr_white  4
582 #    define pgnstr_black  5
583 #    define pgnstr_result 6
584 /* benchmark score structure */
585 typedef struct bmsS {
586   siT bms_acdflag;		/* ACD (depth) data valid flag */
587   siT bms_acnflag;		/* ACN (nodes) data valid flag */
588   siT bms_acsflag;		/* ACS (seconds) data valid flag */
589   liT bms_total;		/* total record count */
590   liT bms_solve;		/* solved record count */
591   liT bms_unsol;		/* unsolved record count */
592   liT bms_total_acd;		/* ACD used, all records */
593   liT bms_solve_acd;		/* ACD used, solved records */
594   liT bms_unsol_acd;		/* ACD used, unsolved records */
595   liT bms_total_acn;		/* ACN used, all records */
596   liT bms_solve_acn;		/* ACN used, solved records */
597   liT bms_unsol_acn;		/* ACN used, unsolved records */
598   liT bms_total_acs;		/* ACS used, all records */
599   liT bms_solve_acs;		/* ACS used, solved records */
600   liT bms_unsol_acs;		/* ACS used, unsolved records */
601 } bmsT, *bmsptrT;
602 
603 /* environment stack entry record type */
604 typedef struct eseS {
605   cT ese_actc;			/* active color */
606   castT ese_cast;		/* castling availability */
607   sqT ese_epsq; 		/* en passant target square */
608   siT ese_hmvc; 		/* halfmove clock */
609   siT ese_fmvn; 		/* fullmove number */
610   sqT ese_ksqv[rcL];		/* king square locations */
611 } eseT, *eseptrT;
612 
613 /* game played move record type (entries are prior to move) */
614 typedef struct gpmS {
615   mT gpm_m;			/* the move to be played */
616   eseT gpm_ese; 		/* environment statck entry storage */
617   nbvT gpm_nbv; 		/* nybble board vector */
618   struct gpmS *gpm_prev;	/* previous played move record */
619   struct gpmS *gpm_next;	/* next played move record */
620 } gpmT, *gpmptrT;
621 
622 /* game record type */
623 typedef struct gamS {
624   charptrT gam_strv[pgnstrL];	/* PGN STR tag values */
625   gtimT gam_gtim;		/* game termination indicator */
626   gpmptrT gam_headgpm;		/* head of game played move list */
627   gpmptrT gam_tailgpm;		/* tail of game played move list */
628   struct gamS *gam_prev;	/* previous game */
629   struct gamS *gam_next;	/* next game */
630 } gamT, *gamptrT;
631 
632 /* statndard disply output column limit */
633 #    define columnL 80
634 /* inclusion telltale closure */
635 #  endif
636 /* *INDENT-ON* */
637