💾 Archived View for runjimmyrunrunyoufuckerrun.com › src › games › chessengines › crafty › epddefs.h captured on 2021-12-17 at 13:26:06.

View Raw

More Information

-=-=-=-=-=-=-

#if !defined(EPDDEFS_INCLUDED)
/* *INDENT-OFF* */
#  define EPDDEFS_INCLUDED
/*>>> epddefs.h: Extended Position Description definitions */
/* Revised: 1996.06.23 */
/*
   Copyright (C) 1996 by Steven J. Edwards (sje@mv.mv.com)
   All rights reserved.  This code may be freely redistibuted and used by
   both research and commerical applications.  No warranty exists.
 */
/*
   Everything in this source file is independent of the host program.
   Requests for changes and additions should be communicated to the author
   via the e-mail address given above.
 */
/*
   This file was originally prepared on an Apple Macintosh using the
   Metrowerks CodeWarrior 6 ANSI C compiler.  Tabs are set at every
   four columns.  Further testing and development was performed on a
   generic PC running Linux 1.3.20 and using the gcc 2.7.0 compiler.
 */
/* inclusion telltale */
#  if (!defined(_epddefs))
#    define _epddefs 1
/* subprogram storage class for non-statics (usually empty definition) */
#    define nonstatic
/* a bit */
#    define bit 0x01
/* bit positions */
#    define bit_00 (bit <<  0)
#    define bit_01 (bit <<  1)
#    define bit_02 (bit <<  2)
#    define bit_03 (bit <<  3)
#    define bit_04 (bit <<  4)
#    define bit_05 (bit <<  5)
#    define bit_06 (bit <<  6)
#    define bit_07 (bit <<  7)
#    define bit_08 (bit <<  8)
#    define bit_09 (bit <<  9)
#    define bit_10 (bit << 10)
#    define bit_11 (bit << 11)
#    define bit_12 (bit << 12)
#    define bit_13 (bit << 13)
#    define bit_14 (bit << 14)
#    define bit_15 (bit << 15)
/* bit width constants */
#    define nybbW  4
#    define byteW  8
/* simple masks */
#    define nybbM 0x000f
/* useful types */
typedef void *voidptrT;
typedef unsigned char byteT, *byteptrT;
typedef char *charptrT;
typedef short int siT, *siptrT;
typedef long int liT, *liptrT;
typedef float srT, *srptrT;
typedef double lrT, *lrptrT;
typedef FILE *fptrT;

/* text I/O buffer length */
#    define tL 256
/* EPD I/O buffer length */
#    define epdL 4096
/* the standard algebraic notation character vector type */
#    define sanL 16
		/* must be at least 8; extra room for alternatives */
typedef char sanT[sanL];
typedef sanT *sanptrT;

/* SAN style attributes, priority ordered (used for encoding) */
typedef siT ssaT;

#    define ssaL 12
#    define ssa_nil (-1)
#    define ssa_capt  0 /* 5 way: capture indicator */
#    define ssa_case  1 /* 2 way: letter case */
#    define ssa_chec  2 /* 3 way: checking */
#    define ssa_cast  3 /* 5 way: castling */
#    define ssa_prom  4 /* 4 way: promoting */
#    define ssa_ptar  5 /* 2 way: pawn target rank skip */
#    define ssa_chmt  6 /* 4 way: checkmating */
#    define ssa_epct  7 /* 2 way: en passant capture */
#    define ssa_draw  8 /* 2 way: drawing */
#    define ssa_move  9 /* 2 way: movement indicator */
#    define ssa_edcf 10 /* 2 way: extra disambiguating character (file) */
#    define ssa_edcr 11 /* 2 way: extra disambiguating character (rank) */
/* SAN style vector */
typedef siT ssavT[ssaL];

/* colors (ordering is critical) */
typedef siT cT, *cptrT;

#    define cQ 2
#    define cL (bit << cQ)
#    define rcQ 1
#    define rcL (bit << rcQ)
#    define c_nil (-1)
#    define c_w 0
		/* white */
