Subversion Repositories Games.Chess Giants

Rev

Rev 108 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
154 pmbaty 1
#pragma once
33 pmbaty 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
108 pmbaty 66
                /* must be at least 8; extra room for alternatives */
33 pmbaty 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
108 pmbaty 99
                /* white */
33 pmbaty 100
#    define c_b 1
108 pmbaty 101
                /* black */
33 pmbaty 102
#    define c_v 2
108 pmbaty 103
                /* vacant */
33 pmbaty 104
#    define c_x 3
108 pmbaty 105
                /* extra */
33 pmbaty 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
108 pmbaty 113
                /* pawn */
33 pmbaty 114
#    define p_n 1
108 pmbaty 115
                /* knight */
33 pmbaty 116
#    define p_b 2
108 pmbaty 117
                /* bishop */
33 pmbaty 118
#    define p_r 3
108 pmbaty 119
                /* rook */
33 pmbaty 120
#    define p_q 4
108 pmbaty 121
                /* queen */
33 pmbaty 122
#    define p_k 5
108 pmbaty 123
                /* king */
33 pmbaty 124
#    define p_v 6
108 pmbaty 125
                /* vacant */
33 pmbaty 126
#    define p_x 7
108 pmbaty 127
                /* extra */
33 pmbaty 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)
108 pmbaty 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 */
33 pmbaty 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)
108 pmbaty 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 */
33 pmbaty 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 {
108 pmbaty 257
  cpT rbm[rankL][fileL];        /* rank/file indexing */
258
  cpT rbv[sqL];                 /* square indexing */
33 pmbaty 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)
108 pmbaty 270
#    define flank_k 0   /* kingside */
271
#    define flank_q 1   /* queenside */
33 pmbaty 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
 
108 pmbaty 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 */
33 pmbaty 419
/* special case move type */
420
typedef siT scmvT;
421
 
422
#    define scmvQ 3
423
#    define scmvL (bit << scmvQ)
424
#    define scmv_nil (-1)
108 pmbaty 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 */
33 pmbaty 433
/* move type */
434
typedef struct mS {
108 pmbaty 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 */
33 pmbaty 441
} mT, *mptrT;
442
 
443
/* game termination indicator markers */
444
typedef siT gtimT, *gtimptrT;
445
 
446
#    define gtimL 4
447
#    define gtim_nil (-1)
108 pmbaty 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 */
33 pmbaty 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)
108 pmbaty 463
#    define eob_string 0        /* quoted string */
464
#    define eob_symbol 1        /* unquoted symbol */
33 pmbaty 465
/* EPD operand value type */
466
typedef struct eovS {
108 pmbaty 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 */
33 pmbaty 471
} eovT, *eovptrT;
472
 
473
/* EPD operation type */
474
typedef struct eopS {
108 pmbaty 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 */
33 pmbaty 480
} eopT, *eopptrT;
481
 
482
/* EPD record type */
483
typedef struct epdS {
108 pmbaty 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 */
33 pmbaty 490
} epdT, *epdptrT;
491
 
492
/* EPD standard operators */
493
typedef siT epdsoT, *epdsoptrT;
494
 
495
#    define epdsoL 51
496
#    define epdso_nil (-1)
108 pmbaty 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 */
33 pmbaty 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 {
108 pmbaty 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 */
33 pmbaty 601
} bmsT, *bmsptrT;
602
 
603
/* environment stack entry record type */
604
typedef struct eseS {
108 pmbaty 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 */
33 pmbaty 611
} eseT, *eseptrT;
612
 
613
/* game played move record type (entries are prior to move) */
614
typedef struct gpmS {
108 pmbaty 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 */
33 pmbaty 620
} gpmT, *gpmptrT;
621
 
622
/* game record type */
623
typedef struct gamS {
108 pmbaty 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 */
33 pmbaty 630
} gamT, *gamptrT;
631
 
632
/* statndard disply output column limit */
633
#    define columnL 80
634
/* inclusion telltale closure */
635
#  endif
636
/* *INDENT-ON* */