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