#    define c_b 1
		/* black */
#    define c_v 2
		/* vacant */
#    define c_x 3
		/* extra */
/* pieces (ordering is critical) */
typedef siT pT, *pptrT;

#    define pL 8
#    define rpL 6
#    define p_nil (-1)
#    define p_p 0
		/* pawn */
#    define p_n 1
		/* knight */
#    define p_b 2
		/* bishop */
#    define p_r 3
		/* rook */
#    define p_q 4
		/* queen */
#    define p_k 5
		/* king */
#    define p_v 6
		/* vacant */
#    define p_x 7
		/* extra */
/* color piece combinations (ordering is critical) */
typedef siT cpT;

#    define cpL 16
#    define rcpL 12
#    define cp_nil (-1)
#    define cp_wp  0	/* white pawn */
#    define cp_wn  1	/* white knight */
#    define cp_wb  2	/* white bishop */
#    define cp_wr  3	/* white rook */
#    define cp_wq  4	/* white queen */
#    define cp_wk  5	/* white king */
#    define cp_bp  6	/* black pawn */
#    define cp_bn  7	/* black knight */
#    define cp_bb  8	/* black bishop */
#    define cp_br  9	/* black rook */
#    define cp_bq 10	/* black queen */
#    define cp_bk 11	/* black king */
#    define cp_v0 12	/* vacant */
#    define cp_x0 13	/* extra 0 */
#    define cp_x1 14	/* extra 1 */
#    define cp_x2 15	/* extra 2 */
/* ranks */
typedef siT rankT;

#    define rankM (0x0007)
#    define rankQ 3
#    define rankL (bit << rankQ)
#    define rank_nil (-1)
#    define rank_1 0
#    define rank_2 1
#    define rank_3 2
#    define rank_4 3
#    define rank_5 4
#    define rank_6 5
#    define rank_7 6
#    define rank_8 7
/* files */
typedef siT fileT;

#    define fileM (0x0007)
#    define fileQ 3
#    define fileL (bit << fileQ)
#    define file_nil (-1)
#    define file_a 0	/* QR */
#    define file_b 1	/* QN */
#    define file_c 2	/* QB */
#    define file_d 3	/* Q */
#    define file_e 4	/* K */
#    define file_f 5	/* KB */
#    define file_g 6	/* KN */
#    define file_h 7	/* KR */
/* location mappings */
#    define map_sq(r, f) (((r) << fileQ | (f)))
#    define map_file(sq) ((sq) & 0x07)
#    define map_rank(sq) ((sq) >> fileQ)
/* squares */
typedef siT sqT, *sqptrT;

#    define sqM (0x003f)
#    define sqQ (rankQ + fileQ)
#    define sqL (bit << sqQ)
#    define sq_nil (-1)
#    define sq_a1 map_sq(rank_1, file_a)
#    define sq_b1 map_sq(rank_1, file_b)
#    define sq_c1 map_sq(rank_1, file_c)
#    define sq_d1 map_sq(rank_1, file_d)
#    define sq_e1 map_sq(rank_1, file_e)
#    define sq_f1 map_sq(rank_1, file_f)
#    define sq_g1 map_sq(rank_1, file_g)
#    define sq_h1 map_sq(rank_1, file_h)
#    define sq_a2 map_sq(rank_2, file_a)
#    define sq_b2 map_sq(rank_2, file_b)
#    define sq_c2 map_sq(rank_2, file_c)
#    define sq_d2 map_sq(rank_2, file_d)
#    define sq_e2 map_sq(rank_2, file_e)
#    define sq_f2 map_sq(rank_2, file_f)
#    define sq_g2 map_sq(rank_2, file_g)
#    define sq_h2 map_sq(rank_2, file_h)
#    define sq_a3 map_sq(rank_3, file_a)
#    define sq_b3 map_sq(rank_3, file_b)
#    define sq_c3 map_sq(rank_3, file_c)
#    define sq_d3 map_sq(rank_3, file_d)
#    define sq_e3 map_sq(rank_3, file_e)
#    define sq_f3 map_sq(rank_3, file_f)
#    define sq_g3 map_sq(rank_3, file_g)
#    define sq_h3 map_sq(rank_3, file_h)
#    define sq_a4 map_sq(rank_4, file_a)
#    define sq_b4 map_sq(rank_4, file_b)
#    define sq_c4 map_sq(rank_4, file_c)
#    define sq_d4 map_sq(rank_4, file_d)
#    define sq_e4 map_sq(rank_4, file_e)
#    define sq_f4 map_sq(rank_4, file_f)
#    define sq_g4 map_sq(rank_4, file_g)
#    define sq_h4 map_sq(rank_4, file_h)
#    define sq_a5 map_sq(rank_5, file_a)
#    define sq_b5 map_sq(rank_5, file_b)
#    define sq_c5 map_sq(rank_5, file_c)
#    define sq_d5 map_sq(rank_5, file_d)
#    define sq_e5 map_sq(rank_5, file_e)
#    define sq_f5 map_sq(rank_5, file_f)
#    define sq_g5 map_sq(rank_5, file_g)
#    define sq_h5 map_sq(rank_5, file_h)
#    define sq_a6 map_sq(rank_6, file_a)
#    define sq_b6 map_sq(rank_6, file_b)
#    define sq_c6 map_sq(rank_6, file_c)
#    define sq_d6 map_sq(rank_6, file_d)
#    define sq_e6 map_sq(rank_6, file_e)
#    define sq_f6 map_sq(rank_6, file_f)
#    define sq_g6 map_sq(rank_6, file_g)
#    define sq_h6 map_sq(rank_6, file_h)
#    define sq_a7 map_sq(rank_7, file_a)
#    define sq_b7 map_sq(rank_7, file_b)
#    define sq_c7 map_sq(rank_7, file_c)
#    define sq_d7 map_sq(rank_7, file_d)
#    define sq_e7 map_sq(rank_7, file_e)
#    define sq_f7 map_sq(rank_7, file_f)
#    define sq_g7 map_sq(rank_7, file_g)
#    define sq_h7 map_sq(rank_7, file_h)
#    define sq_a8 map_sq(rank_8, file_a)
#    define sq_b8 map_sq(rank_8, file_b)
#    define sq_c8 map_sq(rank_8, file_c)
#    define sq_d8 map_sq(rank_8, file_d)
#    define sq_e8 map_sq(rank_8, file_e)
#    define sq_f8 map_sq(rank_8, file_f)
#    define sq_g8 map_sq(rank_8, file_g)
#    define sq_h8 map_sq(rank_8, file_h)
/* regular board */
typedef union rbU {
  cpT rbm[rankL][fileL];	/* rank/file indexing */
  cpT rbv[sqL]; 		/* square indexing */
} rbT, *rbptrT;

/* nybble board vector */
#    define nbL (sqL / (byteW / nybbW))
typedef byteT nbvT[nbL];

/* flanks */
typedef siT flankT;

#    define flankL 2
#    define flank_nil (-1)
#    define flank_k 0	/* kingside */
#    define flank_q 1	/* queenside */
/* direction indices */
typedef siT dxT;

#    define dxQ 4
#    define dxL (bit << dxQ)
#    define dx_nil (-1)
#    define dx_0  0
#    define dx_1  1
#    define dx_2  2
#    define dx_3  3
#    define dx_4  4
#    define dx_5  5
#    define dx_6  6
#    define dx_7  7
#    define dx_8  8
#    define dx_9  9
#    define dx_a 10
#    define dx_b 11
#    define dx_c 12
#    define dx_d 13
#    define dx_e 14
#    define dx_f 15
/* direction vector displacements */
typedef siT dvT;

#    define dv_0 (( 0 * fileL) + 1)
#    define dv_1 (( 1 * fileL) + 0)
#    define dv_2 (( 0 * fileL) - 1)
#    define dv_3 ((-1 * fileL) - 0)
#    define dv_4 (( 1 * fileL) + 1)
#    define dv_5 (( 1 * fileL) - 1)
#    define dv_6 ((-1 * fileL) - 1)
#    define dv_7 ((-1 * fileL) + 1)
#    define dv_8 (( 1 * fileL) + 2)
#    define dv_9 (( 2 * fileL) + 1)
#    define dv_a (( 2 * fileL) - 1)
#    define dv_b (( 1 * fileL) - 2)
#    define dv_c ((-1 * fileL) - 2)
#    define dv_d ((-2 * fileL) - 1)
#    define dv_e ((-2 * fileL) + 1)
#    define dv_f ((-1 * fileL) + 2)
/* extended direction vector offsets */
typedef siT xdvT;

#    define xdv_0 (( 0 * xfileL) + 1)
#    define xdv_1 (( 1 * xfileL) + 0)
#    define xdv_2 (( 0 * xfileL) - 1)
#    define xdv_3 ((-1 * xfileL) - 0)
#    define xdv_4 (( 1 * xfileL) + 1)
#    define xdv_5 (( 1 * xfileL) - 1)
#    define xdv_6 ((-1 * xfileL) - 1)
#    define xdv_7 ((-1 * xfileL) + 1)
#    define xdv_8 (( 1 * xfileL) + 2)
#    define xdv_9 (( 2 * xfileL) + 1)
#    define xdv_a (( 2 * xfileL) - 1)
#    define xdv_b (( 1 * xfileL) - 2)
#    define xdv_c ((-1 * xfileL) - 2)
#    define xdv_d ((-2 * xfileL) - 1)
#    define xdv_e ((-2 * xfileL) + 1)
#    define xdv_f ((-1 * xfileL) + 2)
/* extended rank, file, and square types */
typedef siT xrankT;

#    define xrankQ (rankQ + 1)
#    define xrankL (bit << xrankQ)
typedef siT xfileT;

#    define xfileQ (fileQ + 1)
#    define xfileM 0x0f
#    define xfileL (bit << xfileQ)
typedef siT xsqT, *xsqptrT;

#    define xsqQ (xrankQ + xfileQ)
#    define xsqL (bit << xsqQ)
/* the extended board type */
typedef union xbU {
  cpT xbm[xrankL][xfileL];
  cpT xbv[xsqL];
} xbT, *xbptrT;

/* extended board mapping macros */
#    define map_xrank_xsq(xsq) ((xsq) >> xfileQ)
#    define map_xfile_xsq(xsq) ((xsq) & xfileM)
#    define map_xsq_xrank_xfile(xrank, xfile) (((xrank) << xfileQ) | (xfile))
/* extended conversion macros */
#    define xbdrL 4
#    define map_xfile_file(file) ((file) + xbdrL)
#    define map_xrank_rank(rank) ((rank) + xbdrL)
#    define map_file_xfile(xfile) ((xfile) - xbdrL)
#    define map_rank_xrank(xrank) ((xrank) - xbdrL)
#    define map_sq_xsq(xsq) \
	(((((xsq) >> xfileQ) - xbdrL) << fileQ) | (((xsq) & xfileM) - xbdrL))
#    define map_xsq_sq(sq) \
	((((((sq) >> fileQ) & fileM) + xbdrL) << xfileQ) | \
	(((sq) & fileM) + xbdrL))
/* castling availability indicators */
typedef siT caiT;

#    define caiL (rcL * flankL)
#    define cai_nil (-1)
#    define cai_wk ((c_w * flankL) + flank_k)
#    define cai_wq ((c_w * flankL) + flank_q)
#    define cai_bk ((c_b * flankL) + flank_k)
#    define cai_bq ((c_b * flankL) + flank_q)
/* castling index mapper */
#    define castim(cai) (bit << (cai))
/* castling flags */
typedef siT castT;
typedef castT *castptrT;

#    define cf_wk castim(cai_wk)
#    define cf_wq castim(cai_wq)
#    define cf_bk castim(cai_bk)
#    define cf_bq castim(cai_bq)
/* centipawn evaluation */
typedef siT cpevT, *cpevptrT;

/* some interesting centipawn evaluations */
#    define cpev_best ((cpevT) ((((liT) bit) << 15) - 1))
#    define cpev_bust (-cpev_best)
#    define cpev_draw 0
#    define cpev_mate cpev_best
#    define cpev_wrck (cpev_bust - 1)
/* mate and loss synthesis macros (fullmove distance argument) */
#    define synth_mate(n) (cpev_mate - ((n) * 2) + 1)
#    define synth_loss(n) (cpev_bust + ((n) * 2))
/* distance to mate/loss macros (mate/loss centipawn argument) */
#    define synth_distance_mate(cpev)  ((siT) (((cpev_mate - (cpev)) + 1) / 2))
#    define synth_distance_loss(cpev)  ((siT) (((cpev) - cpev_bust) / 2))
/* maximum distance to mate/loss (fullmove distance count) */
#    define max_dist_mateL 1024
#    define max_dist_lossL 1024
/* forced mate/loss detection macros (mate/loss centipawn argument) */
#    define forced_mate(cpev) ((cpev) >= ((cpev_mate - (max_dist_mateL * 2)) + 1))
#    define forced_loss(cpev) ((cpev) <= (cpev_bust + (max_dist_lossL * 2)))
/* move flag bits */
typedef siT mfT;

#    define mf_bust (bit << 0)	/* illegal move */
#    define mf_chec (bit << 1)	/* checking */
#    define mf_chmt (bit << 2)	/* checkmating */
#    define mf_draw (bit << 3)	/* drawing (includes stalemating) */
#    define mf_exec (bit << 4)	/* executed at least once */
#    define mf_null (bit << 5)	/* special null move */
#    define mf_sanf (bit << 6)	/* needs file disambiguation */
#    define mf_sanr (bit << 7)	/* needs rank disambiguation */
#    define mf_stmt (bit << 8)	/* stalemating */
/* special case move type */
typedef siT scmvT;

#    define scmvQ 3
#    define scmvL (bit << scmvQ)
#    define scmv_nil (-1)
#    define scmv_reg 0	/* regular */
#    define scmv_epc 1	/* en passant capture */
#    define scmv_cks 2	/* castles kingside */
#    define scmv_cqs 3	/* castles queenside */
#    define scmv_ppn 4	/* pawn promotes to knight */
#    define scmv_ppb 5	/* pawn promotes to bishop */
#    define scmv_ppr 6	/* pawn promotes to rook */
#    define scmv_ppq 7	/* pawn promotes to queen */
/* move type */
typedef struct mS {
  mfT m_flag;			/* move flags */
  sqT m_frsq;			/* from square */
  sqT m_tosq;			/* to square */
  cpT m_frcp;			/* from color-piece */
  cpT m_tocp;			/* to color-piece */
  scmvT m_scmv; 		/* special case move indication */
} mT, *mptrT;

/* game termination indicator markers */
typedef siT gtimT, *gtimptrT;

#    define gtimL 4
#    define gtim_nil (-1)
#    define gtim_w 0	/* White won */
#    define gtim_b 1	/* Black won */
#    define gtim_d 2	/* draw */
#    define gtim_u 3	/* unknown */
/* clockstamp length hh:mm:ss */
#    define clockstampL (2 + 1 + 2 + 1 + 2 + 1)
/* datestamp length YYYY.MM.DD */
#    define datestampL (4 + 1 + 2 + 1 + 2 + 1)
/* duration length dddd:hh:mm:ss */
#    define durationL (4 + 1 + 2 + 1 + 2 + 1 + 2 + 1)
/* EPD operand basetype */
typedef siT eobT;

#    define eobL 2
#    define eob_nil (-1)
#    define eob_string 0	/* quoted string */
#    define eob_symbol 1	/* unquoted symbol */
/* EPD operand value type */
typedef struct eovS {
  eobT eov_eob; 		/* basetype */
  charptrT eov_str;		/* string value */
  struct eovS *eov_prev;	/* previous operand */
  struct eovS *eov_next;	/* next operand */
} eovT, *eovptrT;

/* EPD operation type */
typedef struct eopS {
  charptrT eop_opsym;		/* operation code symbol */
  eovptrT eop_headeov;		/* head of operand value list */
  eovptrT eop_taileov;		/* tail of operand value list */
  struct eopS *eop_prev;	/* previous operation */
  struct eopS *eop_next;	/* next operation */
} eopT, *eopptrT;

/* EPD record type */
typedef struct epdS {
  nbvT epd_nbv; 		/* piece placement nybble board vector */
  cT epd_actc;			/* active color */
  castT epd_cast;		/* castling availability */
  sqT epd_epsq; 		/* en passant target square */
  eopptrT epd_headeop;		/* head of operation list */
  eopptrT epd_taileop;		/* tail of operation list */
} epdT, *epdptrT;

/* EPD standard operators */
typedef siT epdsoT, *epdsoptrT;

#    define epdsoL 51
#    define epdso_nil (-1)
#    define epdso_acd	       0	/* analysis count: depth */
#    define epdso_acn	       1	/* analysis count: nodes */
#    define epdso_acs	       2	/* analysis count: seconds */
#    define epdso_am	       3	/* avoid move(s) */
#    define epdso_bm	       4	/* best move(s) */
#    define epdso_c0	       5	/* comment slot 0 */
#    define epdso_c1	       6	/* comment slot 1 */
#    define epdso_c2	       7	/* comment slot 2 */
#    define epdso_c3	       8	/* comment slot 3 */
#    define epdso_c4	       9	/* comment slot 4 */
#    define epdso_c5	      10	/* comment slot 5 */
#    define epdso_c6	      11	/* comment slot 6 */
#    define epdso_c7	      12	/* comment slot 7 */
#    define epdso_c8	      13	/* comment slot 8 */
#    define epdso_c9	      14	/* comment slot 9 */
#    define epdso_cc	      15	/* chess clock */
#    define epdso_ce	      16	/* centipawn evaluation */
#    define epdso_dm	      17	/* direct move count */
#    define epdso_draw_accept 18	/* draw accept */
#    define epdso_draw_claim  19	/* draw claim */
#    define epdso_draw_offer  20	/* draw offer */
#    define epdso_draw_reject 21	/* draw reject */
#    define epdso_eco	      22	/* ECO code */
#    define epdso_fmvn	      23	/* fullmove number */
#    define epdso_hmvc	      24	/* halfmove clock */
#    define epdso_id	      25	/* position identification */
#    define epdso_nic	      26	/* NIC code */
#    define epdso_noop	      27	/* no operation */
#    define epdso_pm	      28	/* predicted move */
#    define epdso_ptp	      29	/* PGN tag pair(s) */
#    define epdso_pv	      30	/* predicted variation */
#    define epdso_rc	      31	/* repetition count */
#    define epdso_refcom      32	/* referee command */
#    define epdso_refreq      33	/* referee request */
#    define epdso_resign      34	/* resign */
#    define epdso_sm	      35	/* supplied move */
#    define epdso_sv	      36	/* supplied variation */
#    define epdso_tcgs	      37	/* telecommunications: game selector */
#    define epdso_tcri	      38	/* telecommunications: receiver identification */
#    define epdso_tcsi	      39	/* telecommunications: sender identification */
#    define epdso_ts	      40	/* timestamp */
#    define epdso_v0	      41	/* variation slot 0 */
#    define epdso_v1	      42	/* variation slot 1 */
#    define epdso_v2	      43	/* variation slot 2 */
#    define epdso_v3	      44	/* variation slot 3 */
#    define epdso_v4	      45	/* variation slot 4 */
#    define epdso_v5	      46	/* variation slot 5 */
#    define epdso_v6	      47	/* variation slot 6 */
#    define epdso_v7	      48	/* variation slot 7 */
#    define epdso_v8	      49	/* variation slot 8 */
#    define epdso_v9	      50	/* variation slot 9 */
/* referee commands */
typedef siT refcomT, *refcomptrT;

#    define refcomL 7
#    define refcom_nil (-1)
#    define refcom_conclude   0
#    define refcom_disconnect 1
#    define refcom_execute    2
#    define refcom_fault      3
#    define refcom_inform     4
#    define refcom_respond    5
#    define refcom_reset      6
/* referee requests */
typedef siT refreqT, *refreqptrT;

#    define refreqL 4
#    define refreq_nil (-1)
#    define refreq_fault    0
#    define refreq_reply    1
#    define refreq_sign_on  2
#    define refreq_sign_off 3
/* referee interface procedure type */
typedef epdptrT(*refintptrT) (epdptrT epdptr, siptrT flagptr);

/* PGN Seven Tag Roster names */
typedef siT pgnstrT, *pgnstrptrT;

#    define pgnstrL 7
#    define pgnstr_nil (-1)
#    define pgnstr_event  0
#    define pgnstr_site   1
#    define pgnstr_date   2
#    define pgnstr_round  3
#    define pgnstr_white  4
#    define pgnstr_black  5
#    define pgnstr_result 6
/* benchmark score structure */
typedef struct bmsS {
  siT bms_acdflag;		/* ACD (depth) data valid flag */
  siT bms_acnflag;		/* ACN (nodes) data valid flag */
  siT bms_acsflag;		/* ACS (seconds) data valid flag */
  liT bms_total;		/* total record count */
  liT bms_solve;		/* solved record count */
  liT bms_unsol;		/* unsolved record count */
  liT bms_total_acd;		/* ACD used, all records */
  liT bms_solve_acd;		/* ACD used, solved records */
  liT bms_unsol_acd;		/* ACD used, unsolved records */
  liT bms_total_acn;		/* ACN used, all records */
  liT bms_solve_acn;		/* ACN used, solved records */
  liT bms_unsol_acn;		/* ACN used, unsolved records */
  liT bms_total_acs;		/* ACS used, all records */
  liT bms_solve_acs;		/* ACS used, solved records */
  liT bms_unsol_acs;		/* ACS used, unsolved records */
} bmsT, *bmsptrT;

/* environment stack entry record type */
typedef struct eseS {
  cT ese_actc;			/* active color */
  castT ese_cast;		/* castling availability */
  sqT ese_epsq; 		/* en passant target square */
  siT ese_hmvc; 		/* halfmove clock */
  siT ese_fmvn; 		/* fullmove number */
  sqT ese_ksqv[rcL];		/* king square locations */
} eseT, *eseptrT;

/* game played move record type (entries are prior to move) */
typedef struct gpmS {
  mT gpm_m;			/* the move to be played */
  eseT gpm_ese; 		/* environment statck entry storage */
  nbvT gpm_nbv; 		/* nybble board vector */
  struct gpmS *gpm_prev;	/* previous played move record */
  struct gpmS *gpm_next;	/* next played move record */
} gpmT, *gpmptrT;

/* game record type */
typedef struct gamS {
  charptrT gam_strv[pgnstrL];	/* PGN STR tag values */
  gtimT gam_gtim;		/* game termination indicator */
  gpmptrT gam_headgpm;		/* head of game played move list */
  gpmptrT gam_tailgpm;		/* tail of game played move list */
  struct gamS *gam_prev;	/* previous game */
  struct gamS *gam_next;	/* next game */
} gamT, *gamptrT;

/* statndard disply output column limit */
#    define columnL 80
/* inclusion telltale closure */
#  endif
/* *INDENT-ON* */
#endif
/*<<< epddefs.h: EOF */