From 0efdc4c5ef60cf4c15e9dddf3658d2115e4d5d93 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Sun, 19 Apr 2009 10:00:52 -0700 Subject: [PATCH] changes from H.G. Muller; version 4.3.13 --- backend.c | 1338 ++++++++++++++------- backend.h | 6 + backendz.h | 144 ++-- bitmaps/Thumbs.db | Bin 0 -> 1139200 bytes bitmaps/a33o.bmp | Bin 0 -> 326 bytes bitmaps/a33s.bmp | Bin 0 -> 326 bytes bitmaps/a33w.bmp | Bin 0 -> 326 bytes bitmaps/a37o.bmp | Bin 0 -> 358 bytes bitmaps/a37s.bmp | Bin 0 -> 358 bytes bitmaps/a37w.bmp | Bin 0 -> 358 bytes bitmaps/a40o.bmp | Bin 0 -> 382 bytes bitmaps/a40s.bmp | Bin 0 -> 382 bytes bitmaps/a40w.bmp | Bin 0 -> 382 bytes bitmaps/a45o.bmp | Bin 0 -> 422 bytes bitmaps/a45s.bmp | Bin 0 -> 422 bytes bitmaps/a45w.bmp | Bin 0 -> 422 bytes bitmaps/a54o.bmp | Bin 0 -> 494 bytes bitmaps/a54s.bmp | Bin 0 -> 494 bytes bitmaps/a54w.bmp | Bin 0 -> 494 bytes bitmaps/a58o.bmp | Bin 0 -> 526 bytes bitmaps/a58s.bmp | Bin 0 -> 526 bytes bitmaps/a58w.bmp | Bin 0 -> 526 bytes bitmaps/a64o.bmp | Bin 0 -> 574 bytes bitmaps/a64s.bmp | Bin 0 -> 574 bytes bitmaps/a64w.bmp | Bin 0 -> 574 bytes bitmaps/as33o.bmp | Bin 0 -> 326 bytes bitmaps/as33s.bmp | Bin 0 -> 326 bytes bitmaps/as33w.bmp | Bin 0 -> 326 bytes bitmaps/as45o.bmp | Bin 0 -> 422 bytes bitmaps/as45s.bmp | Bin 0 -> 422 bytes bitmaps/as45w.bmp | Bin 0 -> 422 bytes bitmaps/as49o.bmp | Bin 0 -> 454 bytes bitmaps/as49s.bmp | Bin 0 -> 454 bytes bitmaps/as49w.bmp | Bin 0 -> 454 bytes bitmaps/as72o.bmp | Bin 0 -> 926 bytes bitmaps/as72s.bmp | Bin 0 -> 926 bytes bitmaps/as72w.bmp | Bin 0 -> 926 bytes bitmaps/bas.gif | Bin 0 -> 308 bytes bitmaps/bcv.gif | Bin 0 -> 295 bytes bitmaps/bitmaps.h | 2 +- bitmaps/c33o.bmp | Bin 0 -> 326 bytes bitmaps/c33s.bmp | Bin 0 -> 326 bytes bitmaps/c33w.bmp | Bin 0 -> 326 bytes bitmaps/c37o.bmp | Bin 0 -> 358 bytes bitmaps/c37s.bmp | Bin 0 -> 358 bytes bitmaps/c37w.bmp | Bin 0 -> 358 bytes bitmaps/c40o.bmp | Bin 0 -> 382 bytes bitmaps/c40s.bmp | Bin 0 -> 382 bytes bitmaps/c40w.bmp | Bin 0 -> 382 bytes bitmaps/c45o.bmp | Bin 0 -> 422 bytes bitmaps/c45s.bmp | Bin 0 -> 422 bytes bitmaps/c45w.bmp | Bin 0 -> 422 bytes bitmaps/c49s.bmp | Bin 454 -> 454 bytes bitmaps/c54o.bmp | Bin 0 -> 494 bytes bitmaps/c54s.bmp | Bin 0 -> 494 bytes bitmaps/c54w.bmp | Bin 0 -> 494 bytes bitmaps/c58o.bmp | Bin 0 -> 526 bytes bitmaps/c58s.bmp | Bin 0 -> 526 bytes bitmaps/c58w.bmp | Bin 0 -> 526 bytes bitmaps/c64o.bmp | Bin 0 -> 574 bytes bitmaps/c64s.bmp | Bin 0 -> 574 bytes bitmaps/c64w.bmp | Bin 0 -> 574 bytes bitmaps/c72s.bmp | Bin 926 -> 926 bytes bitmaps/cv33o.bmp | Bin 0 -> 326 bytes bitmaps/cv33s.bmp | Bin 0 -> 326 bytes bitmaps/cv33w.bmp | Bin 0 -> 326 bytes bitmaps/cv37o.bmp | Bin 0 -> 358 bytes bitmaps/cv37s.bmp | Bin 0 -> 358 bytes bitmaps/cv37w.bmp | Bin 0 -> 358 bytes bitmaps/cv40o.bmp | Bin 0 -> 382 bytes bitmaps/cv40s.bmp | Bin 0 -> 382 bytes bitmaps/cv40w.bmp | Bin 0 -> 382 bytes bitmaps/cv45o.bmp | Bin 0 -> 422 bytes bitmaps/cv45s.bmp | Bin 0 -> 422 bytes bitmaps/cv45w.bmp | Bin 0 -> 422 bytes bitmaps/cv49o.bmp | Bin 0 -> 454 bytes bitmaps/cv49s.bmp | Bin 0 -> 454 bytes bitmaps/cv49w.bmp | Bin 0 -> 454 bytes bitmaps/cv54o.bmp | Bin 0 -> 494 bytes bitmaps/cv54s.bmp | Bin 0 -> 494 bytes bitmaps/cv54w.bmp | Bin 0 -> 494 bytes bitmaps/cv58o.bmp | Bin 0 -> 526 bytes bitmaps/cv58s.bmp | Bin 0 -> 526 bytes bitmaps/cv58w.bmp | Bin 0 -> 526 bytes bitmaps/cv64o.bmp | Bin 0 -> 574 bytes bitmaps/cv64s.bmp | Bin 0 -> 574 bytes bitmaps/cv64w.bmp | Bin 0 -> 574 bytes bitmaps/cv72o.bmp | Bin 0 -> 926 bytes bitmaps/cv72s.bmp | Bin 0 -> 926 bytes bitmaps/cv72w.bmp | Bin 0 -> 926 bytes bitmaps/dk33o.bmp | Bin 0 -> 326 bytes bitmaps/dk33s.bmp | Bin 0 -> 326 bytes bitmaps/dk33w.bmp | Bin 0 -> 326 bytes bitmaps/e33o.bmp | Bin 0 -> 326 bytes bitmaps/e33s.bmp | Bin 0 -> 326 bytes bitmaps/e33w.bmp | Bin 0 -> 326 bytes bitmaps/f33o.bmp | Bin 0 -> 326 bytes bitmaps/f33s.bmp | Bin 0 -> 326 bytes bitmaps/f33w.bmp | Bin 0 -> 326 bytes bitmaps/g33o.bmp | Bin 0 -> 326 bytes bitmaps/g33s.bmp | Bin 0 -> 326 bytes bitmaps/g33w.bmp | Bin 0 -> 326 bytes bitmaps/h33o.bmp | Bin 0 -> 326 bytes bitmaps/h33s.bmp | Bin 0 -> 326 bytes bitmaps/h33w.bmp | Bin 0 -> 326 bytes bitmaps/l33o.bmp | Bin 0 -> 326 bytes bitmaps/l33s.bmp | Bin 0 -> 326 bytes bitmaps/l33w.bmp | Bin 0 -> 326 bytes bitmaps/l37o.bmp | Bin 0 -> 358 bytes bitmaps/l37s.bmp | Bin 0 -> 358 bytes bitmaps/l37w.bmp | Bin 0 -> 358 bytes bitmaps/l40o.bmp | Bin 0 -> 382 bytes bitmaps/l40s.bmp | Bin 0 -> 382 bytes bitmaps/l40w.bmp | Bin 0 -> 382 bytes bitmaps/l45o.bmp | Bin 0 -> 422 bytes bitmaps/l45s.bmp | Bin 0 -> 422 bytes bitmaps/l45w.bmp | Bin 0 -> 422 bytes bitmaps/l54o.bmp | Bin 0 -> 494 bytes bitmaps/l54s.bmp | Bin 0 -> 494 bytes bitmaps/l54w.bmp | Bin 0 -> 494 bytes bitmaps/l58o.bmp | Bin 0 -> 526 bytes bitmaps/l58s.bmp | Bin 0 -> 526 bytes bitmaps/l58w.bmp | Bin 0 -> 526 bytes bitmaps/l64o.bmp | Bin 0 -> 574 bytes bitmaps/l64s.bmp | Bin 0 -> 574 bytes bitmaps/l64w.bmp | Bin 0 -> 574 bytes bitmaps/m33o.bmp | Bin 0 -> 326 bytes bitmaps/m33s.bmp | Bin 0 -> 3354 bytes bitmaps/m33w.bmp | Bin 0 -> 326 bytes bitmaps/o33o.bmp | Bin 0 -> 326 bytes bitmaps/o33s.bmp | Bin 0 -> 326 bytes bitmaps/o33w.bmp | Bin 0 -> 326 bytes bitmaps/s49o.bmp | Bin 0 -> 454 bytes bitmaps/s49s.bmp | Bin 0 -> 454 bytes bitmaps/s49w.bmp | Bin 0 -> 454 bytes bitmaps/s72o.bmp | Bin 0 -> 926 bytes bitmaps/s72s.bmp | Bin 0 -> 926 bytes bitmaps/s72w.bmp | Bin 0 -> 926 bytes bitmaps/v33o.bmp | Bin 0 -> 326 bytes bitmaps/v33s.bmp | Bin 0 -> 326 bytes bitmaps/v33w.bmp | Bin 0 -> 326 bytes bitmaps/v49o.bmp | Bin 0 -> 454 bytes bitmaps/v49s.bmp | Bin 0 -> 454 bytes bitmaps/v49w.bmp | Bin 0 -> 454 bytes bitmaps/v54o.bmp | Bin 0 -> 494 bytes bitmaps/v54s.bmp | Bin 0 -> 494 bytes bitmaps/v54w.bmp | Bin 0 -> 494 bytes bitmaps/v72o.bmp | Bin 0 -> 926 bytes bitmaps/v72s.bmp | Bin 0 -> 926 bytes bitmaps/v72w.bmp | Bin 0 -> 926 bytes bitmaps/w33o.bmp | Bin 0 -> 326 bytes bitmaps/w33s.bmp | Bin 0 -> 326 bytes bitmaps/w33w.bmp | Bin 0 -> 326 bytes bitmaps/was.gif | Bin 0 -> 326 bytes bitmaps/wcv.gif | Bin 0 -> 314 bytes bitmaps/wl49o.bmp | Bin 454 -> 454 bytes bitmaps/wl49s.bmp | Bin 454 -> 454 bytes bitmaps/wl72o.bmp | Bin 926 -> 926 bytes bitmaps/wl72s.bmp | Bin 926 -> 926 bytes common.h | 33 +- config.h | 5 +- frontend.h | 372 +++--- gamelist.c | 838 +++++++------- lists.c | 298 +++--- lists.h | 132 +- moves.c | 197 +++- moves.h | 1 + parser.c | 3093 ++++++++++++++++++++++++---------------------- parser.h | 1 + parser.l | 67 +- pgntags.c | 530 ++++---- uci.c | 202 ++-- winboard/defaults.h | 4 +- winboard/resource.h | 4 + winboard/wclipbrd.c | 168 ++-- winboard/wclipbrd.h | 8 +- winboard/wedittags.c | 2 +- winboard/wedittags.h | 2 +- winboard/wengineoutput.c | 1498 +++++++++++----------- winboard/wevalgraph.c | 1240 ++++++++++---------- winboard/wgamelist.c | 616 +++++----- winboard/wgamelist.h | 2 +- winboard/whistory.c | 944 +++++++------- winboard/winboard.c | 315 +++-- winboard/winboard.h | 33 +- winboard/winboard.rc | 148 +++ winboard/wlayout.c | 312 +++--- winboard/woptions.c | 11 +- winboard/wplugin.c | 450 ++++---- winboard/wplugin.h | 80 +- winboard/wsnap.c | 408 +++--- winboard/wsnap.h | 86 +- zippy.c | 2225 +++++++++++++++++----------------- zippy.h | 114 +- 194 files changed, 8494 insertions(+), 7435 deletions(-) create mode 100644 bitmaps/Thumbs.db create mode 100644 bitmaps/a33o.bmp create mode 100644 bitmaps/a33s.bmp create mode 100644 bitmaps/a33w.bmp create mode 100644 bitmaps/a37o.bmp create mode 100644 bitmaps/a37s.bmp create mode 100644 bitmaps/a37w.bmp create mode 100644 bitmaps/a40o.bmp create mode 100644 bitmaps/a40s.bmp create mode 100644 bitmaps/a40w.bmp create mode 100644 bitmaps/a45o.bmp create mode 100644 bitmaps/a45s.bmp create mode 100644 bitmaps/a45w.bmp create mode 100644 bitmaps/a54o.bmp create mode 100644 bitmaps/a54s.bmp create mode 100644 bitmaps/a54w.bmp create mode 100644 bitmaps/a58o.bmp create mode 100644 bitmaps/a58s.bmp create mode 100644 bitmaps/a58w.bmp create mode 100644 bitmaps/a64o.bmp create mode 100644 bitmaps/a64s.bmp create mode 100644 bitmaps/a64w.bmp create mode 100644 bitmaps/as33o.bmp create mode 100644 bitmaps/as33s.bmp create mode 100644 bitmaps/as33w.bmp create mode 100644 bitmaps/as45o.bmp create mode 100644 bitmaps/as45s.bmp create mode 100644 bitmaps/as45w.bmp create mode 100644 bitmaps/as49o.bmp create mode 100644 bitmaps/as49s.bmp create mode 100644 bitmaps/as49w.bmp create mode 100644 bitmaps/as72o.bmp create mode 100644 bitmaps/as72s.bmp create mode 100644 bitmaps/as72w.bmp create mode 100644 bitmaps/bas.gif create mode 100644 bitmaps/bcv.gif create mode 100644 bitmaps/c33o.bmp create mode 100644 bitmaps/c33s.bmp create mode 100644 bitmaps/c33w.bmp create mode 100644 bitmaps/c37o.bmp create mode 100644 bitmaps/c37s.bmp create mode 100644 bitmaps/c37w.bmp create mode 100644 bitmaps/c40o.bmp create mode 100644 bitmaps/c40s.bmp create mode 100644 bitmaps/c40w.bmp create mode 100644 bitmaps/c45o.bmp create mode 100644 bitmaps/c45s.bmp create mode 100644 bitmaps/c45w.bmp create mode 100644 bitmaps/c54o.bmp create mode 100644 bitmaps/c54s.bmp create mode 100644 bitmaps/c54w.bmp create mode 100644 bitmaps/c58o.bmp create mode 100644 bitmaps/c58s.bmp create mode 100644 bitmaps/c58w.bmp create mode 100644 bitmaps/c64o.bmp create mode 100644 bitmaps/c64s.bmp create mode 100644 bitmaps/c64w.bmp create mode 100644 bitmaps/cv33o.bmp create mode 100644 bitmaps/cv33s.bmp create mode 100644 bitmaps/cv33w.bmp create mode 100644 bitmaps/cv37o.bmp create mode 100644 bitmaps/cv37s.bmp create mode 100644 bitmaps/cv37w.bmp create mode 100644 bitmaps/cv40o.bmp create mode 100644 bitmaps/cv40s.bmp create mode 100644 bitmaps/cv40w.bmp create mode 100644 bitmaps/cv45o.bmp create mode 100644 bitmaps/cv45s.bmp create mode 100644 bitmaps/cv45w.bmp create mode 100644 bitmaps/cv49o.bmp create mode 100644 bitmaps/cv49s.bmp create mode 100644 bitmaps/cv49w.bmp create mode 100644 bitmaps/cv54o.bmp create mode 100644 bitmaps/cv54s.bmp create mode 100644 bitmaps/cv54w.bmp create mode 100644 bitmaps/cv58o.bmp create mode 100644 bitmaps/cv58s.bmp create mode 100644 bitmaps/cv58w.bmp create mode 100644 bitmaps/cv64o.bmp create mode 100644 bitmaps/cv64s.bmp create mode 100644 bitmaps/cv64w.bmp create mode 100644 bitmaps/cv72o.bmp create mode 100644 bitmaps/cv72s.bmp create mode 100644 bitmaps/cv72w.bmp create mode 100644 bitmaps/dk33o.bmp create mode 100644 bitmaps/dk33s.bmp create mode 100644 bitmaps/dk33w.bmp create mode 100644 bitmaps/e33o.bmp create mode 100644 bitmaps/e33s.bmp create mode 100644 bitmaps/e33w.bmp create mode 100644 bitmaps/f33o.bmp create mode 100644 bitmaps/f33s.bmp create mode 100644 bitmaps/f33w.bmp create mode 100644 bitmaps/g33o.bmp create mode 100644 bitmaps/g33s.bmp create mode 100644 bitmaps/g33w.bmp create mode 100644 bitmaps/h33o.bmp create mode 100644 bitmaps/h33s.bmp create mode 100644 bitmaps/h33w.bmp create mode 100644 bitmaps/l33o.bmp create mode 100644 bitmaps/l33s.bmp create mode 100644 bitmaps/l33w.bmp create mode 100644 bitmaps/l37o.bmp create mode 100644 bitmaps/l37s.bmp create mode 100644 bitmaps/l37w.bmp create mode 100644 bitmaps/l40o.bmp create mode 100644 bitmaps/l40s.bmp create mode 100644 bitmaps/l40w.bmp create mode 100644 bitmaps/l45o.bmp create mode 100644 bitmaps/l45s.bmp create mode 100644 bitmaps/l45w.bmp create mode 100644 bitmaps/l54o.bmp create mode 100644 bitmaps/l54s.bmp create mode 100644 bitmaps/l54w.bmp create mode 100644 bitmaps/l58o.bmp create mode 100644 bitmaps/l58s.bmp create mode 100644 bitmaps/l58w.bmp create mode 100644 bitmaps/l64o.bmp create mode 100644 bitmaps/l64s.bmp create mode 100644 bitmaps/l64w.bmp create mode 100644 bitmaps/m33o.bmp create mode 100644 bitmaps/m33s.bmp create mode 100644 bitmaps/m33w.bmp create mode 100644 bitmaps/o33o.bmp create mode 100644 bitmaps/o33s.bmp create mode 100644 bitmaps/o33w.bmp create mode 100644 bitmaps/s49o.bmp create mode 100644 bitmaps/s49s.bmp create mode 100644 bitmaps/s49w.bmp create mode 100644 bitmaps/s72o.bmp create mode 100644 bitmaps/s72s.bmp create mode 100644 bitmaps/s72w.bmp create mode 100644 bitmaps/v33o.bmp create mode 100644 bitmaps/v33s.bmp create mode 100644 bitmaps/v33w.bmp create mode 100644 bitmaps/v49o.bmp create mode 100644 bitmaps/v49s.bmp create mode 100644 bitmaps/v49w.bmp create mode 100644 bitmaps/v54o.bmp create mode 100644 bitmaps/v54s.bmp create mode 100644 bitmaps/v54w.bmp create mode 100644 bitmaps/v72o.bmp create mode 100644 bitmaps/v72s.bmp create mode 100644 bitmaps/v72w.bmp create mode 100644 bitmaps/w33o.bmp create mode 100644 bitmaps/w33s.bmp create mode 100644 bitmaps/w33w.bmp create mode 100644 bitmaps/was.gif create mode 100644 bitmaps/wcv.gif diff --git a/backend.c b/backend.c index e9e1368..1f0af61 100644 --- a/backend.c +++ b/backend.c @@ -214,12 +214,17 @@ int string_to_rating P((char *str)); void ParseFeatures P((char* args, ChessProgramState *cps)); void InitBackEnd3 P((void)); void FeatureDone P((ChessProgramState* cps, int val)); -void InitChessProgram P((ChessProgramState *cps)); +void InitChessProgram P((ChessProgramState *cps, int setup)); -void GetInfoFromComment( int, char * ); +char *GetInfoFromComment( int, char * ); // [HGM] PV time: returns stripped comment extern int tinyLayout, smallLayout; static ChessProgramStats programStats; +static int exiting = 0; /* [HGM] moved to top */ +static int setboardSpoiledMachineBlack = 0, errorExitFlag = 0; +extern int startedFromPositionFile; +int startedFromPositionFile = FALSE; Board filePosition; /* [HGM] loadPos */ +char endingGame = 0; /* [HGM] crash: flag to prevent recursion of GameEnds() */ /* States for ics_getting_history */ #define H_FALSE 0 @@ -292,7 +297,12 @@ static char * safeStrCat( char * dst, const char * src, size_t count ) } /* Fake up flags for now, as we aren't keeping track of castling - availability yet */ + availability yet. [HGM] Change of logic: the flag now only + indicates the type of castlings allowed by the rule of the game. + The actual rights themselves are maintained in the array + castlingRights, as part of the game history, and are not probed + by this function. + */ int PosFlags(index) { @@ -310,6 +320,9 @@ PosFlags(index) case VariantKriegspiel: flags |= F_KRIEGSPIEL_CAPTURE; break; +/* case VariantCapaRandom: */ + case VariantFischeRandom: + flags |= F_FRC_TYPE_CASTLING; /* [HGM] enable this through flag */ case VariantNoCastle: flags &= ~F_ALL_CASTLE_OK; break; @@ -383,6 +396,7 @@ int have_sent_ICS_logon = 0; int movesPerSession; long whiteTimeRemaining, blackTimeRemaining, timeControl, timeIncrement; long timeControl_2; /* [AS] Allow separate time controls */ +char *fullTimeControlString = NULL; /* [HGM] secondary TC: merge of MPS, TC and inc */ long timeRemaining[2][MAX_MOVES]; int matchGame = 0; TimeMark programStartTime; @@ -405,10 +419,12 @@ Board boards[MAX_MOVES]; char epStatus[MAX_MOVES]; char castlingRights[MAX_MOVES][BOARD_SIZE]; // stores files for pieces with castling rights or -1 char castlingRank[BOARD_SIZE]; // and corresponding ranks -char initialRights[BOARD_SIZE], FENcastlingRights[BOARD_SIZE]; +char initialRights[BOARD_SIZE], FENcastlingRights[BOARD_SIZE], fileRights[BOARD_SIZE]; int nrCastlingRights; // For TwoKings, or to implement castling-unknown status int initialRulePlies, FENrulePlies; char FENepStatus; +FILE *serverMoves = NULL; // next two for broadcasting (/serverMoves option) +int loadFlag = 0; ChessSquare FIDEArray[2][BOARD_SIZE] = { { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen, @@ -424,7 +440,6 @@ ChessSquare twoKingsArray[2][BOARD_SIZE] = { BlackKing, BlackKing, BlackKnight, BlackRook } }; -#ifdef FAIRY ChessSquare KnightmateArray[2][BOARD_SIZE] = { { WhiteRook, WhiteMan, WhiteBishop, WhiteQueen, WhiteUnicorn, WhiteBishop, WhiteMan, WhiteRook }, @@ -440,10 +455,10 @@ ChessSquare fairyArray[2][BOARD_SIZE] = { /* [HGM] Queen side differs from King }; ChessSquare ShatranjArray[2][BOARD_SIZE] = { /* [HGM] (movGen knows about Shatranj Q and P) */ - { WhiteRook, WhiteKnight, WhiteAlfil, WhiteFerz, - WhiteKing, WhiteAlfil, WhiteKnight, WhiteRook }, - { BlackRook, BlackKnight, BlackAlfil, BlackFerz, - BlackKing, BlackAlfil, BlackKnight, BlackRook } + { WhiteRook, WhiteKnight, WhiteAlfil, WhiteKing, + WhiteFerz, WhiteAlfil, WhiteKnight, WhiteRook }, + { BlackRook, BlackKnight, BlackAlfil, BlackKing, + BlackFerz, BlackAlfil, BlackKnight, BlackRook } }; @@ -463,23 +478,34 @@ ChessSquare XiangqiArray[2][BOARD_SIZE] = { }; ChessSquare CapablancaArray[2][BOARD_SIZE] = { - { WhiteRook, WhiteKnight, WhiteCardinal, WhiteBishop, WhiteQueen, + { WhiteRook, WhiteKnight, WhiteAngel, WhiteBishop, WhiteQueen, WhiteKing, WhiteBishop, WhiteMarshall, WhiteKnight, WhiteRook }, - { BlackRook, BlackKnight, BlackCardinal, BlackBishop, BlackQueen, + { BlackRook, BlackKnight, BlackAngel, BlackBishop, BlackQueen, BlackKing, BlackBishop, BlackMarshall, BlackKnight, BlackRook } }; #ifdef GOTHIC ChessSquare GothicArray[2][BOARD_SIZE] = { { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen, WhiteMarshall, - WhiteKing, WhiteCardinal, WhiteBishop, WhiteKnight, WhiteRook }, + WhiteKing, WhiteAngel, WhiteBishop, WhiteKnight, WhiteRook }, { BlackRook, BlackKnight, BlackBishop, BlackQueen, BlackMarshall, - BlackKing, BlackCardinal, BlackBishop, BlackKnight, BlackRook } + BlackKing, BlackAngel, BlackBishop, BlackKnight, BlackRook } }; #else // !GOTHIC #define GothicArray CapablancaArray #endif // !GOTHIC +#ifdef FALCON +ChessSquare FalconArray[2][BOARD_SIZE] = { + { WhiteRook, WhiteKnight, WhiteBishop, WhiteLance, WhiteQueen, + WhiteKing, WhiteLance, WhiteBishop, WhiteKnight, WhiteRook }, + { BlackRook, BlackKnight, BlackBishop, BlackLance, BlackQueen, + BlackKing, BlackLance, BlackBishop, BlackKnight, BlackRook } +}; +#else // !FALCON +#define FalconArray CapablancaArray +#endif // !FALCON + #else // !(BOARD_SIZE>=10) #define XiangqiPosition FIDEArray #define CapablancaArray FIDEArray @@ -496,7 +522,6 @@ ChessSquare CourierArray[2][BOARD_SIZE] = { #else // !(BOARD_SIZE>=12) #define CourierArray CapablancaArray #endif // !(BOARD_SIZE>=12) -#endif // FAIRY Board initialPosition; @@ -525,7 +550,7 @@ ClearProgramStats() programStats.nr_moves = 0; programStats.moves_left = 0; programStats.nodes = 0; - programStats.time = 100; + programStats.time = -1; // [HGM] PGNtime: make invalid to recognize engine output programStats.score = 0; programStats.got_only_move = 0; programStats.got_fail = 0; @@ -666,6 +691,26 @@ InitBackEnd1() first.useOOCastle = TRUE; second.useOOCastle = TRUE; /* End of new features added by Tord. */ + /* [HGM] time odds: set factor for each machine */ + first.timeOdds = appData.firstTimeOdds; + second.timeOdds = appData.secondTimeOdds; + { int norm = 1; + if(appData.timeOddsMode) { + norm = first.timeOdds; + if(norm > second.timeOdds) norm = second.timeOdds; + } + first.timeOdds /= norm; + second.timeOdds /= norm; + } + + /* [HGM] secondary TC: how to handle sessions that do not fit in 'level'*/ + first.accumulateTC = appData.firstAccumulateTC; + second.accumulateTC = appData.secondAccumulateTC; + first.maxNrOfSessions = second.maxNrOfSessions = 1; + + /* [HGM] debug */ + first.debug = second.debug = FALSE; + first.scoreIsAbsolute = appData.firstScoreIsAbsolute; /* [AS] */ second.scoreIsAbsolute = appData.secondScoreIsAbsolute; /* [AS] */ first.isUCI = appData.firstIsUCI; /* [AS] */ @@ -762,8 +807,9 @@ InitBackEnd1() case VariantCapablanca: /* [HGM] should work */ case VariantCourier: /* [HGM] initial forced moves not implemented */ case VariantShogi: /* [HGM] drops not tested for legality */ - case VariantShowgi: /* [HGM] not a valid variant */ case VariantKnightmate: /* [HGM] should work */ + case VariantCylinder: /* [HGM] untested */ + case VariantFalcon: /* [HGM] untested */ case VariantCrazyhouse: /* holdings not shown, ([HGM] fixed that!) offboard interposition not understood */ case VariantNormal: /* definitely works! */ @@ -827,22 +873,51 @@ int NextTimeControlFromString( char ** str, long * value ) return result; } -int GetTimeControlForWhite() -{ - int result = timeControl; +int NextSessionFromString( char ** str, int *moves, long * tc, long *inc) +{ /* [HGM] routine added to read '+moves/time' for secondary time control */ + int result = -1; long temp, temp2; + + if(**str != '+') return -1; // old params remain in force! + (*str)++; + if( NextTimeControlFromString( str, &temp ) ) return -1; + if(**str != '/') { + /* time only: incremental or sudden-death time control */ + if(**str == '+') { /* increment follows; read it */ + (*str)++; + if(result = NextIntegerFromString( str, &temp2)) return -1; + *inc = temp2 * 1000; + } else *inc = 0; + *moves = 0; *tc = temp * 1000; + return 0; + } else if(temp % 60 != 0) return -1; /* moves was given as min:sec */ + + (*str)++; /* classical time control */ + result = NextTimeControlFromString( str, &temp2); + if(result == 0) { + *moves = temp/60; + *tc = temp2 * 1000; + *inc = 0; + } return result; } -int GetTimeControlForBlack() -{ - int result = timeControl; +int GetTimeQuota(int movenr) +{ /* [HGM] get time to add from the multi-session time-control string */ + int moves=1; /* kludge to force reading of first session */ + long time, increment; + char *s = fullTimeControlString; - if( timeControl_2 > 0 ) { - result = timeControl_2; - } + if(appData.debugMode) fprintf(debugFP, "TC string = '%s'\n", fullTimeControlString); + do { + if(moves) NextSessionFromString(&s, &moves, &time, &increment); + if(appData.debugMode) fprintf(debugFP, "mps=%d tc=%d inc=%d\n", moves, (int) time, (int) increment); + if(movenr == -1) return time; /* last move before new session */ + if(!moves) return increment; /* current session is incremental */ + if(movenr >= 0) movenr -= moves; /* we already finished this session */ + } while(movenr >= -1); /* try again for next session */ - return result; + return 0; // no new time quota on this move } int @@ -865,6 +940,19 @@ ParseTimeControl(tc, ti, mps) #else long tc1; long tc2; + char buf[MSG_SIZ]; + + if(ti >= 0 && !strchr(tc, '+') && !strchr(tc, '/') ) mps = 0; + if(ti > 0) { + if(mps) + sprintf(buf, "+%d/%s+%d", mps, tc, ti); + else sprintf(buf, "+%s+%d", tc, ti); + } else { + if(mps) + sprintf(buf, "+%d/%s", mps, tc); + else sprintf(buf, "+%s", tc); + } + fullTimeControlString = StrSave(buf); if( NextTimeControlFromString( &tc, &tc1 ) != 0 ) { return FALSE; @@ -935,7 +1023,10 @@ InitBackEnd3 P((void)) char buf[MSG_SIZ]; int err; - InitChessProgram(&first); + if (appData.debugMode) { + fprintf(debugFP, "From InitBackend3\n"); + } + InitChessProgram(&first, startedFromSetupPosition); if (appData.icsActive) { err = establish(); @@ -1038,6 +1129,19 @@ InitBackEnd3 P((void)) (void) LoadPositionFromFile(appData.loadPositionFile, appData.loadPositionIndex, appData.loadPositionFile); + /* [HGM] try to make self-starting even after FEN load */ + /* to allow automatic setup of fairy variants with wtm */ + if(initialMode == BeginningOfGame && !blackPlaysFirst) { + gameMode = BeginningOfGame; + setboardSpoiledMachineBlack = 1; + } + /* [HGM] loadPos: make that every new game uses the setup */ + /* from file as long as we do not switch variant */ + if(!blackPlaysFirst) { int i; + startedFromPositionFile = TRUE; + CopyBoard(filePosition, boards[0]); + for(i=0; i 0) { /* If last read ended with a partial line that we couldn't parse, prepend it to the new read and try again. */ @@ -3204,7 +3338,62 @@ ParseBoard12(string) if (moveNum == 0) { startedFromSetupPosition = !CompareBoards(board, initialPosition); - } + if(startedFromSetupPosition) + initialRulePlies = irrev_count; /* [HGM] 50-move counter offset */ + } + /* [HGM] variantswitch: remember the last initial position parsed, */ + /* because it might have been parsed in the wrong variant, so that */ + /* we can re-parse it once we know the proper variant (which might */ + /* have different piece assignments for the same letters). */ + if(moveNum == 0) strcpy(startBoard, string); + + /* [HGM] Set castling rights. Take the outermost Rooks, + to make it also work for FRC opening positions. Note that board12 + is really defective for later FRC positions, as it has no way to + indicate which Rook can castle if they are on the same side of King. + For the initial position we grant rights to the outermost Rooks, + and remember thos rights, and we then copy them on positions + later in an FRC game. This means WB might not recognize castlings with + Rooks that have moved back to their original position as illegal, + but in ICS mode that is not its job anyway. + */ + if(moveNum == 0 || gameInfo.variant != VariantFischeRandom) + { int i, j; + + for(i=BOARD_LEFT, j= -1; i=BOARD_LEFT; i--) + if(board[0][i] == WhiteRook) j = i; + initialRights[1] = castlingRights[moveNum][1] = (castle_wl == 0 && gameInfo.variant != VariantFischeRandom ? -1 : j); + for(i=BOARD_LEFT, j= -1; i=BOARD_LEFT; i--) + if(board[BOARD_HEIGHT-1][i] == BlackRook) j = i; + initialRights[4] = castlingRights[moveNum][4] = (castle_bl == 0 && gameInfo.variant != VariantFischeRandom ? -1 : j); + + for(k=BOARD_LEFT; k 0) { if (appData.debugMode) { + if (appData.debugMode) { int f = forwardMostMove; + fprintf(debugFP, "parseboard %d, castling = %d %d %d %d %d %d\n", f, + castlingRights[f][0],castlingRights[f][1],castlingRights[f][2],castlingRights[f][3],castlingRights[f][4],castlingRights[f][5]); + } fprintf(debugFP, "accepted move %s from ICS, parse it.\n", move_str); + fprintf(debugFP, "moveNum = %d\n", moveNum); fprintf(debugFP, "board = %d-%d x %d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT); setbuf(debugFP, NULL); } @@ -3472,6 +3666,7 @@ SendMoveToProgram(moveNum, cps) ChessProgramState *cps; { char buf[MSG_SIZ]; + if (cps->useUsermove) { SendToProgram("usermove ", cps); } @@ -3491,14 +3686,17 @@ SendMoveToProgram(moveNum, cps) * the engine. It would be nice to have a better way to identify castle * moves here. */ if(gameInfo.variant == VariantFischeRandom && cps->useOOCastle) { + if (appData.debugMode) { + fprintf(debugFP, "Tord's FRC castling code\n"); + } int fromX = moveList[moveNum][0] - AAA; int fromY = moveList[moveNum][1] - ONE; int toX = moveList[moveNum][2] - AAA; int toY = moveList[moveNum][3] - ONE; - if((boards[currentMove][fromY][fromX] == WhiteKing - && boards[currentMove][toY][toX] == WhiteRook) - || (boards[currentMove][fromY][fromX] == BlackKing - && boards[currentMove][toY][toX] == BlackRook)) { + if((boards[moveNum][fromY][fromX] == WhiteKing + && boards[moveNum][toY][toX] == WhiteRook) + || (boards[moveNum][fromY][fromX] == BlackKing + && boards[moveNum][toY][toX] == BlackRook)) { if(toX > fromX) SendToProgram("O-O\n", cps); else SendToProgram("O-O-O\n", cps); } @@ -3507,6 +3705,21 @@ SendMoveToProgram(moveNum, cps) else SendToProgram(moveList[moveNum], cps); /* End of additions by Tord */ } + + /* [HGM] setting up the opening has brought engine in force mode! */ + /* Send 'go' if we are in a mode where machine should play. */ + if( (moveNum == 0 && setboardSpoiledMachineBlack && cps == &first) && + (gameMode == TwoMachinesPlay || +#ifdef ZIPPY + gameMode == IcsPlayingBlack || gameMode == IcsPlayingWhite || +#endif + gameMode == MachinePlaysBlack || gameMode == MachinePlaysWhite) ) { + SendToProgram("go\n", cps); + if (appData.debugMode) { + fprintf(debugFP, "(extra)\n"); + } + } + setboardSpoiledMachineBlack = 0; } void @@ -3552,13 +3765,16 @@ SendMoveToICS(moveType, fromX, fromY, toX, toY) case BlackPromotionKnight: case WhitePromotionKing: case BlackPromotionKing: -#ifdef FAIRY case WhitePromotionChancellor: case BlackPromotionChancellor: case WhitePromotionArchbishop: case BlackPromotionArchbishop: -#endif - sprintf(user_move, "%c%c%c%c=%c\n", + if(gameInfo.variant == VariantShatranj) + sprintf(user_move, "%c%c%c%c=%c\n", + AAA + fromX, ONE + fromY, AAA + toX, ONE + toY, + PieceToChar(WhiteFerz)); + else + sprintf(user_move, "%c%c%c%c=%c\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY, PieceToChar(PromoPiece(moveType))); break; @@ -3629,47 +3845,35 @@ AlphaRank(char *move, int n) if(move[1]=='*' && move[2]>='0' && move[2]<='9' && move[3]>='a' && move[3]<='x' ) { - move[2] = (move[2]-'1')+BOARD_LEFT + AAA; - move[3] = (move[3]-'a') + ONE; + move[2] = BOARD_RGHT -1 - (move[2]-'1') + AAA; + move[3] = BOARD_HEIGHT-1 - (move[3]-'a') + ONE; } else if(move[0]>='0' && move[0]<='9' && move[1]>='a' && move[1]<='x' && move[2]>='0' && move[2]<='9' && move[3]>='a' && move[3]<='x' ) { /* input move, Shogi -> normal */ -/* - move[0] = BOARD_RGHT -1-(move[0]-'1') + AAA; - move[1] = BOARD_HEIGHT-1-(move[1]-'a') + ONE; - move[2] = BOARD_RGHT -1-(move[2]-'1') + AAA; - move[3] = BOARD_HEIGHT-1-(move[3]-'a') + ONE; -*/ - move[0] = (move[0]-'1')+BOARD_LEFT + AAA; - move[1] = (move[1]-'a') + ONE; - move[2] = (move[2]-'1')+BOARD_LEFT + AAA; - move[3] = (move[3]-'a') + ONE; + move[0] = BOARD_RGHT -1 - (move[0]-'1') + AAA; + move[1] = BOARD_HEIGHT-1 - (move[1]-'a') + ONE; + move[2] = BOARD_RGHT -1 - (move[2]-'1') + AAA; + move[3] = BOARD_HEIGHT-1 - (move[3]-'a') + ONE; } else if(move[1]=='@' && move[3]>='0' && move[3]<='9' && move[2]>='a' && move[2]<='x' ) { move[1] = '*'; - move[2] = (move[2]-AAA)-BOARD_LEFT + '1'; - move[3] = (move[3]-ONE) + 'a'; + move[2] = BOARD_RGHT - 1 - (move[2]-AAA) + '1'; + move[3] = BOARD_HEIGHT-1 - (move[3]-ONE) + 'a'; } else if( move[0]>='a' && move[0]<='x' && move[3]>='0' && move[3]<='9' && move[2]>='a' && move[2]<='x' ) { /* output move, normal -> Shogi */ -/* - move[0] = BOARD_RGHT -1-(move[0]-AAA) + '1'; - move[1] = BOARD_HEIGHT-1-(move[1]-ONE) + 'a'; - move[2] = BOARD_RGHT -1-(move[2]-AAA) + '1'; - move[3] = BOARD_HEIGHT-1-(move[3]-ONE) + 'a'; -*/ - move[0] = (move[0]-AAA)-BOARD_LEFT + '1'; - move[1] = (move[1]-ONE) + 'a'; - move[2] = (move[2]-AAA)-BOARD_LEFT + '1'; - move[3] = (move[3]-ONE) + 'a'; + move[0] = BOARD_RGHT - 1 - (move[0]-AAA) + '1'; + move[1] = BOARD_HEIGHT-1 - (move[1]-ONE) + 'a'; + move[2] = BOARD_RGHT - 1 - (move[2]-AAA) + '1'; + move[3] = BOARD_HEIGHT-1 - (move[3]-ONE) + 'a'; if(move[4] == PieceToChar(BlackQueen)) move[4] = '+'; } if (appData.debugMode) { @@ -3806,9 +4010,15 @@ static void ShuffleFRC( Board board ) board[0][FindEmptySquare(board, rand() % 6)] = WhiteQueen; board[0][FindEmptySquare(board, rand() % 5)] = WhiteKnight; board[0][FindEmptySquare(board, rand() % 4)] = WhiteKnight; - board[0][FindEmptySquare(board, 0)] = WhiteRook; - board[0][FindEmptySquare(board, 0)] = WhiteKing; - board[0][FindEmptySquare(board, 0)] = WhiteRook; + board[0][ i=FindEmptySquare(board, 0) ] = WhiteRook; + initialRights[1] = initialRights[4] = + castlingRights[0][1] = castlingRights[0][4] = i; + board[0][ i=FindEmptySquare(board, 0) ] = WhiteKing; + initialRights[2] = initialRights[5] = + castlingRights[0][2] = castlingRights[0][5] = i; + board[0][ i=FindEmptySquare(board, 0) ] = WhiteRook; + initialRights[0] = initialRights[3] = + castlingRights[0][0] = castlingRights[0][3] = i; for( i=BOARD_LEFT; i= (int) BlackPawn)) { sprintf(message, "%c%c%c\n", ToUpper(PieceToChar(*bp)), AAA + j, ONE + i); + if(message[0] == '+' || message[0] == '~') { + sprintf(message, "%c%c%c+\n", + PieceToChar((ChessSquare)(DEMOTED *bp)), + AAA + j, ONE + i); + } + if(appData.alphaRank) { + message[1] = BOARD_RGHT - 1 - j + '1'; + message[2] = BOARD_HEIGHT - 1 - i + 'a'; + } SendToProgram(message, cps); } } @@ -4159,6 +4398,7 @@ SendBoard(cps, moveNum) SendToProgram(".\n", cps); } + setboardSpoiledMachineBlack = 0; /* [HGM] assume WB 4.2.7 already solves this after sending setboard */ } int @@ -4348,7 +4588,11 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar) (WhitePawn <= pdown && pdown < BlackPawn && WhitePawn <= pup && pup < BlackPawn || BlackPawn <= pdown && pdown < EmptySquare && - BlackPawn <= pup && pup < EmptySquare) ) + BlackPawn <= pup && pup < EmptySquare + ) && !(gameInfo.variant == VariantFischeRandom && + (pup == WhiteRook && pdown == WhiteKing && fromY == 0 && toY == 0|| + pup == BlackRook && pdown == BlackKing && fromY == BOARD_HEIGHT-1 && toY == BOARD_HEIGHT-1 ) + ) ) return ImpossibleMove; /* Check if the user is playing in turn. This is complicated because we @@ -4529,7 +4773,7 @@ FinishMove(moveType, fromX, fromY, toX, toY, promoChar) } /* [HGM] The following if has been moved here from - UserMoveEnevt(). Because it seemed to belon here (why not allow + UserMoveEvent(). Because it seemed to belon here (why not allow piece drops in training games?), and because it can only be performed after it is known to what we promote. */ if (gameMode == Training) { @@ -4720,6 +4964,11 @@ HandleMachineMove(message, cps) while (*message == '\007') message++; /* + * [HGM] engine debug message: ignore lines starting with '#' character + */ + if(cps->debug && *message == '#') return; + + /* * Look for book output */ if (cps == &first && bookRequested) { @@ -4811,6 +5060,10 @@ HandleMachineMove(message, cps) return; } + if (appData.debugMode) { int f = forwardMostMove; + fprintf(debugFP, "machine move %d, castling = %d %d %d %d %d %d\n", f, + castlingRights[f][0],castlingRights[f][1],castlingRights[f][2],castlingRights[f][3],castlingRights[f][4],castlingRights[f][5]); + } AlphaRank(machineMove, 4); if (!ParseOneMove(machineMove, forwardMostMove, &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { @@ -4856,12 +5109,12 @@ HandleMachineMove(message, cps) switch(moveType) { case WhiteASideCastleFR: case BlackASideCastleFR: - toY++; + toX+=2; currentMoveString[2]++; break; case WhiteHSideCastleFR: case BlackHSideCastleFR: - toY--; + toX--; currentMoveString[2]--; break; } @@ -4889,7 +5142,7 @@ HandleMachineMove(message, cps) /* [AS] Save move info and clear stats for next move */ pvInfoList[ forwardMostMove ].score = programStats.score; pvInfoList[ forwardMostMove ].depth = programStats.depth; - pvInfoList[ forwardMostMove ].time = -1; + pvInfoList[ forwardMostMove ].time = programStats.time; // [HGM] PGNtime: take time from engine stats ClearProgramStats(); thinkOutput[0] = NULLCHAR; hiddenThinkOutputState = 0; @@ -4955,7 +5208,7 @@ HandleMachineMove(message, cps) if( appData.testLegality ) { /* [HGM] Some more adjudications for obstinate engines */ int NrWN=0, NrBN=0, NrWB=0, NrBB=0, NrWR=0, NrBR=0, - NrWQ=0, NrBQ=0, + NrWQ=0, NrBQ=0, bishopsColor = 0, NrPieces=0, NrPawns=0, PawnAdvance=0, i, j, k; static int moveCount; @@ -4969,19 +5222,21 @@ HandleMachineMove(message, cps) case WhiteKnight: NrWN++; break; case WhiteBishop: + bishopsColor |= 1 << ((i^j)&1); NrWB++; break; case BlackKnight: - NrWN++; break; + NrBN++; break; case BlackBishop: + bishopsColor |= 1 << ((i^j)&1); NrBB++; break; case WhiteRook: NrWR++; break; case BlackRook: NrBR++; break; case WhiteQueen: - NrWR++; break; + NrWQ++; break; case BlackQueen: - NrBR++; break; + NrBQ++; break; case EmptySquare: break; case BlackPawn: @@ -4992,8 +5247,9 @@ HandleMachineMove(message, cps) NrPieces += (p != EmptySquare); } - if( NrPieces == 3 && NrWN+NrBN+NrWB+NrBB == 1 || NrPieces == 2 ) - { /* KBK, KNK or KK */ + if( NrPieces == 3 && NrWN+NrBN+NrWB+NrBB == 1 || NrPieces == 2 + || NrPieces == 4 && NrBB+NrWB==2 && bishopsColor != 3) + { /* KBK, KNK, KK of KBKB with like Bishops */ /* always flag draws, for judging claims */ epStatus[forwardMostMove] = EP_INSUF_DRAW; @@ -5020,7 +5276,7 @@ HandleMachineMove(message, cps) return; } } else moveCount = 6; - +#if 0 if (appData.debugMode) { int i; fprintf(debugFP, "repeat test fmm=%d bmm=%d ep=%d, reps=%d\n", forwardMostMove, backwardMostMove, epStatus[backwardMostMove], @@ -5029,6 +5285,7 @@ HandleMachineMove(message, cps) fprintf(debugFP, "%d ep=%d\n", i, epStatus[i]); } +#endif /* Check for rep-draws */ count = 0; for(k = forwardMostMove-2; @@ -5037,13 +5294,17 @@ HandleMachineMove(message, cps) epStatus[k+2] <= EP_NONE && epStatus[k+1] <= EP_NONE; k-=2) { int rights=0; +#if 0 if (appData.debugMode) { fprintf(debugFP, " loop\n"); } +#endif if(CompareBoards(boards[k], boards[forwardMostMove])) { +#if 0 if (appData.debugMode) { fprintf(debugFP, "match\n"); } +#endif /* compare castling rights */ if( castlingRights[forwardMostMove][2] != castlingRights[k][2] && (castlingRights[k][0] >= 0 || castlingRights[k][1] >= 0) ) @@ -5061,6 +5322,7 @@ HandleMachineMove(message, cps) castlingRights[forwardMostMove][4] != castlingRights[k][4] ) rights++; } +#if 0 if (appData.debugMode) { for(i=0; i appData.drawRepeats-2 && appData.drawRepeats > 1) { /* adjudicate after user-specified nr of repeats */ @@ -5097,7 +5360,28 @@ HandleMachineMove(message, cps) ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ GameEnds( GameIsDrawn, "Xboard adjudication: 50-move rule", GE_XBOARD ); return; - } + } + + /* if draw offer is pending, treat it as a draw claim + * when draw condition present, to allow engines a way to + * claim draws before making their move to avoid a race + * condition occurring after their move + */ + if( cps->other->offeredDraw || cps->offeredDraw ) { + char *p = NULL; + if(epStatus[forwardMostMove] == EP_RULE_DRAW) + p = "Draw claim: 50-move rule"; + if(epStatus[forwardMostMove] == EP_REP_DRAW) + p = "Draw claim: 3-fold repetition"; + if(epStatus[forwardMostMove] == EP_INSUF_DRAW) + p = "Draw claim: insufficient mating material"; + if( p != NULL ) { + GameEnds( GameIsDrawn, p, GE_XBOARD ); + ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ + return; + } + } + } @@ -5112,6 +5396,11 @@ HandleMachineMove(message, cps) } if (gameMode == TwoMachinesPlay) { + /* [HGM] relaying draw offers moved to after reception of move */ + /* and interpreting offer as claim if it brings draw condition */ + if (cps->offeredDraw == 1 && cps->other->sendDrawOffers) { + SendToProgram("draw\n", cps->other); + } if (cps->other->sendTime) { SendTimeRemaining(cps->other, cps->other->twoMachinesColor[0] == 'w'); @@ -5574,11 +5863,16 @@ HandleMachineMove(message, cps) if (gameMode == TwoMachinesPlay) { if (cps->other->offeredDraw) { GameEnds(GameIsDrawn, "Draw agreed", GE_XBOARD); - } else { + /* [HGM] in two-machine mode we delay relaying draw offer */ + /* until after we also have move, to see if it is really claim */ + } +#if 0 + else { if (cps->other->sendDrawOffers) { SendToProgram("draw\n", cps->other); } } +#endif } else if (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack) { if (userOfferedDraw) { @@ -6038,19 +6332,56 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) int promoChar; Board board; { - ChessSquare captured = board[toY][toX], piece; int p; + ChessSquare captured = board[toY][toX], piece, king; int p; + + /* [HGM] compute & store e.p. status and castling rights for new position */ + /* if we are updating a board for which those exist (i.e. in boards[]) */ + if((p = ((int)board - (int)boards[0])/((int)boards[1]-(int)boards[0])) < MAX_MOVES && p > 0) + { int i, j; + + epStatus[p] = EP_NONE; + + if( board[toY][toX] != EmptySquare ) + epStatus[p] = EP_CAPTURE; + + if( board[fromY][fromX] == WhitePawn ) { + epStatus[p] = EP_PAWN_MOVE; + if( toY-fromY==2 && + (toX>BOARD_LEFT && board[toY][toX-1] == BlackPawn || + toXBOARD_LEFT && board[toY][toX-1] == WhitePawn || + toX fromX+1) { board[fromY][fromX] = EmptySquare; - board[toY][toX] = WhiteKing; + board[toY][toX] = king; + board[toY][toX-1] = board[fromY][BOARD_RGHT-1]; board[fromY][BOARD_RGHT-1] = EmptySquare; - board[toY][toX-1] = WhiteRook; - } else if (initialPosition[fromY][fromX] == WhiteKing - && board[fromY][fromX] == WhiteKing + } else if (board[fromY][fromX] == king + && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX < fromX-1) { board[fromY][fromX] = EmptySquare; - board[toY][toX] = WhiteKing; + board[toY][toX] = king; + board[toY][toX+1] = board[fromY][BOARD_LEFT]; board[fromY][BOARD_LEFT] = EmptySquare; - board[toY][toX+1] = WhiteRook; - } else if (fromY == 0 && fromX == 3 - && board[fromY][fromX] == WhiteKing - && toY == 0 && toX == 5) { - board[fromY][fromX] = EmptySquare; - board[toY][toX] = WhiteKing; - board[fromY][7] = EmptySquare; - board[toY][4] = WhiteRook; - } else if (fromY == 0 && fromX == 3 - && board[fromY][fromX] == WhiteKing - && toY == 0 && toX == 1) { - board[fromY][fromX] = EmptySquare; - board[toY][toX] = WhiteKing; - board[fromY][0] = EmptySquare; - board[toY][2] = WhiteRook; } else if (board[fromY][fromX] == WhitePawn && toY == BOARD_HEIGHT-1 && gameInfo.variant != VariantXiangqi @@ -6117,26 +6434,27 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) board[fromY][fromX] = EmptySquare; } else if ((fromY == BOARD_HEIGHT-4) && (toX != fromX) + && gameInfo.variant != VariantXiangqi && (board[fromY][fromX] == WhitePawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; board[toY][toX] = WhitePawn; captured = board[toY - 1][toX]; board[toY - 1][toX] = EmptySquare; - } else if (initialPosition[fromY][fromX] == BlackKing - && board[fromY][fromX] == BlackKing + } else if (board[fromY][fromX] == king + && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX > fromX+1) { board[fromY][fromX] = EmptySquare; - board[toY][toX] = BlackKing; + board[toY][toX] = king; + board[toY][toX-1] = board[fromY][BOARD_RGHT-1]; board[fromY][BOARD_RGHT-1] = EmptySquare; - board[toY][toX-1] = BlackRook; - } else if (initialPosition[fromY][fromX] == BlackKing - && board[fromY][fromX] == BlackKing + } else if (board[fromY][fromX] == king + && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX < fromX-1) { board[fromY][fromX] = EmptySquare; - board[toY][toX] = BlackKing; + board[toY][toX] = king; + board[toY][toX+1] = board[fromY][BOARD_LEFT]; board[fromY][BOARD_LEFT] = EmptySquare; - board[toY][toX+1] = BlackRook; } else if (fromY == 7 && fromX == 3 && board[fromY][fromX] == BlackKing && toY == 7 && toX == 5) { @@ -6166,6 +6484,7 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) board[fromY][fromX] = EmptySquare; } else if ((fromY == 3) && (toX != fromX) + && gameInfo.variant != VariantXiangqi && (board[fromY][fromX] == BlackPawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; @@ -6263,6 +6582,48 @@ MakeMove(fromX, fromY, toX, toY, promoChar) { forwardMostMove++; + if(serverMoves != NULL) { /* [HGM] write moves on file for broadcasting */ + int timeLeft; static int lastLoadFlag=0; int king, piece; + piece = boards[forwardMostMove-1][fromY][fromX]; + king = piece < (int) BlackPawn ? WhiteKing : BlackKing; + if(gameInfo.variant == VariantKnightmate) + king += (int) WhiteUnicorn - (int) WhiteKing; + if(forwardMostMove == 1) { + if(blackPlaysFirst) + fprintf(serverMoves, "%s;", second.tidy); + fprintf(serverMoves, "%s;", first.tidy); + if(!blackPlaysFirst) + fprintf(serverMoves, "%s;", second.tidy); + } else fprintf(serverMoves, loadFlag|lastLoadFlag ? ":" : ";"); + lastLoadFlag = loadFlag; + // print base move + fprintf(serverMoves, "%c%c:%c%c", AAA+fromX, ONE+fromY, AAA+toX, ONE+toY); + // print castling suffix + if( toY == fromY && piece == king ) { + if(toX-fromX > 1) + fprintf(serverMoves, ":%c%c:%c%c", AAA+BOARD_RGHT-1, ONE+fromY, AAA+toX-1,ONE+toY); + if(fromX-toX >1) + fprintf(serverMoves, ":%c%c:%c%c", AAA+BOARD_LEFT, ONE+fromY, AAA+toX+1,ONE+toY); + } + // e.p. suffix + if( (boards[forwardMostMove-1][fromY][fromX] == WhitePawn || + boards[forwardMostMove-1][fromY][fromX] == BlackPawn ) && + boards[forwardMostMove-1][toY][toX] == EmptySquare + && fromX != toX ) + fprintf(serverMoves, ":%c%c:%c%c", AAA+fromX, ONE+fromY, AAA+toX, ONE+fromY); + // promotion suffix + if(promoChar != NULLCHAR) + fprintf(serverMoves, ":%c:%c%c", promoChar, AAA+toX, ONE+toY); + if(!loadFlag) { + fprintf(serverMoves, "/%d/%d", + pvInfoList[forwardMostMove-1].depth, pvInfoList[forwardMostMove-1].score); + if(forwardMostMove & 1) timeLeft = whiteTimeRemaining/1000; + else timeLeft = blackTimeRemaining/1000; + fprintf(serverMoves, "/%d", timeLeft); + } + fflush(serverMoves); + } + if (forwardMostMove >= MAX_MOVES) { DisplayFatalError("Game too long; increase MAX_MOVES and recompile", 0, 1); @@ -6276,40 +6637,6 @@ MakeMove(fromX, fromY, toX, toY, promoChar) commentList[forwardMostMove] = NULL; } CopyBoard(boards[forwardMostMove], boards[forwardMostMove - 1]); - /* [HGM] compute & store e.p. status and castling rights for new position */ - { int i, j; - - epStatus[forwardMostMove] = EP_NONE; - - if( boards[forwardMostMove][toY][toX] != EmptySquare ) - epStatus[forwardMostMove] = EP_CAPTURE; - - if( boards[forwardMostMove][fromY][fromX] == WhitePawn ) { - epStatus[forwardMostMove] = EP_PAWN_MOVE; - if( toY-fromY==2 && - (toX>BOARD_LEFT && boards[forwardMostMove][toY][toX-1] == BlackPawn || - toXBOARD_LEFT && boards[forwardMostMove][toY][toX-1] == WhitePawn || - toXprotocolVersion != 1 && StrStr(cps->variants, "boardsize") == NULL) { - sprintf(buf, "Board size %dx%d+%d not supported by %s", - gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize, cps->tidy); - DisplayFatalError(buf, 0, 1); - return; + sprintf(b, "%dx%d+%d_%s", gameInfo.boardWidth, gameInfo.boardHeight, + gameInfo.holdingsSize, VariantName(gameInfo.variant)); // cook up sized variant name + /* [HGM] varsize: try first if this defiant size variant is specifically known */ + if(StrStr(cps->variants, b) == NULL) { + // specific sized variant not known, check if general sizing allowed + if (cps->protocolVersion != 1) { // for protocol 1 we cannot check and hope for the best + if(StrStr(cps->variants, "boardsize") == NULL) { + sprintf(buf, "Board size %dx%d+%d not supported by %s", + gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize, cps->tidy); + DisplayFatalError(buf, 0, 1); + return; + } + /* [HGM] here we really should compare with the maximum supported board size */ + } } - /* [HGM] here we really should compare with the maximum supported board size */ - sprintf(buf, "%dx%d+%d_", gameInfo.boardWidth, - gameInfo.boardHeight, gameInfo.holdingsSize ); - while(*b++ != '_'); - } - sprintf(b, "variant %s\n", VariantName(gameInfo.variant)); + } else sprintf(b, "%s", VariantName(gameInfo.variant)); + sprintf(buf, "variant %s\n", b); SendToProgram(buf, cps); + /* [HGM] send opening position in FRC to first engine */ + if(setup /* cps == &first && gameInfo.variant == VariantFischeRandom */) { + SendToProgram("force\n", cps); + SendBoard(cps, 0); + /* engine is now in force mode! Set flag to wake it up after first move. */ + setboardSpoiledMachineBlack = 1; + } } if (cps->sendICS) { sprintf(buf, "ics %s\n", appData.icsActive ? appData.icsHost : "-"); @@ -6554,12 +6894,15 @@ GameEnds(result, resultDetails, whosays) int isIcsGame; char buf[MSG_SIZ]; + if(endingGame) return; /* [HGM] crash: forbid recursion */ + endingGame = 1; + if (appData.debugMode) { fprintf(debugFP, "GameEnds(%d, %s, %d)\n", result, resultDetails ? resultDetails : "(null)", whosays); } - if (appData.icsActive && whosays == (GE_ENGINE || whosays >= GE_ENGINE1)) { + if (appData.icsActive && (whosays == GE_ENGINE || whosays >= GE_ENGINE1)) { /* If we are playing on ICS, the server decides when the game is over, but the engine can offer to draw, claim a draw, or resign. @@ -6576,7 +6919,8 @@ GameEnds(result, resultDetails, whosays) } } #endif - return; + endingGame = 0; /* [HGM] crash */ + return; } /* If we're loading the game from a file, stop */ @@ -6586,7 +6930,7 @@ GameEnds(result, resultDetails, whosays) } /* Cancel draw offers */ - first.offeredDraw = second.offeredDraw = 0; + first.offeredDraw = second.offeredDraw = 0; /* If this is an ICS game, only ICS can really say it's done; if not, anyone can. */ @@ -6625,7 +6969,11 @@ GameEnds(result, resultDetails, whosays) result = claimer == 'w' ? BlackWins : WhiteWins; resultDetails = buf; } else - if( result == GameIsDrawn && epStatus[forwardMostMove] > EP_DRAWS ) { + if( result == GameIsDrawn && epStatus[forwardMostMove] > EP_DRAWS + && (forwardMostMove <= backwardMostMove || + epStatus[forwardMostMove-1] > EP_DRAWS || + (claimer=='b')==(forwardMostMove&1)) + ) { /* Draw that was not flagged by Xboard is false */ sprintf(buf, "False draw claim: '%s'", resultDetails); result = claimer == 'w' ? BlackWins : WhiteWins; @@ -6634,6 +6982,12 @@ GameEnds(result, resultDetails, whosays) /* (Claiming a loss is accepted no questions asked!) */ } + if(serverMoves != NULL && !loadFlag) { char c = '='; + if(result==WhiteWins) c = '+'; + if(result==BlackWins) c = '-'; + if(resultDetails != NULL) + fprintf(serverMoves, ";%c;%s\n", c, resultDetails); + } if (appData.debugMode) { fprintf(debugFP, "GameEnds(%d, %s, %d) after test\n", result, resultDetails ? resultDetails : "(null)", whosays); @@ -6642,7 +6996,30 @@ GameEnds(result, resultDetails, whosays) gameInfo.result = result; gameInfo.resultDetails = StrSave(resultDetails); + /* display last move only if game was not loaded from file */ + if ((whosays != GE_FILE) && (currentMove == forwardMostMove)) + DisplayMove(currentMove - 1); + + if (forwardMostMove != 0) { + if (gameMode != PlayFromGameFile && gameMode != EditGame) { + if (*appData.saveGameFile != NULLCHAR) { + SaveGameToFile(appData.saveGameFile, TRUE); + } else if (appData.autoSaveGames) { + AutoSaveGame(); + } + if (*appData.savePositionFile != NULLCHAR) { + SavePositionToFile(appData.savePositionFile); + } + } + } + /* Tell program how game ended in case it is learning */ + /* [HGM] Moved this to after saving the PGN, just in case */ + /* engine died and we got here through time loss. In that */ + /* case we will get a fatal error writing the pipe, which */ + /* would otherwise lose us the PGN. */ + /* [HGM] crash: not needed anymore, but doesn't hurt; */ + /* output during GameEnds should never be fatal anymore */ if (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay || @@ -6660,23 +7037,6 @@ GameEnds(result, resultDetails, whosays) SendToProgram(buf, &second); } } - - /* display last move only if game was not loaded from file */ - if ((whosays != GE_FILE) && (currentMove == forwardMostMove)) - DisplayMove(currentMove - 1); - - if (forwardMostMove != 0) { - if (gameMode != PlayFromGameFile && gameMode != EditGame) { - if (*appData.saveGameFile != NULLCHAR) { - SaveGameToFile(appData.saveGameFile, TRUE); - } else if (appData.autoSaveGames) { - AutoSaveGame(); - } - if (*appData.savePositionFile != NULLCHAR) { - SavePositionToFile(appData.savePositionFile); - } - } - } } if (appData.icsActive) { @@ -6734,7 +7094,8 @@ GameEnds(result, resultDetails, whosays) if (appData.noChessProgram) { gameMode = nextGameMode; ModeHighlight(); - return; + endingGame = 0; /* [HGM] crash */ + return; } if (first.reuse) { @@ -6823,6 +7184,7 @@ GameEnds(result, resultDetails, whosays) if(appData.matchPause>10000 || appData.matchPause<10) appData.matchPause = 10000; /* [HGM] make pause adjustable */ ScheduleDelayedEvent(NextMatchGame, appData.matchPause); + endingGame = 0; /* [HGM] crash */ return; } else { char buf[MSG_SIZ]; @@ -6839,6 +7201,7 @@ GameEnds(result, resultDetails, whosays) ExitAnalyzeMode(); gameMode = nextGameMode; ModeHighlight(); + endingGame = 0; /* [HGM] crash */ } /* Assumes program was just initialized (initString sent). @@ -6857,6 +7220,9 @@ FeedMovesToProgram(cps, upto) SendToProgram("force\n", cps); if (startedFromSetupPosition) { SendBoard(cps, backwardMostMove); + if (appData.debugMode) { + fprintf(debugFP, "feedMoves\n"); + } } for (i = backwardMostMove; i < upto; i++) { SendMoveToProgram(i, cps); @@ -6873,7 +7239,10 @@ ResurrectChessProgram() if (appData.noChessProgram || first.pr != NoProc) return; StartChessProgram(&first); - InitChessProgram(&first); + if (appData.debugMode) { + fprintf(debugFP, "From ResurrectChessProgram\n"); + } + InitChessProgram(&first, FALSE); FeedMovesToProgram(&first, currentMove); if (!first.sendTime) { @@ -6904,7 +7273,6 @@ Reset(redraw, init) fprintf(debugFP, "Reset(%d, %d) from gameMode %d\n", redraw, init, gameMode); } - pausing = pauseExamInvalid = FALSE; startedFromSetupPosition = blackPlaysFirst = FALSE; firstMove = TRUE; @@ -6931,6 +7299,19 @@ Reset(redraw, init) alarmSounded = FALSE; GameEnds((ChessMove) 0, NULL, GE_PLAYER); + if(appData.serverMovesName != NULL) { + /* [HGM] prepare to make moves file for broadcasting */ + clock_t t = clock(); + if(serverMoves != NULL) fclose(serverMoves); + serverMoves = fopen(appData.serverMovesName, "r"); + if(serverMoves != NULL) { + fclose(serverMoves); + /* delay 15 sec before overwriting, so all clients can see end */ + while(clock()-t < appData.serverPause*CLOCKS_PER_SEC); + } + serverMoves = fopen(appData.serverMovesName, "w"); + } + ExitAnalyzeMode(); gameMode = BeginningOfGame; ModeHighlight(); @@ -6947,7 +7328,11 @@ Reset(redraw, init) if (first.pr == NULL) { StartChessProgram(&first); } - if (init) InitChessProgram(&first); + if (init) { + if (appData.debugMode) { + fprintf(debugFP, "From Reset\n"); + } +InitChessProgram(&first, startedFromSetupPosition);} DisplayTitle(""); DisplayMessage("", ""); HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); @@ -7014,9 +7399,8 @@ AutoPlayOneMove() SendMoveToProgram(currentMove++, &first); DisplayBothClocks(); DrawPosition(FALSE, boards[currentMove]); - if (commentList[currentMove] != NULL) { - DisplayComment(currentMove - 1, commentList[currentMove]); - } + // [HGM] PV info: always display, routine tests if empty + DisplayComment(currentMove - 1, commentList[currentMove]); return TRUE; } @@ -7253,7 +7637,7 @@ LoadGameOneMove(readAhead) if (appData.matchMode || (appData.timeDelay == 0 && !pausing)) { DrawPosition(FALSE, boards[currentMove]); DisplayBothClocks(); - if (!appData.matchMode && commentList[currentMove] != NULL) + if (!appData.matchMode) // [HGM] PV info: routine tests if empty DisplayComment(currentMove - 1, commentList[currentMove]); } (void) StopLoadGameTimer(); @@ -7464,6 +7848,7 @@ LoadGame(f, gameNumber, title, useList) int numPGNTags = 0; int err; GameMode oldGameMode; + VariantClass oldVariant = gameInfo.variant; /* [HGM] PGNvariant */ if (appData.debugMode) fprintf(debugFP, "LoadGame(): on entry, gameMode %d\n", gameMode); @@ -7513,7 +7898,6 @@ LoadGame(f, gameNumber, title, useList) yynewfile(f); - if (lg && lg->gameInfo.white && lg->gameInfo.black) { sprintf(buf, "%s vs. %s", lg->gameInfo.white, lg->gameInfo.black); @@ -7672,6 +8056,16 @@ LoadGame(f, gameNumber, title, useList) err = ParsePGNTag(yy_text, &gameInfo); if (!err) numPGNTags++; + /* [HGM] PGNvariant: automatically switch to variant given in PGN tag */ + if(gameInfo.variant != oldVariant) { + startedFromPositionFile = FALSE; /* [HGM] loadPos: variant switch likely makes position invalid */ + InitPosition(TRUE); + oldVariant = gameInfo.variant; + if (appData.debugMode) + fprintf(debugFP, "New variant %d\n", (int) oldVariant); + } + + if (gameInfo.fen != NULL) { Board initial_position; startedFromSetupPosition = TRUE; @@ -7804,13 +8198,22 @@ LoadGame(f, gameNumber, title, useList) if (first.pr == NoProc) { StartChessProgram(&first); } - InitChessProgram(&first); + if (appData.debugMode) { + fprintf(debugFP, "From LoadGame\n"); + } + InitChessProgram(&first, FALSE); SendToProgram("force\n", &first); if (startedFromSetupPosition) { SendBoard(&first, forwardMostMove); + if (appData.debugMode) { + fprintf(debugFP, "Load Game\n"); + } DisplayBothClocks(); } + /* [HGM] server: flag to write setup moves in broadcast file as one */ + loadFlag = appData.suppressLoadMoves; + while (cm == Comment) { char *p; if (appData.debugMode) @@ -7845,10 +8248,9 @@ LoadGame(f, gameNumber, title, useList) return TRUE; } - if (commentList[currentMove] != NULL) { - if (!matchMode && (pausing || appData.timeDelay != 0)) { + // [HGM] PV info: routine tests if comment empty + if (!matchMode && (pausing || appData.timeDelay != 0)) { DisplayComment(currentMove - 1, commentList[currentMove]); - } } if (!matchMode && appData.timeDelay != 0) DrawPosition(FALSE, boards[currentMove]); @@ -7889,6 +8291,8 @@ LoadGame(f, gameNumber, title, useList) if (appData.debugMode) fprintf(debugFP, "LoadGame(): on exit, gameMode %d\n", gameMode); + + loadFlag = 0; /* [HGM] true game starts */ return TRUE; } @@ -7960,7 +8364,10 @@ LoadPosition(f, positionNumber, title) strcpy(lastLoadPositionTitle, title); if (first.pr == NoProc) { StartChessProgram(&first); - InitChessProgram(&first); + if (appData.debugMode) { + fprintf(debugFP, "From LoadPosition\n"); + } + InitChessProgram(&first, FALSE); } pn = positionNumber; if (positionNumber < 0) { @@ -7987,6 +8394,7 @@ LoadPosition(f, positionNumber, title) DisplayError("Position not found in file", 0); return FALSE; } +#if 0 switch (line[0]) { case '#': case 'x': default: @@ -7996,14 +8404,16 @@ LoadPosition(f, positionNumber, title) case 'P': case 'N': case 'B': case 'R': case 'Q': case 'K': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': -#ifdef FAIRY case 'H': case 'A': case 'M': case 'h': case 'a': case 'm': case 'E': case 'F': case 'G': case 'e': case 'f': case 'g': case 'C': case 'W': case 'c': case 'w': -#endif fenMode = TRUE; break; } +#else + // [HGM] FEN can begin with digit, any piece letter valid in this variant, or a + for Shogi promoted pieces + fenMode = line[0] >= '0' && line[0] <= '9' || line[0] == '+' || CharToPiece(line[0]) != EmptySquare; +#endif if (pn >= 2) { if (fenMode || line[0] == '#') pn--; @@ -8065,6 +8475,9 @@ LoadPosition(f, positionNumber, title) DisplayMessage("", "White to play"); } SendBoard(&first, forwardMostMove); + if (appData.debugMode) { + fprintf(debugFP, "Load Position\n"); + } if (positionNumber > 1) { sprintf(line, "%s %d", title, positionNumber); @@ -8324,10 +8737,11 @@ SaveGamePGN(f) if(i >= backwardMostMove) { /* take the time that changed */ seconds = timeRemaining[0][i] - timeRemaining[0][i+1]; - if(seconds <= 0) + if(seconds <= 0) seconds = timeRemaining[1][i] - timeRemaining[1][i+1]; } seconds /= 1000; + seconds = pvInfoList[i].time/100; if (appData.debugMode) { fprintf(debugFP, "times = %d %d %d %d, seconds=%d\n", timeRemaining[0][i+1], timeRemaining[0][i], @@ -8855,8 +9269,6 @@ ResetGameEvent() } } -static int exiting = 0; - void ExitEvent(status) int status; @@ -8879,8 +9291,10 @@ ExitEvent(status) if (icsPR != NoProc) { DestroyChildProcess(icsPR, TRUE); } +#if 0 /* Save game if resource set and not already saved by GameEnds() */ - if (gameInfo.resultDetails == NULL && forwardMostMove > 0) { + if ((gameInfo.resultDetails == NULL || errorExitFlag ) + && forwardMostMove > 0) { if (*appData.saveGameFile != NULLCHAR) { SaveGameToFile(appData.saveGameFile, TRUE); } else if (appData.autoSaveGames) { @@ -8891,6 +9305,17 @@ ExitEvent(status) } } GameEnds((ChessMove) 0, NULL, GE_PLAYER); +#else + /* [HGM] crash: leave writing PGN and position entirely to GameEnds() */ + GameEnds(gameInfo.result, gameInfo.resultDetails==NULL ? "aborted" : gameInfo.resultDetails, GE_PLAYER); +#endif + /* [HGM] crash: the above GameEnds() is a dud if another one was running */ + /* make sure this other one finishes before killing it! */ + if(endingGame) { int count = 0; + if(appData.debugMode) fprintf(debugFP, "ExitEvent() during GameEnds(), wait\n"); + while(endingGame && count++ < 10) DoSleep(1); + if(appData.debugMode && endingGame) fprintf(debugFP, "GameEnds() seems stuck, proceed exiting\n"); + } /* Kill off chess programs */ if (first.pr != NoProc) { @@ -9264,10 +9689,16 @@ TwoMachinesEvent P((void)) return; } DisplayMessage("", ""); - InitChessProgram(&second); + if (appData.debugMode) { + fprintf(debugFP, "From TwoMachines\n"); + } + InitChessProgram(&second, FALSE); SendToProgram("force\n", &second); if (startedFromSetupPosition) { SendBoard(&second, backwardMostMove); + if (appData.debugMode) { + fprintf(debugFP, "Two Machines\n"); + } } for (i = backwardMostMove; i < forwardMostMove; i++) { SendMoveToProgram(i, &second); @@ -9503,7 +9934,10 @@ void EditPositionDone() { startedFromSetupPosition = TRUE; - InitChessProgram(&first); + if (appData.debugMode) { + fprintf(debugFP, "From EditPosition\n"); + } + InitChessProgram(&first, FALSE); SendToProgram("force\n", &first); if (blackPlaysFirst) { strcpy(moveList[0], ""); @@ -9514,6 +9948,9 @@ EditPositionDone() currentMove = forwardMostMove = backwardMostMove = 0; } SendBoard(&first, forwardMostMove); + if (appData.debugMode) { + fprintf(debugFP, "EditPosDone\n"); + } DisplayTitle(""); timeRemaining[0][forwardMostMove] = whiteTimeRemaining; timeRemaining[1][forwardMostMove] = blackTimeRemaining; @@ -9647,20 +10084,18 @@ EditPositionMenuEvent(selection, x, y) break; case PromotePiece: - if(piece >= (int)WhitePawn && piece < (int)WhiteWazir || - piece >= (int)BlackPawn && piece < (int)BlackWazir ) { + if(piece >= (int)WhitePawn && piece < (int)WhiteMan || + piece >= (int)BlackPawn && piece < (int)BlackMan ) { selection = (ChessSquare) (PROMOTED piece); - } else if(piece == EmptySquare) selection = WhiteWazir; + } else if(piece == EmptySquare) selection = WhiteSilver; else selection = (ChessSquare)((int)piece - 1); goto defaultlabel; case DemotePiece: - if(piece >= (int)WhiteUnicorn && piece < (int)WhiteKing || - piece >= (int)BlackUnicorn && piece < (int)BlackKing ) { + if(piece > (int)WhiteMan && piece <= (int)WhiteKing || + piece > (int)BlackMan && piece <= (int)BlackKing ) { selection = (ChessSquare) (DEMOTED piece); - } else if( piece == WhiteKing || piece == BlackKing ) - selection = (ChessSquare)((int)piece - (int)WhiteKing + (int)WhiteMan); - else if(piece == EmptySquare) selection = BlackWazir; + } else if(piece == EmptySquare) selection = BlackSilver; else selection = (ChessSquare)((int)piece + 1); goto defaultlabel; @@ -10011,7 +10446,7 @@ ForwardInner(target) DisplayMove(currentMove - 1); DrawPosition(FALSE, boards[currentMove]); HistorySet(parseList,backwardMostMove,forwardMostMove,currentMove-1); - if (commentList[currentMove] && !matchMode && gameMode != Training) { + if ( !matchMode && gameMode != Training) { // [HGM] PV info: routine tests if empty DisplayComment(currentMove - 1, commentList[currentMove]); } } @@ -10114,9 +10549,8 @@ BackwardInner(target) DisplayMove(currentMove - 1); DrawPosition(full_redraw, boards[currentMove]); HistorySet(parseList,backwardMostMove,forwardMostMove,currentMove-1); - if (commentList[currentMove] != NULL) { - DisplayComment(currentMove - 1, commentList[currentMove]); - } + // [HGM] PV info: routine tests if comment empty + DisplayComment(currentMove - 1, commentList[currentMove]); } void @@ -10403,6 +10837,7 @@ TidyProgramName(prog, host, buf) p = q; while (p >= prog && *p != '/' && *p != '\\') p--; p++; + if(p == prog && *p == '"') p++; if (q - p >= 4 && StrCaseCmp(q - 4, ".exe") == 0) q -= 4; memcpy(buf, p, q - p); buf[q - p] = NULLCHAR; @@ -10563,7 +10998,7 @@ AppendComment(index, text) int oldlen, len; char *old; - GetInfoFromComment( index, text ); + text = GetInfoFromComment( index, text ); /* [HGM] PV time: strip PV info from comment */ CrushCRs(text); while (*text == '\n') text++; @@ -10601,12 +11036,15 @@ static char * FindStr( char * text, char * sub_text ) } /* [AS] Try to extract PV info from PGN comment */ -void GetInfoFromComment( int index, char * text ) +/* [HGM] PV time: and then remove it, to prevent it appearing twice */ +char *GetInfoFromComment( int index, char * text ) { + char * sep = text; + if( text != NULL && index > 0 ) { int score = 0; int depth = 0; - int time = -1; + int time = -1, sec = 0; char * s_eval = FindStr( text, "[%eval " ); char * s_emt = FindStr( text, "[%emt " ); @@ -10616,11 +11054,11 @@ void GetInfoFromComment( int index, char * text ) if( s_eval != NULL ) { if( sscanf( s_eval, "%d,%d%c", &score, &depth, &delim ) != 3 ) { - return; + return text; } if( delim != ']' ) { - return; + return text; } } @@ -10629,26 +11067,38 @@ void GetInfoFromComment( int index, char * text ) } else { /* We expect something like: [+|-]nnn.nn/dd */ - char * sep = strchr( text, '/' ); int score_lo = 0; + sep = strchr( text, '/' ); if( sep == NULL || sep < (text+4) ) { - return; + return text; } - if( sscanf( text, "%d.%d/%d", &score, &score_lo, &depth ) != 3 ) { - return; + time = -1; sec = -1; + if( sscanf( text, "%d.%d/%d %d:%d", &score, &score_lo, &depth, &time, &sec ) != 5 && + sscanf( text, "%d.%d/%d %d", &score, &score_lo, &depth, &time ) != 4 && + sscanf( text, "%d.%d/%d", &score, &score_lo, &depth ) != 3 ) { + return text; } if( score_lo < 0 || score_lo >= 100 ) { - return; + return text; } + if(sec >= 0) time = 60*time + sec; score = score >= 0 ? score*100 + score_lo : score*100 - score_lo; + + /* [HGM] PV time: now locate end of PV info */ + while( *++sep >= '0' && *sep <= '9'); // strip depth + if(time >= 0) + while( *++sep >= '0' && *sep <= '9'); // strip time + if(sec >= 0) + while( *++sep >= '0' && *sep <= '9'); // strip seconds + while(*sep == ' ') sep++; } if( depth <= 0 ) { - return; + return text; } if( time < 0 ) { @@ -10657,8 +11107,9 @@ void GetInfoFromComment( int index, char * text ) pvInfoList[index-1].depth = depth; pvInfoList[index-1].score = score; - pvInfoList[index-1].time = time; + pvInfoList[index-1].time = time; } + return sep; } void @@ -10682,9 +11133,19 @@ SendToProgram(message, cps) count = strlen(message); outCount = OutputToProcess(cps->pr, message, count, &error); - if (outCount < count && !exiting) { + if (outCount < count && !exiting + && !endingGame) { /* [HGM] crash: to not hang GameEnds() writing to deceased engines */ sprintf(buf, "Error writing to %s chess program", cps->which); - DisplayFatalError(buf, error, 1); + if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */ + if(epStatus[forwardMostMove] <= EP_DRAWS) { + gameInfo.result = GameIsDrawn; /* [HGM] accept exit as draw claim */ + sprintf(buf, "%s program exits in draw position (%s)", cps->which, cps->program); + } else { + gameInfo.result = cps->twoMachinesColor[0]=='w' ? BlackWins : WhiteWins; + } + gameInfo.resultDetails = buf; + } + DisplayFatalError(buf, error, 1); } } @@ -10706,6 +11167,15 @@ ReceiveFromProgram(isr, closure, message, count, error) sprintf(buf, "Error: %s chess program (%s) exited unexpectedly", cps->which, cps->program); + if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */ + if(epStatus[forwardMostMove] <= EP_DRAWS) { + gameInfo.result = GameIsDrawn; /* [HGM] accept exit as draw claim */ + sprintf(buf, "%s program exits in draw position (%s)", cps->which, cps->program); + } else { + gameInfo.result = cps->twoMachinesColor[0]=='w' ? BlackWins : WhiteWins; + } + gameInfo.resultDetails = buf; + } RemoveInputSource(cps->isr); DisplayFatalError(buf, 0, 1); } else { @@ -10722,7 +11192,6 @@ ReceiveFromProgram(isr, closure, message, count, error) DisplayFatalError(buf, error, 1); } - GameEnds((ChessMove) 0, NULL, GE_PLAYER); return; } @@ -10749,13 +11218,18 @@ SendTimeControl(cps, mps, tc, inc, sd, st) long tc; { char buf[MSG_SIZ]; - int seconds = (tc / 1000) % 60; + int seconds; if( timeControl_2 > 0 ) { if( (gameMode == MachinePlaysBlack) || (gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'b') ) { tc = timeControl_2; } } + tc /= cps->timeOdds; /* [HGM] time odds: apply before telling engine */ + inc /= cps->timeOdds; + st /= cps->timeOdds; + + seconds = (tc / 1000) % 60; /* [HGM] displaced to after applying odds */ if (st > 0) { /* Set exact time per move, normally using st command */ @@ -10796,6 +11270,14 @@ SendTimeControl(cps, mps, tc, inc, sd, st) } } +ChessProgramState *WhitePlayer() +/* [HGM] return pointer to 'first' or 'second', depending on who plays white */ +{ + if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b') + return &second; + return &first; +} + void SendTimeRemaining(cps, machineWhite) ChessProgramState *cps; @@ -10815,6 +11297,12 @@ SendTimeRemaining(cps, machineWhite) time = blackTimeRemaining / 10; otime = whiteTimeRemaining / 10; } + /* [HGM] translate opponent's time by time-odds factor */ + otime = (otime * cps->other->timeOdds) / cps->timeOdds; + if (appData.debugMode) { + fprintf(debugFP, "time odds: %d %d \n", cps->timeOdds, cps->other->timeOdds); + } + if (time <= 0) time = 1; if (otime <= 0) otime = 1; @@ -10946,6 +11434,8 @@ ParseFeatures(args, cps) if (BoolFeature(&p, "ics", &cps->sendICS, cps)) continue; if (BoolFeature(&p, "name", &cps->sendName, cps)) continue; if (BoolFeature(&p, "pause", &val, cps)) continue; /* unused at present */ + if (BoolFeature(&p, "debug", &cps->debug, cps)) continue; + if (IntFeature(&p, "level", &cps->maxNrOfSessions, cps)) continue; if (IntFeature(&p, "done", &val, cps)) { FeatureDone(cps, val); continue; @@ -11192,6 +11682,8 @@ DisplayComment(moveNumber, text) char *text; { char title[MSG_SIZ]; + char buf[8000]; // comment can be long! + int score, depth; if( appData.autoDisplayComment ) { if (moveNumber < 0 || parseList[moveNumber][0] == NULLCHAR) { @@ -11201,9 +11693,18 @@ DisplayComment(moveNumber, text) WhiteOnMove(moveNumber) ? " " : ".. ", parseList[moveNumber]); } - + } else title[0] = 0; + + // [HGM] PV info: display PV info together with (or as) comment + if(moveNumber >= 0 && (depth = pvInfoList[moveNumber].depth) > 0) { + if(text == NULL) text = ""; + score = pvInfoList[moveNumber].score; + sprintf(buf, "%s%.2f/%d %d\n%s", score>0 ? "+" : "", score/100., + depth, pvInfoList[moveNumber].time, text); + CommentPopUp(title, buf); + } else + if (text != NULL) CommentPopUp(title, text); - } } /* This routine sends a ^C interrupt to gnuchess, to awaken it if it @@ -11296,30 +11797,18 @@ CheckTimeControl() if (!appData.clockMode || appData.icsActive || gameMode == PlayFromGameFile || forwardMostMove == 0) return; - if (timeIncrement >= 0) { - if (WhiteOnMove(forwardMostMove)) { - blackTimeRemaining += timeIncrement; - } else { - whiteTimeRemaining += timeIncrement; - } - } /* - * add time to clocks when time control is achieved + * add time to clocks when time control is achieved ([HGM] now also used fot increment) */ - if (movesPerSession) { - switch ((forwardMostMove + 1) % (movesPerSession * 2)) { - case 0: + if ( !WhiteOnMove(forwardMostMove) ) /* White made time control */ - whiteTimeRemaining += GetTimeControlForWhite(); - break; - case 1: + whiteTimeRemaining += GetTimeQuota((forwardMostMove-1)/2) + /* [HGM] time odds: correct new time quota for time odds! */ + / WhitePlayer()->timeOdds; + else /* Black made time control */ - blackTimeRemaining += GetTimeControlForBlack(); - break; - default: - break; - } - } + blackTimeRemaining += GetTimeQuota((forwardMostMove-1)/2) + / WhitePlayer()->other->timeOdds; } void @@ -11426,9 +11915,9 @@ ResetClocks() (void) StopClockTimer(); if (appData.icsActive) { whiteTimeRemaining = blackTimeRemaining = 0; - } else { - whiteTimeRemaining = GetTimeControlForWhite(); - blackTimeRemaining = GetTimeControlForBlack(); + } else { /* [HGM] correct new time quote for time odds */ + whiteTimeRemaining = GetTimeQuota(-1) / WhitePlayer()->timeOdds; + blackTimeRemaining = GetTimeQuota(-1) / WhitePlayer()->other->timeOdds; } if (whiteFlag || blackFlag) { DisplayTitle(""); @@ -11518,12 +12007,17 @@ SwitchClocks() lastTickLength = SubtractTimeMarks(&now, &tickStartTM); if (WhiteOnMove(forwardMostMove)) { blackTimeRemaining -= lastTickLength; + /* [HGM] PGNtime: save time for PGN file if engine did not give it */ + if(pvInfoList[forwardMostMove-1].time == -1) + pvInfoList[forwardMostMove-1].time = + (timeRemaining[1][forwardMostMove-1] - blackTimeRemaining)/10; } else { whiteTimeRemaining -= lastTickLength; + /* [HGM] PGNtime: save time for PGN file if engine did not give it */ + if(pvInfoList[forwardMostMove-1].time == -1) + pvInfoList[forwardMostMove-1].time = + (timeRemaining[0][forwardMostMove-1] - whiteTimeRemaining)/10; } - /* [HGM] save time for PGN file if engine did not give it */ - if(pvInfoList[forwardMostMove-1].time == -1) - pvInfoList[forwardMostMove-1].time = lastTickLength/100; flagged = CheckFlags(); } CheckTimeControl(); @@ -11801,84 +12295,50 @@ PositionToFEN(move, useFEN960) } *(p - 1) = ' '; + /* [HGM] print Crazyhouse or Shogi holdings */ + if( gameInfo.holdingsWidth ) { + *(p-1) = '['; /* if we wanted to support BFEN, this could be '/' */ + q = p; + for(i=0; i= 0 && + castlingRights[move][0] >= 0 ) + *p++ = castlingRights[move][0] + AAA + 'A' - 'a'; + if(castlingRights[move][2] >= 0 && + castlingRights[move][1] >= 0 ) + *p++ = castlingRights[move][1] + AAA + 'A' - 'a'; + if(castlingRights[move][5] >= 0 && + castlingRights[move][3] >= 0 ) + *p++ = castlingRights[move][3] + AAA; + if(castlingRights[move][5] >= 0 && + castlingRights[move][4] >= 0 ) + *p++ = castlingRights[move][4] + AAA; + } else { - /* White castling rights */ - - for (fk = BOARD_LEFT+1; fk < BOARD_RGHT-1; fk++) { - - if (boards[move][0][fk] == WhiteKing) { - - for (fr = BOARD_RGHT-1; fr > fk; fr--) { /* H side */ - if (boards[move][0][fr] == WhiteRook) { - *p++ = useFEN960 ? 'A' + fr : 'K'; - break; - } - } - - for (fr = BOARD_LEFT; fr < fk; fr++) { /* A side */ - if (boards[move][0][fr] == WhiteRook) { - *p++ = useFEN960 ? 'A' + fr : 'Q'; - break; - } - } - } - } - - /* Black castling rights */ - - for (fk = BOARD_LEFT+1; fk < BOARD_RGHT-1; fk++) { - - if (boards[move][BOARD_HEIGHT-1][fk] == BlackKing) { - - for (fr = BOARD_RGHT-1; fr > fk; fr--) { /* H side */ - if (boards[move][BOARD_HEIGHT-1][fr] == BlackRook) { - *p++ = useFEN960 ? 'a' + fr : 'k'; - break; - } - } - - for (fr = BOARD_LEFT; fr < fk; fr++) { /* A side */ - if (boards[move][BOARD_HEIGHT-1][fr] == BlackRook) { - *p++ = useFEN960 ? 'a' + fr : 'q'; - break; - } - } - } - } - - if (q == p) *p++ = '-'; /* No castling rights */ - *p++ = ' '; - } - else { - q = p; - -#ifdef OLDCASTLINGCODE - if (boards[move][0][BOARD_WIDTH>>1] == WhiteKing) { - if (boards[move][0][BOARD_RGHT-1] == WhiteRook) *p++ = 'K'; - if (boards[move][0][BOARD_LEFT] == WhiteRook) *p++ = 'Q'; - } - if (boards[move][BOARD_HEIGHT-1][BOARD_WIDTH>>1] == BlackKing) { - if (boards[move][BOARD_HEIGHT-1][BOARD_HEIGHT-1] == BlackRook) *p++ = 'k'; - if (boards[move][BOARD_HEIGHT-1][BOARD_LEFT] == BlackRook) *p++ = 'q'; - } -#else /* [HGM] write true castling rights */ if( nrCastlingRights == 6 ) { if(castlingRights[move][0] == BOARD_RGHT-1 && @@ -11890,12 +12350,9 @@ PositionToFEN(move, useFEN960) if(castlingRights[move][4] == BOARD_LEFT && castlingRights[move][5] >= 0 ) *p++ = 'q'; } -#endif - if (q == p) *p++ = '-'; - *p++ = ' '; - } - - /* POP Fabien & Tord */ + } + if (q == p) *p++ = '-'; /* No castling rights */ + *p++ = ' '; } if(gameInfo.variant != VariantShogi && gameInfo.variant != VariantXiangqi && @@ -11922,26 +12379,6 @@ PositionToFEN(move, useFEN960) *p++ = ' '; } - /* [HGM] print Crazyhouse or Shogi holdings */ - if( gameInfo.holdingsWidth ) { - q = p; - for(i=0; i= 0; i--) { j = 0; for (;;) { - if (*p == '/' || *p == ' ') { - if (*p == '/') p++; + if (*p == '/' || *p == ' ' || (*p == '[' && i == 0) ) { + if (*p == '/') p++; emptycount = gameInfo.boardWidth - j; while (emptycount--) board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare; @@ -12032,6 +12469,34 @@ ParseFEN(board, blackPlaysFirst, fen) } while (*p == '/' || *p == ' ') p++; + /* [HGM] look for Crazyhouse holdings here */ + while(*p==' ') p++; + if( gameInfo.holdingsWidth && p[-1] == '/' || *p == '[') { + if(*p == '[') p++; + if(*p == '-' ) *p++; /* empty holdings */ else { + if( !gameInfo.holdingsWidth ) return FALSE; /* no room to put holdings! */ + /* if we would allow FEN reading to set board size, we would */ + /* have to add holdings and shift the board read so far here */ + while( (piece = CharToPiece(*p) ) != EmptySquare ) { + *p++; + if((int) piece >= (int) BlackPawn ) { + i = (int)piece - (int)BlackPawn; + if( i >= BOARD_HEIGHT ) return FALSE; + board[BOARD_HEIGHT-1-i][0] = piece; /* black holdings */ + board[BOARD_HEIGHT-1-i][1]++; /* black counts */ + } else { + i = (int)piece - (int)WhitePawn; + if( i >= BOARD_HEIGHT ) return FALSE; + board[i][BOARD_WIDTH-1] = piece; /* white holdings */ + board[i][BOARD_WIDTH-2]++; /* black holdings */ + } + } + } + if(*p == ']') *p++; + } + + while(*p == ' ') p++; + /* Active color */ switch (*p++) { case 'w': @@ -12050,7 +12515,8 @@ ParseFEN(board, blackPlaysFirst, fen) /* set defaults in case FEN is incomplete */ FENepStatus = EP_UNKNOWN; for(i=0; i=0 && board[castlingRank[0]][initialRights[0]] != WhiteRook) FENcastlingRights[0] = -1; if(initialRights[1]>=0 && board[castlingRank[1]][initialRights[1]] != WhiteRook) FENcastlingRights[1] = -1; @@ -12068,27 +12534,71 @@ ParseFEN(board, blackPlaysFirst, fen) FENcastlingRights[i] = -1; } } - while(*p=='K' || *p=='Q' || *p=='k' || *p=='q' || *p=='-') { - switch(*p++) { + while(*p=='K' || *p=='Q' || *p=='k' || *p=='q' || *p=='-' || + gameInfo.variant == VariantFischeRandom && + ( *p >= 'a' && *p < 'a' + gameInfo.boardWidth) || + ( *p >= 'A' && *p < 'A' + gameInfo.boardWidth) ) { + char c = *p++; int whiteKingFile=-1, blackKingFile=-1; + + for(i=BOARD_LEFT; i>1; + for(i=BOARD_RGHT-1; board[0][i]!=WhiteRook && i>whiteKingFile; i--); + FENcastlingRights[0] = i != whiteKingFile ? i : -1; + FENcastlingRights[2] = whiteKingFile; break; case'Q': - FENcastlingRights[1] = BOARD_LEFT; - FENcastlingRights[2] = BOARD_WIDTH>>1; + for(i=BOARD_LEFT; board[0][i]!=WhiteRook && i>1; + for(i=BOARD_RGHT-1; board[BOARD_HEIGHT-1][i]!=BlackRook && i>blackKingFile; i--); + FENcastlingRights[3] = i != blackKingFile ? i : -1; + FENcastlingRights[5] = blackKingFile; break; case'q': - FENcastlingRights[4] = BOARD_LEFT; - FENcastlingRights[5] = BOARD_WIDTH>>1; + for(i=BOARD_LEFT; board[BOARD_HEIGHT-1][i]!=BlackRook && i= 'a') { /* black rights */ + for(i=BOARD_LEFT; i= BlackKing ) break; + if(c > i) + FENcastlingRights[3] = c; + else + FENcastlingRights[4] = c; + } else { /* white rights */ + for(i=BOARD_LEFT; i= WhiteKing) break; + if(c > i) + FENcastlingRights[0] = c; + else + FENcastlingRights[1] = c; + } } } + if (appData.debugMode) { + fprintf(debugFP, "FEN castling rights:"); + for(i=0; i= (int) BlackPawn ) { - i = (int)piece - (int)BlackPawn; - if( i >= BOARD_HEIGHT ) return FALSE; - board[BOARD_HEIGHT-1-i][0] = piece; /* black holdings */ - board[BOARD_HEIGHT-1-i][1]++; /* black counts */ - } else { - i = (int)piece - (int)WhitePawn; - if( i >= BOARD_HEIGHT ) return FALSE; - board[i][BOARD_WIDTH-1] = piece; /* white holdings */ - board[i][BOARD_WIDTH-2]++; /* black holdings */ - } - } - } - } - if(sscanf(p, "%d", &i) == 1) { FENrulePlies = i; /* 50-move ply counter */ diff --git a/backend.h b/backend.h index 8ef5bf3..111a3af 100644 --- a/backend.h +++ b/backend.h @@ -251,6 +251,12 @@ typedef struct _CPS { int scoreIsAbsolute; /* [AS] 0=don't know (standard), 1=score is always from white side */ int isUCI; /* [AS] 0=no (Winboard), 1=UCI (requires Polyglot) */ int hasOwnBookUCI; /* [AS] 0=use GUI or Polyglot book, 1=has own book */ + + /* [HGM] time odds */ + int timeOdds; /* factor through which we divide time for this engine */ + int debug; /* [HGM] ignore engine debug lines starting with '#' */ + int maxNrOfSessions; /* [HGM] secondary TC: max args in 'level' command */ + int accumulateTC; /* [HGM] secondary TC: how to handle extra sessions */ } ChessProgramState; extern ChessProgramState first, second; diff --git a/backendz.h b/backendz.h index 4014e3b..a7592e7 100644 --- a/backendz.h +++ b/backendz.h @@ -1,72 +1,72 @@ -/* - * backendz.h -- Internal interface exported by XBoard backend.c to zippy.c - * $Id: backendz.h,v 2.1 2003/10/27 19:21:00 mann Exp $ - * - * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. - * Enhancements Copyright 1992-95 Free Software Foundation, Inc. - * - * The following terms apply to Digital Equipment Corporation's copyright - * interest in XBoard: - * ------------------------------------------------------------------------ - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of Digital not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING - * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL - * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR - * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * ------------------------------------------------------------------------ - * - * The following terms apply to the enhanced version of XBoard distributed - * by the Free Software Foundation: - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * ------------------------------------------------------------------------ - */ - -#ifndef _BACKENDZ -#define _BACKENDZ - -#include "common.h" -#include "frontend.h" - -extern long whiteTimeRemaining, blackTimeRemaining; -extern int forwardMostMove; -extern char star_match[STAR_MATCH_N][MSG_SIZ]; -extern ProcRef firstProgramPR; -extern int startedFromSetupPosition; -extern int firstMove; -extern GameInfo gameInfo; -extern void SendToICS P((char *s)); -extern int looking_at P((char *, int *, char *)); -extern void SendToProgram P((char *message, ChessProgramState *cps)); -extern void SendBoard P((ChessProgramState *cps, int moveNum)); -void SendTimeRemaining P((ChessProgramState *cps, - int/*boolean*/ machineWhite)); - -extern char ics_handle[]; -extern char *ics_prefix; - -#endif +/* + * backendz.h -- Internal interface exported by XBoard backend.c to zippy.c + * $Id: backendz.h,v 2.1 2003/10/27 19:21:00 mann Exp $ + * + * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. + * Enhancements Copyright 1992-95 Free Software Foundation, Inc. + * + * The following terms apply to Digital Equipment Corporation's copyright + * interest in XBoard: + * ------------------------------------------------------------------------ + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * ------------------------------------------------------------------------ + * + * The following terms apply to the enhanced version of XBoard distributed + * by the Free Software Foundation: + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * ------------------------------------------------------------------------ + */ + +#ifndef _BACKENDZ +#define _BACKENDZ + +#include "common.h" +#include "frontend.h" + +extern long whiteTimeRemaining, blackTimeRemaining; +extern int forwardMostMove; +extern char star_match[STAR_MATCH_N][MSG_SIZ]; +extern ProcRef firstProgramPR; +extern int startedFromSetupPosition; +extern int firstMove; +extern GameInfo gameInfo; +extern void SendToICS P((char *s)); +extern int looking_at P((char *, int *, char *)); +extern void SendToProgram P((char *message, ChessProgramState *cps)); +extern void SendBoard P((ChessProgramState *cps, int moveNum)); +void SendTimeRemaining P((ChessProgramState *cps, + int/*boolean*/ machineWhite)); + +extern char ics_handle[]; +extern char *ics_prefix; + +#endif diff --git a/bitmaps/Thumbs.db b/bitmaps/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..401e1e8a556227070fbf08f7bd79d6e9b2ea77ec GIT binary patch literal 1139200 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

mZvf6{qDj2H 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 literal 0 HcmV?d00001 diff --git a/bitmaps/a33o.bmp b/bitmaps/a33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fcd67401f06df12355326e79ddc814dc339ad90f GIT binary patch literal 326 zcmZ9HK?(vf3`IK(qTnG0cb-DQg*%TV^(H-vN6;HMJC_w)6lt7q(?40*!p|e=PeKl- zW9RDImAEb1%<3FJRt4uZRgH51;EHf5xiJAr^H)DEl~F>jgs-$ZB(QJn$;X$xeaQQQ tjG1hG*NJrxuk!^yDBti;Wt8D>uhq?m{Z#v4`%>b(97!3-=03Z#EZ!!P? literal 0 HcmV?d00001 diff --git a/bitmaps/a33w.bmp b/bitmaps/a33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..19598b4ee37040cecaaa4ae456673bd36c5cd670 GIT binary patch literal 326 zcmZvXu?@p83iIN^EeDd}gbRc#kRPd5637-SA{aV>@OKJ1{*gN@iRL9r>F4pAhfq0o?ZmWG))W Y9#p7!58gw%N4!8h6%wcK&;Kyz4`VE)Q~&?~ literal 0 HcmV?d00001 diff --git a/bitmaps/a37s.bmp b/bitmaps/a37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ef1b22208dfb2af9f9e7219a4722d07201cb42c2 GIT binary patch literal 358 zcmZ9IJq`jP6oiLtY2g*NG1((*VKlM#8eUN$s(<$J5kFh*Q--kI=F t|Bs&EaH#nLbd|0owe3arOPCi1%4h}&oL`j?9KX(d(4cvX? zuDyh;H@iY~mCVbZD8w2oGMiY~mzDttgIWHJEPK`;Qp%iqTo7r8fR^^+WI=($=l`3T zq|$kJoYfAk`jn{};ne|++T&<-*{XpDGjgBr`>iJz dP;t-cJ+du2^@XdNP^&1Nd4f6q9{HKZ`frcMw|D>m literal 0 HcmV?d00001 diff --git a/bitmaps/a40s.bmp b/bitmaps/a40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d2a67d60fcc230fa17a362b5d3a007a9fc1c437c GIT binary patch literal 382 zcmZvY%?*M;5QX1{10)_eSioMb0*rTSuoIyJThdNQEC7xqAj9*Gn`mT{nQ!OK-)2we zYk*EgfB3QhPaKK;&dn>`n;B^I_~S&mr#_%UPIf4eDTd;i_ee8qKmAYVf?D$i&| M=k|ZRziBJK0_&ZH=l}o! literal 0 HcmV?d00001 diff --git a/bitmaps/a40w.bmp b/bitmaps/a40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..668ec31016dd8e93c48f4e217d470b80e9ace0fe GIT binary patch literal 382 zcmZ{gK?;LV3`FPS!a^4=dH}aQg_iDnCG}|SO#~01OQB*qCJt0eg~|Jw-f>r#=2#CdcTsZiZOU#N}cb0@p| zqVw}bru%B6$|~4_H}e55Xwe5pS*jR=juU?Fqm^iuH*m)11(10Yprn@Ddpc0}W6K_? vNQ*pHweR`da?Y6%4MoN;_m)87?P0@vooRx|3YF*fIiAz`=KqNuH2=>xm`?eE literal 0 HcmV?d00001 diff --git a/bitmaps/a45s.bmp b/bitmaps/a45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b6f36ae3589b8eb0db4a3f8ee51a68a7a5601236 GIT binary patch literal 422 zcma)&yA8rH6h*IzPzs8Skd}s?3QP3agAr&@G7WQN6pvtuf*>V+yibhc4olZZ?`L28 z+C3d~U3fpTPOBWOaAQ0UCT(0dA_9wO!jCTw(;WzCN1TPtAdJ`noKHMkP0~NMHuvt0 zsFhONYQbLPnLb81WkOYOp{1xtpqFz-pcV4HHFIVkjyZ{+4YR)pAH-*lb6?_q^*sO$ c&rtxpFf03^q0t-#Z;b2v%72n?v-*Gh0`qmZ>Hq)$ literal 0 HcmV?d00001 diff --git a/bitmaps/a45w.bmp b/bitmaps/a45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b84946449ee9e7a57eed60e851c91c69d9cf9a3 GIT binary patch literal 422 zcma)&u?@o@5Jf+6;UWbi(56YBDwfh`508*0GSg%ZMqva?Xb%OK7(MYk7FppML@}!&lg)-(t6^h${AK{n01PA>5o#zgt@VDFtYdz%i_S^hifuQdF_Pt%H?uKK zN-RHro*&PQU$;*W;_HRyhI+oKlg|BL#QSQIJ8lO6p={}bd)72S(}xz3DAH>l(mD=r z`s;5dy#PPJS!XXWS{{^n@cd|X*Kw(DcdAJ597K}YJIu}linIBZl`Q^=;yfZdCoH|c zrE|Nn#ao?#8u`Akdr!`sb0kM{CVR3(We(>L%HHHb*+U|Z_CInm(m(yhYoJ|&Vo&Cz kIPq5}*2@X>DPy)dcbj8mJF_o1J9B(=RtZjvxrqPs3bWvYYybcN literal 0 HcmV?d00001 diff --git a/bitmaps/a58s.bmp b/bitmaps/a58s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e42ddedb6bdde2aca7b23c02b69ccacdd82648eb GIT binary patch literal 526 zcmbu5F%H5o3`KwF&;dk`(3LYV5Q&{5q4WkEfvflcNN|L1tR0I~)qJ~6C1Avo^AhLR z`R?(wUBTnPb;sP#84$ewAkOP4y)ZAT3Z{ij_~n=ym2{N>h(IMhumMUVqm<5BEToQ6 zi8`b8MV$KIrgsKZer|wd?|t*4gV*mmxK2Qm)Md5^etzofgZV!910C}_GgOfseHWyd zf70iOGCFIUk9D7q5}z;A=gs$7Pur{~(U$!K``HgENeWPt%Um-1@A$mcd&-O>WyU4B I_5ELb1Jds)NB{r; literal 0 HcmV?d00001 diff --git a/bitmaps/a58w.bmp b/bitmaps/a58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6827e85162865604666d91313062c597c3754fdb GIT binary patch literal 526 zcmbu4u?@m75JkU9kphHANXrZqSfXbnlx)H(Hv%JMgp?_wnEx+vkU&(N^!=Rk*X928 zcHF`1!t+F(R|N#`KZ*N(kvG;O=L||^3%)tGUAFdN6Oe#tBX9s}kyYE^tTxieik6*8 zbCH($x>FOPvjbXv|Dplz`(%&c{ZAHOnFnsn`C2HFTC^gK1Sufd>}-^e<@v~WzLK-N m7r)kK0LwiQI8Vl!l%XNFT(;&I_ zyNYD_@#%PD&5n%s^oQL$>zL7~-`#G$5nBXc^uH}huBc%N-g_!${bCl&5-un2qXQm* zu(ButlQS?4RW)V_qYc?Qk@Ktw@mK|#R)X_+EH^vuB+pAA?Ei2)daRMbIff`oG1`STDOIxN}u_WRGi z-|fqpxs{9?`gZhSfhQX8*URLokRkx1|F)>>0YlLg{i2UgvqfW85kpPv&8=t?u5v!4 zJfhYih~#`$1iDMY+NLda8>>Q9NRd2@p2Ij z^u;1T0Z!nHv+*Q7b8uf`P@D8guj?dA^VGeb`;huRJek+$R2)3cf9uS9iK&GayiE literal 0 HcmV?d00001 diff --git a/bitmaps/a64w.bmp b/bitmaps/a64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a7fe420c2c6cade5922d3b4c8ef48532eb2599b5 GIT binary patch literal 574 zcmcIgF%H5o40K@Vz|esQWaSktV&_fC(|Agr(6IxmxwB&=D#3;&`y8L+oO8QR2Qixv zFYs&kBncS|{Q2bW1&^vK@ZVNQZ@T4{*I_MBk)esqz*K>&nB~QBjPvH_qLoSFkjIfx zbr~J2RTVd_&@h?A9)sT_UdrtMhS4AMs>?88MHLI!0JNEa2N4P@F=^ lQ?Fx7CYTd*?ZOP5wSPnFdxmZ_kmiepsQq8w|768~g%^G1JwgBg literal 0 HcmV?d00001 diff --git a/bitmaps/as33o.bmp b/bitmaps/as33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bae55ffd2f2946ca439143ccb2463f4aaf7bcf12 GIT binary patch literal 326 zcmZ9{y$ZrG5C`xU7hl88r*Lp^^AY+Cjva#3H*$0+X&=L(BoR7vDD4eJ1D5v8KdB%F z?ta_{9N8Zaapd35<*kd&5^)p;>t*hjeiAcBF8Jbl4f6o2q3NLPDh&&z3TP5_hLras zw5d(uyKS#ls7A)tO)3DubrSm(Nie3$+%lL+c(Q1(G#GVIOvR>FydfuoiL gt<)BhAb+Q~Hb>pjSoyx0MsGQL9~rMufB*aM2k7C2Q2+n{ literal 0 HcmV?d00001 diff --git a/bitmaps/as33s.bmp b/bitmaps/as33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7d028dc38fdeffdb0d63977b798dd8f405edff31 GIT binary patch literal 326 zcmZ9{!3u&v5C&kE422FFJ%C1+ZoNTbMV&hIM4Dcrr*g3e=n>XD*wOGJAx``68bk{- zAIuEQ?B=*Z8o{ltRe#6~c?+Gog3H-zQIFCpDSwU)_599ZFfP0s7jh)^E zB9ilDJBh4ZT;5ku)|u}o9;b(>U};=C&&NxYgNMz`z{6~UKYn_7UjuCH{5`J#DAAj| zx*c~M_S})nBMs<%5#+W8$lS_$0?+}+-km$@N7ou&OXMPL<8D88`sB)>nQDIr8{w6E z^}sLgH#0qYeJg~wli$yn%AA_CIBQ<={8h}dDGE~?=a~>g!W#-P35Q8@nL~G)J@+hW hD2#U@6Lp~>$NXxol>ThFsHWlm$mYuZ@Be<+e*n+w_o@H@ literal 0 HcmV?d00001 diff --git a/bitmaps/as45s.bmp b/bitmaps/as45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f9df7c7a3ed5aee4a2246a8967c6032e5e14e1dd GIT binary patch literal 422 zcmZ|Lu}TCn5C-5$HgW;M&2<(+a-EI+7UD*G;U2?BxZ-fLR`(?L8ZLMbl1|ImMTi?` z=B`p)n0)L^27dDJxEH|R9iG=%H>VPC96TY1i(~P{(@|>$tXebt@e|u+0}yNfo;!f) z*}kPq^tK%%dDV^+8nvAQ&Xeh*-vDGcB$ok-fBjgZ^Jov}XqD~Dg8tP)G-%cm0-Bae z(Oz^r?K;%2jX_g%uEYLU@_w6fKZn3MzlC6D*|0^Ou~}<288gs*-0#WBuPqtEt|f&~ ooI^@UISS?xq;A7V8av&Su8%7chQxDBz=~Sfrq1Ml@Atd^17p~%=>Px# literal 0 HcmV?d00001 diff --git a/bitmaps/as45w.bmp b/bitmaps/as45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..359c0618fffca948c152913ccd4cb405c2a1d887 GIT binary patch literal 422 zcmZ{gI}XAy5JbnM2o<5EKyph%p8^p?&pkLo3IyRYoWl|vBpq$&jAUh*wUY*frP=5G zS(EG!H-mV#j4NtA$RIV2#AB8e2ZtacphP@=_+mNKKr7YLmw-Fld$%Ar#kEx~i>o8s zsdWwe9jX>J;Bn~~5SSaXhjke#D4IOxIW+f}Xy6`C&3BX~xdY~8$3n^an*%4${ZRoX z-g{(`V?Opdf6+VlE2RUhvH=PufaGHmeFWrCpMm}otxHV)1HUKb;vn2(N literal 0 HcmV?d00001 diff --git a/bitmaps/as49s.bmp b/bitmaps/as49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..049ad536c82fe0ce01f2b15292c03ebe9f488274 GIT binary patch literal 454 zcmajbF>b^l5Cu^1B0*(SY#q>6X>)7Z);P zOcU!HW`+R;BSX%C%kX5diH>;}4Y|Rrnr9$rUs8=DIgz|4FF>#Nv0>o3Y%H@+3NQ;P zfUnf}C;!&9U(flyQ*wY+Mxax!fa>6`PE?Oq-Ca~Y1=L$f{gv&13TAGtduil!&5g)P J)@PId`~bA&$d3R3 literal 0 HcmV?d00001 diff --git a/bitmaps/as72o.bmp b/bitmaps/as72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fe967e99e4bbba15c530671dd7241e1d121d5e08 GIT binary patch literal 926 zcmbu6v5wR*6h&vWJtNAg($djxF{~vTw&5S>_=(XNDFq!7CC&O<&?328{{m9by4~Pn z9qGxJ``&mcX>jDsnVaYH?BwnHyQ__j8{S`W-uAiOY%Tx5=RaPYrv?26V8eMH%r1z3 za2u?ude+EjOh_5A3_ZI_cEK6x^R5>`y-Gh%fGeDRt?sCO4ueP`7V zomD?|R(^mHW7YGoG4&(MjH%y) zfv$C#?>u!*{MNa1;I}TFxlUiM)zg=xGy7!j#B%m8e|aGFocomv^Bm3hyn+YZ+FJeq SpE_TWIn;R>|I5CM==lSN5*XV6 literal 0 HcmV?d00001 diff --git a/bitmaps/as72s.bmp b/bitmaps/as72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d1dcc7fdcb0405db86c5f6d64c29bfb1ab295c2b GIT binary patch literal 926 zcmb`EJ#O4E5Jo>P4Jm~XrBo^fNR!Swz{0yoV>iBoa*x2GVZdidWnYCxT>21#PrxFD z0tgy^9L^?Psz{*rVRrQ9M_;cWJoLKY^9#?F9S5iJk^euxFGmCR5E1Z{i?I{RKX~gk zYnhm{w(^sAI*^xIZh6l=IeB^^u_e!L!wsfTXU2*>4k-Mce4(63`Of(ZI_7uCo)sVH zdB-<^4WFEZGfZT`(M#O%mmESZvvbN%XeHrJ`4u1K2QHO=VUPyr$_vJu3cYed+zRVGg{9F^46xv>@<<3{~g%oqP+<#+k>W&7by`^&CKRs0S-6XFXq0rhbpXSii3^ zi=r`RE=?t$j_3<#_v~&po@*u)-m#Yjmd_s7KRj`UQ(QQdF=v%v%pFKH=5F$(yDj)X F`3=c-Unl?o literal 0 HcmV?d00001 diff --git a/bitmaps/as72w.bmp b/bitmaps/as72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ad07b7e6eb647c2e35d189d771933fcfeb6efcb0 GIT binary patch literal 926 zcmb`FF;2xW42E5GC=+GumX$+1y-G}P;SL-Gk#G^t5(y5HBXsOg)%?GmlrAvg%GRep zjuSh5dj9Ce?27mZzg6#~GyMhYU-#}N)S#*YcZ1eY|KL4X)*6wsjrxginZfIz@Aygp zFFopt<`G=FUEU<7fh?O`WESUF@YQ$$@nilf6Y?ivoei#V*55@sO(M~?UbC-38?<1J zdKT(99ZZdD#@xRmLq_ZiYwlw~9F~ZvftAKp$;#6(cw^pZuFM<7%I6&0TlIpRp>hWIl@qwD z4CFBk-f%SbhG%1MI2e1AKDWZHb0V8TTvu+1R^wV_wxQ)@brmABeG~C7EfB73xhd{Rg literal 0 HcmV?d00001 diff --git a/bitmaps/bas.gif b/bitmaps/bas.gif new file mode 100644 index 0000000000000000000000000000000000000000..7376f7e088fa1cf0324c307088980a0121d39a5d GIT binary patch literal 308 zcmZ?wbhEHbG-NPj*v!Dd!o>3D-=9BBEDXc}#h)yU3=B*RIw0jBGniQ(2AuF*z1QOP z+1>vWH2P8^nKHWiR=wJ)$FcnVo@-|Fip}nR-FHSu;PJ{114SOmJ38sp6F+^QDXad*Oulzkn0 zcg|kBG5w%^R*S^3$*ITl{Pu;^H+UUR*?i-~+<4pTp3CN2-`zDe@=4RK-J9Ord3W=} dk+*BleEIOL;{DT!fB*ewVCIsE&|qS)1^_c%fW80# literal 0 HcmV?d00001 diff --git a/bitmaps/bcv.gif b/bitmaps/bcv.gif new file mode 100644 index 0000000000000000000000000000000000000000..6576cf829e469ae7a1f9015cdb37f5524fbb383e GIT binary patch literal 295 zcmV+?0oeXWNk%w1VKD$P0J8u91Of#7{`~v`1OWd407n1-Yybep0093008IdZaRC0y z0KfkL089V?Z~y?x00930A^8LW00062EC2ui05JeD00RWnP{>KEy*TTw0k9t@jvnQO zV~U+2tG?hVuqZ6jxNP5E;M2Zw)}0=zukQ^S#fwTetd*xXDNq>i6>Qtk8@FGB`S4lF-$a) zfSWFTpOsc5lY<~^r>J6Mf_ts5dzWI3g=nj{aJj6zfwi-tXu+jyLC46+K{a&5#fHwE tdC`uH%GcP)%skZ9+}*;A;L@1YYo{>hui@*@8|v`h9P#AnvG)`a06S)9heiMZ literal 0 HcmV?d00001 diff --git a/bitmaps/bitmaps.h b/bitmaps/bitmaps.h index e3128bd..86a0c08 100644 --- a/bitmaps/bitmaps.h +++ b/bitmaps/bitmaps.h @@ -1,6 +1,6 @@ /* * bitmaps.h - Include bitmap files for pieces and icons - * $Id$ + * $Id: bitmaps.h,v 2.1 2003/10/27 19:21:01 mann Exp $ * * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. * Enhancements Copyright 1992-95 Free Software Foundation, Inc. diff --git a/bitmaps/c33o.bmp b/bitmaps/c33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d2fb0ff07cde1c735b33b93f40aac5071ec686a4 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIQ_34!vDJ;l|~o; zeIG3U`TP6xApLLnKbV8)w}0%ngXqtn&x6JPet*9o#Q*#LJDC3W{(C)$|L^{9F#SLN p*MDR_Odh5lrXOY=%zT)AF#G>Q-SZ#jZglsei~s)*wiif&X#jxxiL3ws literal 0 HcmV?d00001 diff --git a/bitmaps/c33s.bmp b/bitmaps/c33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..895e0a8332d70181bbe5ee85a8d6d097ada7b24f GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIQ_34!vDJ;m4=D` zv4@ENkO$MBKk%Oi>3_q(U=F644}j?pJO=zA{vQqjdoV4)0jB>6aMXkN{}foj^nV4G r|Hyop{2!=#n0}afZ=mMG?1S0=AL^d}F!#aSi_0JX|AXxXQeYYYn*wWF literal 0 HcmV?d00001 diff --git a/bitmaps/c33w.bmp b/bitmaps/c33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..057bca0f7c2e0eb20360008fcb7653ad0f878c94 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIQ_34!vABBN~4Sa zkO#|u{=k18r2hc}13NPPfq{V^#Q(#KU@nQ6Tpw-BHm^ivVn0XJ-?19<; XAL^d}Fn6Q77hN3aVUWE*3QPk4f6rxY literal 0 HcmV?d00001 diff --git a/bitmaps/c37o.bmp b/bitmaps/c37o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..882afe0543787102c3c1354af2389e7baa5d4ab7 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z<>_2qpgi|IYx#|9=4a|Nr+x>2e%2n*6`t zV0DlG{r+bG)PMKy-@iA2^d07Zj3D~%e|9kc@t>by`MKbJqjNxkFF199?X20eQ^7s?t!`QKh(Yd|HJ%;<{!8?x;!L&00h6KzW@LL literal 0 HcmV?d00001 diff --git a/bitmaps/c37s.bmp b/bitmaps/c37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6f3b87b141ef26c39f45e33b0cc58360091ecbda GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z<>_2qpgi|IYx#|9=4a|Nr+x>2e%2Or9Mg z|Bo3=KmN!3&jP6b?jOd#H-PjV1_nk5{R2!tU}j?g$^T(tWc&f7|8X!hBh&u{7~Da8 rI6Z;EAB7Kji6I~jiC literal 0 HcmV?d00001 diff --git a/bitmaps/c37w.bmp b/bitmaps/c37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f7e076d6288c30b86f905b1cb3dd25f6150178af GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z<>_2qpgi|IYx#|9=4a|Nr+xX?7emn*2Xz zu)4?pnEzP-^&kAh_(uXr9{^%x`T>v+lK;cN!1x15|6^caMyCHWFtCI8aJqqkAB7K< pN7n~4?*UM+1rQ$qVhJP~<{p^){zKjS|3A!sX#RnVqsv3W2LM(*aajNW literal 0 HcmV?d00001 diff --git a/bitmaps/c40o.bmp b/bitmaps/c40o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b5677fc3e7435c3bd2ea3c4df0e30cc258994c89 GIT binary patch literal 382 zcmZ{gF%E+;3`Nb{u?OhdQ&bgukAx%6g`me^KujGOI>MA+=O?ZZY9rZC$+!IN)DNwM z=Vtl3i%PO^H=Iv7a%Ii{#KN-d_$v4L4_#k=>Kg`Jtlt`*`c9M}WI#;Z&{B`kNMA)m zHt5L?9XVknmoKOCK9{ zy~bUo084a=Wn(g@MG=8YBPu@1{r-cVcV3Inm?cT8_1=AouaT;n84+Xtg8}RtFpvuz v$O|^)4O{X#(cjm_w<6Ez$bi&q-K=$6_KmZ?K8MdIGM`(-_i_H)-~R0j2G*8K literal 0 HcmV?d00001 diff --git a/bitmaps/c40w.bmp b/bitmaps/c40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a0b8d15a6fd6a3d3ac47dd114be69d09977da5ff GIT binary patch literal 382 zcmZ{gF%E+;5CqRkL6IUw9ze@0P(;s{z)yppAn^f8s%#b?i)^GI?TyxZKHGHt5G;Ky zYm+IM2Or}7ba|&&07kJ|#`W~`A1W8iz8w)Y=WSygUI(e1JN=P=sdTPcC>ZUL{A5+) ha#8EvAJ6?F=Z%!+-_MoT{ebe`fZikCb9v?d-+r`5i`@VK literal 0 HcmV?d00001 diff --git a/bitmaps/c45o.bmp b/bitmaps/c45o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..971b7d06d509bd5c4e81f0c2820707e1901117cc GIT binary patch literal 422 zcmZ9I!41MN3`JdWWDzc`z=1n^Faj6IDBPHV3v>h~K$!sAo)W1oA3Mnxw2_>rpYOzW zw!2FuX>D|0X{<|Bl8wFMxXh6f%LYI+fGB^AMF*G9=bZaZo%2ZVO?U8qIEcJaH~m#9 zu3Z?>I@28dJ!RIQe;E8<>2& zyh&yz>&+#BUrXI*8uJ(lg0WK^CLw%c+(ZN#A|3wNMg2U6^C9WC(XY#pM^?t^hg9ah z2O6=(>#Ee6nP*`gTP(Iv|AW;u>$E=Xc;uKM_dFploIWGVij(NsgAr&DHw|-Sl#Fn6DG=uSk}oBRWIuiXD7JIG zy$5XP!hB?$N({)xop>H{Y!^#1Gce2&DyE{>SFZQ${W#})VwhZiEKJ`A5N#RLne?6& zSJ(7^#4fQvxv#kZqiZn$lj{h~PHFif+IRH6`bGNn9GXw_8s~2J(O&w8et*?P`R%{{ E0a)v_xc~qF literal 0 HcmV?d00001 diff --git a/bitmaps/c49s.bmp b/bitmaps/c49s.bmp index 29b6d36045bc44e268eef5370a122b5ca47b01ac..bac2d9461060f6cda8a494cbe41081eb2964d7e0 100644 GIT binary patch delta 149 zcmX@ce2jTQ0@vUB|Nl2I{Qv*={=_UBo8S8%F#o;Z!0@|)fq@Z;{=>k0fWaQ9u0h6v z5v2Zr0tz!r2jC;Sb((sZeTuuY#hY+$uW#BNcK-& H#V7*+)-yp_ delta 149 zcmX@ce2jTQ0@ok;|Nk2p{{R0YKQYV3=7;?Q=0EZc3_lzg7??nG0|Nsikp9EKe1O3o zsIGy>fbl<&K48EDp&gi*LHq{}OcNiOvOHv9=$|ajD68VY1d{&4V88>?_LBjqO&(+% W^8v823_u`1Ifl^%$^OZ!7-aw_&^QMG diff --git a/bitmaps/c54o.bmp b/bitmaps/c54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6a597dbecb416561d2d3e933d28a965c0fedfc7a GIT binary patch literal 494 zcma)(u?hk)42CN=I5_wM!mX|@PGZ5$!S~TY&dt#m5c&!}f}3L>qCz*RcZ&z%;-6~^ zhm(c$BWarcNjJOKNcC%teGXeD8>x731CEnuePY^}S;4SqNSpj3vRfn`ewgDakGAog zK9L_161P+lsi2!qhm~?=!`jW1KaKe`zJk;99dso$ARctsOCA}=WkAe6_~M0@tx4hqrp~lErefJpi90-p2RKgn*j~#NRd9^ zrI$n>=*ZeR*vg`^CAtOK6?io?F}(}V!ValNTEHT^8I*8Mffnpzwm40NE3Aa=5qUPE zZILgSTZ4H;_DacX(P`dNCw0UBMIYI)uk>qp4(Y&iC-kd6qA&V%>Nog~bI4pZ=ZbU2 Vxkq=Q_wrHtKkqf_e0-1aPG60Q0Y(4- literal 0 HcmV?d00001 diff --git a/bitmaps/c54w.bmp b/bitmaps/c54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..61caf6dc668c901747764947eefb93a9cc63891d GIT binary patch literal 494 zcma)(F$%*l3`J#H=+L1TC}iykI)xg#=SU?vQjd@u^a?&f@t8qW{gNdJWM~cY%eQ}o zB;SX3B3n1?7sS;gQM-5ok7Eln`X(ZTz~VJuu6K=}^n>nW_h~MT#mL~uOf^@^wWrd7 zQ}yURJuiMfgX#}X(3;Q5khDj=NBu6)q^3)Q-P9RL6T literal 0 HcmV?d00001 diff --git a/bitmaps/c58s.bmp b/bitmaps/c58s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0bb3cf90b6fcbb813adcb0f6c86a59cd52aa0456 GIT binary patch literal 526 zcma)(u?@m75Ji8mL<*!#5Q&zOGNK?7Jv*>NYLs-8EWj|A4HzLEtxF1&{PTZCBDEQGpYWw53Fmp+GI#udJS{#D2K_)ur>rN7?w-+$nDsk{MN CxGcH= literal 0 HcmV?d00001 diff --git a/bitmaps/c58w.bmp b/bitmaps/c58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..41f05cfbeef3c911458fbb9caf170bc484ff9534 GIT binary patch literal 526 zcma)(K@I{T3`L8xU}2(1aO)XdIEj0YG=Zbl8+Zhcz|w`8`YAL{h$NDf$1kPOa=RaP zq~nVD47)UQWB%-)^ICH)`EP#!BY(SM literal 0 HcmV?d00001 diff --git a/bitmaps/c64s.bmp b/bitmaps/c64s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6dac16f7c4b3e9846b1d0911945179db079f7a61 GIT binary patch literal 574 zcmbV}!EM7Z3`M^ppf1p&EznDDyyn;m;-L5L&=ER7foKD-qz$}+MzE0!4~ErGGe#2x zy_7KdY)T^e<@b;M28-<(cl5*A0|MV@Tz`FV_k_n4zu0;7sig@=JUcBgDJ#h#3O`Z1xM5IP0EsY~WVC{5ZNYl$gjRxS}R4tKyO zI}T647pafHo3N3wCGUY3a^3>l<1Hu4b6stp{GK1|{6*bjeb_HsUnX*vsjxy-nW?C$j8t^Kul4>`a_eIM{U1wlFL4`x0PYG`O8@`> literal 0 HcmV?d00001 diff --git a/bitmaps/c64w.bmp b/bitmaps/c64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5c3c8ff16f75950d2ca5ab0cccec4919427fb363 GIT binary patch literal 574 zcmbV}Jr2V#2!%;HWayBg2Vm_flBj#nlpHNb$q_tys7xOaRLNF56bU~60QR#VP~ z3GohJPVcD02!{RJ)!i37iU`5K*=zQl%+56aW}SBoo*&#Vn4{^|AtD*fjHX1A#^hIO zn0=kgqJw^wLy68oE5yx$R=_w&^X3nW&R3C|kr#Er=odV+9_Q{#C<$&lhav?Iv~nW0 lGNMKg^g?$UGYj4$bAh5k5TWRNulk*lYWDAcSaWaD#y1|(I3)l8 literal 0 HcmV?d00001 diff --git a/bitmaps/c72s.bmp b/bitmaps/c72s.bmp index e34f6986687f6f28d02a8a99671088a6d35be86c..963afdf94a0ba9f1e7b009ff9855e5b94f01ba8b 100644 GIT binary patch delta 257 zcmbQoK97Auovp=xAYfo%0FwV|h+reB|IavacZsvb{|5~Ge+ofn{Hp;H3=BWKPco>VfJQ{~usr-dx1U&gjel(gwmnAOlpw@DHdI2<*UYh|yTs|35JB|A(rdyoV`? bv0<`2v$&L9J=|aaQQ4Cfn8hZiF&I(W=klKQJAn^~V6bK%G*-C3sq diff --git a/bitmaps/cv33o.bmp b/bitmaps/cv33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eba036eb0b9285cf92d6bcc31a376a5b8de22004 GIT binary patch literal 326 zcmZ|KF$%&!5CzZ)77;vzSO}iNfQ43`#dIk|#v6D9Yp)UXv0f%5YaaGl$i$M6UJL`fkwyk>13)3zhu&M~Img}%*X(d-~dv!+z<>_2qpgi|IYx#{~LgO82!V-!XCtj(+ms{ zK9v6X|38@jhk>CUr0yS3D~SGI{})XEV_-z34?y_`m?7dY+JW63tlxp3AFMw?jvYeV zh=XYb19J$?0FmDSr6)MZgT*H>KuzP#l z6Ra-M8&Mrf@IfVb?Oe7PjU+_u#TSlUm(?!>+^_H_QQe=Aj59Xj*SL*&;XZr*cv8+d mADqu%8-&e?g;(8UkHT#J?f3HQcX13(ejhnVMF0H+{r^9CKwQlL literal 0 HcmV?d00001 diff --git a/bitmaps/cv37o.bmp b/bitmaps/cv37o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9075dd60473665bdec652c6b7cdbf4554dd1f5ac GIT binary patch literal 358 zcmZ9|F$%&k6b9gQ5^-?w3_=ef7Ti69n^zF0;7NJ{@dVPr19WiKxD{N2IHXdV-M7-P!L39v+f`z;Ana+Vo|S_hq=8OTix+JZ5rmR^$hB2BT72@KfM@^5`a1z){wG61 z3t3wp(iPPF>x}&zqB_$bH2V#`M02`}8+6}-3P(@oxy||HsB_8)l^LrGd-G-6i43 z>3j*Wb=1Am*fRpWQ7N01haKc5BG8bm`D{L2*@;zlzrbEokih vUTobI+#TK0bz$`evo@DBKA&_**1vx&Eq`&o%=rc?kJ|e3r0<*O-~TcKMdWYf literal 0 HcmV?d00001 diff --git a/bitmaps/cv40o.bmp b/bitmaps/cv40o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7fe8326d06ac87bbb3e149cab17611d7cac87cbc GIT binary patch literal 382 zcmZ9|KMKMy6bA4VM~4pXcJ&k@?w-X}5R7<%j*cF|3kY>{>?b_9#L&A~o{a=47NqZZJ<|-<&VDkpBI+&Y-@rsh04=^U$M&FKx-6?<{q}xg=Q8 anX_rW13Mt8frJ?uAQBEhN|+mhAu1u{|Ns9PfEY+J!0A8y%m+Yx3>u^cB#uV^ z`~UwhSU&>;Gnj5*U0ti90}%KAw}80!{{e_Q|NrO* Q%m4oY761Dl!bc4+06BGvTmS$7 literal 0 HcmV?d00001 diff --git a/bitmaps/cv40w.bmp b/bitmaps/cv40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cc195bb46d7d73aeff02ed2b71d7d59cc87c3b22 GIT binary patch literal 382 zcmZ{g!41MN3`HHKQVtw?V1Qnk0uXmrYP|s~Wdl~|2J~2@f^qyE1Vu!$pKSjmUp}4t zKz8<;cOMZ5gQH@*K|qNtBBY_2-dx(4OZ~&5Dg8gxS+sYUlCw1ut=W11u;Sn~{7{&z z<}eQBPmUQ(Y|M$k#(YVJKN%@V(N|9Ht8#XKi}UIJgyB=>i`|#|6@1*l?>*JMy#O-# Be)#|Z literal 0 HcmV?d00001 diff --git a/bitmaps/cv45o.bmp b/bitmaps/cv45o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..55b4087ed85636d029291c529a0fc496f54e829a GIT binary patch literal 422 zcmZY5I|>3Z5C-5Z7Iq#%TN|&SptUy;EEPP0NW95*9>etpHny5F_l2 zP|11nuM;Vm&9?^Ro6tI<8fzKwKNiHH?@I=CK}4WJETFLrv%*sUC+(5^SK6M^d`)@G z=a32OsMsS`Vg^Rst9fG}c@7^#?IYFh_?#SUz!ne>y(`0>VcBLcaP4_B$xCoDe+LLT we;Dr#AmaX|KGn*Zl=IRBmaV5P5eNQWxNgOq;M1& literal 0 HcmV?d00001 diff --git a/bitmaps/cv45w.bmp b/bitmaps/cv45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..250984d65609dce5bab3bbedee38272c0b2456b4 GIT binary patch literal 422 zcmZ|Lu?fR45CzZ^E}SY}AfPr)RR zHTMmTLpeW6tlT!ZPx_$Q%#x^Be-^1r|L1R0_Q=ZF=h8(C5=$Qj>C8m4&xH$mtLuTD J=s;KR`UB8os8Ij_ literal 0 HcmV?d00001 diff --git a/bitmaps/cv49o.bmp b/bitmaps/cv49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..95fd748f4fee0c7e0ad639cf81adf47d38c32f0e GIT binary patch literal 454 zcmZwDv2MaJ5C&jpV&ef=y0S7OwNm#!Lmz<`D44Mu56~fxQFW;^R9zUlB4zNHAw!Tr z3Wy{>|D9bWLRdL}x;xuR{QUBp7#)wCr;J&Q#DvB>`5A}Mg>eF47#wTUjIy^8ZEL@* z@40_Sw9eH-8=fWmI@T)+3wY6i56z6Rq6b?8Z|iC7_wq=tPw{UX^UEciQy(q+f2c~Q z`rHTItNOhPesyAnPdHj&6Lqkf2M@3vnA27~_m+}3z&83Jb{2CHPkJBVhswQxFIcFj ViC3}HdjaxLN3jX@BGw`Qbp`1U9HsyO literal 0 HcmV?d00001 diff --git a/bitmaps/cv49s.bmp b/bitmaps/cv49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5fc24b9be38d0fc8d33299d9156331d46bc5d27a GIT binary patch literal 454 zcmaLTJq`gu6bJDCWD6aI1FTX>w6a9+6b@n&jgA{Q3bCSc0EJ=`1%-r&h(vha7ZHU? z-u&`DCX<;?cNw57;l0XH_Xx1YkXaNhbkH{<0tc@Y&nQo#fASga|H`NDe2%zY5L2Ke z&VX1v5>3S%Xnp&xZ@j(+`qKZBJa>Z|>3ug8PJN!=qm;MIMa&)$rxP=nP4$8rWbTTJ z%NKHfMq9n}1Bi1rh>!GRS@P!$4YiG)NEKx2*xpSmcRLtq{buhcn(KcMW$w=Uv^(mY G{r?NlInU1k literal 0 HcmV?d00001 diff --git a/bitmaps/cv49w.bmp b/bitmaps/cv49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cbf8e92b9551bc3207788d2f71265b73fc40f964 GIT binary patch literal 454 zcma*ju?oU45C-5sbjW5OA*-WqPA$0mMnXHf`APxB=g8Jk2M58@^UqztIw%G%AGutP zB-`D^K}W-R$yk?gu#E#bFD$gMOd8Wc=4+l88nQjmW+Tx3BkQ$p zrj$NKSFE1a&)+-kU#C_LF_^vCz}%<_E9ANaUaZ*7yfH6aQ;M=Ro8LMl%hWh;ww|xc zspQeKojc8=4j5#7RQ8q}g#|ir{~TC}4?z7xpN-j*OjB_NH2*APuA)WsHkt)_w66Dq z_=4VBb={}xS9_|yzb(`zzosiZ*-N^_+%@VwO0`BsJ6EDm3uIzez)_zS@?Khfi-ScA n%7?zHIp*pNy~+!zoxM`AdldYf1lz}8Uq?5=KmTRJ1b+VoZ=gUq literal 0 HcmV?d00001 diff --git a/bitmaps/cv54s.bmp b/bitmaps/cv54s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9c5bd8bc1faba4e728e0f3853b3990aa233b6140 GIT binary patch literal 494 zcmZ|MJ!%3$6bJDCYH$Swi!^rIrVI!nm16qbA-RDbKwR(=DRPJ$VY_rW!-9pKxY(>@ z+<)H3ESLlb-u!s;=3^iG^t?}CV=D8V#6ye(Uic7J0}tC6Cz6nm5&nxhEoQQQRk_6K zf6T~6*IRR`uO%-;iY1V!6}eSU7~b*UpUgbz`qus7+{D81 z{eTQH}V3K!`4w^fd_MxGCQ`kFiSPLKQNGq4aV zpyuAF$(}9Lm}Yc|5V?Z-5a|kjRphgJ!3SIiBUt0h!m6LFpssl#!3G}NtV5{&&}bcJ z)bFf5^qe^i(oF3TvvX{n=DZ;P6L^8*z>8}hFW-6_^O(ExGGxS`uO&_#E>ojhgHef<_6Df;5(j)!431y?QhyF zWmA?%z7_o>elb6WN(lEMDv0g|Ocix@0~&#&z+N=TJ{pB_nms>2gP7l?H42Z5cSIK! zKN8K&C9%6Et}K4@`6(Wx+Tt<#oHSjvoyFQT!HqsQjA@$l=`gEZ@&3v0;TM%J1v?+( literal 0 HcmV?d00001 diff --git a/bitmaps/cv58w.bmp b/bitmaps/cv58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2f37d5b8c7a2eaba5962012569d10c3792edd52b GIT binary patch literal 526 zcma*kO$x#=5C!1Gh*=1B>#keRAku<+k0kBQ%n>|7j?iTnrQ>@u5nDkpF!`7yo&5BA zJ8Yb`2K@>NZPg#TWe>!trjrz2OJ?vnD+@JZE zzT|I1$z!oviaK@bv|ih{YKIZlpG`lRVWioGY{ulUKD&s6B^lff2cz2}50+#E{>y-z w53rOMjTq-eSN0`O`fh>^`F?_p^j%n}WsVO`982@@XigV%ZcOPOI=}jVF9ga1H2?qr literal 0 HcmV?d00001 diff --git a/bitmaps/cv64o.bmp b/bitmaps/cv64o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..522bb6c3be6fc6d5c01623a5167c3158143c4b6f GIT binary patch literal 574 zcmZ|LJx&8L5Cvd|hJqp&KuSwbMYDtG5ywbPi3B(|prAq&J_(|TM1)f84WNjWw4g1r zD=a_WjBSMYnbqv)8Cza^PfnX1XVLI|z&tKFawCoyoWI)3nH%{Hz%l=hnK*GCs0I;f zSpSmCtY77JN!R^wrr%`0y5M}zTruBE>R5X^7rA__b(P~*>u-iqS0&f_dGsEUd>K6k zZO|_6nw#O!Y`Y^W2FwaTCHr1rpz8hyS%k}SsHu^97*d-H9d$7jSM?ryEda-Lo3|72`= H?Em5uWTmI0 literal 0 HcmV?d00001 diff --git a/bitmaps/cv64s.bmp b/bitmaps/cv64s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1787acd806b36228309aa44c1cbef0ed485cb7b8 GIT binary patch literal 574 zcmaixJx;?w5JtziNI{V{omFZL z^hCVEN4%xKfITeX0N1%z!5DO|jpU7E=G1y@4CI$c+VVDDr#_9>*vo1nhU<}oU^Sea z=Pt4C5kfw+aE9^#_YxBu8DvG=2$LApNSg#V2s7bZSiv_Qy@v0l^M%(B#GllSADLew z8$$gR*&2UD9*q+pXpH#+9GEVmw|)_QEs>2KyXV9)$zj`>EbMS_p1e=L|2$q={{h;W BQ-A;f literal 0 HcmV?d00001 diff --git a/bitmaps/cv64w.bmp b/bitmaps/cv64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b3e1bfd8827ccce036fa579b2b22cbe16be3cc23 GIT binary patch literal 574 zcmb7>K@Ng25Jd-BuyElK*m??T+HI^Nbe#xdJtg%rZ_GUn(8WYUxEV13%iic(_!4oA@u~*VXEg{<(WuBV8r6BL zVf;qJ4J^@fI&@2Z&K_Np*AJgl2cQ~5@$b;k{*ui}3+bHnMWas)w|mTot}_mU@$ob+ F?Qc}*DpCLd literal 0 HcmV?d00001 diff --git a/bitmaps/cv72o.bmp b/bitmaps/cv72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d72c45dbff36b40b1152767b1334d645920d1670 GIT binary patch literal 926 zcma*kPfEi;6bA5=F1k?6Rzb+tQy6fg8}SN)C-49z-Bm#-UO=x>sSsTC3MmTN2&QC{ z!Z4rTo0*pmV#R?8Kfb*Alb5s0r(xp8DW4~t7hw*Pfy=M?e!S!EKF*9iX z!#2uo5!Ny@k>w2T48xq)@4Z%M?rJ`#OTLhLOV6sbclI$<+kAejHpShhH;#f+bT)r; zIZ|v)aj#xC=-n>xsCk>B^`4^1*(|vO`_urnnl~%G7ocZqb~aPj(k!=j#f5Cp)`fQ? zdF0RFt^gk3Yq}iR50=KM*%W&ia(`?#Ee#vV*3-+kGoJYNev^`WZZKbB-1(7E;`{^NzntlC!cWXh82Z2kQ1F`e|Tr0YV|P>J<)~t!;)ypniD8OE9L9An7fF_Im6@moUx_9KloL) R+)it``k5K;!k&Wr{0rdBp#}f| literal 0 HcmV?d00001 diff --git a/bitmaps/cv72w.bmp b/bitmaps/cv72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..65e7e1de397fbf3c82f9e346b9b8768ed808fcd7 GIT binary patch literal 926 zcmb`_O=`n15Cvch2fQfMN6h#{+NdWT#j*eB^(w97SggSfjcj9=c&$dUq~q_hSN zACuAOFUOD1w$bmvxaT;f;Tos;Gk?Fl+0aA^02&VanA?b-JoT}g9cQxs*OrC1x&P!K zeOlX36nExtu{ST`;SV0GxwTR9JeJ;xtW}#^%lYohyt1Z`z2?O}w%J2)+2d3Uc4aA~ zeobb=EtTiuHdK}ilDU`|AKX>>kbUs0VXo2``iZP><$W@=vUf0jsI450mn8 zFt*bmG5t?;)7c@vwJx0A8er3Yo6APoJVEiYtNdQP`rHSrzixei;a1FNOnVc(>^pLr BeP{px literal 0 HcmV?d00001 diff --git a/bitmaps/dk33o.bmp b/bitmaps/dk33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9b00f94941fb8f9a578373162e6e4bb4b49a7371 GIT binary patch literal 326 zcmb7%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOT=WkH27Zt{oc{m6 zAH@I1z+jI;|Np-q#Q)F0P!Fc}|AUy@z(5*p{|~GmX8xc5|L23u`@_H>k3!4HK=>je lVEX^{um8dJK46B>AJ`%E4}J*!M;=1|vxm_C>!CEn{{T{VY{~!t literal 0 HcmV?d00001 diff --git a/bitmaps/dk33w.bmp b/bitmaps/dk33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c77c3b2ee5ccadc8384614dff828e488a2ccdc63 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOT=WkH27Zt{I{lA< z!5$=zPXA|Ms0WDy4TYFXDh<^SGxrYzgFMJQLiGOwj1c=CFhl4M>=60~KZO1x5263r ML+JnYP#WTY0GxthYXATM literal 0 HcmV?d00001 diff --git a/bitmaps/e33o.bmp b/bitmaps/e33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b7f0aac62b41e5bd68f858f630f04f6d52c239be GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DWN%{Qv(AK>nZS5c>CT2>sm_ zLO0xn(C1|#wBS1ky~_+jZ;yh|D|`Nb2br_(+W*fWdVN^^YcL%#A41Q5523q1-Uf+Z z-~Vqnh`!zbzZygz-v7TAME~!H();Qm{QLj^g2nIu{|Bb83A_6HQRr55XW2Qr*^+H=@AjZFLn2(URopXY`%rp8Y uEwpxFy4v`?;$UjXVKVhHzqZH?@cI98f8)9GK3Z5C-5)wSq^mSnRxmV8Fu8BQ1Ioy-IFiVY$c(Ti7TO1Q*TYH!~AOHZb!s zlSxRH>y;{aEmEGPnC4K0Y>X21Sb_(00#KyDHq}3k;@az2QU3v4NDDZ!1;W1v;6?Qj z=*X*%6Ve*hlWCr9fQIUw_BCnGCEwTOb9Ws}>U*R1B<69$o&vuIHzz)O@ohz4iJ=u; O?hpO$M=f)Me}4dZS%?7u literal 0 HcmV?d00001 diff --git a/bitmaps/f33s.bmp b/bitmaps/f33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6ef112d9b6bb7d70b1bcca77dd1b1ba2dcf1f959 GIT binary patch literal 326 zcmZ9HJqp4=5QX0oC4z+quvo;#I|wdV*m)$;+-wm`i`>AF6gC!$O@uY$&de&3g*P8> zewf+yc4HuK72_gmmSmuXQN(VnlExH>2vKy1{zq@b2f%Xv4&=-V$e125|15za`!ld) zHr_PM%5^g5)BFjTbH4Cd!7Obnb2nhh{^`w?8C)lOX@EU@I_f=CXL1)ka^-8Hd|#Bo QD%+Ir^IPwn_Vxb#0bI0Vl>h($ literal 0 HcmV?d00001 diff --git a/bitmaps/f33w.bmp b/bitmaps/f33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b7f7069dd1ecf77a5a09f9212d6df9665cb291de GIT binary patch literal 326 zcmZ{fF$#o03`PH7p3cN5511oYnaspVobk g?-gLC7n1LhSlFFgY1|v*(f-rxce?L%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIQ>B$!smYoq3i#m z@;69B_~)NPXc&M0Z&Y;!vS9wd|NkJg{}%|o#0x^7S_Y>7uF0+k+5dMfl+MkC@S*gd z*XzLipRd>3gVe$3&)@IQ2l3y2zn>4LpPvWQpKosmi~qm9{Xa%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIQ@ek!f#+er4KMd z_%Qm7G=zWrBdYie9tgkv1B7N^s0W*mgZ?MLVh@u4C(r_+4cbuY!sB56pO44qgVe$3 ppP!$f2k}4re%}tJKR*Z4KOY_ji~oOk_&-Se|L5lr8r`30d;rvbc4Pnm literal 0 HcmV?d00001 diff --git a/bitmaps/g33w.bmp b/bitmaps/g33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0c52cea588075d8021f35973459bc968eabc0d3d GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIQ>B$!e?N_PB$<^ z#1F7TXc!+xqv`txG#X?+F8YrGM?FaXk0O*#%*X(d-~dv!+z<>_2qpgi|IYx#{~LgO4Eg{AGg$oo|IaA& zdng}9e~0paL+B5+5c=J||KCCS-rcW%4x(Sbhti+-gZbb8Lg|0@=Rxwn@9&4u{rAE2 zU-tX+LE?XyA@o1T`}QFIzvTa5`ak=>dJz9V|DXS0y8kDHUYri0H_Jol)%6g14i0}p G{SN>y^n}m= literal 0 HcmV?d00001 diff --git a/bitmaps/h33s.bmp b/bitmaps/h33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..95e5dbeb8b1cd2bb3778a3b564c08566b175392d GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z<>_2qpgi|IYx#{~LgOIDLSD8O%q}(qR4r z22}b3l>Y-lf2d&)2B~{s#~==-w4&E5d!e_(7-2Z?`RV8{p2KNO&JfrCGY z|K|t8eGvWk55s&A{cj%QelR_U(H=zquVAVN(+VvA!Sn@52;Gwop&R6({CWsI2kO6n JX#Pa=Hvm2&WoZBa literal 0 HcmV?d00001 diff --git a/bitmaps/h33w.bmp b/bitmaps/h33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cebb7a33018d5707515fc8569e5c9c3c5e53e289 GIT binary patch literal 326 zcmZ|KF$%*l3y29Cv4`kkdK4eQV}?*wvc8vu7^H_}8LZpm z9#GGy`KobY1o*{Cd7VA#Ad`qdLz31zzvyazYi7S$STAmQx_Lxz?{lOB?NaTRK!L&L hmW?YAt>63slhsWDW~){Ie+smx(S6VE=U`9n{|Cd4Ti*Zx literal 0 HcmV?d00001 diff --git a/bitmaps/l33o.bmp b/bitmaps/l33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..510882b743a66a4257ec88d1bdc919d1030bcaaf GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DOSf|2F{n|NqMqNykIf{d*6g z|9*$izkfsM?|UKi`+eByZ@j4LVCsMGhKR#ysCh8+(P^0d==6W6`!MMJ5cB`T=>JeY Gga!ah!jA6% literal 0 HcmV?d00001 diff --git a/bitmaps/l33s.bmp b/bitmaps/l33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4c1ce81b5d55cde60be3618c7ebeb2d842becc24 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DOSf|2F{n|NqOAM*mw6QUAvs zLjPcf&>t8f^aBU%^v91-b&ja?4`&D;PD9Q6!wwNgr~mOo#L;P-{@4#u{~t!f{0*T2 DGLwQ1 literal 0 HcmV?d00001 diff --git a/bitmaps/l33w.bmp b/bitmaps/l33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fff3ec7fef97ddecfb9fea79b055f98bc61538c7 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DOSf|2F{n|NqOAM*ri7sQ<$b tp?@$#=nsq#`T+xW8YYiU!}O!mF!RxAnEmK9PJir&xaU8NhWQ&p0|4}IetiG{ literal 0 HcmV?d00001 diff --git a/bitmaps/l37o.bmp b/bitmaps/l37o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..473b0f7490279d797baa5fa7a5ca0be17528e113 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z<>_2qpgi|IYx#|9=4a|Nr-sNQXnz|N9N0 z|Ne#0zyCq#@AvD$=DxqbA1nQx9U>1?2cv)AgXl-6VdkULF#FNz|K$*KFzEGAadi4V MR2)Xb!UaMD01vaVvj6}9 literal 0 HcmV?d00001 diff --git a/bitmaps/l37s.bmp b/bitmaps/l37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5709f685225ee9fd3f48889f02d7491ae389eb6d GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z<>_2qpgi|IYx#|9=4a|Nr-sNQXnz|5Jw0 ze;6V34+aSRfuSC3?gIsTtn>#3i2R2iP#Vhrq3|E99-W4nk52z%hNwrU|Fc8HF=$-= Nybo0mqha9!p#gh|pP2vv literal 0 HcmV?d00001 diff --git a/bitmaps/l37w.bmp b/bitmaps/l37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9d27faa57afa894e04445d2a50e4e433cb5c4ec GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z<>_2qpgi|IYx#|9=4a|Nr-sNV7xK|6_*G ze;6V34+aSRfuSC3?gIvUtTap>ordX0r(x!!(=hwd>HkpoVbHkzc^~5L|1cUBE)W_3 D&3m0O literal 0 HcmV?d00001 diff --git a/bitmaps/l40o.bmp b/bitmaps/l40o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c97e0f20c79d8fd5cad2bdba013f30a795fd350b GIT binary patch literal 382 zcmb8rJqmy@3P2eC2aYrvn$Lh?u&QfS@w-sveN z7q{>Z7nP7_2uva~vy+hQ#O0@Bnr~p-;mL#UJ9t(DZz>U~8-<6~H-pD~pr;36-&=dn YjFEN!Tkg>RIHkV1rrM-boAzJu0sxS~*#H0l literal 0 HcmV?d00001 diff --git a/bitmaps/l40s.bmp b/bitmaps/l40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..50bc67a2c276587e79694744a35257a43bca19f5 GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEhN|+mhAu1u{|Ns9PfEY+J0O{i-(#=rynh^S*0EGU- zP!Bfm2ZKGB{=gs)rXL9KgXseT>?kx$97ccm2T}h)0G0kB05K1phS>+B{{g)M@(()w ZpAjOCLBsq3qtV0RJyaizhJ_b|1^^|Ir56AI literal 0 HcmV?d00001 diff --git a/bitmaps/l40w.bmp b/bitmaps/l40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ca11b562eb2d19abd1f861e0c615d6ea8ad4a58e GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEhN|+mhAu1u{|Ns9PfEY+J0O{i-(#=ryj1c-C&!em_J}N RdN{m?`0GE6hJ_b|1_0Fmqd@=w literal 0 HcmV?d00001 diff --git a/bitmaps/l45o.bmp b/bitmaps/l45o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..757f9cc6ab94ce193fe34eeef04a896758e913e4 GIT binary patch literal 422 zcmbWz!3~2j3_hBX)kHsDl&iky$-A0ySh5y^Ry6DLky@3BfY zTAd#n&k|MQLZ|dK!#0))K+*vAr0zHU46I)#I?r@k>9Cm@hbbcFA^AtoUoH*ngmpQH dp6CAQ_eQ<1sP`S+%DbXpSYL=r$-Dlq^aPE?2@C)L literal 0 HcmV?d00001 diff --git a/bitmaps/l45s.bmp b/bitmaps/l45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..72e451bf3ffa2407e3904f7906dec4454b3336ae GIT binary patch literal 422 zcmZ?rUB<`&26jMF1Bi8@n2`Y@kpZM?xgi*=5K8?2|DOSf|NsBN0HlAANq?w^=znSt zp%2MJ=mvfW&A<+(|1mIw=|2pNVEP9W0}B0z2_lY8|C2uq(a!|Y{|`$4XM&iEK{r9| lh1n0I4?x|8PCtOU8=Z#v3!TOlPJjP{-T5Cz!@?Cp0|1W?=Mn$_ literal 0 HcmV?d00001 diff --git a/bitmaps/l45w.bmp b/bitmaps/l45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9b2050feb5613a284e9bf2dc535980d5b330a221 GIT binary patch literal 422 zcmZ?rUB<`&26jMF1Bi8@n2`Y@kpZM?xgi*=5K8?2|DOSf|NsBN0HlAANq?w^=zm}j zp%2JI=mvfW&A<+(|1mIw=|2pNU>am6GKPtx(=dJL^na+i7&OdYbQ?VO{%oQ+-vFobtUuBiutZwuZM?2bg<(J zwp_!STUc?IjgAKBX`0K9M$COY80l}ON8ZponbR)b=M9u&U6}v? literal 0 HcmV?d00001 diff --git a/bitmaps/l54s.bmp b/bitmaps/l54s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7abf49d81b34265b331b1c32aff954ca10b904ec GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nX4b3-s#A(Z(4|33o|1Hm6;x*f_VmS%>i|K|yz z|5QNe9|rYcb3ZWHgXsqh@?iP^13#ELyS Hqr?vYnmIO; literal 0 HcmV?d00001 diff --git a/bitmaps/l54w.bmp b/bitmaps/l54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2ba36b8147c1ec517c8dfe309fd18bedf509cc76 GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nX4b3-s#A(Z(4|33o|1Hm6;x*f_VmS%>i|HlZS zL1uyQ4~BX${ei(AOg~_d2h#@__`!4o13Q>zU|n;vC;pb@)$HsKROLFADxET nk50qfhfc%Xk50q^671czT211}$W zgplNX*{lr5DbBl?LrG;S_Rq+6ox`F`08C68_Y8fN^}nVwQm!s*EDigbde_hy9i1@H z0Tb;o(?+~Y=hPBx(h6uRfxWgjN2Glp#dAH%@>3CEuU#;**Lw8qwZXOQwXpf!U)~(| TL;FDPwfg_#wfVo=ShJ^Zcs8bh literal 0 HcmV?d00001 diff --git a/bitmaps/l58s.bmp b/bitmaps/l58s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1c7ba69b86dfe1e6fe2b8645c18699e8624ab3e6 GIT binary patch literal 526 zcmb8rF%H5o33 literal 0 HcmV?d00001 diff --git a/bitmaps/l58w.bmp b/bitmaps/l58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2ec0f44f78cb118a1dde5fb6ca2cacd019758af7 GIT binary patch literal 526 zcmb8ru?+$-3yVMr%{xavH`pkZX&i@|&sg`CveFGkSbRPf! literal 0 HcmV?d00001 diff --git a/bitmaps/l64o.bmp b/bitmaps/l64o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dcd5a4c3a06af412ea6e6c3871d0505a91c9f0da GIT binary patch literal 574 zcmbWyJr06E5Cvecp|G&<0NZ*B*4TRr@4*~_BXAojxdI6Vt%e4Y%`7wf(CFB?$?UiD z_{r?$TJEy6O4(0R=dJQAmy;}ce%zxFV2?3oQg#K8lp?;i))7w~?A^%J@|$v%)C z0Q3woHTCF-@P2Or!SJsV_Rs-!i3sVQMtD1}3k$m8*(0XW}oT4;sfG ln+3VGOJmCgjAI&KE?}I}xN-sG(%}Er;E}&%LT^R7?JJ~0*LDB^ literal 0 HcmV?d00001 diff --git a/bitmaps/l64s.bmp b/bitmaps/l64s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0bdc5bbb1da2f096097a1e83b7b2b91f4511f949 GIT binary patch literal 574 zcmbV}F%kkH3`G+yEG#TMKw3|+IQE{29Bq%XN1&u&z>pA&*!gFY$9{$ovak1c0@Wt@ zA@N*+fU*+F{{3oUhUGB^NJO<{&cCc==gZA_T#WnK$Y=z+yaVKEG=MZ&0cf%SXn_M+ z3+%{RAkz0E3spV;C9-~3WUU|Bkkh<3vLol|d!Np+`v0N7FVf#1>GO&7`9)Tm?Z}`= SlBkj-QT$&$t34vkUHJoz{Gv+$ literal 0 HcmV?d00001 diff --git a/bitmaps/l64w.bmp b/bitmaps/l64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..80342c38720b9adc7fe8ce731714b0e8de3b3c30 GIT binary patch literal 574 zcmbW!Jr2S!35V51+qZnJjQLGk9w36D$8(2d>|4biL5!Oh1K!n;*d33Og`0D=;)SAR4Sd yG+2OWpys@q>(%V9=KgA)PqlvjAM<`{-e1l4QS<%O8qeboCF=h=W{Xf+?c*1^u9%Jh literal 0 HcmV?d00001 diff --git a/bitmaps/m33o.bmp b/bitmaps/m33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..313e9985c134b760084a8d1e82dee4279c1162e5 GIT binary patch literal 326 zcmZ{fF$w}P5JeMg76d(l*m(*UEbKhfdb8bP?-4ugEG$;gFSx6p iV}zi6VS-k7Ht)uGS=f6>?UXU(y|DB&+0Xs&$A17jJ&uzA literal 0 HcmV?d00001 diff --git a/bitmaps/m33s.bmp b/bitmaps/m33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e2571b61f6357164ddfae2cb1bdd914a892a4a87 GIT binary patch literal 3354 zcmeHG!41MN3=DtZjrj3n0tVpE){Md))QyXqoSh~PqC$d74ff@HXS?EhJMKb!E_9yh zJx%W>93uYMhH&5W8v#0=pMQSD+R7a)ahg0Fr5-BVtmr|8 z)E}RoMs2RBWpju+qjK6B3Kc#Fd@tbq%?VPq*{#&*V7V|;(bR4v?PGNhb6p*yq(h9F zn0H9364b<86?6coiFt>lDnU)iDODvtzz{SbpC+;mK@AatboQu(YbQ5WdWV`jSzk$Ckh`2g`Xs_}E!XBX4s4 K9_%*X(d-~dub_#hap5K8?2|DOSf|2F{nIBEGGVEKRVzt@A* zeR#mm4x+!k|6UHFzsvvl4yOPACzbvP()WS=2NQ_?|NZwbDE${qKVXK?^Z)+@@&DET oZwJvg|NjBIV0XR$V-KdkKZf|@n>>X62=&)*G#Zyb0oH4bx&QzG literal 0 HcmV?d00001 diff --git a/bitmaps/o33s.bmp b/bitmaps/o33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a0630959ea1345efebd2d6ec87d4eeea091c1d9b GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DOSf|2F{nIBEGGVEKRiAL>Es zJ}@w_gXm8j0`4ICqX0)ci2m?^9V`x$CxYe#>tkU51)~3dU}1vNj9~ix9|+yR0H*&z m?Y+Uk0CvX#24=9k9x&L0=?}~he|(UK&>x}x`i(~8@+SbRlx6<_ literal 0 HcmV?d00001 diff --git a/bitmaps/o33w.bmp b/bitmaps/o33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d782bd55c589fecc60c0aad800be3bba4049d7fe GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DOSf|2F{nIBEGGVEKRiAL>Es zJ}@w_Q;BATn!^C1{{sz%(qQrb4;UbH1BCtuwf6=C1K1r07?{ECdca^0rav%4{P95^ OLVtw%>o*#W%bx&0ePRay literal 0 HcmV?d00001 diff --git a/bitmaps/s49o.bmp b/bitmaps/s49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e6755c9be867c4ad052657932932430b3109ae57 GIT binary patch literal 454 zcmb8rI|{-;5C-7Q337zAwqC%1y+@J_*m#Q^WjkAsu!4nUln4>B>+igR5wvh&_RF8i zW0LjeP&ipD+80zytHNnxZ+*FFwgGTdw3@ex4=Ly8cgL*fe>qrxva>uHEr&^akN=dC z=Q(BujFJNeG2&((8%Iy;PC>0|@ea+s*|nNu>*c;Wi3thxz5a~M))jiT0ZKLkfxYlR V9q6{5~NSaJen-WQTrZ#eFL@3 zF)>iDInYbp(bH@r24J0=B7(X!SLUWF_xDw;?1Kluaob>~|E literal 0 HcmV?d00001 diff --git a/bitmaps/s49w.bmp b/bitmaps/s49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cc7354ad4a5812a7cafda40c24863e6ddb29f730 GIT binary patch literal 454 zcmb8rF%H5o3P|z zOG1nt=M7`4NGOGq>haNJGBYqZ^2gC1na??-QlImtdbL+x?Ud)L_QSU?p!IW1Z0s3% zV~=occX`bifmMGlq6wE0Ken-sJ4oYw*_R|2Zsrf&j?3NN4@3va1<@z-i}JnMQI`I2 H{wIF}5_jXE literal 0 HcmV?d00001 diff --git a/bitmaps/s72o.bmp b/bitmaps/s72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4df9aa86ae02f3a24262eb22eb612d5a5c886118 GIT binary patch literal 926 zcmci9F=_)b5Cu>zTc|WSf!eh0Qbmv|P43{6L`4qZ8`wwk6$~!6jd7#EqMtw7k#*iaB97LF<+OnV!}^mDeUDunIjHrE{&+> zmLOLr8=Lv_%?UZFOFG}xdtpv_bz?Ig!lir5B{U!2cyAmxJ!ei~YWcaSxz7u*sd3t) zgz5=7V2t@H4p_wUuF;m(3V)-vo{l;#SnkCtMt-~XL9FWxH4Bm}8 Sdu~n*$MVfNtfqSWzx)YB^GHwt literal 0 HcmV?d00001 diff --git a/bitmaps/s72s.bmp b/bitmaps/s72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5ed1196e61b8cf3f212c017732fb5000b9608c3 GIT binary patch literal 926 zcmchUF-`+95JkV`!ezt-*p`wq6_KcDxB~}?Sl@sfgrne&k|W?FxHMA4WM*vdjsjGX zSjpDg=dalv&;8@UL!Ud|Z+JcQ<>1sm^>ckO8xet5d)N=8A6ziWq54ZWW4F|~gp;Xb zIU0}O`P=xT;fl3K%f)!h8Q6?o&NvL8fWO#t=0)z4Gs076$Gqz-1Ch~Dl#PyI@Jw}H zI9=&nB=gLrhTj^#H7uVSnYgk`W$`}dFfze)PQW$rp`LjU_oDFU-{0pBkF zwQOIM0q#t=ayQ|I9I2bnS;K=n$8+yIednk1 zljB57jh;v6Jx8LA)$+!T`GM#c*T}g`KanHc7OucuVHt>wj(Z6_HO7Hcm^p5BE|PP@ zQRWYh_m1Utmh+n%my>zGLsBw=d^1+79F;rAK^eWm%Kr@dNrcKoD5ERFn1yy%ScFVW hxkn6zqnhk7FlmsPg%heW&)W2y!>L_7XwLZ;zW|~Tw9xOu#WtpZAgz# zDRx$b5wHBO$36K+LHeeOX9bW73moPfY{0@elHqpJ7prM9do4QqqgOyIij#i?b>s zt(-1r1wO}=_bGNI6y%~!Jl7KZup}Zv3i7G0&d#b_kG^9kxT?{~Rw zh(Yu`H{e>_7IhIfdDm{T5#}SVcu$1lJrUC@_o=aWR@dHNWJ)9 H{pZp@uTx`HYFIcwn8s7>2 zJ@xFh?yQ9PaaF#zC~xE;BG8gq^X?BwmRGtQHoU)>+Si%|=;%N*^|=L!HkFvz_b@lW h=b!XFnthJ|gY})vo@ay~_iQW)2!|F_w&nVXLLMqzGpqO>P%gDCm*-9bYq(U7#4@S7-j9onJ^$BsX_D>XMO8E zf-^^8gm>l-@YpyLY3ZFQK$xwXe))g)`KOAzW@!5AW~@$qHA^m@n>C-kSmZufz#i1n zRpqR&C{@l{JT$OG9Yc`#+F UK`b^~5pR3ViMXnQL%v_9}XIsB~eS1job;bRHby+GQ29IQa9OVbgrmA3Z$*;4`vS8YvF1F?<_^~g2k4Eqe zoMRz)2YTEIK4^Lpd;x7WxOK<(+2@lGFU6*~2=A9+w+<`I#e2!~{Rw?zUd9|=!xUDy z@xE&w+-7EOJ13?98|F1vZklT5*4M%*7E6y$(;bpsr(?zsh@!5 TR0bSOmCT~^GUT^<|3AM0dT_65 literal 0 HcmV?d00001 diff --git a/bitmaps/v49w.bmp b/bitmaps/v49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..076ea0f5f87ae6aa2c86311d61297668820036df GIT binary patch literal 454 zcma)&I}XAy5JcBXk&YZ8EiD(o64ab2Tjp34h;yW)gfazUnXyNNP+@8OG}@2GKAf(} z%Gu-ILOUs0EsVfrQ&k#uMT9{({^878n0zFe?9Aro_G{*BTywr)Tuw1_<=~aPpOmn~X#(IF9O;kAa?V@~ zfMBm?(B7+Cbp+~SPOcY3jLAjeewSQQKloi?{)>s#UGd2mKgDda))(-C*~MbMpY|K` z6khe;lc)mgaS_^N9^bCaAOBc8Y>{P7eaD|vE3|6J(wjRB>>GQm@j%?XuC#8%!ulMswm$g^)+Z_)^&A1`=3#)D=S4oRt^dbg&TFK-uukG0N^TFENjR%u@NqJjEEHr9=Kz7C?&%Lj!P9yHyCS zHD8%`z&0xgjC+t^VBMbx#9V5B=>2yW-FNbHldSgc2P}tXqvUjyq_4bRy8#=M=UMdi zudUI{#Vwna`_PWJhzAe{m8aUuZs`{hj?c`2E}W{s7nr=j;Fg literal 0 HcmV?d00001 diff --git a/bitmaps/v54w.bmp b/bitmaps/v54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..57bf8d61f39e43b917d3435eacb14b18a57cad7e GIT binary patch literal 494 zcma*kK?=e!5CzZ)U36zWfY7Zca3u!ZdmurmNAd_=c#xhzTq*{qe`damf}o-4Bh94! zN%x0a5^p=)*XSGeBr$OT*F|(M>5|G9&v=17H<8;#ZXGa2UbnyzWBVSoe2Rl` hu`$buODv~i1C~?qBFm{dBz0>J|2uF0ExvAEKLM3O){03OvDDfAq z);b!+Cr`*du#U&4ol7>0_2y=0d?YrBRp)u5J1>^(8~WJeoiRwvmXg`>J$0SbYy5PX z@5IYoX5t2gGMjW6v)&hTuoz`Wou~P>bHz`&y}3-w2}E1vZ8aa{E2+~{)PrC<($9q$ zs<~Bre*aKaWe%d7iFpY&_EhmOu0IThI?RxVE#o|~;CGpjSuCF=&p7asyyt)MFX(?pga7~l literal 0 HcmV?d00001 diff --git a/bitmaps/v72s.bmp b/bitmaps/v72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3dd30dcb9e5002e700989398d5dc840e88a8429f GIT binary patch literal 926 zcmd7PJx;_h5C!0|BH<=lC{raZB`3fV&C(#Q5X1$bql>9%_6(fGNRhVT4rIjzR-%An z<>7h!lStc8Vy&Z3FOykka&_}sk*rHx&#|x5R-`2FaerLJEkU|4GhxStER+9g7aK{v zvJ{SSWP~~QfKD|YILQX^Q{h>EY%M)&>2oXI1gj76hzG4U;yvtELpDtf-VkR(PEU`s z&F5_WGMi2p?iM!14>S}vVPdJjLYr*bE{v9v|DbSby~s6xmm1Aq#b@i;7j#$hUO$Tu z=s9_r8wU?=b{pp@Ifhm0m8--a^|UV@sEKp-q~2`ZNez>(-5Af$)VBRDTetmvvQ_U6 zFN1E(mUcGHkR6#kPnf7nH4|)-!-pA?!+_FE!l6|*4w`4hXw>DL4;2{yHvlVk_*eb~ Dk|>i9 literal 0 HcmV?d00001 diff --git a/bitmaps/v72w.bmp b/bitmaps/v72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3797c5a93e557daf045a54fb5ba23aad0f0b8635 GIT binary patch literal 926 zcmd6l!41MN3`Je_&>I~gSEis6Cob#&leCjCOAidf2yjCJVZOf|WFdq&63NlikMo=S zbiF;a!m+}Vz}LigH^~w`gBSSTg40V3v5zhCBQfKLK2udb9ul literal 0 HcmV?d00001 diff --git a/bitmaps/w33o.bmp b/bitmaps/w33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5de631dee41d5960b4cdf0858d1d0d8e939dcdce GIT binary patch literal 326 zcmZ|KJqiLb5C!0*vofV+u=5Ur3l?^s!h@{fu`IUG&I4GkVqxim=n9E>X5OSy49tAY z4gK=`p1*izE73RBhZQgxD~JB12~G$3L~-K z#X#dqg)cSKO+#O`@41I!atGGQZN&gTRU`KT?(_}E`%|ayfkPvEXj4ruXVB=?fB*aH Fe*iz%hr$2= literal 0 HcmV?d00001 diff --git a/bitmaps/w33s.bmp b/bitmaps/w33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4defb6a54dc011de2f484ebd7115da5fe6da8aa4 GIT binary patch literal 326 zcmZ{fJqiLb5QSezp@q1m`zArdD~K#MRSvbF2)7-sY;AihzLd0mi~vq=^SWypMjd0fXX;yK7j@E(V=I?jrT%- zRU%jq<#{I@+AtCyj4rOFck#eX2sfn{U&2I~5#|1?(mb@%eAMB>e){CjwdVi#zpwcl DY|LV+ literal 0 HcmV?d00001 diff --git a/bitmaps/w33w.bmp b/bitmaps/w33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d7a3994cb1c717f6037eb9c70cecdff5b222b25f GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dub_#hap5K8?2|DOSf|2F{n81w^1h&Tg-JxKl! z1A{z>{=vY&52e{b^aln8beb6|j+X|SgI6C=9;_dx4n_mr0k;1i)II;9?)!g$p&n%K Qf0(=f$V1$Z%YSI%00s3{=Kufz literal 0 HcmV?d00001 diff --git a/bitmaps/was.gif b/bitmaps/was.gif new file mode 100644 index 0000000000000000000000000000000000000000..bebbc25c91057b5b3739a6538bab7581eff56d50 GIT binary patch literal 326 zcmZ?wbhEHbG-NPj*v!Dd!o>3D-=9BBEDXc}#h)yU3=B*RIw0jBGniRE2b}O+z1QOP z+1>vWH2P8^nKHWiR=r|$)M0nvIA3`8uEpPv7P9OTcfO_^;@!9+^3$ZVGmRfl+1F&d zVo8>1(oEsJ>)L1AHm6OH(2RH<@giSRr|9yt)@IumNVrpL^3=$l}d-O?oDvaxZ?ifw7Dg4T*^6xYsa zu*;e_ech71flIsgohd&hZm{O;lq<(~oIDaT@#2X!H wo7?GE4{rYSxo`QoO`pHCU)fr9Xzg9G{169KmmMn?9&Q&<_L_4;k%_??0G1eu+yDRo literal 0 HcmV?d00001 diff --git a/bitmaps/wcv.gif b/bitmaps/wcv.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff562681458328b69add923b496d527ce22aedbc GIT binary patch literal 314 zcmZ?wbhEHbG-NPj*v!Dd!o>3D-=9BBEDWe1fq`Ky0|O@mg9EC#;!hSv1_mYu9gr}{ z3}%++0Vh0H@3nZnmT`l;dY|0W*5ocmM}bZ2w3^@EJXTzFE3f~#%=ui4mW2)CiiMsw zO6p$AzI>nJvV8jr;fkYay`kD?Zl~m?-&MLMNgP9QrN{4AubmSAv89 literal 0 HcmV?d00001 diff --git a/bitmaps/wl49o.bmp b/bitmaps/wl49o.bmp index b405ea9756bf71b6fb350408a076d263866b7520..9e71d680a1708b93f68c119ae35f1af272f8f173 100644 GIT binary patch delta 68 wcmX@ce2jU*Ma$y<-y0bI{r~$HPQM57fB*XrqwhoI=R@gu5dE)sG8f|>0EL$@QUCw| delta 68 zcmX@ce2jU*MN8%X-y0bI{r~e5LjV2y|2>HR^ADW958?yG=R?)SgXn+Clerl8003^E BFQ5Pb diff --git a/bitmaps/wl49s.bmp b/bitmaps/wl49s.bmp index d1a737ab0cb98bd3bb9aef43db583a4847d750cd..a24a4f4d561c10182646bca3bddfb32173926924 100644 GIT binary patch delta 68 vcmX@ce2jU*Mav!r_6CN33`|ULnjgexVPt^O@=*DBC_NuUGxkj8V%!4&XL=EJ delta 68 zcmX@ce2jU*Maw%3>h($ delta 123 zcmbQoK97Auq4W<1=KufyGcYhfNP8&z1M~kM6MKHC9g_e5uO1|O{{R2}egu2|c?4Vj h_~ZqQVyg1T5kf%e4@lY$fGs%w|No)Q&l$Hf0s!l7MB@Me diff --git a/bitmaps/wl72s.bmp b/bitmaps/wl72s.bmp index a64f46667c5be7cb2925539bd7cc93eb9310ef2c..4ea254a766f28dc8043f30b1e410165bffcd3ae5 100644 GIT binary patch delta 117 zcmbQoK97AuA@c_Y#*HOHjENQx7#Qjq7#RK^U|>ivz|KA(fe^>V2I}QOGRNXS)J%)b J&l$Hf0su_rANT+O delta 100 zcmbQoK97AuA@dIg=8YvnjB2(I7#Qjq7#RK^U|=XHK(G@G5bOsQlNT_GsXnkk2mz&e RkhEF+hZ that is POSIX.1 compatible. */ /*#undef HAVE_SYS_WAIT_H*/ @@ -47,7 +46,7 @@ #define LAST_PTY_LETTER 'q' -#define PATCHLEVEL "12" +#define PATCHLEVEL "13c" #define PRODUCT "WinBoard" diff --git a/frontend.h b/frontend.h index f3556e6..dacd12a 100644 --- a/frontend.h +++ b/frontend.h @@ -1,186 +1,186 @@ -/* - * frontend.h -- Interface exported by all XBoard front ends - * $Id: frontend.h,v 2.2 2003/11/06 07:22:14 mann Exp $ - * - * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. - * Enhancements Copyright 1992-95 Free Software Foundation, Inc. - * - * The following terms apply to Digital Equipment Corporation's copyright - * interest in XBoard: - * ------------------------------------------------------------------------ - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of Digital not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING - * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL - * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR - * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * ------------------------------------------------------------------------ - * - * The following terms apply to the enhanced version of XBoard distributed - * by the Free Software Foundation: - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * ------------------------------------------------------------------------ - */ - -#ifndef _FRONTEND -#define _FRONTEND - -#include - -typedef VOIDSTAR ProcRef; -#define NoProc ((ProcRef) 0) -typedef VOIDSTAR InputSourceRef; - -void ModeHighlight P((void)); -void SetICSMode P((void)); -void SetGNUMode P((void)); -void SetNCPMode P((void)); -void SetCmailMode P((void)); -void SetTrainingModeOn P((void)); -void SetTrainingModeOff P((void)); -void SetUserThinkingEnables P((void)); -void SetMachineThinkingEnables P((void)); -void DisplayTitle P((String title)); -void DisplayMessage P((String message, String extMessage)); -void DisplayError P((String message, int error)); -void DisplayMoveError P((String message)); - -/* If status == 0, we are exiting with a benign message, not an error */ -void DisplayFatalError P((String message, int error, int status)); - -void DisplayInformation P((String message)); -void DisplayNote P((String message)); -void AskQuestion P((String title, String question, String replyPrefix, - ProcRef pr)); -void DisplayIcsInteractionTitle P((String title)); -void DrawPosition P((int fullRedraw, Board board)); -void ResetFrontEnd P((void)); -void CommentPopUp P((String title, String comment)); -void CommentPopDown P((void)); -void EditCommentPopUp P((int index, String title, String text)); - -void RingBell P((void)); -void PlayIcsWinSound P((void)); -void PlayIcsLossSound P((void)); -void PlayIcsDrawSound P((void)); -void PlayIcsUnfinishedSound P((void)); -void PlayAlarmSound P((void)); -void EchoOn P((void)); -void EchoOff P((void)); -void Raw P((void)); -void Colorize P((ColorClass cc, int continuation)); - -char *UserName P((void)); -char *HostName P((void)); - -int ClockTimerRunning P((void)); -int StopClockTimer P((void)); -void StartClockTimer P((long millisec)); -void DisplayWhiteClock P((long timeRemaining, int highlight)); -void DisplayBlackClock P((long timeRemaining, int highlight)); - -int LoadGameTimerRunning P((void)); -int StopLoadGameTimer P((void)); -void StartLoadGameTimer P((long millisec)); -void AutoSaveGame P((void)); - -typedef void (*DelayedEventCallback) P((void)); -void ScheduleDelayedEvent P((DelayedEventCallback cb, long millisec)); -DelayedEventCallback GetDelayedEvent P((void)); -void CancelDelayedEvent P((void)); - -int StartChildProcess P((char *cmdLine, char *dir, ProcRef *pr)); -void DestroyChildProcess P((ProcRef pr, int/*boolean*/ signal)); -void InterruptChildProcess P((ProcRef pr)); - -int OpenTelnet P((char *host, char *port, ProcRef *pr)); -int OpenTCP P((char *host, char *port, ProcRef *pr)); -int OpenCommPort P((char *name, ProcRef *pr)); -int OpenLoopback P((ProcRef *pr)); -int OpenRcmd P((char *host, char *user, char *cmd, ProcRef *pr)); - -typedef void (*InputCallback) P((InputSourceRef isr, VOIDSTAR closure, - char *buf, int count, int error)); -/* pr == NoProc means the local keyboard */ -InputSourceRef AddInputSource P((ProcRef pr, int lineByLine, - InputCallback func, VOIDSTAR closure)); -void RemoveInputSource P((InputSourceRef isr)); - -/* pr == NoProc means the local display */ -int OutputToProcess P((ProcRef pr, char *message, int count, int *outError)); -int OutputToProcessDelayed P((ProcRef pr, char *message, int count, - int *outError, long msdelay)); - -void CmailSigHandlerCallBack P((InputSourceRef isr, VOIDSTAR closure, - char *buf, int count, int error)); - -extern ProcRef cmailPR; - -/* these are in wgamelist.c */ -void GameListPopUp P((FILE *fp, char *filename)); -void GameListPopDown P((void)); -void GameListHighlight P((int index)); -void GameListDestroy P((void)); - -/* these are in wedittags.c */ -void EditTagsPopUp P((char *tags)); -void TagsPopUp P((char *tags, char *msg)); -void TagsPopDown P((void)); - -void ICSInitScript P((void)); -void StartAnalysisClock P((void)); -void AnalysisPopUp P((char *title, char *label)); -void AnalysisPopDown P((void)); - -void SetHighlights P((int fromX, int fromY, int toX, int toY)); -void ClearHighlights P((void)); -void SetPremoveHighlights P((int fromX, int fromY, int toX, int toY)); -void ClearPremoveHighlights P((void)); - -void ShutDownFrontEnd P((void)); -void BoardToTop P((void)); -void AnimateMove P((Board board, int fromX, int fromY, int toX, int toY)); -void HistorySet P((char movelist[][2*MOVE_LEN], int first, int last, int current)); -void FreezeUI P((void)); -void ThawUI P((void)); -extern char *programName; - -typedef struct FrontEndProgramStats_TAG { - int which; - int depth; - unsigned long nodes; - int score; - int time; - char * pv; - char * hint; - int an_move_index; - int an_move_count; -} FrontEndProgramStats; - -void SetProgramStats P(( FrontEndProgramStats * stats )); /* [AS] */ - -#endif +/* + * frontend.h -- Interface exported by all XBoard front ends + * $Id: frontend.h,v 2.2 2003/11/06 07:22:14 mann Exp $ + * + * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. + * Enhancements Copyright 1992-95 Free Software Foundation, Inc. + * + * The following terms apply to Digital Equipment Corporation's copyright + * interest in XBoard: + * ------------------------------------------------------------------------ + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * ------------------------------------------------------------------------ + * + * The following terms apply to the enhanced version of XBoard distributed + * by the Free Software Foundation: + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * ------------------------------------------------------------------------ + */ + +#ifndef _FRONTEND +#define _FRONTEND + +#include + +typedef VOIDSTAR ProcRef; +#define NoProc ((ProcRef) 0) +typedef VOIDSTAR InputSourceRef; + +void ModeHighlight P((void)); +void SetICSMode P((void)); +void SetGNUMode P((void)); +void SetNCPMode P((void)); +void SetCmailMode P((void)); +void SetTrainingModeOn P((void)); +void SetTrainingModeOff P((void)); +void SetUserThinkingEnables P((void)); +void SetMachineThinkingEnables P((void)); +void DisplayTitle P((String title)); +void DisplayMessage P((String message, String extMessage)); +void DisplayError P((String message, int error)); +void DisplayMoveError P((String message)); + +/* If status == 0, we are exiting with a benign message, not an error */ +void DisplayFatalError P((String message, int error, int status)); + +void DisplayInformation P((String message)); +void DisplayNote P((String message)); +void AskQuestion P((String title, String question, String replyPrefix, + ProcRef pr)); +void DisplayIcsInteractionTitle P((String title)); +void DrawPosition P((int fullRedraw, Board board)); +void ResetFrontEnd P((void)); +void CommentPopUp P((String title, String comment)); +void CommentPopDown P((void)); +void EditCommentPopUp P((int index, String title, String text)); + +void RingBell P((void)); +void PlayIcsWinSound P((void)); +void PlayIcsLossSound P((void)); +void PlayIcsDrawSound P((void)); +void PlayIcsUnfinishedSound P((void)); +void PlayAlarmSound P((void)); +void EchoOn P((void)); +void EchoOff P((void)); +void Raw P((void)); +void Colorize P((ColorClass cc, int continuation)); + +char *UserName P((void)); +char *HostName P((void)); + +int ClockTimerRunning P((void)); +int StopClockTimer P((void)); +void StartClockTimer P((long millisec)); +void DisplayWhiteClock P((long timeRemaining, int highlight)); +void DisplayBlackClock P((long timeRemaining, int highlight)); + +int LoadGameTimerRunning P((void)); +int StopLoadGameTimer P((void)); +void StartLoadGameTimer P((long millisec)); +void AutoSaveGame P((void)); + +typedef void (*DelayedEventCallback) P((void)); +void ScheduleDelayedEvent P((DelayedEventCallback cb, long millisec)); +DelayedEventCallback GetDelayedEvent P((void)); +void CancelDelayedEvent P((void)); + +int StartChildProcess P((char *cmdLine, char *dir, ProcRef *pr)); +void DestroyChildProcess P((ProcRef pr, int/*boolean*/ signal)); +void InterruptChildProcess P((ProcRef pr)); + +int OpenTelnet P((char *host, char *port, ProcRef *pr)); +int OpenTCP P((char *host, char *port, ProcRef *pr)); +int OpenCommPort P((char *name, ProcRef *pr)); +int OpenLoopback P((ProcRef *pr)); +int OpenRcmd P((char *host, char *user, char *cmd, ProcRef *pr)); + +typedef void (*InputCallback) P((InputSourceRef isr, VOIDSTAR closure, + char *buf, int count, int error)); +/* pr == NoProc means the local keyboard */ +InputSourceRef AddInputSource P((ProcRef pr, int lineByLine, + InputCallback func, VOIDSTAR closure)); +void RemoveInputSource P((InputSourceRef isr)); + +/* pr == NoProc means the local display */ +int OutputToProcess P((ProcRef pr, char *message, int count, int *outError)); +int OutputToProcessDelayed P((ProcRef pr, char *message, int count, + int *outError, long msdelay)); + +void CmailSigHandlerCallBack P((InputSourceRef isr, VOIDSTAR closure, + char *buf, int count, int error)); + +extern ProcRef cmailPR; + +/* these are in wgamelist.c */ +void GameListPopUp P((FILE *fp, char *filename)); +void GameListPopDown P((void)); +void GameListHighlight P((int index)); +void GameListDestroy P((void)); + +/* these are in wedittags.c */ +void EditTagsPopUp P((char *tags)); +void TagsPopUp P((char *tags, char *msg)); +void TagsPopDown P((void)); + +void ICSInitScript P((void)); +void StartAnalysisClock P((void)); +void AnalysisPopUp P((char *title, char *label)); +void AnalysisPopDown P((void)); + +void SetHighlights P((int fromX, int fromY, int toX, int toY)); +void ClearHighlights P((void)); +void SetPremoveHighlights P((int fromX, int fromY, int toX, int toY)); +void ClearPremoveHighlights P((void)); + +void ShutDownFrontEnd P((void)); +void BoardToTop P((void)); +void AnimateMove P((Board board, int fromX, int fromY, int toX, int toY)); +void HistorySet P((char movelist[][2*MOVE_LEN], int first, int last, int current)); +void FreezeUI P((void)); +void ThawUI P((void)); +extern char *programName; + +typedef struct FrontEndProgramStats_TAG { + int which; + int depth; + unsigned long nodes; + int score; + int time; + char * pv; + char * hint; + int an_move_index; + int an_move_count; +} FrontEndProgramStats; + +void SetProgramStats P(( FrontEndProgramStats * stats )); /* [AS] */ + +#endif diff --git a/gamelist.c b/gamelist.c index 2be1fe8..0d24d1d 100644 --- a/gamelist.c +++ b/gamelist.c @@ -1,419 +1,419 @@ -/* - * gamelist.c -- Functions to manage a gamelist - * XBoard $Id: gamelist.c,v 2.1 2003/10/27 19:21:00 mann Exp $ - * - * Copyright 1995 Free Software Foundation, Inc. - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - * ------------------------------------------------------------------------ - */ - -#include "config.h" - -#include -#include -#if STDC_HEADERS -# include -# include -#else /* not STDC_HEADERS */ -# if HAVE_STRING_H -# include -# else /* not HAVE_STRING_H */ -# include -# endif /* not HAVE_STRING_H */ -#endif /* not STDC_HEADERS */ - -#include "common.h" -#include "frontend.h" -#include "backend.h" -#include "parser.h" - - -/* Variables - */ -List gameList; - - -/* Local function prototypes - */ -static void GameListDeleteGame P((ListGame *)); -static ListGame *GameListCreate P((void)); -static void GameListFree P((List *)); -static int GameListNewGame P((ListGame **)); - -/* Delete a ListGame; implies removint it from a list. - */ -static void GameListDeleteGame(listGame) - ListGame *listGame; -{ - if (listGame) { - if (listGame->gameInfo.event) free(listGame->gameInfo.event); - if (listGame->gameInfo.site) free(listGame->gameInfo.site); - if (listGame->gameInfo.date) free(listGame->gameInfo.date); - if (listGame->gameInfo.round) free(listGame->gameInfo.round); - if (listGame->gameInfo.white) free(listGame->gameInfo.white); - if (listGame->gameInfo.black) free(listGame->gameInfo.black); - if (listGame->gameInfo.fen) free(listGame->gameInfo.fen); - if (listGame->gameInfo.resultDetails) free(listGame->gameInfo.resultDetails); - if (listGame->gameInfo.timeControl) free(listGame->gameInfo.timeControl); - if (listGame->gameInfo.extraTags) free(listGame->gameInfo.extraTags); - if (listGame->gameInfo.outOfBook) free(listGame->gameInfo.outOfBook); - ListNodeFree((ListNode *) listGame); - } -} - - -/* Free the previous list of games. - */ -static void GameListFree(gameList) - List *gameList; -{ - while (!ListEmpty(gameList)) - { - GameListDeleteGame((ListGame *) gameList->head); - } -} - - - -/* Initialize a new GameInfo structure. - */ -void GameListInitGameInfo(gameInfo) - GameInfo *gameInfo; -{ - gameInfo->event = NULL; - gameInfo->site = NULL; - gameInfo->date = NULL; - gameInfo->round = NULL; - gameInfo->white = NULL; - gameInfo->black = NULL; - gameInfo->result = GameUnfinished; - gameInfo->fen = NULL; - gameInfo->resultDetails = NULL; - gameInfo->timeControl = NULL; - gameInfo->extraTags = NULL; - gameInfo->whiteRating = -1; /* unknown */ - gameInfo->blackRating = -1; /* unknown */ - gameInfo->variant = VariantNormal; - gameInfo->outOfBook = NULL; -} - - -/* Create empty ListGame; returns ListGame or NULL, if out of memory. - * - * Note, that the ListGame is *not* added to any list - */ -static ListGame *GameListCreate() - -{ - ListGame *listGame; - - if ((listGame = (ListGame *) ListNodeCreate(sizeof(*listGame)))) { - GameListInitGameInfo(&listGame->gameInfo); - } - return(listGame); -} - - -/* Creates a new game for the gamelist. - */ -static int GameListNewGame(listGamePtr) - ListGame **listGamePtr; -{ - if (!(*listGamePtr = (ListGame *) GameListCreate())) { - GameListFree(&gameList); - return(ENOMEM); - } - ListAddTail(&gameList, (ListNode *) *listGamePtr); - return(0); -} - - -/* Build the list of games in the open file f. - * Returns 0 for success or error number. - */ -int GameListBuild(f) - FILE *f; -{ - ChessMove cm, lastStart; - int gameNumber; - ListGame *currentListGame = NULL; - int error; - int offset; - - GameListFree(&gameList); - yynewfile(f); - gameNumber = 0; - - lastStart = (ChessMove) 0; - yyskipmoves = FALSE; - do { - yyboardindex = 0; - offset = yyoffset(); - cm = (ChessMove) yylex(); - switch (cm) { - case GNUChessGame: - if ((error = GameListNewGame(¤tListGame))) { - rewind(f); - yyskipmoves = FALSE; - return(error); - } - currentListGame->number = ++gameNumber; - currentListGame->offset = offset; - if (currentListGame->gameInfo.event != NULL) { - free(currentListGame->gameInfo.event); - } - currentListGame->gameInfo.event = StrSave(yy_text); - lastStart = cm; - break; - case XBoardGame: - lastStart = cm; - break; - case MoveNumberOne: - switch (lastStart) { - case GNUChessGame: - break; /* ignore */ - case PGNTag: - lastStart = cm; - break; /* Already started */ - case (ChessMove) 0: - case MoveNumberOne: - case XBoardGame: - if ((error = GameListNewGame(¤tListGame))) { - rewind(f); - yyskipmoves = FALSE; - return(error); - } - currentListGame->number = ++gameNumber; - currentListGame->offset = offset; - lastStart = cm; - break; - default: - break; /* impossible */ - } - break; - case PGNTag: - lastStart = cm; - if ((error = GameListNewGame(¤tListGame))) { - rewind(f); - yyskipmoves = FALSE; - return(error); - } - currentListGame->number = ++gameNumber; - currentListGame->offset = offset; - ParsePGNTag(yy_text, ¤tListGame->gameInfo); - do { - yyboardindex = 1; - offset = yyoffset(); - cm = (ChessMove) yylex(); - if (cm == PGNTag) { - ParsePGNTag(yy_text, ¤tListGame->gameInfo); - } - } while (cm == PGNTag || cm == Comment); - break; - case NormalMove: - /* Allow the first game to start with an unnumbered move */ - yyskipmoves = TRUE; - if (lastStart == (ChessMove) 0) { - if ((error = GameListNewGame(¤tListGame))) { - rewind(f); - yyskipmoves = FALSE; - return(error); - } - currentListGame->number = ++gameNumber; - currentListGame->offset = offset; - lastStart = MoveNumberOne; - } - break; - default: - break; - } - } - while (cm != (ChessMove) 0); - - - if (appData.debugMode) { - for (currentListGame = (ListGame *) gameList.head; - currentListGame->node.succ; - currentListGame = (ListGame *) currentListGame->node.succ) { - - fprintf(debugFP, "Parsed game number %d, offset %ld:\n", - currentListGame->number, currentListGame->offset); - PrintPGNTags(debugFP, ¤tListGame->gameInfo); - } - } - - rewind(f); - yyskipmoves = FALSE; - return 0; -} - - -/* Clear an existing GameInfo structure. - */ -void ClearGameInfo(gameInfo) - GameInfo *gameInfo; -{ - if (gameInfo->event != NULL) { - free(gameInfo->event); - } - if (gameInfo->site != NULL) { - free(gameInfo->site); - } - if (gameInfo->date != NULL) { - free(gameInfo->date); - } - if (gameInfo->round != NULL) { - free(gameInfo->round); - } - if (gameInfo->white != NULL) { - free(gameInfo->white); - } - if (gameInfo->black != NULL) { - free(gameInfo->black); - } - if (gameInfo->resultDetails != NULL) { - free(gameInfo->resultDetails); - } - if (gameInfo->fen != NULL) { - free(gameInfo->fen); - } - if (gameInfo->timeControl != NULL) { - free(gameInfo->timeControl); - } - if (gameInfo->extraTags != NULL) { - free(gameInfo->extraTags); - } - if (gameInfo->outOfBook != NULL) { - free(gameInfo->outOfBook); - } - - GameListInitGameInfo(gameInfo); -} - -/* [AS] Replaced by "dynamic" tag selection below */ -char * -GameListLineOld(number, gameInfo) - int number; - GameInfo *gameInfo; -{ - char *event = (gameInfo->event && strcmp(gameInfo->event, "?") != 0) ? - gameInfo->event : gameInfo->site ? gameInfo->site : "?"; - char *white = gameInfo->white ? gameInfo->white : "?"; - char *black = gameInfo->black ? gameInfo->black : "?"; - char *date = gameInfo->date ? gameInfo->date : "?"; - int len = 10 + strlen(event) + 2 + strlen(white) + 1 + - strlen(black) + 11 + strlen(date) + 1; - char *ret = (char *) malloc(len); - sprintf(ret, "%d. %s, %s-%s, %s, %s", - number, event, white, black, PGNResult(gameInfo->result), date); - return ret; -} - -#define MAX_FIELD_LEN 64 /* To avoid overflowing the buffer */ - -char * GameListLine( int number, GameInfo * gameInfo ) -{ - char buffer[1024]; - char * buf = buffer; - char * glt = appData.gameListTags; - - buf += sprintf( buffer, "%d.", number ); - - while( *glt != '\0' ) { - *buf++ = ' '; - - switch( *glt ) { - case GLT_EVENT: - strncpy( buf, gameInfo->event ? gameInfo->event : "?", MAX_FIELD_LEN ); - break; - case GLT_SITE: - strncpy( buf, gameInfo->site ? gameInfo->site : "?", MAX_FIELD_LEN ); - break; - case GLT_DATE: - strncpy( buf, gameInfo->date ? gameInfo->date : "?", MAX_FIELD_LEN ); - break; - case GLT_ROUND: - strncpy( buf, gameInfo->round ? gameInfo->round : "?", MAX_FIELD_LEN ); - break; - case GLT_PLAYERS: - strncpy( buf, gameInfo->white ? gameInfo->white : "?", MAX_FIELD_LEN ); - buf[ MAX_FIELD_LEN-1 ] = '\0'; - buf += strlen( buf ); - *buf++ = '-'; - strncpy( buf, gameInfo->black ? gameInfo->black : "?", MAX_FIELD_LEN ); - break; - case GLT_RESULT: - strcpy( buf, PGNResult(gameInfo->result) ); - break; - case GLT_WHITE_ELO: - if( gameInfo->whiteRating > 0 ) - sprintf( buf, "%d", gameInfo->whiteRating ); - else - strcpy( buf, "?" ); - break; - case GLT_BLACK_ELO: - if( gameInfo->blackRating > 0 ) - sprintf( buf, "%d", gameInfo->blackRating ); - else - strcpy( buf, "?" ); - break; - case GLT_TIME_CONTROL: - strncpy( buf, gameInfo->timeControl ? gameInfo->timeControl : "?", MAX_FIELD_LEN ); - break; - case GLT_VARIANT: - break; - case GLT_OUT_OF_BOOK: - strncpy( buf, gameInfo->outOfBook ? gameInfo->outOfBook : "?", MAX_FIELD_LEN ); - break; - default: - break; - } - - buf[MAX_FIELD_LEN-1] = '\0'; - - buf += strlen( buf ); - - glt++; - - if( *glt != '\0' ) { - *buf++ = ','; - } - } - - *buf = '\0'; - - return strdup( buffer ); -} - -char * GameListLineFull( int number, GameInfo * gameInfo ) -{ - char * event = gameInfo->event ? gameInfo->event : "?"; - char * site = gameInfo->site ? gameInfo->site : "?"; - char * white = gameInfo->white ? gameInfo->white : "?"; - char * black = gameInfo->black ? gameInfo->black : "?"; - char * round = gameInfo->round ? gameInfo->round : "?"; - char * date = gameInfo->date ? gameInfo->date : "?"; - char * oob = gameInfo->outOfBook ? gameInfo->outOfBook : ""; - - int len = 64 + strlen(event) + strlen(site) + strlen(white) + strlen(black) + strlen(date) + strlen(oob); - - char *ret = (char *) malloc(len); - - sprintf(ret, "%d, \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"", number, event, site, round, white, black, PGNResult(gameInfo->result), date, oob ); - - return ret; -} +/* + * gamelist.c -- Functions to manage a gamelist + * XBoard $Id: gamelist.c,v 2.1 2003/10/27 19:21:00 mann Exp $ + * + * Copyright 1995 Free Software Foundation, Inc. + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + * ------------------------------------------------------------------------ + */ + +#include "config.h" + +#include +#include +#if STDC_HEADERS +# include +# include +#else /* not STDC_HEADERS */ +# if HAVE_STRING_H +# include +# else /* not HAVE_STRING_H */ +# include +# endif /* not HAVE_STRING_H */ +#endif /* not STDC_HEADERS */ + +#include "common.h" +#include "frontend.h" +#include "backend.h" +#include "parser.h" + + +/* Variables + */ +List gameList; + + +/* Local function prototypes + */ +static void GameListDeleteGame P((ListGame *)); +static ListGame *GameListCreate P((void)); +static void GameListFree P((List *)); +static int GameListNewGame P((ListGame **)); + +/* Delete a ListGame; implies removint it from a list. + */ +static void GameListDeleteGame(listGame) + ListGame *listGame; +{ + if (listGame) { + if (listGame->gameInfo.event) free(listGame->gameInfo.event); + if (listGame->gameInfo.site) free(listGame->gameInfo.site); + if (listGame->gameInfo.date) free(listGame->gameInfo.date); + if (listGame->gameInfo.round) free(listGame->gameInfo.round); + if (listGame->gameInfo.white) free(listGame->gameInfo.white); + if (listGame->gameInfo.black) free(listGame->gameInfo.black); + if (listGame->gameInfo.fen) free(listGame->gameInfo.fen); + if (listGame->gameInfo.resultDetails) free(listGame->gameInfo.resultDetails); + if (listGame->gameInfo.timeControl) free(listGame->gameInfo.timeControl); + if (listGame->gameInfo.extraTags) free(listGame->gameInfo.extraTags); + if (listGame->gameInfo.outOfBook) free(listGame->gameInfo.outOfBook); + ListNodeFree((ListNode *) listGame); + } +} + + +/* Free the previous list of games. + */ +static void GameListFree(gameList) + List *gameList; +{ + while (!ListEmpty(gameList)) + { + GameListDeleteGame((ListGame *) gameList->head); + } +} + + + +/* Initialize a new GameInfo structure. + */ +void GameListInitGameInfo(gameInfo) + GameInfo *gameInfo; +{ + gameInfo->event = NULL; + gameInfo->site = NULL; + gameInfo->date = NULL; + gameInfo->round = NULL; + gameInfo->white = NULL; + gameInfo->black = NULL; + gameInfo->result = GameUnfinished; + gameInfo->fen = NULL; + gameInfo->resultDetails = NULL; + gameInfo->timeControl = NULL; + gameInfo->extraTags = NULL; + gameInfo->whiteRating = -1; /* unknown */ + gameInfo->blackRating = -1; /* unknown */ + gameInfo->variant = VariantNormal; + gameInfo->outOfBook = NULL; +} + + +/* Create empty ListGame; returns ListGame or NULL, if out of memory. + * + * Note, that the ListGame is *not* added to any list + */ +static ListGame *GameListCreate() + +{ + ListGame *listGame; + + if ((listGame = (ListGame *) ListNodeCreate(sizeof(*listGame)))) { + GameListInitGameInfo(&listGame->gameInfo); + } + return(listGame); +} + + +/* Creates a new game for the gamelist. + */ +static int GameListNewGame(listGamePtr) + ListGame **listGamePtr; +{ + if (!(*listGamePtr = (ListGame *) GameListCreate())) { + GameListFree(&gameList); + return(ENOMEM); + } + ListAddTail(&gameList, (ListNode *) *listGamePtr); + return(0); +} + + +/* Build the list of games in the open file f. + * Returns 0 for success or error number. + */ +int GameListBuild(f) + FILE *f; +{ + ChessMove cm, lastStart; + int gameNumber; + ListGame *currentListGame = NULL; + int error; + int offset; + + GameListFree(&gameList); + yynewfile(f); + gameNumber = 0; + + lastStart = (ChessMove) 0; + yyskipmoves = FALSE; + do { + yyboardindex = 0; + offset = yyoffset(); + cm = (ChessMove) yylex(); + switch (cm) { + case GNUChessGame: + if ((error = GameListNewGame(¤tListGame))) { + rewind(f); + yyskipmoves = FALSE; + return(error); + } + currentListGame->number = ++gameNumber; + currentListGame->offset = offset; + if (currentListGame->gameInfo.event != NULL) { + free(currentListGame->gameInfo.event); + } + currentListGame->gameInfo.event = StrSave(yy_text); + lastStart = cm; + break; + case XBoardGame: + lastStart = cm; + break; + case MoveNumberOne: + switch (lastStart) { + case GNUChessGame: + break; /* ignore */ + case PGNTag: + lastStart = cm; + break; /* Already started */ + case (ChessMove) 0: + case MoveNumberOne: + case XBoardGame: + if ((error = GameListNewGame(¤tListGame))) { + rewind(f); + yyskipmoves = FALSE; + return(error); + } + currentListGame->number = ++gameNumber; + currentListGame->offset = offset; + lastStart = cm; + break; + default: + break; /* impossible */ + } + break; + case PGNTag: + lastStart = cm; + if ((error = GameListNewGame(¤tListGame))) { + rewind(f); + yyskipmoves = FALSE; + return(error); + } + currentListGame->number = ++gameNumber; + currentListGame->offset = offset; + ParsePGNTag(yy_text, ¤tListGame->gameInfo); + do { + yyboardindex = 1; + offset = yyoffset(); + cm = (ChessMove) yylex(); + if (cm == PGNTag) { + ParsePGNTag(yy_text, ¤tListGame->gameInfo); + } + } while (cm == PGNTag || cm == Comment); + break; + case NormalMove: + /* Allow the first game to start with an unnumbered move */ + yyskipmoves = TRUE; + if (lastStart == (ChessMove) 0) { + if ((error = GameListNewGame(¤tListGame))) { + rewind(f); + yyskipmoves = FALSE; + return(error); + } + currentListGame->number = ++gameNumber; + currentListGame->offset = offset; + lastStart = MoveNumberOne; + } + break; + default: + break; + } + } + while (cm != (ChessMove) 0); + + + if (appData.debugMode) { + for (currentListGame = (ListGame *) gameList.head; + currentListGame->node.succ; + currentListGame = (ListGame *) currentListGame->node.succ) { + + fprintf(debugFP, "Parsed game number %d, offset %ld:\n", + currentListGame->number, currentListGame->offset); + PrintPGNTags(debugFP, ¤tListGame->gameInfo); + } + } + + rewind(f); + yyskipmoves = FALSE; + return 0; +} + + +/* Clear an existing GameInfo structure. + */ +void ClearGameInfo(gameInfo) + GameInfo *gameInfo; +{ + if (gameInfo->event != NULL) { + free(gameInfo->event); + } + if (gameInfo->site != NULL) { + free(gameInfo->site); + } + if (gameInfo->date != NULL) { + free(gameInfo->date); + } + if (gameInfo->round != NULL) { + free(gameInfo->round); + } + if (gameInfo->white != NULL) { + free(gameInfo->white); + } + if (gameInfo->black != NULL) { + free(gameInfo->black); + } + if (gameInfo->resultDetails != NULL) { + free(gameInfo->resultDetails); + } + if (gameInfo->fen != NULL) { + free(gameInfo->fen); + } + if (gameInfo->timeControl != NULL) { + free(gameInfo->timeControl); + } + if (gameInfo->extraTags != NULL) { + free(gameInfo->extraTags); + } + if (gameInfo->outOfBook != NULL) { + free(gameInfo->outOfBook); + } + + GameListInitGameInfo(gameInfo); +} + +/* [AS] Replaced by "dynamic" tag selection below */ +char * +GameListLineOld(number, gameInfo) + int number; + GameInfo *gameInfo; +{ + char *event = (gameInfo->event && strcmp(gameInfo->event, "?") != 0) ? + gameInfo->event : gameInfo->site ? gameInfo->site : "?"; + char *white = gameInfo->white ? gameInfo->white : "?"; + char *black = gameInfo->black ? gameInfo->black : "?"; + char *date = gameInfo->date ? gameInfo->date : "?"; + int len = 10 + strlen(event) + 2 + strlen(white) + 1 + + strlen(black) + 11 + strlen(date) + 1; + char *ret = (char *) malloc(len); + sprintf(ret, "%d. %s, %s-%s, %s, %s", + number, event, white, black, PGNResult(gameInfo->result), date); + return ret; +} + +#define MAX_FIELD_LEN 64 /* To avoid overflowing the buffer */ + +char * GameListLine( int number, GameInfo * gameInfo ) +{ + char buffer[1024]; + char * buf = buffer; + char * glt = appData.gameListTags; + + buf += sprintf( buffer, "%d.", number ); + + while( *glt != '\0' ) { + *buf++ = ' '; + + switch( *glt ) { + case GLT_EVENT: + strncpy( buf, gameInfo->event ? gameInfo->event : "?", MAX_FIELD_LEN ); + break; + case GLT_SITE: + strncpy( buf, gameInfo->site ? gameInfo->site : "?", MAX_FIELD_LEN ); + break; + case GLT_DATE: + strncpy( buf, gameInfo->date ? gameInfo->date : "?", MAX_FIELD_LEN ); + break; + case GLT_ROUND: + strncpy( buf, gameInfo->round ? gameInfo->round : "?", MAX_FIELD_LEN ); + break; + case GLT_PLAYERS: + strncpy( buf, gameInfo->white ? gameInfo->white : "?", MAX_FIELD_LEN ); + buf[ MAX_FIELD_LEN-1 ] = '\0'; + buf += strlen( buf ); + *buf++ = '-'; + strncpy( buf, gameInfo->black ? gameInfo->black : "?", MAX_FIELD_LEN ); + break; + case GLT_RESULT: + strcpy( buf, PGNResult(gameInfo->result) ); + break; + case GLT_WHITE_ELO: + if( gameInfo->whiteRating > 0 ) + sprintf( buf, "%d", gameInfo->whiteRating ); + else + strcpy( buf, "?" ); + break; + case GLT_BLACK_ELO: + if( gameInfo->blackRating > 0 ) + sprintf( buf, "%d", gameInfo->blackRating ); + else + strcpy( buf, "?" ); + break; + case GLT_TIME_CONTROL: + strncpy( buf, gameInfo->timeControl ? gameInfo->timeControl : "?", MAX_FIELD_LEN ); + break; + case GLT_VARIANT: + break; + case GLT_OUT_OF_BOOK: + strncpy( buf, gameInfo->outOfBook ? gameInfo->outOfBook : "?", MAX_FIELD_LEN ); + break; + default: + break; + } + + buf[MAX_FIELD_LEN-1] = '\0'; + + buf += strlen( buf ); + + glt++; + + if( *glt != '\0' ) { + *buf++ = ','; + } + } + + *buf = '\0'; + + return strdup( buffer ); +} + +char * GameListLineFull( int number, GameInfo * gameInfo ) +{ + char * event = gameInfo->event ? gameInfo->event : "?"; + char * site = gameInfo->site ? gameInfo->site : "?"; + char * white = gameInfo->white ? gameInfo->white : "?"; + char * black = gameInfo->black ? gameInfo->black : "?"; + char * round = gameInfo->round ? gameInfo->round : "?"; + char * date = gameInfo->date ? gameInfo->date : "?"; + char * oob = gameInfo->outOfBook ? gameInfo->outOfBook : ""; + + int len = 64 + strlen(event) + strlen(site) + strlen(white) + strlen(black) + strlen(date) + strlen(oob); + + char *ret = (char *) malloc(len); + + sprintf(ret, "%d, \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"", number, event, site, round, white, black, PGNResult(gameInfo->result), date, oob ); + + return ret; +} diff --git a/lists.c b/lists.c index a9e0d41..8d9bb20 100644 --- a/lists.c +++ b/lists.c @@ -1,149 +1,149 @@ -/* - * lists.c -- Functions to implement a double linked list - * XBoard $Id: lists.c,v 2.1 2003/10/27 19:21:00 mann Exp $ - * - * Copyright 1995 Free Software Foundation, Inc. - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - * ------------------------------------------------------------------------ - * - * This file could well be a part of backend.c, but I prefer it this - * way. - */ - -#include "config.h" - -#include -#if STDC_HEADERS -# include -#endif /* not STDC_HEADERS */ - -#include "common.h" -#include "lists.h" - - - -/* Check, if List l is empty; returns TRUE, if it is, FALSE - * otherwise. - */ -int ListEmpty(l) - List *l; -{ - return(l->head == (ListNode *) &l->tail); -} - - -/* Initialize a list. Must be executed before list is used. - */ -void ListNew(l) - List *l; -{ - l->head = (ListNode *) &l->tail; - l->tail = NULL; - l->tailPred = (ListNode *) l; -} - - -/* Remove node n from the list it is inside. - */ -void ListRemove(n) - ListNode *n; -{ - if (n->succ != NULL) { /* Be safe */ - n->pred->succ = n->succ; - n->succ->pred = n->pred; - n->succ = NULL; /* Mark node as no longer being member */ - n->pred = NULL; /* of a list. */ - } -} - - -/* Delete node n. - */ -void ListNodeFree(n) - ListNode *n; -{ - if (n) { - ListRemove(n); - free(n); - } -} - - -/* Create a list node with size s. Returns NULL, if out of memory. - */ -ListNode *ListNodeCreate(s) - size_t s; -{ - ListNode *n; - - if ((n = (ListNode*) malloc(s))) { - n->succ = NULL; /* Mark node as not being member of a list. */ - n->pred = NULL; - } - return(n); -} - - -/* Insert node n into the list of node m after m. - */ -void ListInsert(m, n) - ListNode *m, *n; -{ - n->succ = m->succ; - n->pred = m; - m->succ = n; - n->succ->pred = n; -} - - -/* Add node n to the head of list l. - */ -void ListAddHead(l, n) - List *l; - ListNode *n; -{ - ListInsert((ListNode *) &l->head, n); -} - - -/* Add node n to the tail of list l. - */ -void ListAddTail(l, n) - List *l; - ListNode *n; -{ - ListInsert((ListNode *) l->tailPred, n); -} - - -/* Return element with number n of list l. (NULL, if n doesn't exist.) - * Counting starts with 0. - */ -ListNode *ListElem(l, n) - List *l; - int n; -{ - ListNode *ln; - - for (ln = l->head; ln->succ; ln = ln->succ) { - if (!n--) { - return (ln); - } - } - - return(NULL); -} +/* + * lists.c -- Functions to implement a double linked list + * XBoard $Id: lists.c,v 2.1 2003/10/27 19:21:00 mann Exp $ + * + * Copyright 1995 Free Software Foundation, Inc. + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + * ------------------------------------------------------------------------ + * + * This file could well be a part of backend.c, but I prefer it this + * way. + */ + +#include "config.h" + +#include +#if STDC_HEADERS +# include +#endif /* not STDC_HEADERS */ + +#include "common.h" +#include "lists.h" + + + +/* Check, if List l is empty; returns TRUE, if it is, FALSE + * otherwise. + */ +int ListEmpty(l) + List *l; +{ + return(l->head == (ListNode *) &l->tail); +} + + +/* Initialize a list. Must be executed before list is used. + */ +void ListNew(l) + List *l; +{ + l->head = (ListNode *) &l->tail; + l->tail = NULL; + l->tailPred = (ListNode *) l; +} + + +/* Remove node n from the list it is inside. + */ +void ListRemove(n) + ListNode *n; +{ + if (n->succ != NULL) { /* Be safe */ + n->pred->succ = n->succ; + n->succ->pred = n->pred; + n->succ = NULL; /* Mark node as no longer being member */ + n->pred = NULL; /* of a list. */ + } +} + + +/* Delete node n. + */ +void ListNodeFree(n) + ListNode *n; +{ + if (n) { + ListRemove(n); + free(n); + } +} + + +/* Create a list node with size s. Returns NULL, if out of memory. + */ +ListNode *ListNodeCreate(s) + size_t s; +{ + ListNode *n; + + if ((n = (ListNode*) malloc(s))) { + n->succ = NULL; /* Mark node as not being member of a list. */ + n->pred = NULL; + } + return(n); +} + + +/* Insert node n into the list of node m after m. + */ +void ListInsert(m, n) + ListNode *m, *n; +{ + n->succ = m->succ; + n->pred = m; + m->succ = n; + n->succ->pred = n; +} + + +/* Add node n to the head of list l. + */ +void ListAddHead(l, n) + List *l; + ListNode *n; +{ + ListInsert((ListNode *) &l->head, n); +} + + +/* Add node n to the tail of list l. + */ +void ListAddTail(l, n) + List *l; + ListNode *n; +{ + ListInsert((ListNode *) l->tailPred, n); +} + + +/* Return element with number n of list l. (NULL, if n doesn't exist.) + * Counting starts with 0. + */ +ListNode *ListElem(l, n) + List *l; + int n; +{ + ListNode *ln; + + for (ln = l->head; ln->succ; ln = ln->succ) { + if (!n--) { + return (ln); + } + } + + return(NULL); +} diff --git a/lists.h b/lists.h index 31d6f5b..b291894 100644 --- a/lists.h +++ b/lists.h @@ -1,66 +1,66 @@ -/* - * lists.c -- Includefile of lists.c - * XBoard $Id: lists.h,v 2.1 2003/10/27 19:21:00 mann Exp $ - * - * Copyright 1995 Free Software Foundation, Inc. - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - * ------------------------------------------------------------------------ - * - * This file could well be a part of backend.c, but I prefer it this - * way. - */ - -#ifndef _LISTS_H -#define _LISTS_H - - -/* Type definition: Node of a double linked list. - */ -typedef struct _ListNode { - struct _ListNode *succ; - struct _ListNode *pred; -} ListNode; - - -/* Type definition: Double linked list. - * - * The list structure consists of two ListNode's: The pred entry of - * the head being the succ entry of the tail. Thus a list is empty - * if and only if it consists of 2 nodes. :-) - */ -typedef struct { - struct _ListNode *head; /* The list structure consists of two */ - struct _ListNode *tail; /* ListNode's: The pred entry of the */ - struct _ListNode *tailPred; /* head being the succ entry of the */ -} List; /* tail. */ - - - -/* Function prototypes - */ -extern int ListEmpty P((List *)); -void ListNew P((List *)); -void ListRemove P((ListNode *)); -void ListNodeFree P((ListNode *)); -ListNode *ListNodeCreate P((size_t)); -void ListInsert P((ListNode *, ListNode *)); -void ListAddHead P((List *, ListNode *)); -void ListAddTail P((List *, ListNode *)); -ListNode *ListElem P((List *, int)); - - -#endif +/* + * lists.c -- Includefile of lists.c + * XBoard $Id: lists.h,v 2.1 2003/10/27 19:21:00 mann Exp $ + * + * Copyright 1995 Free Software Foundation, Inc. + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + * ------------------------------------------------------------------------ + * + * This file could well be a part of backend.c, but I prefer it this + * way. + */ + +#ifndef _LISTS_H +#define _LISTS_H + + +/* Type definition: Node of a double linked list. + */ +typedef struct _ListNode { + struct _ListNode *succ; + struct _ListNode *pred; +} ListNode; + + +/* Type definition: Double linked list. + * + * The list structure consists of two ListNode's: The pred entry of + * the head being the succ entry of the tail. Thus a list is empty + * if and only if it consists of 2 nodes. :-) + */ +typedef struct { + struct _ListNode *head; /* The list structure consists of two */ + struct _ListNode *tail; /* ListNode's: The pred entry of the */ + struct _ListNode *tailPred; /* head being the succ entry of the */ +} List; /* tail. */ + + + +/* Function prototypes + */ +extern int ListEmpty P((List *)); +void ListNew P((List *)); +void ListRemove P((ListNode *)); +void ListNodeFree P((ListNode *)); +ListNode *ListNodeCreate P((size_t)); +void ListInsert P((ListNode *, ListNode *)); +void ListAddHead P((List *, ListNode *)); +void ListAddTail P((List *, ListNode *)); +ListNode *ListElem P((List *, int)); + + +#endif diff --git a/moves.c b/moves.c index deb245f..deac69f 100644 --- a/moves.c +++ b/moves.c @@ -196,12 +196,11 @@ ChessMove PromoCharToMoveType(whiteOnMove, promoChar) } char pieceToChar[] = { - 'P', 'N', 'B', 'R', 'Q', 'F', - 'W', 'E', 'M', 'O', 'U', 'H', 'A', 'C', 'G', 'S', - 'K', 'p', 'n', 'b', 'r', 'q', 'f', - 'w', 'e', 'm', 'o', 'u', 'h', 'a', 'c', 'g', 's', - 'k', 'x' - }; + 'P', 'N', 'B', 'R', 'Q', 'F', 'E', 'A', 'C', 'W', 'M', + 'O', 'H', 'I', 'J', 'G', 'D', 'V', 'S', 'L', 'U', 'K', + 'p', 'n', 'b', 'r', 'q', 'f', 'e', 'a', 'c', 'w', 'm', + 'o', 'h', 'i', 'j', 'g', 'd', 'v', 's', 'l', 'u', 'k', + 'x' }; char PieceToChar(p) ChessSquare p; @@ -210,7 +209,7 @@ char PieceToChar(p) return pieceToChar[(int) p]; } -int PieceToNumber(p) +int PieceToNumber(p) /* [HGM] holdings: count piece type, ignoring non-participating piece types */ ChessSquare p; { int i=0; @@ -519,8 +518,8 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) m++; /* Capablanca Archbishop continues as Knight */ - case WhiteCardinal: - case BlackCardinal: + case WhiteAngel: + case BlackAngel: m++; /* Shogi Bishops are ordinary Bishops */ @@ -570,8 +569,8 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) break; /* Shogi Dragon King has to continue as Ferz after Rook moves */ - case SHOGI WhiteMarshall: - case SHOGI BlackMarshall: + case SHOGI WhiteDragon: + case SHOGI BlackDragon: m++; /* Capablanca Chancellor sets flag to continue as Knight */ @@ -643,7 +642,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) for (fs = -1; fs <= 1; fs += 2) { rt = rf + rs; ft = ff + fs; - if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; + if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) continue; if (!SameColor(board[rf][ff], board[rt][ft]) && (gameInfo.variant != VariantXiangqi || InPalace(rt, ft) ) ) callback(board, flags, NormalMove, @@ -669,6 +668,24 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) rf, ff, rt, ft, closure); } break; + + case WhiteNightrider: + case BlackNightrider: + for (i = -1; i <= 1; i += 2) + for (j = -1; j <= 1; j += 2) + for (s = 1; s <= 2; s++) { int k; + for(k=1;; k++) { + rt = rf + k*i*s; + ft = ff + k*j*(3-s); + if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; + if (SameColor(board[rf][ff], board[rt][ft])) break; + callback(board, flags, NormalMove, + rf, ff, rt, ft, closure); + if (board[rt][ft] != EmptySquare) break; + } + } + break; + } } } @@ -736,8 +753,9 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) VOIDSTAR closure; { GenLegalClosure cl; - int ff, ft; + int ff, ft, k, left, right; int ignoreCheck = (flags & F_IGNORE_CHECK) != 0; + ChessSquare wKing = WhiteKing, bKing = BlackKing; cl.cb = callback; cl.cl = closure; @@ -747,10 +765,14 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) CheckTest(board, flags, -1, -1, -1, -1, FALSE)) return TRUE; /* Generate castling moves */ + if(gameInfo.variant == VariantKnightmate) { /* [HGM] Knightmate */ + wKing = WhiteUnicorn; bKing = BlackUnicorn; + } + for (ff = BOARD_WIDTH>>1; ff >= (BOARD_WIDTH-1)>>1; ff-- /*ics wild 1*/) { if ((flags & F_WHITE_ON_MOVE) && (flags & F_WHITE_KCASTLE_OK) && - board[0][ff] == WhiteKing && + board[0][ff] == wKing && board[0][ff + 1] == EmptySquare && board[0][ff + 2] == EmptySquare && board[0][BOARD_RGHT-3] == EmptySquare && @@ -769,7 +791,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) } if ((flags & F_WHITE_ON_MOVE) && (flags & F_WHITE_QCASTLE_OK) && - board[0][ff] == WhiteKing && + board[0][ff] == wKing && board[0][ff - 1] == EmptySquare && board[0][ff - 2] == EmptySquare && board[0][BOARD_LEFT+2] == EmptySquare && @@ -788,7 +810,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) } if (!(flags & F_WHITE_ON_MOVE) && (flags & F_BLACK_KCASTLE_OK) && - board[BOARD_HEIGHT-1][ff] == BlackKing && + board[BOARD_HEIGHT-1][ff] == bKing && board[BOARD_HEIGHT-1][ff + 1] == EmptySquare && board[BOARD_HEIGHT-1][ff + 2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_RGHT-3] == EmptySquare && @@ -807,7 +829,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) } if (!(flags & F_WHITE_ON_MOVE) && (flags & F_BLACK_QCASTLE_OK) && - board[BOARD_HEIGHT-1][ff] == BlackKing && + board[BOARD_HEIGHT-1][ff] == bKing && board[BOARD_HEIGHT-1][ff - 1] == EmptySquare && board[BOARD_HEIGHT-1][ff - 2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_LEFT+2] == EmptySquare && @@ -818,7 +840,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) (ignoreCheck || (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_LEFT+3, FALSE) && - !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE)))) { + !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? BlackQueenSideCastle : BlackQueenSideCastleWild, @@ -826,41 +848,73 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) } } - /* PUSH Fabien */ + if(gameInfo.variant == VariantFischeRandom) { /* generate all potential FRC castling moves (KxR), ignoring flags */ - /* [HGM] Tord! Help requested! */ - - if ((flags & F_WHITE_ON_MOVE) != 0) { + /* [HGM] test if the Rooks we find have castling rights */ - for (ff = BOARD_LEFT+1; ff < BOARD_RGHT-1; ff++) { - if (board[0][ff] == WhiteKing) { - for (ft = BOARD_LEFT+0; ft < BOARD_RGHT; ft++) { - if (board[0][ft] == WhiteRook) { - callback(board, flags, - (ft > ff) ? WhiteHSideCastleFR : WhiteASideCastleFR, - 0, ff, 0, ft, closure); - } - } - } - } + if ((flags & F_WHITE_ON_MOVE) != 0) { + ff = castlingRights[2]; /* King file if we have any rights */ + if(ff > 0) { + if (appData.debugMode) { + fprintf(debugFP, "FRC castling, %d %d %d %d %d %d\n", + castlingRights[0],castlingRights[1],ff,castlingRights[3],castlingRights[4],castlingRights[5]); + } + ft = castlingRights[0]; /* Rook file if we have H-side rights */ + left = ff+1; + right = BOARD_RGHT-2; + if(ff == BOARD_RGHT-2) left = right = ff-1; /* special case */ + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[0][k] != EmptySquare) ft = -1; + for(k=left; k= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, 0, ff, 0, k, FALSE)) ft = -1; + if(ft >= 0) + callback(board, flags, WhiteHSideCastleFR, 0, ff, 0, ft, closure); + + ft = castlingRights[1]; /* Rook file if we have A-side rights */ + left = BOARD_LEFT+2; + right = ff-1; + if(ff <= BOARD_LEFT+2) { left = ff+1; right = BOARD_LEFT+3; } + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[0][k] != EmptySquare) ft = -1; + if(ff > BOARD_LEFT+2) + for(k=left+1; k<=right && ft >= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, 0, ff, 0, k, FALSE)) ft = -1; + + if(ft >= 0) + callback(board, flags, WhiteASideCastleFR, 0, ff, 0, ft, closure); + } } else { - - for (ff = BOARD_LEFT+1; ff < BOARD_RGHT-1; ff++) { - if (board[BOARD_HEIGHT-1][ff] == BlackKing) { - for (ft = BOARD_LEFT+0; ft < BOARD_RGHT; ft++) { - if (board[BOARD_HEIGHT-1][ft] == BlackRook) { - callback(board, flags, - (ft > ff) ? BlackHSideCastleFR : BlackASideCastleFR, - BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ft, closure); - } - } - } - } + ff = castlingRights[5]; /* King file if we have any rights */ + if(ff > 0) { + ft = castlingRights[3]; /* Rook file if we have H-side rights */ + left = ff+1; + right = BOARD_RGHT-2; + if(ff == BOARD_RGHT-2) left = right = ff-1; /* special case */ + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[BOARD_HEIGHT-1][k] != EmptySquare) ft = -1; + for(k=left; k= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, k, FALSE)) ft = -1; + if(ft >= 0) + callback(board, flags, BlackHSideCastleFR, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ft, closure); + + ft = castlingRights[4]; /* Rook file if we have A-side rights */ + left = BOARD_LEFT+2; + right = ff-1; + if(ff <= BOARD_LEFT+2) { left = ff+1; right = BOARD_LEFT+3; } + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[BOARD_HEIGHT-1][k] != EmptySquare) ft = -1; + if(ff > BOARD_LEFT+2) + for(k=left+1; k<=right && ft >= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, k, FALSE)) ft = -1; + + if(ft >= 0) + callback(board, flags, BlackASideCastleFR, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ft, closure); + } } - /* POP Fabien */ + } return FALSE; } @@ -976,9 +1030,9 @@ void LegalityTestCallback(board, flags, kind, rf, ff, rt, ft, closure) { register LegalityTestClosure *cl = (LegalityTestClosure *) closure; - if (appData.debugMode) { - fprintf(debugFP, "Legality test: %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); - } +// if (appData.debugMode) { +// fprintf(debugFP, "Legality test: %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); +// } if (rf == cl->rf && ff == cl->ff && rt == cl->rt && ft == cl->ft) cl->kind = kind; } @@ -989,8 +1043,20 @@ ChessMove LegalityTest(board, flags, epfile, castlingRights, rf, ff, rt, ft, pro int rf, ff, rt, ft, promoChar; char castlingRights[]; { - LegalityTestClosure cl; + LegalityTestClosure cl; ChessSquare piece = board[rf][ff]; + if (appData.debugMode) { + int i; + for(i=0; i<6; i++) fprintf(debugFP, "%d ", castlingRights[i]); + fprintf(debugFP, "Legality test? %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); + } + /* [HGM] Lance, Cobra and Falcon are wildcard pieces; consider all their moves legal */ + /* (perhaps we should disallow moves that obviously leave us in check?) */ + if(piece == WhiteFalcon || piece == BlackFalcon || + piece == WhiteCobra || piece == BlackCobra || + piece == WhiteLance || piece == BlackLance) + return NormalMove; + cl.rf = rf; cl.ff = ff; cl.rt = rt; @@ -1139,25 +1205,31 @@ void Disambiguate(board, flags, epfile, closure) if (appData.debugMode) { fprintf(debugFP, "Disambiguate in: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } if(gameInfo.variant == VariantShogi) { /* [HGM] Shogi promotions. '=' means defer */ if(closure->rfIn != DROP_RANK && closure->kind == NormalMove) { ChessSquare piece = closure->piece; - +#if 0 if (appData.debugMode) { fprintf(debugFP, "Disambiguate A: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } +#endif if(c != NULLCHAR && c != 'x' && c != '+' && c != '=' && ToUpper(PieceToChar(PROMOTED piece)) != ToUpper(c) ) closure->kind = IllegalMove; else if(flags & F_WHITE_ON_MOVE) { +#if 0 if (appData.debugMode) { fprintf(debugFP, "Disambiguate B: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } +#endif if( (int) piece < (int) WhiteWazir && (closure->rf > BOARD_HEIGHT-4 || closure->rt > BOARD_HEIGHT-4) ) { if( (piece == WhitePawn || piece == WhiteQueen) && closure->rt > BOARD_HEIGHT-2 || @@ -1191,10 +1263,13 @@ void Disambiguate(board, flags, epfile, closure) closure->kind = IllegalMove; } } +#if 0 if (appData.debugMode) { fprintf(debugFP, "Disambiguate C: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } +#endif /* [HGM] returns 'q' for optional promotion, 'n' for mandatory */ if(closure->promoCharIn != '=') closure->promoChar = ToLower(PieceToChar(PromoPiece(closure->kind))); @@ -1299,7 +1374,7 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, if(PieceToChar(piece)=='~') piece = (ChessSquare)(DEMOTED piece); if (appData.debugMode) - fprintf(debugFP, "CoordsToAlgebraic, piece=%d\n", (int)piece); + fprintf(debugFP, "CoordsToAlgebraic, piece=%d (%d,%d)-(%d,%d) %c\n", (int)piece,ff,rf,ft,rt,promoChar ); switch (piece) { case WhitePawn: case BlackPawn: @@ -1330,6 +1405,8 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, } /* Use promotion suffix style "=Q" */ *outp = NULLCHAR; + if (appData.debugMode) + fprintf(debugFP, "movetype=%d, promochar=%d=%c\n", (int)kind, promoChar, promoChar); if (promoChar != NULLCHAR) { if(gameInfo.variant == VariantShogi) { /* [HGM] ... but not in Shogi! */ @@ -1470,8 +1547,12 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, return cl.kind; /* [HGM] Always long notation for fairies we don't know */ - case WhiteNightrider: - case BlackNightrider: + case WhiteFalcon: + case BlackFalcon: + case WhiteSilver: + case BlackSilver: + case WhiteLance: + case BlackLance: case WhiteGrasshopper: case BlackGrasshopper: case EmptySquare: diff --git a/moves.h b/moves.h index cc70260..f50ea08 100644 --- a/moves.h +++ b/moves.h @@ -73,6 +73,7 @@ typedef void (*MoveCallback) P((Board board, int flags, ChessMove kind, #define F_ATOMIC_CAPTURE 128 /* capturing piece explodes, destroying itself and all non-pawns on adjacent squares; destroying your own king is illegal */ +#define F_FRC_TYPE_CASTLING 256 /* generate castlings as captures of own Rook */ /* Special epfile values. [HGM] positive values are non-reversible moves! */ #define EP_NONE (-4) /* [HGM] Tricky! order matters: */ diff --git a/parser.c b/parser.c index 49ebb34..58282bd 100644 --- a/parser.c +++ b/parser.c @@ -9,8 +9,7 @@ #define YY_FLEX_MINOR_VERSION 5 #include -// #include - +#include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus @@ -23,6 +22,9 @@ #ifdef __cplusplus #include +#ifndef _WIN32 +#include +#endif /* Use prototypes in function declarations. */ #define YY_USE_PROTOS @@ -62,6 +64,7 @@ #define YY_PROTO(proto) () #endif + /* Returned upon end-of-file. */ #define YY_NULL 0 @@ -286,7 +289,7 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); #define YY_NUM_RULES 42 #define YY_END_OF_BUFFER 43 -static yyconst short int yy_acclist[661] = +static yyconst short int yy_acclist[650] = { 0, 43, 41, 42, 41, 42, 41, 42, 40, 41, 42, 41, 42, 25, 41, 42, 41, 42, 40, 41, 42, @@ -294,155 +297,152 @@ static yyconst short int yy_acclist[661] = 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42, 41, + 40, 41, 42, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, - 41, 42, 40, 41, 42, 40, 41, 42, 41, 42, + 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, + 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, + 40, 41, 42, 40, 41, 42, 41, 42, 41, 42, + 40, 41, 42, 40, 41, 42, 40, 41, 42,16410, + 40, 41, 42,16410, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - 42,16410, 40, 41, 42,16410, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, - 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - 42, 40, 41, 42, 41, 42, 33, 40, 17, 40, - 9, 40, 40, 40,16410, 8218, 40, 35, 40, 40, + 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, + 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, + 41, 42, 33, 40, 17, 40, 9, 40, 40, 40, + 16410, 8218, 40, 35, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 9, 40, 40, 40, 40, + 40, 40, 36, 40, 3, 40, 40, 4, 40, 40, + 40, 40, 40, 40, 9, 40, 40, 40, 34, 40, + 40, 9, 40, 40, 40,16410, 8218, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 9, - 40, 40, 40, 40, 40, 40, 36, 40, 3, 40, - 40, 40, 4, 40, 40, 3, 40, 40, 4, 40, - 40, 40, 40, 9, 40, 34, 40, 40, 9, 40, - 40, 40,16410, 8218, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 9, 40, 40, 40, - 40, 40, 40, 40, 3, 40, 40, 40, 4, 40, - 40, 3, 40, 40, 4, 40, 40, 40, 40, 9, + 40, 40, 40, 40, 40, 40, 40, 3, 40, 40, + + 4, 40, 40, 40, 40, 40, 40, 9, 40, 40, 40, 15, 9, 40, 23, 40, 23, 8, 40, 8218, 22, 40, 22, 24, 40, 40, 40, 6, 40, 40, - 40, 40, 40, 40, 40, 9, 40, 40, 40, 40, - 40, 20, 40, 4, 40, 40, 3, 40, 40, 3, - 40, 4, 5, 40, 4, 40, 40, 4, 40, 40, - 40, 3, 40, 4, 4, 40, 5, 6, 40, 4, - 40, 40, 9, 40, 34, 39, 9, 40, 23, 40, - 8, 40, 22, 40, 35, 40, 40, 40, 6, 40, - 40, 40, 40, 40, 40, 40, 9, 40, 40, 40, - 40, 40, 20, 40, 4, 40, 40, 3, 40, 40, - 3, 40, 5, 40, 4, 40, 40, 4, 40, 40, - 40, 3, 40, 4, 40, 5, 6, 40, 4, 40, - - 40, 9, 40, 38, 38, 37, 25, 25, 40, 6, - 40, 7, 40, 6, 10, 40, 40, 40, 40, 19, - 40, 40, 21, 40, 16, 40, 40, 40, 40, 40, - 20, 20, 40, 20, 40, 36, 3, 3, 2, 40, - 5, 4, 5, 40, 40, 4, 4, 40, 2, 7, - 40, 5, 6, 5, 6, 40, 5, 40, 40, 40, - 25, 39, 40, 6, 40, 7, 40, 40, 40, 40, - 40, 19, 40, 40, 21, 40, 16, 40, 40, 40, - 40, 40, 20, 40, 20, 20, 40, 2, 40, 5, - 40, 40, 4, 40, 2, 7, 40, 5, 6, 40, - - 5, 40, 40, 40, 7, 1, 40, 40, 40, 19, - 40, 40, 40, 21, 21, 40, 21, 40, 40, 40, - 40, 30, 36, 2, 2, 40, 5, 4, 5, 5, - 40, 2, 7, 39, 1, 40, 40, 40, 19, 40, - 40, 40, 21, 40, 21, 21, 40, 40, 40, 40, - 20, 39, 2, 40, 5, 40, 27, 38, 23, 23, - 22, 22, 24, 24, 20, 21, 1, 1, 40, 40, + 20, 40, 4, 40, 40, 3, 3, 40, 3, 40, + 40, 4, 5, 40, 4, 4, 40, 40, 40, 40, + 9, 40, 40, 34, 39, 9, 40, 23, 40, 8, + 40, 22, 40, 35, 40, 40, 40, 6, 40, 40, + 40, 40, 40, 40, 40, 9, 40, 40, 40, 40, + 20, 40, 4, 40, 40, 3, 40, 3, 40, 40, + + 5, 40, 4, 40, 40, 40, 40, 9, 40, 40, + 38, 38, 37, 25, 25, 6, 40, 10, 6, 40, + 7, 40, 6, 40, 6, 40, 40, 40, 19, 40, + 40, 21, 40, 16, 40, 40, 40, 40, 40, 20, + 20, 40, 20, 40, 36, 3, 3, 2, 40, 5, + 4, 5, 5, 40, 40, 4, 4, 40, 40, 25, + 39, 40, 6, 40, 7, 40, 40, 40, 40, 40, + 19, 40, 40, 21, 40, 16, 40, 40, 40, 40, + 40, 20, 40, 20, 20, 40, 2, 40, 5, 40, + 40, 4, 40, 40, 7, 7, 1, 40, 40, 40, + + 19, 40, 40, 40, 21, 21, 40, 21, 40, 40, + 40, 40, 30, 36, 2, 2, 2, 40, 5, 5, + 5, 40, 39, 1, 40, 40, 40, 19, 40, 40, + 40, 21, 40, 21, 21, 40, 40, 40, 40, 20, + 39, 2, 40, 5, 40, 27, 38, 1, 23, 23, + 22, 22, 24, 24, 1, 1, 40, 20, 21, 40, 40, 40, 11, 40, 40, 28, 36, 30, 2, 2, - 5, 27, 34, 39, 39, 1, 40, 40, 40, 40, - 21, 39, 11, 40, 40, 20, 39, 18, 24, 20, - - 21, 1, 1, 19, 40, 40, 40, 11, 40, 40, - 40, 40, 21, 39, 40, 11, 40, 40, 12, 40, - 40, 40, 40, 12, 40, 40, 14, 40, 40, 40, - 14, 40, 40, 40, 39, 40, 40, 40, 40, 39, - 39, 40, 40, 31, 40, 39, 39, 31, 40, 13, - 31, 32, 32, 35, 39, 39, 31, 39, 34, 29 + 27, 34, 39, 39, 1, 40, 40, 40, 40, 21, + 39, 11, 40, 40, 20, 39, 18, 1, 24, 1, + 20, 21, 19, 40, 40, 40, 11, 40, 40, 40, + + 40, 21, 39, 40, 11, 40, 40, 12, 40, 40, + 40, 40, 12, 40, 40, 14, 40, 40, 40, 14, + 40, 40, 40, 39, 40, 40, 40, 40, 39, 39, + 40, 40, 31, 40, 39, 39, 31, 40, 13, 31, + 32, 32, 35, 39, 39, 31, 39, 34, 29 } ; -static yyconst short int yy_accept[712] = +static yyconst short int yy_accept[698] = { 0, 1, 1, 1, 2, 4, 6, 8, 11, 13, 16, 18, 21, 25, 29, 31, 34, 37, 40, 43, 46, - 49, 52, 55, 58, 61, 64, 67, 70, 72, 75, - 78, 81, 84, 87, 90, 93, 96, 99, 101, 103, - 106, 109, 113, 117, 119, 122, 125, 128, 131, 134, + 49, 52, 55, 58, 61, 64, 66, 69, 72, 75, + 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, + 108, 111, 114, 117, 119, 121, 124, 127, 131, 135, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, - 167, 170, 173, 176, 179, 182, 185, 187, 187, 188, - 189, 189, 189, 189, 189, 190, 190, 190, 191, 191, - 193, 193, 193, 193, 194, 194, 194, 196, 196, 198, - 198, 199, 199, 200, 200, 201, 201, 201, 202, 203, - - 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, - 215, 216, 217, 217, 217, 217, 217, 218, 219, 221, - 221, 222, 223, 225, 226, 228, 228, 229, 231, 232, - 233, 234, 236, 236, 236, 236, 237, 237, 238, 238, - 239, 241, 241, 242, 244, 244, 246, 246, 247, 248, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 259, 260, 261, 262, 263, 264, 265, 267, 267, 268, - 269, 271, 272, 274, 274, 275, 277, 278, 279, 280, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 283, 283, 283, 283, 285, 287, 288, 290, - - 291, 291, 291, 291, 293, 294, 295, 295, 295, 295, - 295, 296, 296, 297, 297, 298, 298, 298, 300, 301, - 302, 303, 304, 305, 306, 308, 309, 310, 311, 312, - 314, 314, 314, 314, 314, 316, 316, 317, 317, 317, - 319, 320, 322, 323, 325, 325, 325, 327, 328, 330, - 331, 331, 332, 334, 335, 337, 340, 342, 343, 345, - 346, 346, 346, 346, 346, 347, 349, 351, 353, 355, - 355, 356, 356, 357, 358, 358, 359, 361, 362, 363, - 364, 365, 366, 367, 369, 370, 371, 372, 373, 375, - 377, 378, 378, 380, 381, 383, 385, 387, 388, 390, - - 391, 391, 392, 394, 396, 399, 401, 402, 404, 404, - 404, 405, 406, 406, 406, 407, 407, 407, 408, 408, - 409, 409, 409, 409, 410, 410, 410, 410, 410, 410, - 410, 410, 410, 410, 410, 410, 412, 412, 412, 414, - 415, 416, 417, 417, 418, 419, 420, 422, 422, 423, - 425, 427, 428, 429, 430, 431, 432, 434, 436, 436, - 436, 436, 436, 437, 438, 438, 439, 441, 442, 443, - 443, 443, 443, 445, 446, 447, 447, 449, 449, 452, - 454, 457, 459, 460, 461, 461, 462, 462, 462, 462, - 462, 463, 463, 464, 464, 464, 466, 468, 469, 469, - - 470, 471, 472, 474, 475, 477, 479, 480, 481, 482, - 483, 485, 486, 488, 490, 492, 493, 495, 498, 501, - 503, 504, 505, 505, 505, 505, 505, 505, 505, 505, - 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, - 506, 508, 509, 510, 510, 512, 512, 513, 514, 515, - 517, 519, 520, 521, 522, 522, 522, 524, 524, 524, - 525, 525, 525, 527, 528, 528, 529, 530, 530, 532, - 532, 534, 534, 534, 534, 534, 534, 534, 535, 535, - 535, 537, 538, 539, 541, 542, 543, 545, 546, 548, - 549, 550, 551, 553, 555, 557, 557, 557, 559, 559, - - 559, 560, 560, 561, 561, 562, 562, 563, 563, 564, - 564, 565, 565, 565, 565, 565, 567, 567, 568, 568, - 568, 570, 571, 571, 571, 571, 571, 571, 572, 573, - 575, 576, 578, 578, 579, 580, 581, 582, 582, 582, - 584, 584, 584, 585, 586, 586, 586, 588, 589, 590, - 591, 593, 595, 596, 598, 598, 599, 599, 599, 599, - 600, 600, 600, 600, 602, 602, 603, 604, 604, 605, - 605, 605, 605, 605, 606, 607, 608, 610, 611, 611, - 611, 611, 611, 611, 612, 613, 615, 616, 618, 619, - 619, 619, 619, 619, 619, 619, 620, 620, 620, 620, - - 620, 621, 622, 622, 622, 622, 622, 623, 624, 624, - 624, 624, 624, 625, 625, 625, 625, 626, 627, 629, - 629, 629, 629, 629, 630, 630, 631, 633, 633, 633, - 633, 633, 634, 635, 635, 635, 635, 635, 636, 637, - 638, 638, 638, 638, 638, 638, 639, 640, 640, 640, - 640, 640, 641, 642, 643, 644, 644, 644, 644, 644, - 644, 646, 646, 646, 646, 646, 647, 648, 650, 650, - 650, 651, 651, 652, 652, 653, 653, 653, 655, 655, - 656, 657, 657, 657, 657, 657, 659, 659, 659, 659, - 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, - - 659, 659, 659, 659, 659, 659, 659, 659, 660, 661, - 661 + 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, + 197, 200, 203, 206, 209, 212, 215, 218, 221, 223, + 223, 224, 225, 225, 225, 225, 225, 226, 226, 226, + 226, 227, 227, 229, 229, 229, 229, 230, 230, 230, + + 232, 232, 234, 234, 235, 235, 236, 236, 237, 237, + 238, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 248, 249, 250, 251, 252, 253, 253, 253, 253, 253, + 254, 255, 257, 257, 258, 260, 261, 262, 263, 264, + 265, 267, 268, 269, 269, 269, 269, 270, 270, 271, + 271, 272, 274, 274, 275, 277, 277, 279, 279, 280, + 281, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 292, 293, 294, 295, 296, 297, 298, 300, 300, + 301, 303, 304, 305, 306, 307, 308, 310, 311, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + + 312, 313, 313, 313, 313, 313, 313, 315, 317, 318, + 320, 321, 321, 321, 321, 323, 324, 325, 325, 326, + 326, 327, 327, 328, 328, 330, 330, 330, 330, 330, + 331, 332, 333, 334, 335, 336, 338, 339, 340, 341, + 343, 343, 343, 343, 343, 345, 345, 346, 346, 347, + 349, 351, 352, 353, 353, 355, 356, 358, 359, 360, + 361, 363, 364, 365, 365, 365, 365, 365, 366, 368, + 370, 372, 374, 374, 375, 375, 376, 377, 377, 378, + 380, 381, 382, 383, 384, 385, 386, 388, 389, 390, + 391, 393, 395, 396, 396, 398, 400, 401, 403, 405, + + 406, 407, 408, 410, 411, 411, 411, 412, 413, 413, + 413, 414, 414, 414, 415, 415, 416, 416, 417, 417, + 417, 417, 418, 418, 418, 418, 418, 418, 418, 418, + 419, 421, 421, 423, 424, 425, 425, 426, 427, 427, + 427, 427, 427, 428, 429, 431, 431, 432, 434, 436, + 437, 438, 439, 440, 441, 443, 445, 445, 445, 445, + 445, 446, 447, 447, 448, 450, 451, 452, 452, 452, + 453, 455, 456, 457, 457, 459, 460, 460, 461, 461, + 461, 461, 461, 462, 462, 463, 463, 463, 465, 467, + 468, 468, 469, 470, 471, 473, 474, 476, 478, 479, + + 480, 481, 482, 484, 485, 487, 489, 491, 492, 494, + 495, 495, 495, 495, 495, 496, 496, 496, 496, 496, + 496, 496, 496, 496, 496, 497, 499, 499, 499, 499, + 499, 500, 501, 501, 503, 503, 504, 505, 506, 508, + 510, 511, 512, 513, 513, 513, 515, 515, 515, 516, + 516, 517, 519, 520, 520, 521, 521, 523, 523, 523, + 523, 523, 523, 523, 523, 524, 524, 524, 526, 527, + 528, 530, 531, 532, 534, 535, 537, 538, 539, 540, + 542, 544, 546, 546, 546, 548, 548, 549, 549, 550, + 550, 551, 551, 552, 552, 553, 553, 554, 554, 555, + + 555, 555, 555, 556, 558, 558, 558, 560, 560, 561, + 561, 561, 561, 561, 561, 562, 563, 565, 566, 568, + 568, 569, 570, 571, 571, 571, 573, 573, 573, 574, + 575, 575, 575, 577, 578, 579, 580, 582, 584, 585, + 587, 587, 588, 588, 588, 589, 589, 590, 591, 591, + 591, 591, 593, 593, 593, 594, 594, 594, 594, 594, + 595, 596, 597, 599, 600, 600, 600, 600, 600, 600, + 601, 602, 604, 605, 607, 608, 608, 608, 608, 608, + 608, 608, 609, 609, 609, 609, 609, 610, 611, 611, + 611, 611, 611, 612, 613, 613, 613, 613, 613, 614, + + 614, 614, 614, 615, 616, 618, 618, 618, 618, 618, + 619, 619, 620, 622, 622, 622, 622, 622, 623, 624, + 624, 624, 624, 624, 625, 626, 627, 627, 627, 627, + 627, 627, 628, 629, 629, 629, 629, 629, 630, 631, + 632, 633, 633, 633, 633, 633, 633, 635, 635, 635, + 635, 635, 636, 637, 639, 639, 639, 640, 640, 641, + 641, 642, 642, 642, 644, 644, 645, 646, 646, 646, + 646, 646, 648, 648, 648, 648, 648, 648, 648, 648, + 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, + 648, 648, 648, 648, 649, 650, 650 + } ; static yyconst int yy_ec[256] = @@ -452,15 +452,15 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 6, 7, 8, 1, 9, 10, 11, 12, 13, 1, 14, 15, 16, 17, 18, 19, - 20, 20, 20, 20, 20, 20, 21, 22, 23, 1, - 24, 1, 1, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 34, 44, 34, 45, 46, 34, 34, - 47, 1, 48, 1, 49, 1, 50, 51, 52, 53, - - 54, 55, 56, 57, 58, 34, 59, 60, 61, 62, - 63, 64, 41, 65, 66, 67, 68, 34, 69, 46, - 70, 34, 71, 1, 72, 1, 1, 1, 1, 1, + 20, 20, 20, 20, 20, 20, 20, 21, 22, 1, + 23, 1, 1, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 33, 34, 35, 36, 37, 38, 34, + 34, 39, 40, 33, 41, 33, 42, 43, 33, 33, + 44, 1, 45, 1, 46, 1, 47, 48, 49, 50, + + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 68, 72, 1, 73, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -477,694 +477,707 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[73] = +static yyconst int yy_meta[74] = { 0, 1, 2, 3, 2, 1, 1, 1, 1, 4, 5, - 6, 1, 1, 7, 1, 1, 4, 8, 8, 8, - 4, 9, 1, 10, 1, 4, 11, 4, 4, 4, - 4, 4, 4, 4, 11, 4, 4, 11, 12, 12, - 11, 11, 4, 4, 4, 7, 1, 1, 1, 13, - 14, 13, 13, 15, 13, 13, 13, 4, 11, 4, - 4, 11, 12, 12, 11, 4, 4, 4, 4, 4, - 1, 1 + 6, 1, 7, 8, 1, 1, 9, 9, 9, 9, + 10, 1, 11, 1, 12, 12, 12, 12, 12, 12, + 12, 12, 13, 12, 13, 13, 12, 12, 12, 13, + 13, 12, 14, 1, 1, 1, 15, 15, 15, 15, + 16, 15, 15, 15, 15, 15, 15, 15, 17, 18, + 18, 18, 18, 18, 17, 17, 17, 17, 17, 19, + 17, 1, 1 } ; -static yyconst short int yy_base[787] = +static yyconst short int yy_base[784] = { 0, - 0, 72, 2588, 4394, 119, 129, 0, 141, 2583, 139, - 150, 171, 238, 2583, 257, 2527, 2518, 117, 159, 2518, - 2530, 190, 142, 233, 191, 2512, 239, 317, 376, 420, - 125, 205, 193, 114, 243, 120, 204, 331, 2574, 174, - 353, 476, 258, 260, 543, 244, 282, 346, 311, 334, - 256, 312, 365, 595, 331, 351, 354, 644, 688, 242, - 348, 327, 365, 386, 303, 392, 552, 2521, 432, 0, - 2566, 258, 557, 282, 4394, 2562, 393, 320, 2556, 2554, - 2552, 342, 442, 2551, 457, 364, 605, 2550, 0, 2562, - 4394, 576, 530, 617, 732, 625, 661, 449, 2514, 2509, - - 2512, 2517, 2492, 2493, 2490, 2517, 2515, 463, 572, 2503, - 2494, 2489, 2502, 789, 372, 861, 4394, 669, 924, 705, - 713, 468, 980, 765, 1032, 773, 789, 1076, 481, 637, - 2486, 2485, 390, 2475, 830, 2542, 2541, 383, 2540, 617, - 593, 546, 858, 874, 406, 579, 432, 865, 1120, 1005, - 505, 683, 726, 727, 621, 872, 870, 876, 603, 873, - 905, 665, 891, 884, 882, 973, 1168, 1013, 1049, 936, - 1225, 1057, 1277, 1093, 1101, 1321, 641, 983, 928, 930, - 896, 2478, 538, 543, 612, 2531, 622, 1030, 1221, 2528, - 2466, 4394, 2532, 2531, 2529, 2518, 2527, 2526, 0, 4394, - - 2525, 2524, 2523, 2521, 2520, 443, 2465, 2459, 2471, 2466, - 668, 709, 594, 1218, 732, 753, 756, 1365, 2467, 2466, - 2446, 803, 906, 2460, 2498, 0, 2453, 2449, 2441, 1422, - 689, 1069, 172, 1494, 790, 1251, 1294, 1302, 1415, 2496, - 838, 976, 1288, 1557, 1413, 1449, 678, 629, 910, 1338, - 1346, 992, 1105, 1502, 1057, 1609, 1182, 1100, 2492, 4394, - 1510, 996, 2501, 191, 2501, 1172, 960, 962, 1158, 831, - 2499, 1132, 1237, 889, 1482, 1300, 1653, 1176, 1228, 1010, - 1273, 1315, 1175, 1190, 0, 1204, 1531, 1071, 1710, 1774, - 1550, 1582, 1242, 1443, 1551, 1830, 1272, 1239, 1121, 1493, - - 1590, 1606, 1659, 1141, 1882, 1673, 1721, 1427, 1504, 2447, - 4394, 843, 1025, 2489, 4394, 1727, 2487, 2485, 2423, 2422, - 2475, 2474, 2473, 2473, 1010, 2472, 539, 2471, 1290, 1541, - 610, 2421, 2421, 2414, 2414, 0, 939, 1197, 0, 4394, - 4394, 1699, 1710, 1344, 2420, 2419, 885, 879, 1130, 1939, - 0, 2438, 2420, 2421, 2420, 0, 2011, 2083, 733, 949, - 1131, 1410, 2468, 2461, 1365, 4394, 2146, 1356, 1154, 689, - 1752, 1796, 1157, 715, 2417, 2406, 0, 1386, 0, 1564, - 2202, 1802, 1633, 2406, 1857, 2464, 1571, 1672, 2417, 2403, - 2462, 1187, 1451, 1003, 894, 1295, 1470, 1718, 1855, 1823, - - 1555, 1665, 1782, 1796, 2267, 1574, 1588, 1826, 1647, 1674, - 2339, 2460, 2411, 2475, 1840, 1858, 1608, 0, 2531, 1905, - 1956, 1857, 1728, 2409, 2451, 1639, 2450, 2385, 2445, 2383, - 2443, 2381, 2434, 1281, 2399, 2395, 2395, 2390, 1389, 4394, - 2587, 2443, 1146, 1916, 2442, 1281, 2415, 2390, 0, 2652, - 2724, 2378, 2378, 2428, 1322, 1883, 4394, 2426, 1966, 1457, - 2002, 2076, 2419, 1428, 952, 4394, 2375, 2364, 0, 2410, - 1544, 1774, 2396, 1877, 2392, 2347, 2341, 1521, 1030, 1255, - 2787, 1676, 1881, 1788, 1891, 1861, 2852, 2402, 2924, 1963, - 1841, 1944, 2402, 1691, 1649, 1816, 1235, 4394, 1979, 2393, - - 2392, 2330, 2329, 2389, 2388, 2326, 2325, 2385, 2381, 2319, - 2318, 2366, 2362, 2315, 2323, 1377, 2320, 1778, 2004, 2102, - 2355, 2310, 2348, 2304, 2287, 2326, 2288, 2289, 2264, 1524, - 2279, 4394, 1980, 4394, 2317, 4394, 4394, 2312, 2053, 2319, - 2268, 2261, 2315, 1999, 1555, 548, 1908, 1982, 1951, 1786, - 2301, 2043, 2029, 2297, 2054, 4394, 2243, 2158, 2289, 2284, - 2219, 2205, 2209, 4394, 2198, 2239, 4394, 2235, 2228, 2174, - 2228, 2182, 2157, 2174, 2105, 2086, 0, 2061, 2130, 2120, - 2054, 1040, 358, 2032, 2091, 2073, 2093, 1970, 2136, 2120, - 1988, 2029, 1542, 1985, 1941, 1941, 1923, 884, 1858, 1831, - - 2996, 1815, 1772, 1768, 1617, 651, 3068, 2150, 2149, 1757, - 1745, 1725, 4394, 1623, 1924, 2045, 3140, 2054, 0, 1631, - 1594, 1302, 1202, 3212, 2158, 2066, 2040, 2177, 1577, 1531, - 2110, 1524, 1496, 1455, 1427, 1308, 1895, 2162, 1448, 1422, - 2179, 1319, 1298, 2163, 2154, 1285, 1115, 1083, 1117, 1726, - 1576, 2196, 2198, 1062, 984, 2193, 2056, 930, 2153, 2166, - 0, 902, 804, 803, 1618, 2210, 2238, 0, 2213, 583, - 4394, 497, 2199, 486, 4394, 426, 460, 4394, 2116, 2203, - 2254, 2231, 392, 317, 1804, 2255, 2281, 239, 2027, 829, - 2006, 2117, 2293, 2295, 2298, 2299, 2303, 2317, 2321, 2322, - - 2323, 2365, 2366, 2369, 2370, 2371, 2233, 154, 4394, 4394, - 3281, 3296, 3311, 3326, 3341, 3353, 3368, 3383, 3397, 3412, - 3427, 3442, 3457, 3472, 3487, 3502, 3517, 3532, 3547, 3562, - 3577, 3592, 3607, 3622, 3633, 3648, 3663, 3678, 3693, 3708, - 3723, 3738, 3753, 3768, 3783, 3792, 3807, 3822, 3837, 3852, - 3867, 3882, 3897, 3908, 3923, 3938, 3953, 3968, 3983, 3998, - 4013, 4028, 4043, 4058, 4073, 4088, 4103, 4118, 4133, 4148, - 4163, 4174, 4188, 4203, 4218, 4233, 4244, 4258, 4273, 4288, - 4303, 4318, 4333, 4348, 4363, 4378 + 0, 73, 2729, 4517, 122, 131, 0, 142, 2724, 140, + 151, 171, 162, 2724, 231, 159, 2672, 2661, 119, 2660, + 2673, 143, 2668, 2652, 211, 301, 361, 212, 209, 279, + 243, 284, 301, 286, 221, 303, 309, 329, 2670, 239, + 2665, 2649, 338, 403, 2710, 149, 380, 475, 348, 190, + 538, 240, 2659, 2648, 236, 2650, 2663, 157, 2658, 2642, + 379, 600, 314, 353, 377, 395, 401, 413, 382, 408, + 513, 424, 516, 423, 562, 448, 544, 607, 612, 2654, + 468, 0, 2696, 309, 617, 174, 4517, 2692, 672, 246, + 353, 2686, 2686, 2680, 517, 661, 2680, 576, 280, 655, + + 2679, 0, 2692, 4517, 0, 696, 0, 741, 0, 580, + 644, 586, 622, 2645, 2640, 2592, 2592, 692, 2617, 2616, + 714, 2606, 680, 720, 2592, 2606, 811, 537, 884, 4517, + 911, 961, 0, 986, 1035, 687, 753, 757, 2584, 2588, + 2587, 2582, 2591, 318, 2568, 825, 2636, 2635, 430, 2634, + 747, 820, 253, 830, 1085, 160, 563, 455, 1148, 1193, + 2633, 784, 843, 850, 760, 603, 692, 844, 854, 2596, + 657, 858, 893, 862, 893, 658, 1217, 1267, 2629, 1292, + 1342, 913, 926, 1157, 831, 894, 915, 918, 895, 845, + 2568, 464, 487, 538, 2620, 556, 1162, 1073, 2619, 2556, + + 4517, 1146, 1209, 2624, 2623, 2622, 2611, 2620, 2619, 0, + 4517, 2618, 2616, 2615, 2614, 2613, 384, 1029, 1062, 1078, + 1367, 1147, 1145, 1167, 1412, 2558, 2551, 2564, 2559, 1240, + 1422, 2540, 756, 651, 2557, 2593, 2551, 2547, 1214, 1482, + 722, 1208, 761, 1555, 1619, 0, 1624, 0, 2594, 2592, + 2591, 1174, 1426, 1490, 1673, 2591, 2589, 560, 2550, 2549, + 2583, 2530, 4517, 1499, 1039, 2591, 725, 2587, 928, 845, + 592, 917, 642, 2585, 1156, 1503, 1716, 2584, 1516, 1761, + 1531, 1564, 1470, 1565, 1464, 1429, 1580, 1490, 1566, 1598, + 1831, 1896, 1901, 2583, 1582, 2573, 1613, 1950, 1587, 1676, + + 1588, 1614, 1581, 1149, 1539, 2528, 4517, 775, 799, 2562, + 4517, 1709, 2557, 2556, 2493, 2492, 1202, 1709, 2546, 2545, + 2544, 2544, 615, 2543, 744, 2542, 1099, 1674, 832, 4517, + 2535, 1719, 2534, 2533, 1955, 1622, 4517, 1410, 2490, 2490, + 2487, 2487, 2494, 2493, 778, 892, 920, 2013, 0, 2511, + 2495, 2496, 2495, 0, 2086, 2159, 940, 1210, 1233, 1309, + 2540, 2533, 1434, 4517, 1776, 1424, 2529, 910, 1615, 1616, + 2528, 1173, 4517, 2476, 0, 2476, 1842, 2532, 1727, 1735, + 2488, 2473, 2530, 1003, 1736, 904, 599, 1216, 1523, 2186, + 2528, 1847, 1726, 1767, 1880, 1771, 2244, 1522, 1813, 1849, + + 1848, 1862, 2317, 2527, 2390, 2029, 1869, 1879, 1713, 2021, + 1747, 2479, 2517, 1595, 2500, 1809, 2511, 2443, 2504, 2441, + 2500, 2433, 2460, 1869, 4517, 2454, 2427, 2423, 2423, 2418, + 2468, 1049, 2006, 2467, 1075, 2440, 2410, 0, 2497, 2570, + 2400, 2394, 2448, 1341, 1756, 4517, 2446, 1803, 1343, 1491, + 1768, 2439, 2438, 1416, 4517, 2386, 0, 2425, 1871, 2421, + 1240, 2416, 2373, 2366, 1454, 1718, 1473, 2635, 1888, 2044, + 1889, 2042, 2023, 2678, 2425, 1990, 1886, 2052, 2063, 2425, + 1870, 1899, 1958, 1000, 4517, 2095, 1777, 2416, 2415, 2351, + 2350, 2411, 2410, 2347, 2346, 2407, 2406, 2343, 2342, 2393, + + 2388, 1840, 2017, 2382, 2320, 2326, 2011, 2298, 2303, 2338, + 2296, 2275, 2316, 2293, 2302, 2270, 2018, 2264, 4517, 2117, + 4517, 2296, 4517, 2290, 2119, 2300, 2251, 2231, 2282, 1960, + 1445, 289, 2107, 2108, 2114, 2068, 2281, 2125, 2131, 2280, + 2139, 4517, 2227, 2176, 2262, 2267, 2258, 4517, 2187, 2173, + 2177, 4517, 2166, 2214, 2211, 2157, 2198, 2148, 2103, 2111, + 2085, 2098, 0, 2077, 2196, 2071, 2002, 827, 1575, 2168, + 2135, 2063, 2170, 2136, 2164, 2203, 2000, 2014, 1683, 1939, + 1931, 2030, 1944, 1630, 1954, 1906, 2751, 1919, 1917, 1913, + 1385, 1565, 2824, 2249, 2204, 1850, 1863, 1832, 4517, 1806, + + 1637, 1912, 2897, 1920, 0, 1775, 1762, 1585, 945, 2970, + 2096, 1949, 2188, 2207, 1772, 1743, 2250, 1745, 1677, 1563, + 1551, 1686, 681, 2260, 1568, 1502, 2258, 1408, 1406, 2243, + 2170, 1358, 1313, 1240, 1258, 1751, 1127, 2261, 2312, 1072, + 926, 2279, 2133, 809, 1969, 2073, 0, 855, 705, 711, + 1429, 2317, 2305, 0, 2284, 631, 4517, 546, 2094, 480, + 4517, 413, 392, 4517, 1794, 2351, 2357, 2298, 325, 206, + 1884, 2303, 2352, 203, 1915, 365, 2138, 2221, 2364, 2365, + 2369, 2370, 2371, 2372, 2373, 2427, 2444, 2451, 2452, 2453, + 2454, 2456, 2296, 179, 4517, 4517, 3040, 3059, 3072, 3086, + + 3105, 3124, 3140, 3159, 3178, 3196, 1267, 1342, 1671, 3214, + 3233, 1702, 3252, 3271, 3290, 3309, 3328, 3347, 3366, 3385, + 3404, 3416, 3435, 3454, 3473, 3492, 3511, 3519, 1896, 3529, + 3545, 3564, 3580, 3599, 3618, 3637, 3656, 3675, 3694, 3713, + 3732, 3744, 3763, 3782, 3801, 3820, 3839, 3858, 3877, 3893, + 3908, 3924, 3943, 3962, 3981, 3997, 4016, 4035, 4054, 4073, + 4092, 4111, 4130, 4149, 4168, 4187, 4206, 4225, 4244, 4259, + 4278, 4297, 4316, 4331, 4345, 4364, 4383, 4402, 4421, 4440, + 4459, 4478, 4497 } ; -static yyconst short int yy_def[787] = +static yyconst short int yy_def[784] = { 0, - 710, 710, 710, 710, 710, 710, 711, 712, 710, 710, - 711, 710, 12, 713, 711, 711, 711, 711, 15, 711, - 711, 15, 711, 711, 15, 711, 711, 714, 711, 15, - 29, 29, 29, 29, 29, 29, 711, 715, 710, 716, - 716, 710, 42, 713, 716, 716, 716, 716, 45, 716, - 716, 45, 716, 716, 45, 716, 716, 716, 45, 58, - 58, 58, 58, 58, 58, 716, 715, 710, 710, 711, - 717, 718, 717, 710, 710, 710, 710, 711, 710, 711, - 710, 719, 719, 711, 719, 710, 12, 710, 711, 713, - 710, 710, 711, 710, 711, 710, 710, 95, 711, 711, - - 711, 711, 711, 711, 711, 711, 711, 711, 95, 711, - 711, 711, 720, 714, 720, 721, 710, 711, 711, 710, - 711, 711, 711, 711, 119, 710, 711, 123, 95, 711, - 711, 711, 715, 722, 715, 710, 723, 716, 710, 716, - 716, 710, 716, 42, 710, 716, 724, 716, 148, 710, - 149, 716, 716, 716, 716, 716, 716, 716, 716, 716, - 716, 149, 716, 716, 716, 148, 148, 710, 148, 716, - 716, 148, 167, 710, 148, 171, 149, 716, 716, 716, - 715, 710, 717, 725, 725, 726, 727, 717, 717, 728, - 729, 710, 710, 710, 710, 711, 711, 710, 711, 710, - - 710, 710, 710, 711, 710, 710, 710, 710, 710, 710, - 711, 710, 95, 710, 711, 710, 710, 711, 711, 711, - 711, 711, 711, 711, 711, 218, 711, 711, 711, 730, - 731, 732, 733, 734, 123, 710, 711, 710, 710, 711, - 711, 711, 735, 711, 710, 710, 711, 711, 123, 711, - 710, 711, 711, 735, 123, 244, 711, 711, 711, 710, - 715, 710, 736, 710, 737, 716, 716, 716, 716, 738, - 736, 739, 716, 149, 710, 716, 149, 716, 716, 716, - 716, 716, 716, 716, 277, 716, 716, 716, 740, 716, - 716, 710, 716, 716, 716, 290, 716, 716, 290, 291, - - 710, 716, 716, 290, 296, 716, 716, 716, 715, 710, - 710, 741, 741, 742, 710, 743, 744, 744, 745, 745, - 710, 710, 710, 711, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 711, 746, 710, 711, 710, - 710, 711, 710, 711, 711, 711, 711, 710, 711, 747, - 711, 711, 711, 711, 711, 748, 749, 749, 750, 750, - 751, 752, 753, 710, 710, 710, 711, 754, 710, 710, - 710, 710, 711, 711, 710, 710, 711, 710, 367, 754, - 367, 711, 711, 711, 715, 710, 710, 710, 710, 710, - 755, 710, 716, 756, 756, 716, 716, 291, 710, 716, - - 716, 716, 716, 716, 757, 716, 716, 716, 716, 716, - 758, 748, 758, 716, 716, 716, 716, 414, 414, 716, - 716, 716, 715, 710, 759, 760, 761, 762, 763, 764, - 765, 766, 710, 710, 710, 710, 710, 710, 710, 710, - 711, 711, 711, 710, 711, 710, 711, 711, 767, 768, - 768, 711, 711, 711, 769, 770, 710, 771, 710, 772, - 710, 710, 711, 710, 710, 710, 710, 710, 711, 710, - 772, 715, 710, 710, 710, 710, 710, 773, 774, 774, - 414, 716, 716, 716, 716, 716, 775, 767, 775, 716, - 716, 716, 776, 716, 716, 715, 710, 710, 760, 761, - - 761, 762, 762, 763, 763, 764, 764, 765, 765, 766, - 766, 710, 710, 710, 710, 710, 710, 777, 710, 710, - 711, 711, 778, 710, 710, 710, 710, 711, 711, 711, - 711, 710, 710, 710, 710, 710, 710, 710, 715, 710, - 710, 710, 773, 773, 774, 774, 716, 716, 716, 716, - 779, 716, 716, 776, 715, 710, 710, 760, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 778, 778, 710, - 710, 710, 710, 711, 711, 711, 711, 711, 715, 710, - 710, 774, 774, 716, 716, 779, 716, 716, 716, 715, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - - 780, 711, 710, 710, 774, 774, 781, 716, 715, 710, - 710, 710, 710, 710, 782, 782, 780, 617, 711, 710, - 710, 774, 774, 781, 782, 624, 716, 715, 710, 710, - 782, 617, 617, 710, 710, 774, 774, 783, 624, 624, - 715, 710, 710, 782, 782, 617, 617, 710, 710, 774, - 774, 783, 783, 624, 624, 715, 710, 710, 782, 782, - 617, 784, 710, 785, 774, 783, 783, 624, 715, 710, - 710, 710, 782, 784, 710, 710, 785, 710, 774, 783, - 783, 715, 710, 710, 774, 783, 715, 710, 774, 715, - 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, - - 786, 786, 786, 786, 786, 786, 786, 710, 710, 0, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710 + 696, 696, 696, 696, 696, 696, 697, 698, 696, 699, + 697, 696, 12, 700, 697, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 701, 697, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 697, 697, + 697, 697, 697, 702, 696, 703, 703, 696, 48, 700, + 703, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 703, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 703, 703, 703, 703, 703, 702, 696, + 696, 697, 704, 705, 704, 696, 696, 696, 696, 696, + 697, 696, 697, 696, 706, 706, 697, 706, 696, 12, + + 696, 697, 700, 696, 707, 697, 708, 697, 709, 108, + 696, 108, 108, 697, 697, 697, 697, 108, 106, 697, + 108, 697, 108, 108, 697, 710, 701, 710, 711, 696, + 697, 696, 712, 697, 697, 697, 697, 697, 697, 697, + 697, 697, 697, 702, 713, 702, 696, 714, 703, 696, + 703, 703, 696, 703, 696, 696, 703, 715, 703, 159, + 709, 160, 160, 160, 703, 703, 703, 703, 160, 159, + 703, 160, 703, 160, 160, 703, 159, 696, 712, 159, + 696, 703, 703, 703, 703, 703, 703, 703, 703, 702, + 696, 716, 717, 717, 718, 719, 716, 716, 720, 721, + + 696, 722, 722, 696, 696, 696, 697, 697, 696, 697, + 696, 696, 696, 696, 697, 696, 696, 696, 697, 696, + 697, 722, 697, 696, 697, 696, 696, 696, 696, 697, + 697, 697, 697, 697, 697, 697, 697, 697, 697, 723, + 724, 725, 726, 727, 697, 728, 697, 729, 728, 697, + 247, 697, 730, 730, 697, 254, 697, 697, 697, 697, + 697, 697, 696, 702, 696, 731, 696, 732, 733, 733, + 733, 733, 734, 731, 735, 733, 733, 222, 733, 277, + 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, + 736, 733, 277, 729, 733, 293, 733, 292, 733, 733, + + 733, 733, 733, 733, 702, 696, 696, 737, 737, 738, + 696, 739, 740, 740, 741, 741, 696, 742, 696, 696, + 696, 697, 696, 696, 696, 696, 696, 696, 696, 696, + 697, 742, 697, 696, 697, 332, 696, 697, 696, 696, + 696, 696, 697, 697, 697, 696, 697, 743, 697, 697, + 697, 697, 697, 744, 745, 745, 746, 746, 747, 748, + 749, 696, 696, 696, 750, 751, 696, 696, 751, 751, + 697, 697, 696, 696, 697, 697, 702, 696, 696, 696, + 696, 696, 752, 696, 733, 753, 753, 733, 733, 293, + 336, 733, 733, 733, 733, 733, 754, 733, 733, 733, + + 733, 733, 755, 744, 755, 756, 733, 733, 733, 733, + 702, 696, 757, 758, 696, 696, 759, 760, 761, 762, + 763, 764, 696, 696, 696, 697, 696, 696, 696, 696, + 697, 697, 696, 697, 696, 697, 697, 765, 766, 766, + 697, 697, 697, 767, 768, 696, 769, 696, 770, 770, + 770, 697, 696, 696, 696, 696, 697, 696, 702, 696, + 696, 696, 696, 696, 771, 772, 772, 733, 733, 733, + 733, 733, 733, 754, 765, 474, 733, 733, 733, 773, + 733, 733, 702, 696, 696, 758, 774, 759, 759, 760, + 760, 761, 761, 762, 762, 763, 763, 764, 764, 696, + + 696, 774, 774, 697, 696, 696, 696, 696, 697, 775, + 696, 696, 696, 696, 697, 697, 697, 697, 696, 696, + 696, 696, 696, 696, 702, 696, 696, 696, 771, 771, + 772, 772, 733, 733, 733, 733, 776, 733, 733, 773, + 702, 696, 696, 758, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 775, 775, 696, 696, 696, 696, 697, + 697, 697, 697, 697, 702, 696, 696, 772, 772, 733, + 733, 776, 733, 733, 733, 702, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 777, 697, 696, 696, + 772, 772, 778, 733, 702, 696, 696, 696, 696, 696, + + 779, 779, 777, 603, 697, 696, 696, 772, 772, 778, + 779, 610, 733, 702, 696, 696, 779, 603, 603, 696, + 696, 772, 772, 780, 610, 610, 702, 696, 696, 779, + 779, 603, 603, 696, 696, 772, 772, 780, 780, 610, + 610, 702, 696, 696, 779, 779, 603, 781, 696, 782, + 772, 780, 780, 610, 702, 696, 696, 696, 779, 781, + 696, 696, 782, 696, 772, 780, 780, 702, 696, 696, + 772, 780, 702, 696, 772, 702, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 696, 696, 0, 696, 696, 696, 696, + + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696 } ; -static yyconst short int yy_nxt[4467] = +static yyconst short int yy_nxt[4591] = { 0, 4, 4, 4, 5, 4, 4, 6, 4, 7, 8, 4, 9, 10, 7, 4, 4, 11, 12, 13, 13, - 13, 4, 14, 4, 4, 7, 15, 16, 17, 7, - 7, 18, 7, 7, 19, 20, 21, 22, 23, 24, - 22, 25, 26, 7, 27, 7, 28, 4, 4, 29, - 30, 31, 32, 33, 34, 35, 36, 7, 19, 20, - 21, 22, 37, 24, 25, 26, 7, 7, 27, 7, - 38, 4, 4, 4, 4, 5, 4, 39, 6, 39, - 7, 8, 4, 9, 10, 40, 4, 4, 41, 42, - 43, 43, 43, 4, 44, 4, 4, 40, 45, 46, - - 47, 40, 40, 48, 40, 40, 49, 50, 51, 52, - 53, 54, 52, 55, 56, 40, 57, 40, 28, 4, - 4, 58, 59, 60, 61, 62, 63, 64, 65, 40, - 49, 50, 51, 52, 66, 54, 55, 56, 40, 40, - 57, 40, 67, 4, 68, 69, 69, 69, 69, 69, - 72, 75, 76, 77, 102, 106, 709, 73, 73, 73, - 73, 73, 710, 78, 122, 79, 80, 123, 68, 123, - 122, 81, 82, 82, 83, 123, 362, 123, 103, 70, - 107, 130, 70, 710, 84, 85, 86, 87, 87, 87, - 87, 87, 88, 710, 710, 139, 70, 89, 70, 70, - - 70, 70, 70, 70, 70, 89, 70, 70, 89, 89, - 89, 89, 89, 70, 70, 70, 70, 131, 70, 363, - 89, 89, 89, 89, 89, 89, 89, 89, 70, 89, - 70, 70, 89, 89, 89, 89, 70, 70, 70, 70, - 70, 82, 92, 122, 109, 123, 389, 123, 94, 70, - 70, 70, 70, 710, 390, 122, 123, 97, 123, 710, - 92, 82, 91, 147, 70, 139, 132, 186, 187, 101, - 93, 138, 94, 710, 95, 95, 95, 139, 96, 139, - 102, 97, 108, 108, 108, 108, 108, 108, 108, 108, - 70, 190, 662, 122, 171, 111, 112, 123, 178, 123, - - 153, 112, 93, 139, 103, 158, 98, 98, 98, 98, - 98, 98, 98, 98, 710, 710, 99, 113, 114, 114, - 114, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 115, 113, 113, 134, 710, 710, 196, 197, 113, 113, - 113, 113, 70, 82, 82, 82, 154, 135, 135, 135, - 135, 135, 191, 170, 70, 139, 77, 92, 171, 70, - 91, 70, 70, 113, 117, 113, 140, 139, 79, 141, - 138, 138, 139, 70, 142, 139, 688, 170, 159, 171, - 205, 171, 206, 155, 162, 231, 139, 113, 113, 118, - 138, 70, 134, 119, 119, 119, 157, 120, 170, 171, - - 70, 171, 136, 160, 139, 179, 193, 156, 194, 265, - 164, 165, 154, 139, 195, 170, 165, 163, 171, 117, - 171, 121, 205, 155, 606, 122, 123, 122, 122, 122, - 122, 122, 122, 124, 271, 272, 170, 125, 125, 125, - 171, 126, 171, 82, 82, 82, 330, 156, 69, 69, - 69, 69, 69, 556, 180, 201, 331, 202, 82, 82, - 82, 136, 678, 203, 331, 127, 218, 218, 218, 128, - 129, 128, 129, 129, 129, 129, 129, 82, 82, 83, - 226, 226, 226, 684, 70, 244, 244, 244, 675, 143, - 85, 86, 144, 144, 144, 144, 144, 145, 256, 256, - - 256, 138, 146, 138, 138, 138, 138, 138, 138, 138, - 146, 138, 138, 146, 146, 146, 146, 146, 138, 138, - 138, 138, 277, 277, 277, 146, 146, 146, 146, 146, - 146, 146, 146, 138, 146, 138, 138, 146, 146, 146, - 146, 138, 138, 138, 138, 138, 92, 184, 311, 265, - 91, 70, 186, 312, 134, 205, 148, 206, 94, 683, - 149, 149, 149, 198, 150, 181, 184, 97, 135, 135, - 135, 135, 135, 188, 188, 188, 188, 188, 189, 211, - 211, 211, 211, 211, 211, 211, 211, 70, 148, 218, - 218, 218, 151, 151, 151, 151, 151, 151, 151, 151, - - 139, 70, 152, 70, 207, 583, 208, 70, 82, 268, - 94, 70, 209, 433, 139, 710, 139, 210, 70, 97, - 710, 186, 312, 136, 139, 70, 710, 434, 207, 70, - 208, 314, 315, 266, 267, 671, 209, 227, 139, 70, - 210, 284, 139, 376, 161, 161, 161, 161, 161, 161, - 161, 161, 70, 91, 244, 244, 244, 166, 305, 305, - 305, 167, 167, 167, 281, 168, 212, 212, 212, 212, - 212, 212, 212, 212, 216, 216, 216, 216, 216, 216, - 216, 216, 277, 277, 277, 336, 336, 336, 375, 169, - 220, 70, 377, 170, 171, 170, 170, 170, 170, 170, - - 170, 172, 360, 376, 139, 173, 173, 173, 623, 174, - 217, 217, 217, 217, 217, 217, 217, 217, 235, 235, - 235, 235, 235, 235, 235, 235, 337, 337, 337, 468, - 286, 248, 278, 175, 70, 70, 117, 176, 177, 176, - 177, 177, 177, 177, 177, 213, 360, 139, 139, 339, - 339, 339, 466, 214, 243, 243, 243, 243, 243, 243, - 243, 243, 123, 123, 123, 123, 123, 123, 123, 123, - 340, 340, 340, 341, 341, 341, 280, 213, 469, 279, - 117, 215, 215, 215, 215, 215, 215, 215, 215, 113, - 114, 114, 114, 113, 113, 113, 113, 113, 113, 113, - - 113, 113, 113, 113, 113, 678, 348, 70, 70, 70, - 113, 113, 113, 113, 249, 249, 249, 249, 249, 249, - 249, 249, 254, 254, 254, 254, 254, 254, 254, 254, - 349, 691, 134, 271, 272, 113, 117, 113, 255, 255, - 255, 255, 255, 255, 255, 255, 135, 135, 135, 135, - 135, 261, 314, 315, 349, 367, 367, 367, 676, 113, - 113, 113, 232, 232, 232, 233, 70, 113, 113, 113, - 113, 113, 113, 70, 269, 113, 113, 82, 70, 139, - 70, 70, 113, 113, 70, 113, 139, 138, 444, 710, - 70, 139, 70, 139, 139, 139, 91, 139, 134, 70, - - 136, 136, 138, 139, 675, 139, 446, 113, 117, 309, - 139, 268, 139, 70, 273, 273, 273, 273, 273, 273, - 273, 273, 285, 285, 285, 524, 139, 336, 336, 336, - 446, 113, 113, 236, 138, 282, 70, 237, 70, 281, - 287, 288, 283, 289, 70, 238, 445, 239, 524, 139, - 240, 139, 343, 296, 296, 296, 480, 139, 240, 350, - 343, 240, 455, 325, 240, 240, 468, 136, 70, 237, - 70, 350, 350, 241, 242, 241, 241, 241, 241, 241, - 241, 139, 240, 139, 343, 240, 366, 672, 240, 245, - 308, 70, 268, 367, 367, 367, 117, 244, 244, 244, - - 296, 296, 296, 246, 139, 91, 247, 386, 265, 379, - 379, 379, 387, 388, 247, 537, 265, 247, 70, 427, - 247, 247, 290, 290, 290, 290, 290, 290, 290, 290, - 247, 139, 91, 248, 314, 315, 279, 668, 247, 184, - 311, 247, 91, 605, 247, 250, 188, 188, 188, 188, - 188, 189, 479, 251, 216, 216, 216, 216, 216, 216, - 216, 216, 243, 243, 243, 243, 243, 243, 243, 243, - 232, 232, 232, 233, 381, 381, 381, 250, 403, 70, - 428, 252, 253, 252, 252, 252, 252, 252, 252, 213, - 545, 668, 139, 256, 256, 256, 265, 214, 171, 171, - - 171, 171, 171, 171, 171, 171, 299, 299, 299, 299, - 299, 299, 299, 299, 376, 366, 117, 339, 339, 339, - 663, 213, 379, 379, 379, 215, 257, 215, 215, 258, - 215, 215, 215, 274, 91, 362, 662, 410, 396, 396, - 396, 275, 254, 254, 254, 254, 254, 254, 254, 254, - 304, 304, 304, 304, 304, 304, 304, 304, 419, 419, - 419, 329, 447, 377, 375, 274, 70, 467, 661, 276, - 276, 276, 276, 276, 276, 276, 276, 236, 363, 139, - 70, 291, 522, 70, 70, 393, 448, 394, 478, 292, - 478, 239, 375, 139, 293, 395, 139, 139, 70, 339, - - 339, 339, 293, 407, 91, 293, 522, 370, 293, 293, - 374, 139, 70, 291, 440, 440, 440, 294, 295, 294, - 294, 294, 294, 294, 294, 139, 293, 401, 406, 293, - 184, 311, 293, 70, 245, 248, 70, 316, 316, 316, - 316, 316, 296, 296, 296, 70, 139, 70, 246, 139, - 70, 297, 366, 376, 396, 396, 396, 91, 139, 297, - 139, 408, 297, 139, 637, 297, 297, 338, 338, 338, - 338, 338, 338, 338, 338, 297, 348, 364, 298, 402, - 70, 70, 375, 297, 512, 364, 297, 556, 364, 297, - 300, 364, 364, 139, 139, 557, 513, 245, 301, 429, - - 404, 364, 417, 70, 91, 368, 368, 368, 70, 364, - 91, 246, 364, 526, 661, 364, 139, 397, 397, 397, - 546, 139, 300, 70, 404, 298, 302, 303, 302, 302, - 302, 302, 302, 302, 274, 455, 139, 527, 305, 305, - 305, 370, 275, 241, 241, 241, 241, 241, 241, 241, - 241, 365, 365, 365, 365, 365, 365, 365, 365, 636, - 430, 441, 441, 441, 658, 371, 274, 650, 405, 532, - 276, 306, 276, 276, 307, 276, 276, 276, 342, 372, - 405, 405, 460, 460, 460, 657, 343, 252, 252, 252, - 252, 252, 252, 252, 252, 378, 378, 378, 378, 378, - - 378, 378, 378, 471, 471, 471, 518, 518, 518, 465, - 342, 456, 456, 456, 344, 344, 344, 344, 344, 344, - 344, 344, 356, 356, 236, 356, 356, 356, 356, 356, - 563, 356, 356, 356, 356, 70, 356, 356, 467, 369, - 422, 364, 564, 356, 356, 356, 356, 369, 139, 364, - 369, 70, 364, 369, 369, 364, 364, 457, 245, 70, - 414, 414, 414, 369, 139, 364, 461, 268, 356, 356, - 356, 369, 139, 364, 369, 369, 364, 369, 70, 364, - 462, 465, 655, 369, 654, 265, 369, 358, 649, 369, - 369, 139, 356, 356, 113, 232, 232, 232, 233, 369, - - 113, 113, 113, 113, 113, 113, 134, 369, 113, 113, - 369, 245, 134, 369, 648, 113, 113, 423, 113, 380, - 380, 380, 544, 392, 544, 246, 385, 385, 385, 385, - 385, 338, 338, 338, 338, 338, 338, 338, 338, 70, - 113, 117, 302, 302, 302, 302, 302, 302, 302, 302, - 431, 431, 139, 461, 331, 370, 647, 91, 70, 70, - 646, 366, 331, 70, 113, 113, 371, 462, 414, 414, - 414, 139, 139, 371, 77, 136, 139, 576, 91, 665, - 372, 136, 70, 373, 473, 265, 79, 372, 643, 577, - 409, 373, 81, 265, 373, 139, 70, 373, 373, 294, - - 294, 294, 294, 294, 294, 294, 294, 373, 582, 139, - 374, 432, 432, 482, 70, 373, 70, 465, 373, 91, - 91, 373, 342, 418, 418, 418, 268, 139, 642, 139, - 343, 365, 365, 365, 365, 365, 365, 365, 365, 378, - 378, 378, 378, 378, 378, 378, 378, 468, 184, 498, - 441, 441, 441, 499, 342, 70, 635, 70, 344, 382, - 344, 344, 383, 344, 344, 344, 398, 70, 139, 366, - 139, 622, 679, 70, 399, 474, 418, 418, 418, 92, - 139, 70, 70, 375, 70, 475, 139, 86, 634, 630, - 397, 397, 397, 88, 139, 139, 469, 139, 398, 70, - - 491, 536, 400, 400, 400, 400, 400, 400, 400, 400, - 356, 356, 139, 356, 356, 356, 356, 356, 357, 356, - 356, 356, 356, 483, 356, 356, 298, 492, 91, 70, - 134, 412, 356, 356, 356, 376, 184, 311, 397, 397, - 397, 496, 139, 426, 426, 426, 426, 426, 344, 344, - 344, 344, 344, 344, 344, 344, 356, 356, 356, 439, - 439, 439, 439, 439, 439, 439, 439, 400, 400, 400, - 400, 400, 400, 400, 400, 413, 134, 613, 464, 664, - 356, 356, 70, 245, 417, 444, 464, 519, 539, 464, - 70, 444, 464, 464, 70, 139, 70, 246, 629, 136, - - 297, 520, 464, 139, 70, 371, 91, 139, 297, 139, - 464, 297, 467, 464, 297, 297, 464, 139, 134, 441, - 441, 441, 464, 556, 297, 621, 620, 298, 485, 555, - 464, 70, 297, 464, 70, 297, 464, 464, 297, 371, - 481, 481, 481, 484, 139, 540, 464, 139, 70, 70, - 467, 585, 486, 372, 464, 374, 415, 464, 265, 134, - 464, 139, 139, 689, 415, 70, 70, 415, 619, 70, - 415, 415, 468, 472, 472, 472, 472, 472, 139, 139, - 415, 490, 139, 416, 456, 456, 456, 136, 415, 70, - 201, 415, 202, 416, 415, 398, 615, 91, 203, 70, - - 615, 553, 139, 399, 439, 439, 439, 439, 439, 439, - 439, 439, 139, 70, 550, 467, 70, 548, 567, 268, - 549, 495, 481, 481, 481, 523, 139, 398, 136, 139, - 457, 400, 420, 400, 400, 421, 400, 400, 400, 449, - 449, 548, 449, 449, 449, 449, 449, 92, 449, 449, - 449, 449, 70, 449, 449, 631, 651, 524, 416, 70, - 449, 449, 449, 449, 70, 139, 525, 533, 533, 533, - 468, 70, 139, 481, 481, 481, 614, 139, 70, 631, - 524, 533, 533, 533, 139, 449, 449, 449, 184, 311, - 70, 139, 451, 584, 612, 558, 558, 558, 558, 558, - - 544, 392, 544, 139, 451, 451, 613, 596, 693, 449, - 449, 356, 356, 534, 356, 356, 356, 356, 356, 495, - 356, 356, 356, 356, 552, 356, 356, 534, 535, 91, - 566, 158, 356, 356, 356, 356, 535, 70, 566, 535, - 70, 566, 535, 535, 566, 566, 611, 560, 70, 610, - 139, 70, 535, 139, 566, 134, 134, 356, 356, 356, - 535, 139, 566, 535, 139, 566, 535, 590, 566, 579, - 579, 579, 579, 579, 607, 392, 631, 260, 589, 632, - 664, 356, 356, 356, 356, 461, 356, 356, 356, 356, - 356, 639, 356, 356, 356, 356, 587, 356, 356, 70, - - 631, 70, 535, 633, 356, 356, 356, 356, 588, 670, - 535, 519, 139, 535, 139, 640, 535, 535, 91, 693, - 604, 671, 134, 603, 136, 136, 535, 602, 566, 356, - 356, 356, 134, 609, 535, 644, 566, 535, 577, 566, - 535, 631, 566, 566, 70, 588, 579, 579, 579, 579, - 579, 134, 566, 356, 356, 461, 607, 139, 70, 645, - 566, 638, 628, 566, 392, 631, 566, 184, 498, 462, - 601, 139, 463, 685, 558, 558, 558, 558, 558, 134, - 463, 134, 673, 463, 631, 631, 463, 463, 260, 631, - 641, 136, 656, 653, 631, 134, 463, 631, 392, 659, - - 392, 540, 608, 627, 463, 392, 669, 463, 631, 631, - 463, 371, 392, 631, 660, 134, 601, 653, 631, 673, - 136, 631, 600, 666, 599, 372, 682, 653, 373, 653, - 631, 598, 686, 134, 653, 693, 373, 597, 569, 373, - 392, 653, 373, 373, 687, 569, 680, 667, 136, 567, - 136, 653, 373, 653, 631, 374, 392, 392, 653, 596, - 373, 564, 595, 373, 136, 653, 373, 449, 449, 653, - 449, 449, 449, 449, 449, 450, 449, 449, 449, 449, - 594, 449, 449, 134, 136, 653, 653, 593, 488, 449, - 449, 449, 592, 653, 690, 693, 591, 693, 681, 392, - - 693, 693, 136, 392, 708, 693, 694, 686, 695, 653, - 653, 696, 697, 449, 449, 449, 698, 392, 581, 693, - 489, 580, 262, 693, 693, 693, 537, 536, 578, 575, - 699, 574, 489, 489, 700, 701, 702, 449, 449, 356, - 356, 573, 356, 356, 356, 356, 356, 357, 356, 356, - 356, 356, 136, 356, 356, 572, 571, 570, 569, 105, - 412, 356, 356, 356, 260, 567, 260, 693, 693, 260, - 260, 693, 693, 693, 260, 565, 562, 561, 703, 704, - 560, 559, 705, 706, 707, 356, 356, 356, 260, 511, - 511, 509, 260, 260, 260, 509, 507, 507, 505, 505, - - 503, 503, 501, 501, 392, 551, 542, 541, 205, 356, - 356, 356, 356, 198, 356, 356, 356, 356, 356, 357, - 356, 356, 356, 356, 466, 356, 356, 538, 465, 536, - 459, 92, 412, 356, 356, 356, 260, 260, 531, 530, - 260, 260, 260, 529, 528, 444, 92, 517, 516, 515, - 514, 434, 511, 509, 507, 505, 503, 356, 356, 356, - 501, 187, 497, 493, 392, 477, 476, 74, 199, 470, - 370, 366, 459, 454, 453, 452, 199, 443, 442, 438, - 437, 356, 356, 70, 461, 436, 435, 205, 205, 199, - 198, 198, 198, 320, 320, 318, 139, 318, 462, 187, - - 424, 494, 264, 392, 264, 384, 366, 355, 354, 494, - 353, 352, 494, 351, 347, 494, 494, 346, 345, 335, - 334, 333, 332, 329, 329, 494, 328, 327, 326, 325, - 325, 324, 323, 494, 322, 321, 494, 320, 318, 494, - 371, 311, 310, 265, 264, 262, 260, 199, 259, 117, - 230, 229, 228, 199, 372, 225, 224, 415, 223, 222, - 222, 221, 220, 219, 91, 415, 205, 204, 415, 198, - 199, 415, 415, 198, 192, 184, 182, 137, 110, 105, - 104, 415, 101, 100, 416, 91, 74, 710, 710, 415, - 710, 710, 415, 710, 710, 415, 519, 710, 710, 710, - - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 520, 710, 710, 521, 710, 710, 710, 710, 710, 710, - 710, 521, 710, 710, 521, 710, 710, 521, 521, 710, - 710, 710, 710, 710, 710, 710, 710, 521, 710, 710, - 710, 710, 710, 710, 710, 521, 710, 710, 521, 710, - 710, 521, 449, 449, 710, 449, 449, 449, 449, 449, - 710, 449, 449, 449, 449, 710, 449, 449, 710, 710, - 710, 710, 710, 449, 449, 449, 449, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 449, 449, - - 449, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 449, 449, 449, 449, 710, 449, 449, 449, - 449, 449, 710, 449, 449, 449, 449, 710, 449, 449, - 710, 710, 710, 710, 710, 449, 449, 449, 449, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 449, 449, 449, 710, 710, 710, 710, 451, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 451, - 451, 710, 710, 710, 449, 449, 519, 710, 710, 710, - - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 520, 710, 710, 547, 710, 710, 710, 710, 710, 710, - 710, 547, 710, 710, 547, 710, 710, 547, 547, 710, - 710, 710, 710, 710, 710, 710, 710, 547, 710, 710, - 710, 710, 710, 710, 710, 547, 710, 710, 547, 710, - 710, 547, 449, 449, 710, 449, 449, 449, 449, 449, - 450, 449, 449, 449, 449, 710, 449, 449, 710, 710, - 710, 710, 710, 488, 449, 449, 449, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 449, 449, - - 449, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 449, 449, 449, 449, 710, 449, 449, 449, - 449, 449, 450, 449, 449, 449, 449, 710, 449, 449, - 710, 710, 710, 710, 710, 488, 449, 449, 449, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 449, 449, 449, 710, 710, 710, 710, 489, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 489, - 489, 710, 710, 710, 449, 449, 616, 616, 710, 616, - - 616, 616, 616, 616, 710, 616, 616, 616, 616, 710, - 616, 616, 710, 710, 710, 710, 710, 616, 616, 616, - 616, 710, 710, 710, 710, 710, 710, 618, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 616, 616, 616, 710, 710, 710, 710, 710, - 710, 618, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 616, 616, 616, 616, - 710, 616, 616, 616, 616, 616, 617, 616, 616, 616, - 616, 710, 616, 616, 710, 710, 710, 710, 710, 625, - 616, 616, 616, 710, 710, 710, 710, 710, 710, 626, + 4, 14, 4, 4, 15, 16, 17, 18, 15, 15, + 19, 15, 15, 15, 20, 21, 15, 22, 23, 24, + 15, 25, 15, 26, 4, 4, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 7, + 40, 7, 7, 41, 42, 7, 7, 7, 43, 7, + 7, 44, 4, 4, 4, 4, 5, 4, 45, 6, + 45, 7, 8, 4, 9, 10, 46, 4, 4, 47, + 48, 49, 49, 4, 50, 4, 4, 51, 52, 53, + + 54, 51, 51, 55, 51, 51, 51, 56, 57, 51, + 58, 59, 60, 51, 61, 51, 26, 4, 4, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 46, 75, 46, 46, 76, 77, 46, 46, + 46, 78, 46, 46, 79, 4, 80, 81, 81, 81, + 81, 84, 87, 88, 90, 115, 119, 82, 85, 85, + 85, 85, 111, 268, 91, 95, 92, 93, 80, 150, + 170, 94, 95, 95, 96, 82, 216, 696, 116, 82, + 120, 695, 696, 199, 97, 98, 99, 100, 100, 100, + 100, 101, 104, 158, 171, 102, 102, 102, 102, 102, + + 102, 102, 102, 82, 102, 82, 82, 102, 102, 102, + 82, 82, 102, 82, 111, 111, 112, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 82, + 102, 102, 102, 102, 102, 82, 82, 82, 82, 82, + 82, 82, 105, 111, 106, 200, 107, 108, 108, 108, + 108, 109, 140, 648, 105, 136, 268, 135, 135, 204, + 135, 205, 138, 674, 123, 124, 206, 136, 136, 137, + 209, 125, 166, 106, 135, 135, 135, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 136, + 136, 104, 135, 135, 135, 167, 216, 163, 217, 141, + + 106, 126, 127, 127, 127, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 128, 126, 126, 111, 195, 196, + 145, 126, 126, 126, 126, 136, 136, 135, 135, 135, + 136, 136, 136, 136, 135, 135, 135, 115, 135, 135, + 135, 111, 114, 569, 126, 130, 126, 136, 136, 136, + 136, 95, 135, 135, 135, 136, 136, 135, 135, 135, + 116, 149, 181, 696, 135, 135, 135, 677, 150, 207, + 208, 183, 126, 126, 131, 136, 136, 132, 132, 132, + 132, 133, 111, 90, 542, 135, 135, 328, 82, 117, + 147, 143, 125, 151, 664, 92, 152, 329, 125, 182, + + 153, 181, 181, 134, 329, 145, 184, 135, 135, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 146, + 146, 146, 146, 182, 182, 181, 181, 181, 182, 182, + 134, 82, 174, 175, 181, 181, 181, 147, 82, 176, + 165, 182, 182, 150, 181, 181, 181, 182, 182, 166, + 150, 181, 181, 181, 182, 182, 82, 274, 275, 182, + 182, 181, 181, 181, 181, 181, 181, 670, 150, 185, + 182, 182, 167, 193, 307, 147, 95, 95, 96, 181, + 181, 181, 661, 82, 81, 81, 81, 81, 154, 98, + 99, 155, 155, 155, 155, 156, 195, 308, 188, 157, + + 157, 157, 157, 157, 157, 157, 157, 149, 157, 149, + 149, 157, 157, 157, 149, 149, 157, 149, 95, 95, + 95, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 149, 157, 157, 157, 157, 157, 149, + 149, 149, 149, 149, 149, 149, 82, 195, 308, 105, + 241, 159, 82, 107, 160, 160, 160, 160, 161, 182, + 182, 105, 182, 182, 150, 310, 311, 181, 181, 181, + 82, 82, 181, 181, 374, 186, 168, 95, 95, 95, + 159, 130, 150, 150, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 225, 225, 225, 225, + + 82, 104, 225, 225, 225, 225, 669, 159, 82, 173, + 111, 82, 150, 177, 145, 82, 178, 178, 178, 178, + 179, 375, 187, 150, 417, 190, 193, 150, 146, 146, + 146, 146, 230, 197, 197, 197, 197, 198, 225, 225, + 225, 225, 180, 284, 274, 275, 181, 181, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 95, 467, + 189, 176, 95, 95, 95, 82, 82, 176, 82, 180, + 696, 226, 231, 227, 212, 696, 213, 150, 150, 228, + 657, 214, 229, 104, 147, 109, 418, 107, 202, 202, + 202, 202, 109, 226, 271, 227, 225, 225, 225, 225, + + 82, 348, 228, 255, 255, 255, 255, 229, 225, 225, + 225, 225, 150, 664, 109, 348, 348, 291, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 225, 225, 225, 225, 239, 358, 225, 225, 225, 225, + 637, 109, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 221, 82, 662, 235, 284, 346, + 216, 222, 217, 269, 270, 360, 130, 150, 82, 255, + 255, 255, 255, 255, 255, 255, 255, 381, 237, 240, + 150, 433, 347, 221, 310, 311, 382, 223, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 259, + + 280, 280, 280, 280, 347, 361, 283, 260, 310, 311, + 221, 126, 127, 127, 127, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 145, 82, 104, + 591, 126, 126, 126, 126, 423, 271, 434, 82, 82, + 150, 146, 146, 146, 146, 264, 272, 145, 323, 424, + 150, 150, 82, 82, 126, 130, 126, 661, 305, 280, + 280, 280, 280, 658, 150, 150, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 126, 126, 126, 242, 242, 242, 243, 281, + 126, 126, 126, 126, 126, 126, 286, 147, 126, 126, + + 282, 82, 82, 82, 126, 126, 104, 126, 285, 280, + 280, 280, 280, 150, 150, 150, 290, 147, 435, 286, + 327, 82, 288, 82, 374, 82, 82, 126, 130, 298, + 298, 298, 298, 150, 82, 150, 82, 150, 150, 289, + 435, 385, 298, 298, 298, 298, 150, 104, 150, 304, + 466, 436, 291, 358, 303, 126, 126, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 82, + 246, 373, 301, 437, 247, 271, 654, 82, 82, 82, + 82, 248, 288, 249, 130, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + + 250, 250, 250, 251, 465, 623, 465, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 247, 82, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 254, 330, 330, 330, 330, 542, + 378, 255, 255, 255, 255, 379, 380, 256, 543, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 331, 331, + 331, 331, 193, 307, 509, 258, 95, 95, 95, 312, + 312, 312, 312, 82, 332, 332, 332, 332, 149, 98, + + 654, 155, 155, 155, 155, 150, 513, 509, 419, 157, + 157, 157, 157, 157, 157, 157, 157, 149, 157, 149, + 149, 157, 157, 157, 149, 149, 157, 149, 514, 104, + 651, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 149, 157, 157, 157, 157, 157, 149, + 149, 149, 149, 149, 149, 149, 82, 82, 104, 222, + 696, 333, 333, 333, 333, 82, 222, 696, 150, 150, + 420, 193, 307, 298, 298, 298, 298, 150, 197, 197, + 197, 197, 198, 334, 334, 334, 334, 456, 222, 696, + 365, 365, 365, 365, 276, 276, 276, 276, 276, 276, + + 276, 276, 276, 276, 276, 276, 277, 302, 386, 242, + 242, 242, 243, 278, 402, 222, 696, 387, 415, 415, + 415, 415, 222, 444, 82, 318, 318, 318, 318, 222, + 333, 333, 333, 333, 457, 277, 150, 360, 337, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 222, 130, 212, 130, 213, 333, 333, 333, 333, + 214, 649, 277, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 82, 246, 361, 222, 353, + 293, 218, 218, 149, 149, 149, 149, 294, 343, 249, + 648, 295, 295, 295, 295, 295, 295, 295, 295, 295, + + 295, 295, 295, 295, 295, 295, 295, 295, 295, 296, + 445, 445, 445, 297, 297, 297, 297, 297, 297, 297, + 297, 297, 297, 297, 297, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 293, 149, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 82, 254, 450, 446, 444, 149, 220, 220, 298, 298, + 298, 298, 150, 647, 256, 451, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 519, 647, 104, 149, 149, + 149, 149, 300, 149, 149, 149, 149, 149, 149, 149, + + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 335, 426, 426, 426, 426, + 456, 104, 336, 369, 337, 254, 608, 82, 333, 333, + 333, 333, 366, 366, 366, 366, 370, 104, 256, 150, + 449, 449, 449, 449, 335, 530, 384, 530, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 344, 644, 82, 643, 454, 104, 368, 455, 82, 398, + 665, 335, 354, 354, 150, 354, 354, 354, 354, 354, + 150, 354, 354, 354, 354, 568, 354, 354, 82, 696, + + 696, 145, 354, 354, 354, 354, 696, 696, 696, 696, + 150, 82, 696, 696, 397, 377, 377, 377, 377, 388, + 388, 388, 388, 150, 82, 354, 354, 354, 397, 397, + 82, 82, 389, 389, 389, 389, 150, 532, 395, 82, + 696, 145, 150, 150, 400, 425, 356, 389, 389, 389, + 389, 150, 411, 354, 354, 126, 242, 242, 242, 243, + 641, 126, 126, 126, 126, 126, 126, 104, 346, 126, + 126, 147, 82, 82, 82, 126, 126, 104, 126, 393, + 389, 389, 389, 389, 150, 150, 150, 104, 82, 82, + 82, 396, 364, 399, 410, 82, 82, 373, 126, 130, + + 150, 150, 150, 640, 193, 485, 82, 150, 150, 486, + 635, 147, 394, 396, 389, 389, 389, 389, 150, 609, + 634, 82, 82, 401, 696, 369, 126, 126, 254, 406, + 406, 406, 406, 150, 150, 696, 393, 696, 696, 622, + 592, 256, 696, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 394, 402, 696, 696, 696, 617, 511, 258, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 369, 421, 82, 224, 224, 329, 104, 617, + 374, 696, 421, 511, 329, 370, 150, 371, 371, 371, + + 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, + 371, 371, 371, 371, 371, 371, 253, 253, 193, 307, + 104, 82, 336, 372, 82, 414, 414, 414, 414, 336, + 90, 337, 336, 150, 82, 633, 150, 409, 461, 336, + 460, 696, 92, 636, 82, 422, 150, 94, 462, 145, + 99, 336, 271, 104, 422, 101, 150, 445, 445, 445, + 483, 336, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 390, 82, 531, 450, 336, 82, + 632, 391, 469, 337, 82, 450, 502, 150, 336, 82, + 696, 150, 82, 82, 82, 82, 104, 629, 451, 503, + + 446, 650, 472, 390, 520, 520, 520, 392, 392, 392, + 392, 392, 392, 392, 392, 392, 392, 392, 392, 147, + 628, 82, 621, 470, 473, 487, 487, 487, 487, 620, + 390, 354, 354, 150, 354, 354, 354, 354, 354, 355, + 354, 354, 354, 354, 145, 354, 354, 521, 671, 696, + 271, 404, 354, 354, 354, 82, 82, 82, 459, 459, + 459, 459, 696, 468, 468, 468, 468, 150, 150, 150, + 82, 616, 500, 145, 354, 354, 354, 82, 82, 455, + 523, 599, 150, 433, 501, 525, 104, 82, 82, 150, + 150, 111, 433, 456, 82, 405, 82, 82, 478, 150, + + 150, 477, 354, 354, 82, 254, 150, 82, 150, 150, + 363, 363, 479, 615, 147, 542, 150, 104, 256, 150, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 471, + 482, 675, 617, 526, 618, 538, 300, 297, 297, 297, + 297, 297, 297, 297, 297, 297, 297, 297, 297, 369, + 145, 530, 384, 530, 617, 650, 619, 607, 606, 605, + 601, 541, 370, 625, 407, 407, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 407, 601, 600, 626, 582, 659, 597, 617, + + 408, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 438, 438, 510, 438, 438, 438, 438, + 438, 617, 438, 438, 438, 438, 502, 438, 438, 82, + 147, 82, 547, 438, 438, 438, 438, 82, 450, 696, + 476, 150, 149, 150, 511, 149, 149, 149, 149, 150, + 82, 451, 82, 512, 476, 476, 438, 438, 438, 596, + 82, 551, 150, 440, 150, 384, 111, 590, 562, 511, + 535, 82, 150, 536, 589, 552, 82, 440, 440, 534, + 598, 271, 563, 150, 438, 438, 354, 354, 150, 354, + 354, 354, 354, 354, 599, 354, 354, 354, 354, 624, + + 354, 354, 534, 617, 193, 307, 354, 354, 354, 354, + 539, 544, 544, 544, 544, 82, 82, 548, 520, 520, + 520, 145, 82, 659, 617, 617, 617, 150, 150, 354, + 354, 354, 571, 82, 150, 565, 565, 565, 565, 82, + 679, 145, 588, 82, 82, 150, 617, 563, 617, 587, + 587, 150, 576, 570, 185, 150, 150, 354, 354, 354, + 354, 521, 354, 354, 354, 354, 354, 586, 354, 354, + 354, 354, 82, 354, 354, 573, 82, 575, 82, 354, + 354, 354, 354, 656, 150, 193, 485, 585, 150, 574, + 150, 147, 544, 544, 544, 544, 82, 657, 145, 593, + + 617, 584, 354, 354, 354, 145, 145, 593, 150, 145, + 263, 147, 565, 565, 565, 565, 595, 614, 583, 574, + 627, 555, 617, 679, 555, 582, 552, 581, 646, 594, + 354, 354, 392, 392, 392, 392, 392, 392, 392, 392, + 392, 392, 392, 392, 438, 438, 580, 438, 438, 438, + 438, 438, 439, 438, 438, 438, 438, 82, 438, 438, + 145, 579, 384, 384, 475, 438, 438, 438, 526, 150, + 578, 642, 548, 617, 630, 147, 147, 577, 645, 147, + 617, 145, 384, 384, 384, 567, 145, 438, 438, 438, + 639, 639, 655, 263, 476, 617, 631, 668, 679, 613, + + 145, 566, 617, 265, 455, 384, 523, 384, 476, 476, + 564, 673, 639, 639, 384, 438, 438, 354, 354, 384, + 354, 354, 354, 354, 354, 355, 354, 354, 354, 354, + 147, 354, 354, 639, 561, 639, 652, 404, 354, 354, + 354, 560, 639, 559, 558, 557, 556, 639, 555, 139, + 553, 147, 666, 384, 145, 639, 147, 639, 653, 384, + 354, 354, 354, 667, 639, 676, 679, 679, 694, 639, + 147, 679, 679, 679, 679, 679, 550, 680, 681, 672, + 549, 639, 682, 683, 684, 685, 686, 639, 354, 354, + 354, 354, 548, 354, 354, 354, 354, 354, 355, 354, + + 354, 354, 354, 639, 354, 354, 547, 672, 546, 639, + 404, 354, 354, 354, 499, 499, 497, 497, 495, 495, + 493, 493, 491, 491, 147, 489, 489, 384, 537, 679, + 528, 527, 216, 354, 354, 354, 263, 263, 209, 373, + 687, 263, 263, 263, 263, 263, 679, 524, 455, 523, + 448, 111, 518, 679, 679, 679, 679, 688, 679, 517, + 516, 354, 354, 502, 689, 690, 691, 692, 515, 693, + 433, 111, 508, 507, 506, 505, 503, 424, 504, 504, + 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 504, 504, 504, 504, 504, 504, 504, 438, 438, 263, + + 438, 438, 438, 438, 438, 499, 438, 438, 438, 438, + 497, 438, 438, 495, 493, 491, 263, 438, 438, 438, + 438, 489, 425, 263, 263, 263, 263, 196, 263, 484, + 480, 268, 384, 464, 463, 86, 210, 458, 455, 373, + 438, 438, 438, 364, 448, 443, 442, 441, 210, 432, + 431, 430, 429, 428, 427, 337, 425, 337, 216, 216, + 210, 209, 209, 209, 316, 316, 314, 314, 438, 438, + 438, 438, 196, 438, 438, 438, 438, 438, 412, 438, + 438, 438, 438, 364, 438, 438, 268, 268, 267, 384, + 438, 438, 438, 438, 267, 353, 376, 344, 343, 373, + + 254, 364, 364, 246, 352, 351, 350, 349, 345, 342, + 341, 340, 339, 438, 438, 438, 327, 327, 326, 325, + 440, 324, 323, 323, 322, 321, 320, 319, 316, 314, + 307, 306, 268, 287, 440, 440, 268, 268, 267, 265, + 263, 438, 438, 82, 502, 262, 237, 210, 261, 235, + 130, 240, 238, 210, 236, 150, 234, 503, 233, 533, + 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + 533, 533, 533, 533, 533, 533, 533, 533, 438, 438, + 233, 438, 438, 438, 438, 438, 439, 438, 438, 438, + 438, 232, 438, 438, 104, 216, 215, 209, 475, 438, + + 438, 438, 210, 209, 201, 193, 191, 173, 172, 169, + 168, 165, 164, 148, 122, 142, 139, 122, 121, 118, + 117, 438, 438, 438, 114, 113, 104, 86, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 438, + 438, 602, 602, 696, 602, 602, 602, 602, 602, 696, + 602, 602, 602, 602, 696, 602, 602, 696, 696, 696, + 696, 602, 602, 602, 602, 696, 696, 696, 696, 696, + 696, 604, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 602, 602, 602, 696, 696, 696, + + 696, 696, 696, 604, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 602, 602, 602, 602, 696, 602, 602, 602, + 602, 602, 603, 602, 602, 602, 602, 696, 602, 602, + 696, 696, 696, 696, 611, 602, 602, 602, 696, 696, + 696, 696, 696, 696, 612, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 602, 602, 602, + 696, 696, 696, 696, 696, 696, 612, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 602, 602, 602, 602, 696, + + 602, 602, 602, 602, 602, 696, 602, 602, 602, 602, + 696, 602, 602, 696, 696, 696, 696, 602, 602, 602, + 602, 696, 696, 696, 696, 696, 696, 604, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 602, 602, 602, 696, 696, 696, 696, 696, 696, 604, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 602, 602, + 602, 602, 696, 602, 602, 602, 602, 602, 603, 602, + 602, 602, 602, 696, 602, 602, 696, 696, 696, 696, + 611, 602, 602, 602, 696, 696, 696, 696, 696, 696, + + 612, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 602, 602, 602, 696, 696, 696, 696, + 696, 696, 612, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 602, 602, 82, 696, 696, 696, 82, 82, 696, + 696, 82, 82, 82, 82, 82, 82, 82, 82, 83, + 83, 83, 83, 83, 696, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 89, 89, + 696, 696, 696, 89, 89, 89, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + + 103, 103, 103, 103, 103, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 149, 696, 696, 696, 149, 149, 149, + 696, 149, 149, 149, 149, 149, 149, 149, 149, 192, + 192, 192, 192, 192, 696, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 211, 211, 696, + + 696, 696, 696, 696, 696, 696, 696, 211, 696, 696, + 211, 211, 696, 211, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + + 273, 273, 273, 273, 273, 273, 273, 273, 273, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 313, 313, 696, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 616, 616, 616, 710, 710, 710, - 710, 710, 710, 626, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 616, 616, - 616, 616, 710, 616, 616, 616, 616, 616, 710, 616, - 616, 616, 616, 710, 616, 616, 710, 710, 710, 710, - 710, 616, 616, 616, 616, 710, 710, 710, 710, 710, - 710, 618, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 616, 616, 616, 710, - 710, 710, 710, 710, 710, 618, 710, 710, 710, 710, + 313, 313, 313, 313, 315, 315, 696, 315, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 317, 696, 317, 696, 696, 696, 317, + 317, 317, 696, 696, 317, 355, 355, 696, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 359, 359, 359, 359, 359, 359, 359, 359, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 616, 616, 616, 616, 710, 616, 616, 616, 616, 616, - 617, 616, 616, 616, 616, 710, 616, 616, 710, 710, - 710, 710, 710, 625, 616, 616, 616, 710, 710, 710, - 710, 710, 710, 626, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 616, 616, - 616, 710, 710, 710, 710, 710, 710, 626, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 616, 616, 70, 710, 710, 70, 70, 710, - 710, 70, 70, 70, 70, 70, 71, 71, 71, 71, - - 71, 710, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 133, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 138, 710, 710, 138, - 138, 138, 710, 138, 138, 138, 138, 138, 183, 183, - 183, 183, 183, 710, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 200, 200, - - 710, 710, 710, 710, 710, 710, 710, 200, 200, 200, - 200, 200, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - - 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 186, 313, 313, 313, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 362, 362, 362, 367, 696, 696, 696, 367, 696, 367, + 367, 367, 367, 696, 367, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 383, 383, 383, 383, 383, 383, + 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, + 383, 383, 383, 149, 696, 696, 696, 149, 149, 149, + 696, 149, 149, 149, 149, 149, 149, 149, 149, 273, + + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 403, 403, 696, + 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 413, 413, 413, 413, 696, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 192, 192, 192, 192, 192, 192, + + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 313, 313, 696, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 317, 317, 710, 317, 317, 317, 317, 317, - 317, 317, 317, 317, 317, 317, 317, 319, 319, 710, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 357, 357, 710, 357, 357, 357, 357, 357, - 357, 357, 357, 357, 357, 357, 357, 359, 359, 359, + 313, 313, 315, 315, 696, 315, 315, 315, 315, 315, + 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, + 315, 416, 696, 416, 416, 696, 696, 416, 416, 416, + 696, 696, 416, 439, 439, 696, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 354, 354, 696, 354, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, + + 354, 355, 355, 696, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, + 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, 357, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 113, 113, 113, 113, 113, 113, 113, 113, - - 113, 113, 113, 113, 113, 113, 113, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 369, 710, 710, - 369, 710, 369, 369, 710, 710, 369, 369, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 90, 90, 90, 90, 90, 90, 90, - - 90, 90, 90, 90, 90, 90, 90, 90, 411, 411, - 710, 411, 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 425, 425, - 425, 425, 710, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 183, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 317, 317, - 710, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 317, 319, 319, 710, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 439, 710, - - 439, 710, 710, 710, 439, 439, 439, 450, 450, 710, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, - 450, 450, 356, 356, 710, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 357, 357, 710, + 359, 359, 359, 359, 359, 359, 359, 359, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 452, 452, 696, 696, + + 452, 452, 696, 452, 452, 452, 452, 452, 452, 452, + 452, 452, 453, 696, 696, 696, 696, 696, 453, 453, + 453, 453, 696, 453, 383, 383, 383, 383, 383, 383, + 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, + 383, 383, 383, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 474, 474, 696, 474, 474, 474, 474, 474, + 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, + 474, 403, 403, 696, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, + + 481, 481, 696, 696, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 481, 413, 413, 413, 413, + 696, 413, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 488, 488, 696, 488, 488, 488, + 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, + 488, 488, 488, 490, 490, 696, 490, 490, 490, 490, + 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, + 490, 490, 492, 492, 696, 492, 492, 492, 492, 492, + + 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, + 492, 494, 494, 696, 494, 494, 494, 494, 494, 494, + 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, + 496, 496, 696, 496, 496, 496, 496, 496, 496, 496, + 496, 496, 496, 496, 496, 496, 496, 496, 496, 498, + 498, 696, 498, 498, 498, 498, 498, 498, 498, 498, + 498, 498, 498, 498, 498, 498, 498, 498, 438, 438, + 696, 438, 438, 438, 438, 438, 438, 438, 438, 438, + 438, 438, 438, 438, 438, 438, 438, 439, 439, 696, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + + 439, 439, 439, 439, 439, 439, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 359, 359, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 458, 458, 458, - - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 464, 710, 710, 710, 710, 464, 464, 710, - 710, 464, 464, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 487, 487, 710, 487, 487, 487, 487, - 487, 487, 487, 487, 487, 487, 487, 487, 411, 411, - 710, 411, 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 425, 425, 425, 425, 710, 425, 425, - 425, 425, 425, 425, 425, 425, 425, 425, 183, 183, - - 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 500, 500, 710, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 500, 502, 502, - 710, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 502, 502, 502, 504, 504, 710, 504, 504, 504, 504, - 504, 504, 504, 504, 504, 504, 504, 504, 506, 506, - 710, 506, 506, 506, 506, 506, 506, 506, 506, 506, - 506, 506, 506, 508, 508, 710, 508, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 510, 510, - 710, 510, 510, 510, 510, 510, 510, 510, 510, 510, - - 510, 510, 510, 449, 449, 710, 449, 449, 449, 449, - 449, 449, 449, 449, 449, 449, 449, 449, 450, 450, - 710, 450, 450, 450, 450, 450, 450, 450, 450, 450, - 450, 450, 450, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 359, 359, 359, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 535, 710, - 710, 710, 710, 535, 535, 710, 710, 535, 543, 543, - 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, - - 543, 543, 543, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 487, 487, - 710, 487, 487, 487, 487, 487, 487, 487, 487, 487, - 487, 487, 487, 554, 554, 554, 554, 554, 554, 554, - 554, 554, 554, 554, 554, 554, 554, 554, 566, 710, - 710, 710, 710, 566, 566, 710, 710, 566, 568, 568, - 710, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 568, 586, 586, 586, 586, 586, 586, 586, - 586, 586, 586, 586, 586, 586, 586, 586, 617, 617, - 710, 617, 617, 617, 617, 617, 617, 617, 617, 617, - - 617, 617, 617, 624, 624, 710, 624, 624, 624, 624, - 624, 624, 624, 624, 624, 624, 624, 624, 616, 616, - 710, 616, 616, 616, 616, 616, 616, 616, 616, 616, - 616, 616, 616, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 677, 677, 677, 677, 677, 677, 677, - 677, 677, 677, 677, 677, 677, 677, 677, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, - 692, 692, 692, 3, 710, 710, 710, 710, 710, 710, - - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710 + 357, 357, 357, 357, 357, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, + 447, 447, 447, 522, 696, 696, 696, 696, 696, 522, + 522, 522, 522, 522, 522, 522, 522, 522, 529, 529, + 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, + 529, 529, 529, 529, 529, 529, 529, 103, 103, 103, + + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 545, 696, 696, 696, 696, + 696, 545, 545, 545, 545, 554, 554, 696, 554, 554, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, + 554, 554, 554, 554, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 603, 603, 696, 603, 603, 603, 603, + 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, + + 603, 603, 610, 610, 696, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, + 610, 602, 602, 696, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, + 638, 638, 638, 638, 638, 638, 638, 638, 638, 660, + 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, + 660, 660, 660, 660, 660, 660, 660, 660, 663, 663, + 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, + 663, 663, 663, 663, 663, 663, 663, 678, 678, 678, + + 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, + 678, 678, 678, 678, 678, 678, 3, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696 } ; -static yyconst short int yy_chk[4467] = +static yyconst short int yy_chk[4591] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1173,7 +1186,7 @@ static yyconst short int yy_chk[4467] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -1181,482 +1194,495 @@ static yyconst short int yy_chk[4467] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, - 8, 10, 10, 11, 18, 23, 708, 8, 8, 8, - 8, 8, 19, 11, 34, 11, 11, 34, 5, 34, - 36, 11, 12, 12, 12, 36, 233, 31, 18, 12, - 23, 31, 40, 19, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 22, 25, 40, 12, 12, 12, 12, + 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, + 6, 8, 10, 10, 11, 19, 22, 46, 8, 8, + 8, 8, 16, 156, 11, 13, 11, 11, 5, 46, + 58, 11, 12, 12, 12, 13, 156, 13, 19, 12, + 22, 694, 13, 86, 12, 12, 12, 12, 12, 12, + 12, 12, 50, 50, 58, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 37, 19, 233, + 12, 12, 12, 12, 25, 28, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 13, 27, 33, 25, 33, 264, 33, 24, 22, - 25, 13, 46, 13, 264, 32, 32, 24, 32, 13, - 15, 43, 44, 44, 51, 46, 37, 72, 72, 32, - 15, 43, 15, 43, 15, 15, 15, 51, 15, 43, - 35, 15, 24, 24, 24, 24, 24, 24, 24, 24, - 47, 74, 688, 35, 60, 27, 27, 35, 60, 35, - - 46, 27, 15, 47, 35, 51, 15, 15, 15, 15, - 15, 15, 15, 15, 49, 52, 15, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 38, 55, 49, 78, 78, 28, 28, - 28, 28, 50, 82, 82, 82, 47, 38, 38, 38, - 38, 38, 74, 65, 48, 50, 41, 57, 65, 56, - 583, 41, 57, 28, 28, 28, 41, 48, 41, 41, - 49, 52, 56, 53, 41, 57, 684, 62, 53, 62, - 86, 62, 86, 48, 55, 115, 53, 28, 28, 29, - 55, 138, 133, 29, 29, 29, 50, 29, 61, 61, - - 66, 61, 38, 53, 138, 66, 77, 48, 77, 145, - 57, 57, 61, 66, 77, 63, 57, 56, 63, 115, - 63, 29, 145, 64, 583, 29, 29, 29, 29, 29, - 29, 29, 29, 30, 147, 147, 64, 30, 30, 30, - 64, 30, 64, 83, 83, 83, 206, 64, 69, 69, - 69, 69, 69, 683, 66, 83, 206, 83, 85, 85, - 85, 133, 677, 83, 206, 30, 98, 98, 98, 30, - 30, 30, 30, 30, 30, 30, 30, 42, 42, 42, - 108, 108, 108, 676, 42, 122, 122, 122, 674, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 129, 129, - - 129, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 151, 151, 151, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 45, 183, 183, 142, - 546, 45, 184, 184, 67, 327, 45, 327, 45, 672, - 45, 45, 45, 142, 45, 67, 73, 45, 67, 67, - 67, 67, 67, 73, 73, 73, 73, 73, 73, 93, - 93, 93, 93, 93, 93, 93, 93, 146, 45, 109, - 109, 109, 45, 45, 45, 45, 45, 45, 45, 45, - - 146, 141, 45, 54, 92, 546, 92, 213, 87, 141, - 54, 159, 92, 331, 141, 213, 54, 92, 87, 54, - 87, 185, 185, 67, 159, 140, 87, 331, 92, 155, - 92, 187, 187, 140, 140, 670, 92, 109, 140, 213, - 92, 159, 155, 248, 54, 54, 54, 54, 54, 54, - 54, 54, 58, 606, 130, 130, 130, 58, 177, 177, - 177, 58, 58, 58, 155, 58, 94, 94, 94, 94, - 94, 94, 94, 94, 96, 96, 96, 96, 96, 96, - 96, 96, 162, 162, 162, 211, 211, 211, 247, 58, - 130, 152, 248, 58, 58, 58, 58, 58, 58, 58, - - 58, 59, 231, 370, 152, 59, 59, 59, 606, 59, - 97, 97, 97, 97, 97, 97, 97, 97, 118, 118, - 118, 118, 118, 118, 118, 118, 212, 212, 212, 374, - 162, 247, 152, 59, 153, 154, 231, 59, 59, 59, - 59, 59, 59, 59, 59, 95, 359, 153, 154, 215, - 215, 215, 370, 95, 120, 120, 120, 120, 120, 120, - 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, - 216, 216, 216, 217, 217, 217, 154, 95, 374, 153, - 359, 95, 95, 95, 95, 95, 95, 95, 95, 114, - 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, - - 114, 114, 114, 114, 114, 664, 222, 235, 235, 235, - 114, 114, 114, 114, 124, 124, 124, 124, 124, 124, - 124, 124, 126, 126, 126, 126, 126, 126, 126, 126, - 222, 690, 135, 270, 270, 114, 114, 114, 127, 127, - 127, 127, 127, 127, 127, 127, 135, 135, 135, 135, - 135, 135, 312, 312, 222, 241, 241, 241, 663, 114, - 114, 116, 116, 116, 116, 116, 143, 116, 116, 116, - 116, 116, 116, 148, 143, 116, 116, 144, 157, 143, - 156, 160, 116, 116, 158, 116, 148, 144, 347, 144, - 165, 157, 164, 156, 160, 144, 395, 158, 181, 163, - - 690, 135, 274, 165, 662, 164, 348, 116, 116, 181, - 274, 160, 163, 161, 148, 148, 148, 148, 148, 148, - 148, 148, 161, 161, 161, 598, 161, 249, 249, 249, - 348, 116, 116, 119, 274, 157, 179, 119, 180, 156, - 163, 164, 158, 165, 170, 119, 347, 119, 598, 179, - 119, 180, 337, 170, 170, 170, 395, 170, 119, 223, - 337, 119, 360, 267, 119, 119, 465, 181, 267, 119, - 268, 223, 223, 119, 119, 119, 119, 119, 119, 119, - 119, 267, 119, 268, 337, 119, 242, 658, 119, 123, - 179, 178, 180, 242, 242, 242, 360, 123, 123, 123, - - 178, 178, 178, 123, 178, 394, 123, 262, 150, 252, - 252, 252, 262, 262, 123, 465, 168, 123, 280, 325, - 123, 123, 166, 166, 166, 166, 166, 166, 166, 166, - 123, 280, 479, 123, 313, 313, 178, 655, 123, 188, - 188, 123, 582, 582, 123, 125, 188, 188, 188, 188, - 188, 188, 394, 125, 150, 150, 150, 150, 150, 150, - 150, 150, 168, 168, 168, 168, 168, 168, 168, 168, - 232, 232, 232, 232, 255, 255, 255, 125, 280, 288, - 325, 125, 125, 125, 125, 125, 125, 125, 125, 128, - 479, 654, 288, 128, 128, 128, 174, 128, 169, 169, - - 169, 169, 169, 169, 169, 169, 172, 172, 172, 172, - 172, 172, 172, 172, 258, 253, 232, 258, 258, 258, - 649, 128, 253, 253, 253, 128, 128, 128, 128, 128, - 128, 128, 128, 149, 272, 361, 648, 288, 299, 299, - 299, 149, 174, 174, 174, 174, 174, 174, 174, 174, - 175, 175, 175, 175, 175, 175, 175, 175, 304, 304, - 304, 269, 349, 258, 369, 149, 269, 373, 647, 149, - 149, 149, 149, 149, 149, 149, 149, 167, 361, 269, - 266, 167, 443, 283, 278, 266, 349, 272, 392, 167, - 392, 167, 257, 266, 167, 272, 283, 278, 284, 257, - - 257, 257, 167, 284, 623, 167, 443, 369, 167, 167, - 373, 284, 286, 167, 338, 338, 338, 167, 167, 167, - 167, 167, 167, 167, 167, 286, 167, 278, 283, 167, - 189, 189, 167, 171, 171, 257, 279, 189, 189, 189, - 189, 189, 171, 171, 171, 273, 171, 298, 171, 279, - 293, 171, 293, 298, 273, 273, 273, 480, 273, 171, - 298, 286, 171, 293, 623, 171, 171, 214, 214, 214, - 214, 214, 214, 214, 214, 171, 281, 236, 171, 279, - 297, 281, 297, 171, 434, 236, 171, 497, 236, 171, - 173, 236, 236, 297, 281, 497, 434, 243, 173, 329, - - 281, 236, 298, 396, 622, 243, 243, 243, 276, 236, - 636, 243, 236, 446, 646, 236, 396, 276, 276, 276, - 480, 276, 173, 282, 281, 297, 173, 173, 173, 173, - 173, 173, 173, 173, 176, 455, 282, 446, 176, 176, - 176, 243, 176, 237, 237, 237, 237, 237, 237, 237, - 237, 238, 238, 238, 238, 238, 238, 238, 238, 622, - 329, 344, 344, 344, 643, 368, 176, 636, 282, 455, - 176, 176, 176, 176, 176, 176, 176, 176, 218, 368, - 282, 282, 365, 365, 365, 642, 218, 250, 250, 250, - 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, - - 251, 251, 251, 378, 378, 378, 439, 439, 439, 368, - 218, 362, 362, 362, 218, 218, 218, 218, 218, 218, - 218, 218, 230, 230, 239, 230, 230, 230, 230, 230, - 516, 230, 230, 230, 230, 308, 230, 230, 464, 245, - 308, 239, 516, 230, 230, 230, 230, 245, 308, 239, - 245, 294, 239, 245, 245, 239, 239, 362, 246, 393, - 294, 294, 294, 245, 294, 239, 460, 393, 230, 230, - 230, 245, 393, 239, 245, 246, 239, 245, 397, 239, - 460, 464, 640, 246, 639, 275, 246, 230, 635, 246, - 246, 397, 230, 230, 234, 234, 234, 234, 234, 246, - - 234, 234, 234, 234, 234, 234, 309, 246, 234, 234, - 246, 254, 261, 246, 634, 234, 234, 309, 234, 254, - 254, 254, 478, 478, 478, 254, 261, 261, 261, 261, - 261, 275, 275, 275, 275, 275, 275, 275, 275, 287, - 234, 234, 300, 300, 300, 300, 300, 300, 300, 300, - 330, 593, 287, 471, 330, 254, 633, 545, 291, 295, - 632, 295, 330, 401, 234, 234, 244, 471, 295, 295, - 295, 291, 295, 380, 387, 309, 401, 530, 651, 651, - 244, 261, 406, 244, 387, 292, 387, 380, 630, 530, - 287, 244, 387, 301, 244, 406, 407, 244, 244, 291, - - 291, 291, 291, 291, 291, 291, 291, 244, 545, 407, - 244, 330, 593, 401, 302, 244, 417, 380, 244, 605, - 665, 244, 256, 302, 302, 302, 407, 302, 629, 417, - 256, 292, 292, 292, 292, 292, 292, 292, 292, 301, - 301, 301, 301, 301, 301, 301, 301, 383, 426, 426, - 383, 383, 383, 426, 256, 409, 621, 495, 256, 256, - 256, 256, 256, 256, 256, 256, 277, 303, 409, 303, - 495, 605, 665, 402, 277, 388, 303, 303, 303, 482, - 303, 306, 410, 306, 482, 388, 402, 388, 620, 614, - 306, 306, 306, 388, 306, 410, 383, 482, 277, 494, - - 409, 494, 277, 277, 277, 277, 277, 277, 277, 277, - 289, 289, 494, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 402, 289, 289, 306, 410, 650, 307, - 423, 289, 289, 289, 289, 307, 316, 316, 307, 307, - 307, 423, 307, 316, 316, 316, 316, 316, 342, 342, - 342, 342, 342, 342, 342, 342, 289, 289, 289, 343, - 343, 343, 343, 343, 343, 343, 343, 398, 398, 398, - 398, 398, 398, 398, 398, 289, 472, 612, 371, 650, - 289, 289, 290, 290, 307, 403, 371, 518, 472, 371, - 403, 484, 371, 371, 550, 290, 484, 290, 611, 423, - - 290, 518, 371, 403, 404, 372, 685, 550, 290, 484, - 371, 290, 382, 371, 290, 290, 371, 404, 496, 382, - 382, 382, 372, 610, 290, 604, 603, 290, 404, 496, - 372, 400, 290, 372, 408, 290, 372, 372, 290, 296, - 400, 400, 400, 403, 400, 472, 372, 408, 415, 491, - 415, 550, 404, 296, 372, 382, 296, 372, 399, 385, - 372, 415, 491, 685, 296, 422, 416, 296, 602, 486, - 296, 296, 416, 385, 385, 385, 385, 385, 422, 416, - 296, 408, 486, 296, 456, 456, 456, 496, 296, 483, - 474, 296, 474, 415, 296, 305, 600, 637, 474, 485, - - 599, 491, 483, 305, 399, 399, 399, 399, 399, 399, - 399, 399, 485, 420, 486, 420, 547, 483, 547, 422, - 485, 416, 420, 420, 420, 444, 420, 305, 385, 547, - 456, 305, 305, 305, 305, 305, 305, 305, 305, 350, - 350, 483, 350, 350, 350, 350, 350, 492, 350, 350, - 350, 350, 492, 350, 350, 615, 637, 444, 420, 549, - 350, 350, 350, 350, 421, 492, 444, 459, 459, 459, - 421, 490, 549, 421, 421, 421, 597, 421, 588, 615, - 444, 533, 533, 533, 490, 350, 350, 350, 499, 499, - 548, 588, 350, 549, 596, 499, 499, 499, 499, 499, - - 544, 544, 544, 548, 350, 350, 596, 595, 691, 350, - 350, 357, 357, 459, 357, 357, 357, 357, 357, 421, - 357, 357, 357, 357, 490, 357, 357, 533, 461, 689, - 519, 548, 357, 357, 357, 357, 461, 553, 519, 461, - 584, 519, 461, 461, 519, 519, 594, 592, 627, 591, - 553, 552, 461, 584, 519, 539, 555, 357, 357, 357, - 461, 627, 519, 461, 552, 519, 461, 555, 519, 539, - 539, 539, 539, 539, 584, 586, 616, 691, 553, 618, - 689, 357, 357, 358, 358, 462, 358, 358, 358, 358, - 358, 626, 358, 358, 358, 358, 552, 358, 358, 585, - - 616, 587, 462, 618, 358, 358, 358, 358, 552, 657, - 462, 520, 585, 462, 587, 626, 462, 462, 679, 692, - 581, 657, 590, 580, 539, 555, 462, 578, 520, 358, - 358, 358, 579, 590, 462, 631, 520, 462, 576, 520, - 462, 631, 520, 520, 589, 587, 579, 579, 579, 579, - 579, 609, 520, 358, 358, 367, 585, 589, 608, 631, - 520, 625, 609, 520, 638, 631, 520, 558, 558, 367, - 575, 608, 367, 679, 558, 558, 558, 558, 558, 628, - 367, 641, 659, 367, 659, 645, 367, 367, 692, 625, - 628, 590, 641, 638, 644, 656, 367, 660, 652, 644, - - 653, 579, 589, 608, 367, 680, 656, 367, 659, 645, - 367, 381, 666, 625, 645, 669, 574, 638, 644, 660, - 609, 660, 573, 653, 572, 381, 669, 652, 381, 653, - 673, 571, 680, 682, 680, 707, 381, 570, 569, 381, - 667, 666, 381, 381, 682, 568, 666, 653, 628, 566, - 641, 652, 381, 653, 673, 381, 681, 686, 680, 565, - 381, 563, 562, 381, 656, 666, 381, 405, 405, 667, - 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, - 561, 405, 405, 687, 669, 681, 686, 560, 405, 405, - 405, 405, 559, 667, 687, 693, 557, 694, 667, 554, - - 695, 696, 682, 551, 707, 697, 693, 681, 694, 681, - 686, 695, 696, 405, 405, 405, 697, 543, 542, 698, - 405, 541, 540, 699, 700, 701, 538, 535, 531, 529, - 698, 528, 405, 405, 699, 700, 701, 405, 405, 411, - 411, 527, 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 687, 411, 411, 526, 525, 524, 523, 522, - 411, 411, 411, 411, 693, 521, 694, 702, 703, 695, - 696, 704, 705, 706, 697, 517, 515, 514, 702, 703, - 513, 512, 704, 705, 706, 411, 411, 411, 698, 511, - 510, 509, 699, 700, 701, 508, 507, 506, 505, 504, - - 503, 502, 501, 500, 493, 488, 477, 476, 475, 411, - 411, 413, 413, 473, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 470, 413, 413, 468, 467, 463, - 458, 454, 413, 413, 413, 413, 702, 703, 453, 452, - 704, 705, 706, 448, 447, 445, 442, 438, 437, 436, - 435, 433, 432, 431, 430, 429, 428, 413, 413, 413, - 427, 425, 424, 412, 391, 390, 389, 386, 384, 376, - 375, 364, 363, 355, 354, 353, 352, 346, 345, 335, - 334, 413, 413, 414, 414, 333, 332, 328, 326, 324, - 323, 322, 321, 320, 319, 318, 414, 317, 414, 314, - - 310, 414, 271, 265, 263, 259, 240, 229, 228, 414, - 227, 225, 414, 224, 221, 414, 414, 220, 219, 210, - 209, 208, 207, 205, 204, 414, 203, 202, 201, 198, - 197, 196, 195, 414, 194, 193, 414, 191, 190, 414, - 419, 186, 182, 139, 137, 136, 134, 132, 131, 113, - 112, 111, 110, 107, 419, 106, 105, 419, 104, 103, - 102, 101, 100, 99, 90, 419, 88, 84, 419, 81, - 80, 419, 419, 79, 76, 71, 68, 39, 26, 21, - 20, 419, 17, 16, 419, 14, 9, 3, 0, 419, - 0, 0, 419, 0, 0, 419, 441, 0, 0, 0, - + 12, 12, 15, 52, 15, 86, 15, 15, 15, 15, + 15, 15, 40, 674, 15, 29, 153, 29, 29, 90, + 28, 90, 29, 670, 25, 25, 90, 35, 35, 28, + 153, 25, 55, 15, 35, 35, 35, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 31, + 31, 532, 31, 31, 31, 55, 99, 52, 99, 40, + + 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 63, 84, 84, + 144, 26, 26, 26, 26, 30, 30, 30, 30, 30, + 32, 32, 34, 34, 32, 32, 32, 33, 34, 34, + 34, 43, 30, 532, 26, 26, 26, 33, 33, 36, + 36, 49, 33, 33, 33, 37, 37, 36, 36, 36, + 33, 49, 63, 49, 37, 37, 37, 676, 49, 91, + 91, 63, 26, 26, 27, 38, 38, 27, 27, 27, + 27, 27, 61, 47, 669, 38, 38, 217, 47, 38, + 144, 43, 43, 47, 663, 47, 47, 217, 43, 64, + + 47, 64, 64, 27, 217, 44, 64, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, + 44, 44, 44, 65, 65, 65, 65, 65, 69, 69, + 27, 74, 61, 61, 69, 69, 69, 676, 149, 61, + 65, 66, 66, 74, 66, 66, 66, 67, 67, 68, + 149, 67, 67, 67, 70, 70, 76, 158, 158, 68, + 68, 70, 70, 70, 68, 68, 68, 662, 76, 74, + 72, 72, 68, 192, 192, 44, 48, 48, 48, 72, + 72, 72, 660, 48, 81, 81, 81, 81, 48, 48, + 48, 48, 48, 48, 48, 48, 193, 193, 76, 48, + + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 95, 95, + 95, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 51, 194, 194, 51, + 128, 51, 77, 51, 51, 51, 51, 51, 51, 71, + 71, 51, 73, 73, 77, 196, 196, 71, 71, 71, + 75, 157, 73, 73, 258, 75, 73, 98, 98, 98, + 51, 128, 75, 157, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 110, 110, 110, 110, + + 271, 387, 112, 112, 112, 112, 658, 51, 62, 77, + 78, 166, 271, 62, 79, 78, 62, 62, 62, 62, + 62, 258, 75, 166, 323, 79, 85, 78, 79, 79, + 79, 79, 112, 85, 85, 85, 85, 85, 113, 113, + 113, 113, 62, 166, 273, 273, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 100, 387, + 78, 78, 96, 96, 96, 171, 176, 78, 100, 62, + 100, 111, 113, 111, 96, 100, 96, 171, 176, 111, + 656, 96, 111, 623, 79, 89, 323, 89, 89, 89, + 89, 89, 89, 111, 171, 111, 123, 123, 123, 123, + + 167, 234, 111, 136, 136, 136, 136, 111, 118, 118, + 118, 118, 167, 650, 89, 234, 234, 176, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 121, 121, 121, 121, 123, 241, 124, 124, 124, 124, + 623, 89, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 108, 151, 649, 118, 167, 233, + 325, 108, 325, 151, 151, 243, 241, 151, 165, 137, + 137, 137, 137, 138, 138, 138, 138, 267, 121, 124, + 165, 345, 233, 108, 308, 308, 267, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 137, + + 162, 162, 162, 162, 233, 243, 165, 138, 309, 309, + 108, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 146, 152, 568, + 568, 127, 127, 127, 127, 329, 152, 345, 154, 185, + 152, 146, 146, 146, 146, 146, 154, 190, 270, 329, + 154, 185, 168, 270, 127, 127, 127, 648, 190, 163, + 163, 163, 163, 644, 168, 270, 164, 164, 164, 164, + 169, 169, 169, 169, 172, 172, 172, 172, 174, 174, + 174, 174, 127, 127, 129, 129, 129, 129, 129, 163, + 129, 129, 129, 129, 129, 129, 185, 146, 129, 129, + + 164, 173, 186, 189, 129, 129, 386, 129, 168, 175, + 175, 175, 175, 173, 186, 189, 174, 190, 346, 169, + 272, 182, 172, 187, 368, 272, 188, 129, 129, 182, + 182, 182, 182, 182, 183, 187, 269, 272, 188, 173, + 346, 269, 183, 183, 183, 183, 183, 609, 269, 189, + 386, 347, 175, 357, 186, 129, 129, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 132, + 132, 368, 183, 347, 132, 187, 641, 132, 132, 132, + 132, 132, 188, 132, 357, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + + 132, 132, 132, 132, 384, 609, 384, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 135, 218, 218, 218, 218, 484, + 265, 135, 135, 135, 135, 265, 265, 135, 484, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 219, 219, + 219, 219, 198, 198, 432, 135, 155, 155, 155, 198, + 198, 198, 198, 155, 220, 220, 220, 220, 155, 155, + + 640, 155, 155, 155, 155, 155, 435, 432, 327, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 435, 637, + 637, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 159, 304, 275, 202, + 222, 223, 223, 223, 223, 184, 202, 222, 159, 304, + 327, 197, 197, 184, 184, 184, 184, 184, 197, 197, + 197, 197, 197, 224, 224, 224, 224, 372, 202, 222, + 252, 252, 252, 252, 159, 159, 159, 159, 159, 159, + + 159, 159, 159, 159, 159, 159, 160, 184, 275, 242, + 242, 242, 242, 160, 304, 202, 222, 275, 317, 317, + 317, 317, 203, 358, 388, 203, 203, 203, 203, 203, + 239, 239, 239, 239, 372, 160, 388, 359, 388, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 203, 242, 461, 358, 461, 230, 230, 230, 230, + 461, 635, 160, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 178, 178, 359, 203, 239, + 178, 707, 707, 178, 178, 178, 178, 178, 230, 178, + 634, 178, 178, 178, 178, 178, 178, 178, 178, 178, + + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 360, 360, 360, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 181, 181, 449, 360, 444, 181, 708, 708, 181, 181, + 181, 181, 181, 633, 181, 449, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 444, 632, 591, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 225, 338, 338, 338, 338, + 454, 651, 225, 366, 225, 253, 591, 286, 231, 231, + 231, 231, 253, 253, 253, 253, 366, 531, 253, 286, + 363, 363, 363, 363, 225, 465, 465, 465, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 231, 629, 285, 628, 366, 467, 253, 454, 283, 286, + 651, 225, 240, 240, 285, 240, 240, 240, 240, 240, + 283, 240, 240, 240, 240, 531, 240, 240, 288, 254, + + 450, 264, 240, 240, 240, 240, 254, 254, 254, 254, + 288, 276, 254, 450, 285, 264, 264, 264, 264, 276, + 276, 276, 276, 276, 279, 240, 240, 240, 285, 285, + 398, 389, 279, 279, 279, 279, 279, 467, 283, 281, + 254, 305, 398, 389, 288, 389, 240, 281, 281, 281, + 281, 281, 305, 240, 240, 244, 244, 244, 244, 244, + 626, 244, 244, 244, 244, 244, 244, 592, 284, 244, + 244, 264, 282, 284, 289, 244, 244, 569, 244, 281, + 282, 282, 282, 282, 282, 284, 289, 608, 287, 303, + 295, 284, 295, 287, 303, 299, 301, 299, 244, 244, + + 287, 303, 295, 625, 414, 414, 290, 299, 301, 414, + 621, 305, 282, 284, 290, 290, 290, 290, 290, 592, + 620, 297, 302, 289, 369, 370, 244, 244, 245, 297, + 297, 297, 297, 297, 302, 336, 301, 369, 370, 608, + 569, 245, 336, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 302, 290, 336, 369, 370, 601, 584, 245, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 255, 328, 300, 709, 709, 328, 622, 601, + 300, 336, 579, 584, 328, 255, 300, 255, 255, 255, + + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 712, 712, 312, 312, + 466, 409, 318, 255, 277, 312, 312, 312, 312, 318, + 379, 318, 332, 409, 393, 619, 277, 300, 380, 332, + 379, 332, 379, 622, 385, 328, 393, 379, 380, 411, + 380, 318, 385, 636, 579, 380, 385, 445, 445, 445, + 411, 332, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 280, 394, 466, 451, 318, 396, + 618, 280, 393, 280, 365, 365, 487, 394, 332, 365, + 451, 396, 365, 365, 365, 365, 665, 616, 365, 487, + + 445, 636, 396, 280, 448, 448, 448, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 411, + 615, 399, 607, 394, 396, 416, 416, 416, 416, 606, + 280, 291, 291, 399, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 377, 291, 291, 448, 665, 502, + 399, 291, 291, 291, 291, 392, 401, 400, 377, 377, + 377, 377, 502, 392, 392, 392, 392, 392, 401, 400, + 402, 600, 424, 459, 291, 291, 291, 407, 481, 407, + 481, 598, 402, 395, 424, 459, 671, 408, 395, 407, + 481, 469, 471, 408, 477, 291, 469, 471, 401, 408, + + 395, 400, 291, 291, 292, 292, 477, 482, 469, 471, + 729, 729, 402, 597, 377, 596, 292, 675, 292, 482, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 395, + 408, 671, 602, 459, 604, 477, 292, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 298, + 483, 530, 530, 530, 602, 675, 604, 590, 589, 588, + 586, 483, 298, 612, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 585, 583, 612, 581, 645, 580, 645, + + 298, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 348, 348, 433, 348, 348, 348, 348, + 348, 645, 348, 348, 348, 348, 503, 348, 348, 410, + 483, 473, 578, 348, 348, 348, 348, 406, 406, 503, + 476, 410, 406, 473, 433, 406, 406, 406, 406, 406, + 472, 406, 470, 433, 476, 476, 348, 348, 348, 577, + 478, 507, 472, 348, 470, 572, 479, 567, 517, 433, + 472, 479, 478, 473, 566, 507, 536, 348, 348, 470, + 582, 410, 517, 479, 348, 348, 355, 355, 536, 355, + 355, 355, 355, 355, 582, 355, 355, 355, 355, 611, + + 355, 355, 470, 646, 486, 486, 355, 355, 355, 355, + 478, 486, 486, 486, 486, 533, 534, 533, 520, 520, + 520, 525, 535, 646, 659, 646, 611, 533, 534, 355, + 355, 355, 536, 538, 535, 525, 525, 525, 525, 539, + 677, 541, 564, 571, 574, 538, 659, 562, 611, 561, + 560, 539, 541, 535, 534, 571, 574, 355, 355, 356, + 356, 520, 356, 356, 356, 356, 356, 559, 356, 356, + 356, 356, 575, 356, 356, 538, 570, 539, 573, 356, + 356, 356, 356, 643, 575, 544, 544, 558, 570, 538, + 573, 525, 544, 544, 544, 544, 613, 643, 565, 571, + + 631, 557, 356, 356, 356, 576, 595, 570, 613, 614, + 677, 541, 565, 565, 565, 565, 576, 595, 556, 573, + 614, 555, 631, 678, 554, 553, 551, 550, 631, 575, + 356, 356, 390, 390, 390, 390, 390, 390, 390, 390, + 390, 390, 390, 390, 397, 397, 549, 397, 397, 397, + 397, 397, 397, 397, 397, 397, 397, 594, 397, 397, + 627, 547, 624, 638, 397, 397, 397, 397, 565, 594, + 546, 627, 545, 630, 617, 576, 595, 543, 630, 614, + 617, 642, 540, 537, 529, 528, 655, 397, 397, 397, + 624, 638, 642, 678, 397, 630, 617, 655, 693, 594, + + 668, 527, 617, 526, 524, 672, 522, 653, 397, 397, + 518, 668, 624, 638, 639, 397, 397, 403, 403, 652, + 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, + 627, 403, 403, 672, 516, 653, 639, 403, 403, 403, + 403, 515, 639, 514, 513, 512, 511, 652, 510, 509, + 508, 642, 652, 666, 673, 672, 655, 653, 639, 667, + 403, 403, 403, 653, 639, 673, 679, 680, 693, 652, + 668, 681, 682, 683, 684, 685, 506, 679, 680, 666, + 505, 666, 681, 682, 683, 684, 685, 667, 403, 403, + 405, 405, 504, 405, 405, 405, 405, 405, 405, 405, + + 405, 405, 405, 666, 405, 405, 501, 667, 500, 667, + 405, 405, 405, 405, 499, 498, 497, 496, 495, 494, + 493, 492, 491, 490, 673, 489, 488, 480, 475, 686, + 464, 463, 462, 405, 405, 405, 679, 680, 460, 458, + 686, 681, 682, 683, 684, 685, 687, 456, 453, 452, + 447, 443, 442, 688, 689, 690, 691, 687, 692, 441, + 437, 405, 405, 426, 688, 689, 690, 691, 436, 692, + 434, 431, 430, 429, 428, 427, 426, 423, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 426, 426, 426, 426, 426, 439, 439, 686, + + 439, 439, 439, 439, 439, 422, 439, 439, 439, 439, + 421, 439, 439, 420, 419, 418, 687, 439, 439, 439, + 439, 417, 415, 688, 689, 690, 691, 413, 692, 412, + 404, 391, 383, 382, 381, 378, 376, 374, 371, 367, + 439, 439, 439, 362, 361, 353, 352, 351, 350, 344, + 343, 342, 341, 340, 339, 334, 333, 331, 326, 324, + 322, 321, 320, 319, 316, 315, 314, 313, 439, 439, + 440, 440, 310, 440, 440, 440, 440, 440, 306, 440, + 440, 440, 440, 296, 440, 440, 294, 278, 274, 268, + 440, 440, 440, 440, 266, 262, 261, 260, 259, 257, + + 256, 251, 250, 249, 238, 237, 236, 235, 232, 229, + 228, 227, 226, 440, 440, 440, 216, 215, 214, 213, + 440, 212, 209, 208, 207, 206, 205, 204, 200, 199, + 195, 191, 179, 170, 440, 440, 161, 150, 148, 147, + 145, 440, 440, 468, 468, 143, 142, 141, 140, 139, + 126, 125, 122, 120, 119, 468, 117, 468, 116, 468, + 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, + 468, 468, 468, 468, 468, 468, 468, 468, 474, 474, + 115, 474, 474, 474, 474, 474, 474, 474, 474, 474, + 474, 114, 474, 474, 103, 101, 97, 94, 474, 474, + + 474, 474, 93, 92, 88, 83, 80, 60, 59, 57, + 56, 54, 53, 45, 42, 41, 39, 24, 23, 21, + 20, 474, 474, 474, 18, 17, 14, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 441, 0, 0, 441, 0, 0, 0, 0, 0, 0, - 0, 441, 0, 0, 441, 0, 0, 441, 441, 0, - 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, - 0, 0, 0, 0, 0, 441, 0, 0, 441, 0, - 0, 441, 450, 450, 0, 450, 450, 450, 450, 450, - 0, 450, 450, 450, 450, 0, 450, 450, 0, 0, - 0, 0, 0, 450, 450, 450, 450, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 450, 450, - - 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 450, 450, 451, 451, 0, 451, 451, 451, - 451, 451, 0, 451, 451, 451, 451, 0, 451, 451, - 0, 0, 0, 0, 0, 451, 451, 451, 451, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, + 474, 587, 587, 0, 587, 587, 587, 587, 587, 0, + 587, 587, 587, 587, 0, 587, 587, 0, 0, 0, + 0, 587, 587, 587, 587, 0, 0, 0, 0, 0, + 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 587, 587, 587, 0, 0, 0, + + 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 587, 587, 593, 593, 0, 593, 593, 593, + 593, 593, 593, 593, 593, 593, 593, 0, 593, 593, + 0, 0, 0, 0, 593, 593, 593, 593, 0, 0, + 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 593, 593, 593, + 0, 0, 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 451, 451, 451, 0, 0, 0, 0, 451, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 451, - 451, 0, 0, 0, 451, 451, 481, 0, 0, 0, + 0, 0, 0, 0, 0, 593, 593, 603, 603, 0, + 603, 603, 603, 603, 603, 0, 603, 603, 603, 603, + 0, 603, 603, 0, 0, 0, 0, 603, 603, 603, + 603, 0, 0, 0, 0, 0, 0, 603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 481, 0, 0, 481, 0, 0, 0, 0, 0, 0, - 0, 481, 0, 0, 481, 0, 0, 481, 481, 0, - 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, - 0, 0, 0, 0, 0, 481, 0, 0, 481, 0, - 0, 481, 487, 487, 0, 487, 487, 487, 487, 487, - 487, 487, 487, 487, 487, 0, 487, 487, 0, 0, - 0, 0, 0, 487, 487, 487, 487, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 487, 487, - - 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 603, 603, 603, 0, 0, 0, 0, 0, 0, 603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 487, 487, 489, 489, 0, 489, 489, 489, - 489, 489, 489, 489, 489, 489, 489, 0, 489, 489, - 0, 0, 0, 0, 0, 489, 489, 489, 489, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 603, 603, + 610, 610, 0, 610, 610, 610, 610, 610, 610, 610, + 610, 610, 610, 0, 610, 610, 0, 0, 0, 0, + 610, 610, 610, 610, 0, 0, 0, 0, 0, 0, + + 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 610, 610, 610, 0, 0, 0, 0, + 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 489, 489, 489, 0, 0, 0, 0, 489, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, - 489, 0, 0, 0, 489, 489, 601, 601, 0, 601, - - 601, 601, 601, 601, 0, 601, 601, 601, 601, 0, - 601, 601, 0, 0, 0, 0, 0, 601, 601, 601, - 601, 0, 0, 0, 0, 0, 0, 601, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 601, 601, 601, 0, 0, 0, 0, 0, - 0, 601, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 601, 601, 607, 607, - 0, 607, 607, 607, 607, 607, 607, 607, 607, 607, - 607, 0, 607, 607, 0, 0, 0, 0, 0, 607, - 607, 607, 607, 0, 0, 0, 0, 0, 0, 607, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 607, 607, 607, 0, 0, 0, - 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 607, 607, - 617, 617, 0, 617, 617, 617, 617, 617, 0, 617, - 617, 617, 617, 0, 617, 617, 0, 0, 0, 0, - 0, 617, 617, 617, 617, 0, 0, 0, 0, 0, - 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 617, 617, 617, 0, - 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 617, 617, 624, 624, 0, 624, 624, 624, 624, 624, - 624, 624, 624, 624, 624, 0, 624, 624, 0, 0, - 0, 0, 0, 624, 624, 624, 624, 0, 0, 0, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 624, 624, - 624, 0, 0, 0, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 624, 624, 711, 0, 0, 711, 711, 0, - 0, 711, 711, 711, 711, 711, 712, 712, 712, 712, - - 712, 0, 712, 712, 712, 712, 712, 712, 712, 712, - 712, 713, 713, 713, 713, 713, 713, 713, 713, 713, - 713, 713, 713, 713, 713, 713, 714, 714, 714, 714, + 0, 610, 610, 697, 0, 0, 0, 697, 697, 0, + 0, 697, 697, 697, 697, 697, 697, 697, 697, 698, + 698, 698, 698, 698, 0, 698, 698, 698, 698, 698, + 698, 698, 698, 698, 698, 698, 698, 698, 699, 699, + 0, 0, 0, 699, 699, 699, 700, 700, 700, 700, + 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, + + 700, 700, 700, 700, 700, 701, 701, 701, 701, 701, + 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, + 701, 701, 701, 701, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 703, 0, 0, 0, 703, 703, 703, + 0, 703, 703, 703, 703, 703, 703, 703, 703, 704, + 704, 704, 704, 704, 0, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 705, 705, + 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, + 705, 705, 705, 705, 705, 705, 705, 706, 706, 0, + + 0, 0, 0, 0, 0, 0, 0, 706, 0, 0, + 706, 706, 0, 706, 710, 710, 710, 710, 710, 710, + 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, + 710, 710, 710, 711, 711, 711, 711, 711, 711, 711, + 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, + 711, 711, 713, 713, 713, 713, 713, 713, 713, 713, + 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, + 713, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, - 714, 715, 715, 715, 715, 715, 715, 715, 715, 715, - 715, 715, 715, 715, 715, 715, 716, 0, 0, 716, - 716, 716, 0, 716, 716, 716, 716, 716, 717, 717, - 717, 717, 717, 0, 717, 717, 717, 717, 717, 717, - 717, 717, 717, 718, 718, 718, 718, 718, 718, 718, - 718, 718, 718, 718, 718, 718, 718, 718, 719, 719, - - 0, 0, 0, 0, 0, 0, 0, 719, 719, 719, - 719, 719, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 720, 720, 720, 720, 721, 721, 721, + 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, + + 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, + 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, 717, 717, + 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, + 717, 717, 717, 717, 717, 717, 717, 718, 718, 718, + 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, + 718, 718, 718, 718, 718, 718, 719, 719, 719, 719, + 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, + 719, 719, 719, 719, 719, 720, 720, 0, 720, 720, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + + 720, 720, 720, 720, 721, 721, 0, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, - 721, 721, 722, 722, 722, 722, 722, 722, 722, 722, - 722, 722, 722, 722, 722, 722, 722, 723, 723, 723, + 721, 721, 721, 722, 0, 722, 0, 0, 0, 722, + 722, 722, 0, 0, 722, 723, 723, 0, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, - 723, 723, 724, 724, 724, 724, 724, 724, 724, 724, - 724, 724, 724, 724, 724, 724, 724, 725, 725, 725, + 723, 723, 723, 723, 724, 724, 724, 724, 724, 724, + 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, + 724, 724, 724, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, - 725, 725, 726, 726, 726, 726, 726, 726, 726, 726, - 726, 726, 726, 726, 726, 726, 726, 727, 727, 727, + + 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, + 726, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, - 727, 727, 728, 728, 0, 728, 728, 728, 728, 728, - 728, 728, 728, 728, 728, 728, 728, 729, 729, 0, - 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, - 729, 729, 730, 730, 0, 730, 730, 730, 730, 730, - 730, 730, 730, 730, 730, 730, 730, 731, 731, 731, + 728, 728, 728, 730, 0, 0, 0, 730, 0, 730, + 730, 730, 730, 0, 730, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 732, 732, 732, 732, 732, 732, 732, 732, - - 732, 732, 732, 732, 732, 732, 732, 733, 733, 733, - 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, - 733, 733, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 735, 0, 0, - 735, 0, 735, 735, 0, 0, 735, 735, 736, 736, + 731, 731, 731, 731, 732, 732, 732, 732, 732, 732, + 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, + 732, 732, 732, 733, 0, 0, 0, 733, 733, 733, + 0, 733, 733, 733, 733, 733, 733, 733, 733, 734, + + 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, + 734, 734, 734, 734, 734, 734, 734, 734, 735, 735, + 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, + 735, 735, 735, 735, 735, 735, 735, 736, 736, 0, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 737, 737, 737, 737, 737, 737, 737, - 737, 737, 737, 737, 737, 737, 737, 737, 738, 738, + 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 738, 738, 738, 738, 0, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, - 738, 738, 738, 739, 739, 739, 739, 739, 739, 739, - - 739, 739, 739, 739, 739, 739, 739, 739, 740, 740, - 0, 740, 740, 740, 740, 740, 740, 740, 740, 740, - 740, 740, 740, 741, 741, 741, 741, 741, 741, 741, - 741, 741, 741, 741, 741, 741, 741, 741, 742, 742, - 742, 742, 0, 742, 742, 742, 742, 742, 742, 742, - 742, 742, 742, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 744, 744, - 0, 744, 744, 744, 744, 744, 744, 744, 744, 744, - 744, 744, 744, 745, 745, 0, 745, 745, 745, 745, - 745, 745, 745, 745, 745, 745, 745, 745, 746, 0, - - 746, 0, 0, 0, 746, 746, 746, 747, 747, 0, + 738, 738, 738, 738, 739, 739, 739, 739, 739, 739, + + 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, + 739, 739, 739, 740, 740, 0, 740, 740, 740, 740, + 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, + 740, 740, 741, 741, 0, 741, 741, 741, 741, 741, + 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, + 741, 742, 0, 742, 742, 0, 0, 742, 742, 742, + 0, 0, 742, 743, 743, 0, 743, 743, 743, 743, + 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, + 743, 743, 744, 744, 0, 744, 744, 744, 744, 744, + 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, + + 744, 745, 745, 0, 745, 745, 745, 745, 745, 745, + 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, + 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, 746, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, - 747, 747, 748, 748, 0, 748, 748, 748, 748, 748, - 748, 748, 748, 748, 748, 748, 748, 749, 749, 0, + 747, 747, 747, 747, 747, 747, 747, 747, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, - 749, 749, 750, 750, 750, 750, 750, 750, 750, 750, - 750, 750, 750, 750, 750, 750, 750, 751, 751, 751, - 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, - 751, 751, 752, 752, 752, 752, 752, 752, 752, 752, - 752, 752, 752, 752, 752, 752, 752, 753, 753, 753, + 749, 749, 749, 749, 749, 749, 750, 750, 0, 0, + 750, 750, 0, 750, 750, 750, 750, 750, 750, 750, + 750, 750, 751, 0, 0, 0, 0, 0, 751, 751, + 751, 751, 0, 751, 752, 752, 752, 752, 752, 752, + 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, + 752, 752, 752, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, - 753, 753, 754, 0, 0, 0, 0, 754, 754, 0, - 0, 754, 754, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 756, 756, - 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, - 756, 756, 756, 757, 757, 0, 757, 757, 757, 757, - 757, 757, 757, 757, 757, 757, 757, 757, 758, 758, - 0, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 759, 759, 759, 759, 0, 759, 759, - 759, 759, 759, 759, 759, 759, 759, 759, 760, 760, - + 753, 753, 754, 754, 0, 754, 754, 754, 754, 754, + 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, + 754, 755, 755, 0, 755, 755, 755, 755, 755, 755, + 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, + + 756, 756, 0, 0, 756, 756, 756, 756, 756, 756, + 756, 756, 756, 756, 756, 756, 757, 757, 757, 757, + 0, 757, 757, 757, 757, 757, 757, 757, 757, 757, + 757, 757, 757, 757, 757, 758, 758, 758, 758, 758, + 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, + 758, 758, 758, 758, 759, 759, 0, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 760, 760, 0, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 761, 761, 0, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 762, 762, - 0, 762, 762, 762, 762, 762, 762, 762, 762, 762, - 762, 762, 762, 763, 763, 0, 763, 763, 763, 763, - 763, 763, 763, 763, 763, 763, 763, 763, 764, 764, - 0, 764, 764, 764, 764, 764, 764, 764, 764, 764, - 764, 764, 764, 765, 765, 0, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, 766, 766, - 0, 766, 766, 766, 766, 766, 766, 766, 766, 766, - - 766, 766, 766, 767, 767, 0, 767, 767, 767, 767, - 767, 767, 767, 767, 767, 767, 767, 767, 768, 768, - 0, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 769, 769, 769, 769, 769, 769, 769, - 769, 769, 769, 769, 769, 769, 769, 769, 770, 770, - 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, - 770, 770, 770, 771, 771, 771, 771, 771, 771, 771, - 771, 771, 771, 771, 771, 771, 771, 771, 772, 0, - 0, 0, 0, 772, 772, 0, 0, 772, 773, 773, + 760, 760, 761, 761, 0, 761, 761, 761, 761, 761, + + 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, + 761, 762, 762, 0, 762, 762, 762, 762, 762, 762, + 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, + 763, 763, 0, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 764, + 764, 0, 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, 765, 765, + 0, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, 765, 765, 765, 766, 766, 0, + 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, + + 766, 766, 766, 766, 766, 766, 767, 767, 767, 767, + 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, + 767, 767, 767, 767, 767, 768, 768, 768, 768, 768, + 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 768, 768, 769, 769, 769, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, + 769, 769, 769, 770, 0, 0, 0, 0, 0, 770, + 770, 770, 770, 770, 770, 770, 770, 770, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 772, 772, 772, + + 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - - 773, 773, 773, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, 775, 775, - 0, 775, 775, 775, 775, 775, 775, 775, 775, 775, - 775, 775, 775, 776, 776, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 776, 777, 0, - 0, 0, 0, 777, 777, 0, 0, 777, 778, 778, - 0, 778, 778, 778, 778, 778, 778, 778, 778, 778, - 778, 778, 778, 779, 779, 779, 779, 779, 779, 779, - 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, - 0, 780, 780, 780, 780, 780, 780, 780, 780, 780, - - 780, 780, 780, 781, 781, 0, 781, 781, 781, 781, + 773, 773, 773, 773, 773, 774, 0, 0, 0, 0, + 0, 774, 774, 774, 774, 775, 775, 0, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 776, 776, 776, 776, 776, 776, + 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, + 776, 776, 776, 777, 777, 0, 777, 777, 777, 777, + 777, 777, 777, 777, 777, 777, 777, 777, 777, 777, + + 777, 777, 778, 778, 0, 778, 778, 778, 778, 778, + 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, + 778, 779, 779, 0, 779, 779, 779, 779, 779, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, + 780, 780, 780, 780, 780, 780, 780, 780, 780, 781, + 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 782, 782, - 0, 782, 782, 782, 782, 782, 782, 782, 782, 782, - 782, 782, 782, 783, 783, 783, 783, 783, 783, 783, - 783, 783, 783, 783, 783, 783, 783, 783, 784, 784, - 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, - 784, 784, 784, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, 786, 786, - 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, - 786, 786, 786, 710, 710, 710, 710, 710, 710, 710, - - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, - 710, 710, 710, 710, 710, 710 + 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 783, 783, 783, + + 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, + 696, 696, 696, 696, 696, 696, 696, 696, 696, 696 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; @@ -1681,9 +1707,7 @@ goto find_rule; \ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "../parser.l" #define INITIAL 0 -#line 8 "../parser.l" /* * parser.l -- lex parser of algebraic chess moves for XBoard * $Id: parser.l,v 2.1 2003/10/27 19:21:00 mann Exp $ @@ -1735,6 +1759,16 @@ char *yytext; /* This parser handles all forms of promotion. * The parser resolves ambiguous moves by searching and check-testing. * It also parses comments of the form [anything] or (anything). + * + * [HGM] Parser extensively modified for bigger boards, Shogi-like syntax, + * and unknow pieces. All pieces are now mandatory upper case, but can be + * any letter A-Z. Files must be lower case (as before), but can run upto 'l'. + * Ranks can be 0-9. The parser returns 0 for off-board files and ranks. + * For an unknown piece (as mover or promotion piece) it returns + * IllegalMove, like it does when the piece doesn't match. + * Promotions can now also be appended Shogi-style, a bare '=' or '+', + * and this is then returned as promotion character. The piece indicator + * can be prefixed by a '+' to indicate it is a promoted piece. */ #include "config.h" @@ -1831,7 +1865,6 @@ int yyback P((int *, int)); int yywrap P((void)); extern void CopyBoard P((Board to, Board from)); -#line 1835 "lex.yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1931,9 +1964,20 @@ YY_MALLOC_DECL YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + } #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - @@ -1982,13 +2026,11 @@ YY_MALLOC_DECL YY_DECL { register yy_state_type yy_current_state; - register char *yy_cp = NULL, *yy_bp = NULL; + register char *yy_cp, *yy_bp; register int yy_act; -#line 156 "../parser.l" -#line 1992 "lex.yy.c" if ( yy_init ) { @@ -2037,14 +2079,14 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 711 ) + if ( yy_current_state >= 697 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_base[yy_current_state] != 4394 ); + while ( yy_base[yy_current_state] != 4517 ); yy_find_action: yy_current_state = *--yy_state_ptr; @@ -2095,55 +2137,83 @@ do_action: /* This label is used only to access EOF actions. */ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 158 "../parser.l" { /* * Fully-qualified algebraic move, possibly with promotion */ - int skip1 = 0, skip2 = 0; + int skip1 = 0, skip2 = 0, skip3 = 0, promoted = 0; ChessSquare piece; ChessMove result; - + char c; + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - /* remove the / */ - if (yytext[1] == '/') skip1 = 1; + if (yytext[0] == '+') skip1 = skip3 = promoted = 1; /* [HGM] Shogi promoted */ + /* remove the / */ + if (yytext[1+skip1] == '/') skip1++; + /* remove the [xX:-] */ if ((yytext[3+skip1] == 'x') || (yytext[3+skip1] == 'X') || - (yytext[3+skip1] == '-') || (yytext[3+skip1] == ':')) skip2 = 1; - + (yytext[3+skip1] == '-') || (yytext[3+skip1] == ':')) skip2 = 1; + currentMoveString[0] = yytext[1+skip1]; currentMoveString[1] = yytext[2+skip1]; currentMoveString[2] = yytext[3+skip1+skip2]; currentMoveString[3] = yytext[4+skip1+skip2]; currentMoveString[4] = NULLCHAR; + + if (appData.debugMode) { + fprintf(debugFP, "Parser Qa1b2: yyleng=%d\n", + yyleng); + } - if (yyleng-skip1-skip2 > 5) { - if (yytext[yyleng-1] == ')') { - currentMoveString[4] = ToLower(yytext[yyleng-2]); + if (yyleng-skip1-skip2 > 5) { char c; + if (yytext[yyleng-1] == ')') { + c = currentMoveString[4] = ToLower(yytext[yyleng-2]); } else { - currentMoveString[4] = ToLower(yytext[yyleng-1]); + c = currentMoveString[4] = ToLower(yytext[yyleng-1]); } currentMoveString[5] = NULLCHAR; + if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) + return IllegalMove; /* [HGM] promotion to invalid piece */ + } + + if (appData.debugMode) { + fprintf(debugFP, "parser: %s\n", currentMoveString); } + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[1] - ONE >= BOARD_HEIGHT || + currentMoveString[1] - ONE < 0 || + currentMoveString[0] - AAA >= BOARD_RGHT || + currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[3] - ONE < 0 || + currentMoveString[2] - AAA >= BOARD_RGHT || + currentMoveString[0] - AAA < BOARD_LEFT || + currentMoveString[2] - AAA < BOARD_LEFT ) + return 0; piece = boards[yyboardindex] - [currentMoveString[1] - '1'][currentMoveString[0] - 'a']; - if (ToLower(yytext[0]) != ToLower(PieceToChar(piece))) + [currentMoveString[1] - ONE][currentMoveString[0] - AAA]; + if(promoted) piece = (ChessSquare) (DEMOTED piece); + c = PieceToChar(piece); + if(c == '~') c = PieceToChar((ChessSquare) (DEMOTED piece)); + if (ToLower(yytext[skip3]) != ToLower(c)) return (int) IllegalMove; result = LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, - currentMoveString[1] - '1', - currentMoveString[0] - 'a', - currentMoveString[3] - '1', - currentMoveString[2] - 'a', + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, currentMoveString[4]); if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = 'q'; + (result == WhitePromotionKnight || result == BlackPromotionKnight || + result == WhitePromotionQueen || result == BlackPromotionQueen)) { + currentMoveString[4] = PieceToChar(BlackQueen); currentMoveString[5] = NULLCHAR; } @@ -2152,10 +2222,10 @@ YY_RULE_SETUP YY_BREAK case 2: YY_RULE_SETUP -#line 212 "../parser.l" { /* * Simple algebraic move, possibly with promotion + * [HGM] Engine moves are received in this format, with lower-case promoChar! */ int skip = 0; ChessMove result; @@ -2172,26 +2242,44 @@ YY_RULE_SETUP currentMoveString[3] = yytext[3+skip]; currentMoveString[4] = NULLCHAR; - if (yyleng-skip > 4) { + if (yyleng-skip > 4) { char c; if (yytext[yyleng-1] == ')') { - currentMoveString[4] = ToLower(yytext[yyleng-2]); + c = currentMoveString[4] = ToLower(yytext[yyleng-2]); } else { - currentMoveString[4] = ToLower(yytext[yyleng-1]); + c = currentMoveString[4] = ToLower(yytext[yyleng-1]); } currentMoveString[5] = NULLCHAR; + if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) + return IllegalMove; } + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[1] - ONE >= BOARD_HEIGHT || + currentMoveString[1] - ONE < 0 || + currentMoveString[0] - AAA >= BOARD_RGHT || + currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[3] - ONE < 0 || + currentMoveString[2] - AAA >= BOARD_RGHT || + currentMoveString[0] - AAA < BOARD_LEFT || + currentMoveString[2] - AAA < BOARD_LEFT ) + return 0; + result = LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, - currentMoveString[1] - '1', - currentMoveString[0] - 'a', - currentMoveString[3] - '1', - currentMoveString[2] - 'a', + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, currentMoveString[4]); if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = 'q'; + (result == WhitePromotionKnight || result == BlackPromotionKnight || + result == WhitePromotionQueen || result == BlackPromotionQueen)) { + if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier) + currentMoveString[4] = PieceToChar(BlackFerz); + else + currentMoveString[4] = PieceToChar(BlackQueen); currentMoveString[5] = NULLCHAR; } @@ -2200,33 +2288,44 @@ YY_RULE_SETUP YY_BREAK case 3: YY_RULE_SETUP -#line 257 "../parser.l" { /* * Pawn move, possibly with promotion */ DisambiguateClosure cl; - int skip = 0; + int skip = 0; char c; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ /* remove the =() */ - if (yytext[2] == '=') skip++; + if (yytext[2] == '=' && yytext[3] != NULLCHAR) skip++; if (yytext[2+skip] == '(') skip++; cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn; cl.rfIn = -1; - cl.ffIn = yytext[0] - 'a'; - cl.rtIn = yytext[1] - '1'; - cl.ftIn = yytext[0] - 'a'; - cl.promoCharIn = yytext[2+skip]; + cl.ffIn = yytext[0] - AAA; + cl.rtIn = yytext[1] - ONE; + cl.ftIn = yytext[0] - AAA; + c = cl.promoCharIn = yytext[2+skip]; + + /* [HGM] do not allow values beyond board size */ + if(cl.rtIn >= BOARD_HEIGHT || + cl.rtIn < 0 || + cl.ffIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + + if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare) + return IllegalMove; + + Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, &cl); - currentMoveString[0] = cl.ff + 'a'; - currentMoveString[1] = cl.rf + '1'; - currentMoveString[2] = cl.ft + 'a'; - currentMoveString[3] = cl.rt + '1'; + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; currentMoveString[4] = cl.promoChar; currentMoveString[5] = NULLCHAR; @@ -2235,13 +2334,12 @@ YY_RULE_SETUP YY_BREAK case 4: YY_RULE_SETUP -#line 290 "../parser.l" { /* * Pawn capture, possibly with promotion, possibly ambiguous */ DisambiguateClosure cl; - int skip1 = 0, skip2 = 0; + int skip1 = 0, skip2 = 0; char c; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ @@ -2257,22 +2355,33 @@ YY_RULE_SETUP /* remove the [xX:-] and =() */ if ((yytext[1] == 'x') || (yytext[1] == 'X') || (yytext[1] == ':') || (yytext[1] == '-')) skip1 = 1; - if (yytext[2+skip1] == '=') skip2++; + if (yytext[2+skip1] == '=' && yytext[3+skip1] != NULLCHAR) skip2++; if (yytext[2+skip1+skip2] == '(') skip2++; cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn; cl.rfIn = -1; - cl.ffIn = yytext[0] - 'a'; + cl.ffIn = yytext[0] - AAA; cl.rtIn = -1; - cl.ftIn = yytext[1+skip1] - 'a'; - cl.promoCharIn = yytext[2+skip1+skip2]; + cl.ftIn = yytext[1+skip1] - AAA; + c = cl.promoCharIn = yytext[2+skip1+skip2]; + + /* [HGM] do not allow values beyond board size */ + if(cl.ffIn >= BOARD_RGHT || + cl.ffIn < BOARD_LEFT || + cl.ftIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + + if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare) + return IllegalMove; + Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, &cl); - currentMoveString[0] = cl.ff + 'a'; - currentMoveString[1] = cl.rf + '1'; - currentMoveString[2] = cl.ft + 'a'; - currentMoveString[3] = cl.rt + '1'; + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; currentMoveString[4] = cl.promoChar; currentMoveString[5] = NULLCHAR; @@ -2281,13 +2390,12 @@ YY_RULE_SETUP YY_BREAK case 5: YY_RULE_SETUP -#line 333 "../parser.l" { /* * unambiguously abbreviated Pawn capture, possibly with promotion */ int skip = 0; - ChessMove result; + ChessMove result; char c; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ @@ -2307,34 +2415,53 @@ YY_RULE_SETUP currentMoveString[0] = yytext[0]; currentMoveString[2] = yytext[1+skip]; currentMoveString[3] = yytext[2+skip]; + + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[0] - AAA >= BOARD_RGHT || + currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[3] - ONE < 0 || + currentMoveString[2] - AAA >= BOARD_RGHT || + currentMoveString[0] - AAA < BOARD_LEFT || + currentMoveString[2] - AAA < BOARD_LEFT ) + return 0; + + if (gameInfo.variant == VariantXiangqi && /* [HGM] In Xiangqi rank stays same */ + currentMoveString[0] != currentMoveString[2] ) { + if (yytext[2+skip] == ONE) return (int) ImpossibleMove; + currentMoveString[1] = yytext[2+skip]; + } else if (WhiteOnMove(yyboardindex)) { - if (yytext[2+skip] == '1') return (int) ImpossibleMove; + if (yytext[2+skip] == ONE) return (int) ImpossibleMove; currentMoveString[1] = yytext[2+skip] - 1; } else { - if (yytext[2+skip] == '8') return (int) ImpossibleMove; - currentMoveString[1] = yytext[2+skip] + 1; + currentMoveString[1] = currentMoveString[3] + 1; + if (currentMoveString[3] == ONE+BOARD_HEIGHT-1) return (int) ImpossibleMove; } if (yyleng-skip > 3) { if (yytext[yyleng-1] == ')') - currentMoveString[4] = ToLower(yytext[yyleng-2]); + c = currentMoveString[4] = ToLower(yytext[yyleng-2]); else - currentMoveString[4] = ToLower(yytext[yyleng-1]); + c = currentMoveString[4] = ToLower(yytext[yyleng-1]); currentMoveString[5] = NULLCHAR; + if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) + return IllegalMove; } else { currentMoveString[4] = NULLCHAR; } result = LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, - currentMoveString[1] - '1', - currentMoveString[0] - 'a', - currentMoveString[3] - '1', - currentMoveString[2] - 'a', + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, currentMoveString[4]); if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = 'q'; + (result == WhitePromotionQueen || result == BlackPromotionQueen || + result == WhitePromotionKnight || result == BlackPromotionKnight)) { + currentMoveString[4] = PieceToChar(BlackQueen); currentMoveString[5] = NULLCHAR; } @@ -2359,10 +2486,11 @@ YY_RULE_SETUP result = LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, - currentMoveString[1] - '1', - currentMoveString[0] - 'a', - currentMoveString[3] - '1', - currentMoveString[2] - 'a', + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, currentMoveString[4]); if (result == WhiteCapturesEnPassant || result == BlackCapturesEnPassant) @@ -2373,37 +2501,57 @@ YY_RULE_SETUP YY_BREAK case 6: YY_RULE_SETUP -#line 422 "../parser.l" { /* * piece move, possibly ambiguous */ DisambiguateClosure cl; - int skip = 0; + int skip = 0, skip2 = 0, promoted = 0; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + if(yytext[0] == '+') promoted = skip = skip2 = 1; + /* remove the [xX:-] */ - if ((yytext[1] == 'x') || (yytext[1] == 'X') - || (yytext[1] == ':') || (yytext[1] == '-')) skip = 1; + if ((yytext[1+skip] == 'x') || (yytext[1+skip] == 'X') + || (yytext[1+skip] == ':') || (yytext[1+skip] == '-')) skip++; if (WhiteOnMove(yyboardindex)) { - cl.pieceIn = CharToPiece(ToUpper(yytext[0])); + cl.pieceIn = CharToPiece(ToUpper(yytext[skip2])); } else { - cl.pieceIn = CharToPiece(ToLower(yytext[0])); + cl.pieceIn = CharToPiece(ToLower(yytext[skip2])); } + if(promoted) cl.pieceIn = (ChessSquare) (PROMOTED cl.pieceIn); + cl.rfIn = -1; cl.ffIn = -1; - cl.rtIn = yytext[2+skip] - '1'; - cl.ftIn = yytext[1+skip] - 'a'; + cl.rtIn = yytext[2+skip] - ONE; + cl.ftIn = yytext[1+skip] - AAA; cl.promoCharIn = NULLCHAR; + + if(yyleng-skip > 3) /* [HGM] can have Shogi-style promotion */ + cl.promoCharIn = yytext[yyleng-1]; + + if (appData.debugMode) { + fprintf(debugFP, "Parser Qa1: yyleng=%d, %d(%d,%d)-(%d,%d) = %d (%c)\n", + yyleng, + cl.pieceIn,cl.ffIn,cl.rfIn,cl.ftIn,cl.rtIn,cl.promoCharIn,cl.promoCharIn?cl.promoCharIn:' '); + } + + /* [HGM] but do not allow values beyond board size */ + if(cl.rtIn >= BOARD_HEIGHT || + cl.rtIn < 0 || + cl.ftIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, &cl); - currentMoveString[0] = cl.ff + 'a'; - currentMoveString[1] = cl.rf + '1'; - currentMoveString[2] = cl.ft + 'a'; - currentMoveString[3] = cl.rt + '1'; + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; currentMoveString[4] = cl.promoChar; currentMoveString[5] = NULLCHAR; @@ -2412,42 +2560,61 @@ YY_RULE_SETUP YY_BREAK case 7: YY_RULE_SETUP -#line 458 "../parser.l" { /* * piece move with rank or file disambiguator */ DisambiguateClosure cl; - int skip = 0; + int skip = 0, skip2 = 0; int promoted=0; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + if(yytext[0]=='+') promoted = skip = skip2 = 1; + /* remove the [xX:-] */ - if ((yytext[2] == 'x') || (yytext[2] == 'X') - || (yytext[2] == ':') || (yytext[2] == '-')) skip = 1; + if ((yytext[2+skip] == 'x') || (yytext[2+skip] == 'X') + || (yytext[2+skip] == ':') || (yytext[2+skip] == '-')) skip++; if (WhiteOnMove(yyboardindex)) { - cl.pieceIn = CharToPiece(ToUpper(yytext[0])); + cl.pieceIn = CharToPiece(ToUpper(yytext[skip2])); } else { - cl.pieceIn = CharToPiece(ToLower(yytext[0])); + cl.pieceIn = CharToPiece(ToLower(yytext[skip2])); } - if (isalpha(yytext[1])) { + if(promoted) cl.pieceIn = (ChessSquare) (PROMOTED cl.pieceIn); + + if (isalpha(yytext[1+skip2])) { cl.rfIn = -1; - cl.ffIn = yytext[1] - 'a'; + cl.ffIn = yytext[1+skip2] - AAA; + + if(cl.ffIn >= BOARD_RGHT || + cl.ffIn < BOARD_LEFT ) return 0; } else { - cl.rfIn = yytext[1] - '1'; + cl.rfIn = yytext[1+skip2] - ONE; cl.ffIn = -1; + if(cl.rfIn >= BOARD_HEIGHT || + cl.rfIn < 0) return 0; } - cl.rtIn = yytext[3+skip] - '1'; - cl.ftIn = yytext[2+skip] - 'a'; + cl.rtIn = yytext[3+skip] - ONE; + cl.ftIn = yytext[2+skip] - AAA; cl.promoCharIn = NULLCHAR; + + if(yyleng-skip > 4) /* [HGM] can have Shogi-style promotion */ + cl.promoCharIn = yytext[yyleng-1]; + + /* [HGM] do not allow values beyond board size */ + if(cl.rtIn >= BOARD_HEIGHT || + cl.rtIn < 0 || + cl.ftIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, &cl); - currentMoveString[0] = cl.ff + 'a'; - currentMoveString[1] = cl.rf + '1'; - currentMoveString[2] = cl.ft + 'a'; - currentMoveString[3] = cl.rt + '1'; + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; currentMoveString[4] = cl.promoChar; currentMoveString[5] = NULLCHAR; @@ -2456,101 +2623,135 @@ YY_RULE_SETUP YY_BREAK case 8: YY_RULE_SETUP -#line 499 "../parser.l" { int rf, ff, rt, ft; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + /* [HGM] all squares referenced to board edges in stead of absolute */ if (WhiteOnMove(yyboardindex)) { - if (boards[yyboardindex][0][3] == WhiteKing) { + if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) { /* ICS wild castling */ - strcpy(currentMoveString, "d1f1"); rf = 0; - ff = 3; + ff = (BOARD_WIDTH-1)>>1; rt = 0; - ft = 5; + ft = BOARD_RGHT-3; } else { - strcpy(currentMoveString, "e1c1"); rf = 0; - ff = 4; + ff = BOARD_WIDTH>>1; rt = 0; - ft = 2; + ft = BOARD_LEFT+2; } - } else{ - if (boards[yyboardindex][7][3] == BlackKing) { + } else{ + if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) { /* ICS wild castling */ - strcpy(currentMoveString, "d8f8"); - rf = 7; - ff = 3; - rt = 7; - ft = 5; + rf = BOARD_HEIGHT-1; + ff = (BOARD_WIDTH-1)>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_RGHT-3; } else { - strcpy(currentMoveString, "e8c8"); - rf = 7; - ff = 4; - rt = 7; - ft = 2; + rf = BOARD_HEIGHT-1; + ff = BOARD_WIDTH>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_LEFT+2; } } + if(gameInfo.variant == VariantFischeRandom) { + if (WhiteOnMove(yyboardindex)) { + ff = initialRights[2]; + ft = initialRights[1]; + } else { + ff = initialRights[5]; + ft = initialRights[4]; + } + fprintf(debugFP, "Parser FRC long %d %d\n", ff, ft); + if(ff < 0 || ft < 0) return 0; + } + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + if (appData.debugMode) { + fprintf(debugFP, "long castling %d %d\n", ff, ft); + } return (int) LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, + castlingRights[yyboardindex], /* [HGM] use true castling rights */ rf, ff, rt, ft, NULLCHAR); } YY_BREAK case 9: YY_RULE_SETUP -#line 540 "../parser.l" { int rf, ff, rt, ft; if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ if (WhiteOnMove(yyboardindex)) { - if (boards[yyboardindex][0][3] == WhiteKing) { + if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) { /* ICS wild castling */ - strcpy(currentMoveString, "d1b1"); rf = 0; - ff = 3; + ff = (BOARD_WIDTH-1)>>1; rt = 0; - ft = 1; + ft = BOARD_LEFT+1; } else { - strcpy(currentMoveString, "e1g1"); rf = 0; - ff = 4; + ff = BOARD_WIDTH>>1; rt = 0; - ft = 6; + ft = BOARD_RGHT-2; } } else { - if (boards[yyboardindex][7][3] == BlackKing) { + if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) { /* ICS wild castling */ - strcpy(currentMoveString, "d8b8"); - rf = 7; - ff = 3; - rt = 7; - ft = 1; + rf = BOARD_HEIGHT-1; + ff = (BOARD_WIDTH-1)>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_LEFT+1; } else { - strcpy(currentMoveString, "e8g8"); - rf = 7; - ff = 4; - rt = 7; - ft = 6; + rf = BOARD_HEIGHT-1; + ff = BOARD_WIDTH>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_RGHT-2; } } + if(gameInfo.variant == VariantFischeRandom) { + if (WhiteOnMove(yyboardindex)) { + ff = initialRights[2]; + ft = initialRights[0]; + } else { + ff = initialRights[5]; + ft = initialRights[3]; + } + if (appData.debugMode) { + fprintf(debugFP, "Parser FRC short %d %d\n", ff, ft); + } + if(ff < 0 || ft < 0) return 0; + } + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + if (appData.debugMode) { + fprintf(debugFP, "short castling %d %d\n", ff, ft); + } + return (int) LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, + PosFlags(yyboardindex), EP_UNKNOWN, + castlingRights[yyboardindex], /* [HGM] use true castling rights */ rf, ff, rt, ft, NULLCHAR); } YY_BREAK case 10: YY_RULE_SETUP -#line 581 "../parser.l" { /* Bughouse piece drop. No legality checking for now. */ currentMoveString[1] = '@'; currentMoveString[2] = yytext[2]; currentMoveString[3] = yytext[3]; currentMoveString[4] = NULLCHAR; + + if (appData.debugMode) { + fprintf(debugFP, "Drop: %s\n", currentMoveString); + } + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[2] - AAA >= BOARD_WIDTH ) + return 0; + if (WhiteOnMove(yyboardindex)) { currentMoveString[0] = ToUpper(yytext[0]); return (int) WhiteDrop; @@ -2562,7 +2763,6 @@ YY_RULE_SETUP YY_BREAK case 11: YY_RULE_SETUP -#line 596 "../parser.l" { if (WhiteOnMove(yyboardindex)) return (int) BlackWins; @@ -2572,35 +2772,30 @@ YY_RULE_SETUP YY_BREAK case 12: YY_RULE_SETUP -#line 603 "../parser.l" { return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins); } YY_BREAK case 13: YY_RULE_SETUP -#line 607 "../parser.l" { return (int) GameUnfinished; } YY_BREAK case 14: YY_RULE_SETUP -#line 611 "../parser.l" { return (int) GameIsDrawn; } YY_BREAK case 15: YY_RULE_SETUP -#line 615 "../parser.l" { return (int) GameIsDrawn; } YY_BREAK case 16: YY_RULE_SETUP -#line 619 "../parser.l" { if (WhiteOnMove(yyboardindex)) return (int) BlackWins; @@ -2610,7 +2805,6 @@ YY_RULE_SETUP YY_BREAK case 17: YY_RULE_SETUP -#line 626 "../parser.l" { if (WhiteOnMove(yyboardindex)) return (int) BlackWins; @@ -2620,63 +2814,54 @@ YY_RULE_SETUP YY_BREAK case 18: YY_RULE_SETUP -#line 633 "../parser.l" { return (int) GameIsDrawn; } YY_BREAK case 19: YY_RULE_SETUP -#line 637 "../parser.l" { return (int) GameIsDrawn; } YY_BREAK case 20: YY_RULE_SETUP -#line 641 "../parser.l" { return (int) (ToUpper(yytext[0]) == 'W' ? WhiteWins : BlackWins); } YY_BREAK case 21: YY_RULE_SETUP -#line 645 "../parser.l" { return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins); } YY_BREAK case 22: YY_RULE_SETUP -#line 649 "../parser.l" -{ +{ return (int) WhiteWins; } YY_BREAK case 23: YY_RULE_SETUP -#line 653 "../parser.l" -{ +{ return (int) BlackWins; } YY_BREAK case 24: YY_RULE_SETUP -#line 657 "../parser.l" { return (int) GameIsDrawn; } YY_BREAK case 25: YY_RULE_SETUP -#line 661 "../parser.l" { return (int) GameUnfinished; } YY_BREAK case 26: YY_RULE_SETUP -#line 665 "../parser.l" { /* move numbers */ if ((yyleng == 1) && (yytext[0] == '1')) @@ -2685,15 +2870,13 @@ YY_RULE_SETUP YY_BREAK case 27: YY_RULE_SETUP -#line 671 "../parser.l" { - /* elapsed time indication, e.g. (0:12) or {10:21.071} */ + /* elapsed time indication, e.g. (0:12) or {10:21.071} */ return (int) ElapsedTime; } YY_BREAK case 28: YY_RULE_SETUP -#line 676 "../parser.l" { /* position diagram enclosed in [-- --] */ return (int) PositionDiagram; @@ -2704,7 +2887,6 @@ case 29: yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 681 "../parser.l" { /* position diagram enclosed in {-- --} */ return (int) PositionDiagram; @@ -2712,14 +2894,12 @@ YY_RULE_SETUP YY_BREAK case 30: YY_RULE_SETUP -#line 686 "../parser.l" { return (int) PGNTag; -} +} YY_BREAK case 31: YY_RULE_SETUP -#line 690 "../parser.l" { return (int) GNUChessGame; } @@ -2729,23 +2909,20 @@ case 32: yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 694 "../parser.l" { return (int) XBoardGame; } YY_BREAK case 33: YY_RULE_SETUP -#line 698 "../parser.l" { /* numeric annotation glyph */ return (int) NAG; } YY_BREAK case 34: YY_RULE_SETUP -#line 702 "../parser.l" { /* anything in {} */ - return (int) Comment; + return (int) Comment; } YY_BREAK case 35: @@ -2753,59 +2930,50 @@ case 35: yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 706 "../parser.l" { /* ; to end of line */ return (int) Comment; } YY_BREAK case 36: YY_RULE_SETUP -#line 710 "../parser.l" { /* anything in [] */ - return (int) Comment; + return (int) Comment; } YY_BREAK case 37: YY_RULE_SETUP -#line 714 "../parser.l" { /* nested () */ - return (int) Comment; + return (int) Comment; } YY_BREAK case 38: YY_RULE_SETUP -#line 718 "../parser.l" { /* >=2 chars in () */ - return (int) Comment; -} + return (int) Comment; +} YY_BREAK case 39: YY_RULE_SETUP -#line 722 "../parser.l" { /* Skip mail headers */ } YY_BREAK case 40: YY_RULE_SETUP -#line 726 "../parser.l" { /* Skip random words */ } YY_BREAK case 41: YY_RULE_SETUP -#line 730 "../parser.l" { /* Skip everything else */ } YY_BREAK case 42: YY_RULE_SETUP -#line 734 "../parser.l" ECHO; YY_BREAK -#line 2809 "lex.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -3095,7 +3263,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 711 ) + if ( yy_current_state >= 697 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3125,11 +3293,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 711 ) + if ( yy_current_state >= 697 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 710); + yy_is_jam = (yy_current_state == 696); if ( ! yy_is_jam ) *yy_state_ptr++ = yy_current_state; @@ -3182,7 +3350,6 @@ register char *yy_bp; #endif /* ifndef YY_NO_UNPUT */ -#ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput() #else @@ -3255,7 +3422,7 @@ static int input() return c; } -#endif /* YY_NO_INPUT */ + #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) @@ -3366,6 +3533,15 @@ YY_BUFFER_STATE b; } +#ifndef _WIN32 +#include +#else +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif +#endif #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) @@ -3683,7 +3859,6 @@ int main() return 0; } #endif -#line 734 "../parser.l" @@ -3695,7 +3870,7 @@ static FILE *lexFP; static int input() { int ret; - + if (StringToLex != NULL) { ret = *StringToLex; if (ret == NULLCHAR) @@ -3706,9 +3881,9 @@ static int input() ret = unputBuffer[--unputCount]; } else { ret = fgetc(lexFP); - } + } - if (ret == EOF) + if (ret == EOF) return 0; else return ret; @@ -3726,7 +3901,7 @@ int yyoffset() } return(offset); } - + static void output(ch) int ch; { @@ -3798,7 +3973,7 @@ void my_yy_input(buf, result, max_size) *result = count; } return; - } + } } static YY_BUFFER_STATE my_file_buffer = NULL; @@ -3852,7 +4027,7 @@ ChessMove yylexstr(boardIndex, s) #ifdef FLEX_SCANNER YY_BUFFER_STATE buffer, oldBuffer; #endif - + yyboardindex = boardIndex; oldStringToLex = StringToLex; StringToLex = s; @@ -3865,7 +4040,7 @@ ChessMove yylexstr(boardIndex, s) ret = (ChessMove) yylex(); #ifdef FLEX_SCANNER - if (oldBuffer != NULL) + if (oldBuffer != NULL) yy_switch_to_buffer(oldBuffer); yy_delete_buffer(buffer); #endif /*FLEX_SCANNER*/ diff --git a/parser.h b/parser.h index 7718604..66fe833 100644 --- a/parser.h +++ b/parser.h @@ -58,3 +58,4 @@ extern char *yy_text; /* Needed because yytext can be either a char[] or a (non-constant) char* */ extern int yyoffset P((void)); extern char initialRights[BOARD_SIZE]; +extern char castlingRights[MAX_MOVES][BOARD_SIZE]; diff --git a/parser.l b/parser.l index 46de027..41feced 100644 --- a/parser.l +++ b/parser.l @@ -191,6 +191,11 @@ extern void CopyBoard P((Board to, Board from)); currentMoveString[3] = yytext[4+skip1+skip2]; currentMoveString[4] = NULLCHAR; + if (appData.debugMode) { + fprintf(debugFP, "Parser Qa1b2: yyleng=%d\n", + yyleng); + } + if (yyleng-skip1-skip2 > 5) { char c; if (yytext[yyleng-1] == ')') { c = currentMoveString[4] = ToLower(yytext[yyleng-2]); @@ -297,7 +302,10 @@ extern void CopyBoard P((Board to, Board from)); if (currentMoveString[4] == NULLCHAR && (result == WhitePromotionKnight || result == BlackPromotionKnight || result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = PieceToChar(BlackQueen); + if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier) + currentMoveString[4] = PieceToChar(BlackFerz); + else + currentMoveString[4] = PieceToChar(BlackQueen); currentMoveString[5] = NULLCHAR; } @@ -543,6 +551,12 @@ extern void CopyBoard P((Board to, Board from)); if(yyleng-skip > 3) /* [HGM] can have Shogi-style promotion */ cl.promoCharIn = yytext[yyleng-1]; + if (appData.debugMode) { + fprintf(debugFP, "Parser Qa1: yyleng=%d, %d(%d,%d)-(%d,%d) = %d (%c)\n", + yyleng, + cl.pieceIn,cl.ffIn,cl.rfIn,cl.ftIn,cl.rtIn,cl.promoCharIn,cl.promoCharIn?cl.promoCharIn:' '); + } + /* [HGM] but do not allow values beyond board size */ if(cl.rtIn >= BOARD_HEIGHT || cl.rtIn < 0 || @@ -557,7 +571,7 @@ extern void CopyBoard P((Board to, Board from)); currentMoveString[1] = cl.rf + ONE; currentMoveString[2] = cl.ft + AAA; currentMoveString[3] = cl.rt + ONE; - currentMoveString[4] = cl.promoChar; + currentMoveString[4] = cl.promoChar; currentMoveString[5] = NULLCHAR; return (int) cl.kind; @@ -637,33 +651,44 @@ extern void CopyBoard P((Board to, Board from)); ff = (BOARD_WIDTH-1)>>1; rt = 0; ft = BOARD_RGHT-3; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } else { rf = 0; ff = BOARD_WIDTH>>1; rt = 0; ft = BOARD_LEFT+2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } } else{ - if (boards[yyboardindex][BOARD_HEIGHT-1][3] == BlackKing) { + if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) { /* ICS wild castling */ rf = BOARD_HEIGHT-1; ff = (BOARD_WIDTH-1)>>1; rt = BOARD_HEIGHT-1; ft = BOARD_RGHT-3; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } else { rf = BOARD_HEIGHT-1; ff = BOARD_WIDTH>>1; rt = BOARD_HEIGHT-1; ft = BOARD_LEFT+2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } } + if(gameInfo.variant == VariantFischeRandom) { + if (WhiteOnMove(yyboardindex)) { + ff = initialRights[2]; + ft = initialRights[1]; + } else { + ff = initialRights[5]; + ft = initialRights[4]; + } + fprintf(debugFP, "Parser FRC long %d %d\n", ff, ft); + if(ff < 0 || ft < 0) return 0; + } + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + if (appData.debugMode) { + fprintf(debugFP, "long castling %d %d\n", ff, ft); + } return (int) LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ + castlingRights[yyboardindex], /* [HGM] use true castling rights */ rf, ff, rt, ft, NULLCHAR); } @@ -679,13 +704,11 @@ extern void CopyBoard P((Board to, Board from)); ff = (BOARD_WIDTH-1)>>1; rt = 0; ft = BOARD_LEFT+1; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } else { rf = 0; ff = BOARD_WIDTH>>1; rt = 0; ft = BOARD_RGHT-2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } } else { if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) { @@ -694,18 +717,34 @@ extern void CopyBoard P((Board to, Board from)); ff = (BOARD_WIDTH-1)>>1; rt = BOARD_HEIGHT-1; ft = BOARD_LEFT+1; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } else { rf = BOARD_HEIGHT-1; ff = BOARD_WIDTH>>1; rt = BOARD_HEIGHT-1; ft = BOARD_RGHT-2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); } } + if(gameInfo.variant == VariantFischeRandom) { + if (WhiteOnMove(yyboardindex)) { + ff = initialRights[2]; + ft = initialRights[0]; + } else { + ff = initialRights[5]; + ft = initialRights[3]; + } + if (appData.debugMode) { + fprintf(debugFP, "Parser FRC short %d %d\n", ff, ft); + } + if(ff < 0 || ft < 0) return 0; + } + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + if (appData.debugMode) { + fprintf(debugFP, "short castling %d %d\n", ff, ft); + } + return (int) LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ + PosFlags(yyboardindex), EP_UNKNOWN, + castlingRights[yyboardindex], /* [HGM] use true castling rights */ rf, ff, rt, ft, NULLCHAR); } diff --git a/pgntags.c b/pgntags.c index 6317c8b..f21bccc 100644 --- a/pgntags.c +++ b/pgntags.c @@ -1,265 +1,265 @@ -/* - * pgntags.c -- Functions to manage PGN tags - * XBoard $Id: pgntags.c,v 2.1 2003/10/27 19:21:00 mann Exp $ - * - * Copyright 1995 Free Software Foundation, Inc. - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - * ------------------------------------------------------------------------ - * - * This file could well be a part of backend.c, but I prefer it this - * way. - */ - -#include "config.h" - -#include -#include -#include -#if STDC_HEADERS -# include -# include -#else /* not STDC_HEADERS */ -# if HAVE_STRING_H -# include -# else /* not HAVE_STRING_H */ -# include -# endif /* not HAVE_STRING_H */ -#endif /* not STDC_HEADERS */ - -#include "common.h" -#include "frontend.h" -#include "backend.h" -#include "parser.h" - -static char *PGNTagsStatic P((GameInfo *)); - - - -/* Parse PGN tags; returns 0 for success or error number - */ -int ParsePGNTag(tag, gameInfo) - char *tag; - GameInfo *gameInfo; -{ - char *name, *value, *p, *oldTags; - int len; - int success; - - name = tag; - while (!isalpha(*name) && !isdigit(*name)) { - name++; - } - p = name; - while (*p != ' ' && *p != '\t' && *p != '\n') { - p++; - } - *p = NULLCHAR; - value = strchr(p + 1, '"') + 1; - p = strrchr(value, '"'); - *p = NULLCHAR; - - if (StrCaseCmp(name, "Event") == 0) { - success = StrSavePtr(value, &gameInfo->event) != NULL; - } else if (StrCaseCmp(name, "Site") == 0) { - success = StrSavePtr(value, &gameInfo->site) != NULL; - } else if (StrCaseCmp(name, "Date") == 0) { - success = StrSavePtr(value, &gameInfo->date) != NULL; - } else if (StrCaseCmp(name, "Round") == 0) { - success = StrSavePtr(value, &gameInfo->round) != NULL; - } else if (StrCaseCmp(name, "White") == 0) { - success = StrSavePtr(value, &gameInfo->white) != NULL; - } else if (StrCaseCmp(name, "Black") == 0) { - success = StrSavePtr(value, &gameInfo->black) != NULL; - } - /* Fold together the various ways of denoting White/Black rating */ - else if ((StrCaseCmp(name, "WhiteElo")==0) || - (StrCaseCmp(name, "WhiteUSCF")==0) ) { - success = TRUE; - gameInfo->whiteRating = atoi( value ); - } else if ((StrCaseCmp(name, "BlackElo")==0) || - (StrCaseCmp(name, "BlackUSCF")==0)) { - success = TRUE; - gameInfo->blackRating = atoi( value ); - } - else if (StrCaseCmp(name, "Result") == 0) { - if (strcmp(value, "1-0") == 0) - gameInfo->result = WhiteWins; - else if (strcmp(value, "0-1") == 0) - gameInfo->result = BlackWins; - else if (strcmp(value, "1/2-1/2") == 0) - gameInfo->result = GameIsDrawn; - else - gameInfo->result = GameUnfinished; - success = TRUE; - } else if (StrCaseCmp(name, "FEN") == 0) { - success = StrSavePtr(value, &gameInfo->fen) != NULL; - } else if (StrCaseCmp(name, "SetUp") == 0) { - /* ignore on input; presence of FEN governs */ - success = TRUE; - } else if (StrCaseCmp(name, "Variant") == 0) { - /* xboard-defined extension */ - gameInfo->variant = StringToVariant(value); - success = TRUE; - } else if (StrCaseCmp(name, PGN_OUT_OF_BOOK) == 0) { - /* [AS] Out of book annotation */ - success = StrSavePtr(value, &gameInfo->outOfBook) != NULL; - } else { - if (gameInfo->extraTags == NULL) { - oldTags = ""; - } else { - oldTags = gameInfo->extraTags; - } - /* Buffer size includes 7 bytes of space for [ ""]\n\0 */ - len = strlen(oldTags) + strlen(value) + strlen(name) + 7; - if ((p = (char *) malloc(len)) != NULL) { - sprintf(p, "%s[%s \"%s\"]\n", oldTags, name, value); - if (gameInfo->extraTags != NULL) free(gameInfo->extraTags); - gameInfo->extraTags = p; - success = TRUE; - } else { - success = FALSE; - } - } - return(success ? 0 : ENOMEM); -} - - - -/* Return a static buffer with a game's data. - */ -static char *PGNTagsStatic(gameInfo) - GameInfo *gameInfo; -{ - static char buf[8192]; - char buf1[MSG_SIZ]; - - buf[0] = NULLCHAR; - - sprintf(buf1, "[Event \"%s\"]\n", - gameInfo->event ? gameInfo->event : "?"); - strcat(buf, buf1); - sprintf(buf1, "[Site \"%s\"]\n", - gameInfo->site ? gameInfo->site : "?"); - strcat(buf, buf1); - sprintf(buf1, "[Date \"%s\"]\n", - gameInfo->date ? gameInfo->date : "?"); - strcat(buf, buf1); - sprintf(buf1, "[Round \"%s\"]\n", - gameInfo->round ? gameInfo->round : "-"); - strcat(buf, buf1); - sprintf(buf1, "[White \"%s\"]\n", - gameInfo->white ? gameInfo->white : "?"); - strcat(buf, buf1); - sprintf(buf1, "[Black \"%s\"]\n", - gameInfo->black ? gameInfo->black : "?"); - strcat(buf, buf1); - sprintf(buf1, "[Result \"%s\"]\n", PGNResult(gameInfo->result)); - strcat(buf, buf1); - - if (gameInfo->whiteRating >= 0 ) { - sprintf(buf1, "[WhiteElo \"%d\"]\n", gameInfo->whiteRating ); - strcat(buf, buf1); - } - if ( gameInfo->blackRating >= 0 ) { - sprintf(buf1, "[BlackElo \"%d\"]\n", gameInfo->blackRating ); - strcat(buf, buf1); - } - if (gameInfo->timeControl != NULL) { - sprintf(buf1, "[TimeControl \"%s\"]\n", gameInfo->timeControl); - strcat(buf, buf1); - } - if (gameInfo->variant != VariantNormal) { - sprintf(buf1, "[Variant \"%s\"]\n", VariantName(gameInfo->variant)); - strcat(buf, buf1); - } - if (gameInfo->extraTags != NULL) { - strcat(buf, gameInfo->extraTags); - } - return buf; -} - - - -/* Print game info - */ -void PrintPGNTags(fp, gameInfo) - FILE *fp; - GameInfo *gameInfo; -{ - fprintf(fp, "%s", PGNTagsStatic(gameInfo)); -} - - -/* Return a non-static buffer with a games info. - */ -char *PGNTags(gameInfo) - GameInfo *gameInfo; -{ - return StrSave(PGNTagsStatic(gameInfo)); -} - - -/* Returns pointer to a static string with a result. - */ -char *PGNResult(result) - ChessMove result; -{ - switch (result) { - case GameUnfinished: - default: - return "*"; - case WhiteWins: - return "1-0"; - case BlackWins: - return "0-1"; - case GameIsDrawn: - return "1/2-1/2"; - } -} - -/* Returns 0 for success, nonzero for error */ -int -ReplaceTags(tags, gameInfo) - char *tags; - GameInfo *gameInfo; -{ - ChessMove moveType; - int err; - - ClearGameInfo(gameInfo); - yynewstr(tags); - for (;;) { - yyboardindex = 0; - moveType = (ChessMove) yylex(); - if (moveType == (ChessMove) 0) { - break; - } else if (moveType == PGNTag) { - err = ParsePGNTag(yy_text, gameInfo); - if (err != 0) return err; - } - } - /* just one problem...if there is a result in the new tags, - * DisplayMove() won't ever show it because ClearGameInfo() set - * gameInfo->resultDetails to NULL. So we must plug something in if there - * is a result. - */ - if (gameInfo->result != GameUnfinished) { - if (gameInfo->resultDetails) free(gameInfo->resultDetails); - gameInfo->resultDetails = strdup(""); - } - return 0; -} +/* + * pgntags.c -- Functions to manage PGN tags + * XBoard $Id: pgntags.c,v 2.1 2003/10/27 19:21:00 mann Exp $ + * + * Copyright 1995 Free Software Foundation, Inc. + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + * ------------------------------------------------------------------------ + * + * This file could well be a part of backend.c, but I prefer it this + * way. + */ + +#include "config.h" + +#include +#include +#include +#if STDC_HEADERS +# include +# include +#else /* not STDC_HEADERS */ +# if HAVE_STRING_H +# include +# else /* not HAVE_STRING_H */ +# include +# endif /* not HAVE_STRING_H */ +#endif /* not STDC_HEADERS */ + +#include "common.h" +#include "frontend.h" +#include "backend.h" +#include "parser.h" + +static char *PGNTagsStatic P((GameInfo *)); + + + +/* Parse PGN tags; returns 0 for success or error number + */ +int ParsePGNTag(tag, gameInfo) + char *tag; + GameInfo *gameInfo; +{ + char *name, *value, *p, *oldTags; + int len; + int success; + + name = tag; + while (!isalpha(*name) && !isdigit(*name)) { + name++; + } + p = name; + while (*p != ' ' && *p != '\t' && *p != '\n') { + p++; + } + *p = NULLCHAR; + value = strchr(p + 1, '"') + 1; + p = strrchr(value, '"'); + *p = NULLCHAR; + + if (StrCaseCmp(name, "Event") == 0) { + success = StrSavePtr(value, &gameInfo->event) != NULL; + } else if (StrCaseCmp(name, "Site") == 0) { + success = StrSavePtr(value, &gameInfo->site) != NULL; + } else if (StrCaseCmp(name, "Date") == 0) { + success = StrSavePtr(value, &gameInfo->date) != NULL; + } else if (StrCaseCmp(name, "Round") == 0) { + success = StrSavePtr(value, &gameInfo->round) != NULL; + } else if (StrCaseCmp(name, "White") == 0) { + success = StrSavePtr(value, &gameInfo->white) != NULL; + } else if (StrCaseCmp(name, "Black") == 0) { + success = StrSavePtr(value, &gameInfo->black) != NULL; + } + /* Fold together the various ways of denoting White/Black rating */ + else if ((StrCaseCmp(name, "WhiteElo")==0) || + (StrCaseCmp(name, "WhiteUSCF")==0) ) { + success = TRUE; + gameInfo->whiteRating = atoi( value ); + } else if ((StrCaseCmp(name, "BlackElo")==0) || + (StrCaseCmp(name, "BlackUSCF")==0)) { + success = TRUE; + gameInfo->blackRating = atoi( value ); + } + else if (StrCaseCmp(name, "Result") == 0) { + if (strcmp(value, "1-0") == 0) + gameInfo->result = WhiteWins; + else if (strcmp(value, "0-1") == 0) + gameInfo->result = BlackWins; + else if (strcmp(value, "1/2-1/2") == 0) + gameInfo->result = GameIsDrawn; + else + gameInfo->result = GameUnfinished; + success = TRUE; + } else if (StrCaseCmp(name, "FEN") == 0) { + success = StrSavePtr(value, &gameInfo->fen) != NULL; + } else if (StrCaseCmp(name, "SetUp") == 0) { + /* ignore on input; presence of FEN governs */ + success = TRUE; + } else if (StrCaseCmp(name, "Variant") == 0) { + /* xboard-defined extension */ + gameInfo->variant = StringToVariant(value); + success = TRUE; + } else if (StrCaseCmp(name, PGN_OUT_OF_BOOK) == 0) { + /* [AS] Out of book annotation */ + success = StrSavePtr(value, &gameInfo->outOfBook) != NULL; + } else { + if (gameInfo->extraTags == NULL) { + oldTags = ""; + } else { + oldTags = gameInfo->extraTags; + } + /* Buffer size includes 7 bytes of space for [ ""]\n\0 */ + len = strlen(oldTags) + strlen(value) + strlen(name) + 7; + if ((p = (char *) malloc(len)) != NULL) { + sprintf(p, "%s[%s \"%s\"]\n", oldTags, name, value); + if (gameInfo->extraTags != NULL) free(gameInfo->extraTags); + gameInfo->extraTags = p; + success = TRUE; + } else { + success = FALSE; + } + } + return(success ? 0 : ENOMEM); +} + + + +/* Return a static buffer with a game's data. + */ +static char *PGNTagsStatic(gameInfo) + GameInfo *gameInfo; +{ + static char buf[8192]; + char buf1[MSG_SIZ]; + + buf[0] = NULLCHAR; + + sprintf(buf1, "[Event \"%s\"]\n", + gameInfo->event ? gameInfo->event : "?"); + strcat(buf, buf1); + sprintf(buf1, "[Site \"%s\"]\n", + gameInfo->site ? gameInfo->site : "?"); + strcat(buf, buf1); + sprintf(buf1, "[Date \"%s\"]\n", + gameInfo->date ? gameInfo->date : "?"); + strcat(buf, buf1); + sprintf(buf1, "[Round \"%s\"]\n", + gameInfo->round ? gameInfo->round : "-"); + strcat(buf, buf1); + sprintf(buf1, "[White \"%s\"]\n", + gameInfo->white ? gameInfo->white : "?"); + strcat(buf, buf1); + sprintf(buf1, "[Black \"%s\"]\n", + gameInfo->black ? gameInfo->black : "?"); + strcat(buf, buf1); + sprintf(buf1, "[Result \"%s\"]\n", PGNResult(gameInfo->result)); + strcat(buf, buf1); + + if (gameInfo->whiteRating >= 0 ) { + sprintf(buf1, "[WhiteElo \"%d\"]\n", gameInfo->whiteRating ); + strcat(buf, buf1); + } + if ( gameInfo->blackRating >= 0 ) { + sprintf(buf1, "[BlackElo \"%d\"]\n", gameInfo->blackRating ); + strcat(buf, buf1); + } + if (gameInfo->timeControl != NULL) { + sprintf(buf1, "[TimeControl \"%s\"]\n", gameInfo->timeControl); + strcat(buf, buf1); + } + if (gameInfo->variant != VariantNormal) { + sprintf(buf1, "[Variant \"%s\"]\n", VariantName(gameInfo->variant)); + strcat(buf, buf1); + } + if (gameInfo->extraTags != NULL) { + strcat(buf, gameInfo->extraTags); + } + return buf; +} + + + +/* Print game info + */ +void PrintPGNTags(fp, gameInfo) + FILE *fp; + GameInfo *gameInfo; +{ + fprintf(fp, "%s", PGNTagsStatic(gameInfo)); +} + + +/* Return a non-static buffer with a games info. + */ +char *PGNTags(gameInfo) + GameInfo *gameInfo; +{ + return StrSave(PGNTagsStatic(gameInfo)); +} + + +/* Returns pointer to a static string with a result. + */ +char *PGNResult(result) + ChessMove result; +{ + switch (result) { + case GameUnfinished: + default: + return "*"; + case WhiteWins: + return "1-0"; + case BlackWins: + return "0-1"; + case GameIsDrawn: + return "1/2-1/2"; + } +} + +/* Returns 0 for success, nonzero for error */ +int +ReplaceTags(tags, gameInfo) + char *tags; + GameInfo *gameInfo; +{ + ChessMove moveType; + int err; + + ClearGameInfo(gameInfo); + yynewstr(tags); + for (;;) { + yyboardindex = 0; + moveType = (ChessMove) yylex(); + if (moveType == (ChessMove) 0) { + break; + } else if (moveType == PGNTag) { + err = ParsePGNTag(yy_text, gameInfo); + if (err != 0) return err; + } + } + /* just one problem...if there is a result in the new tags, + * DisplayMove() won't ever show it because ClearGameInfo() set + * gameInfo->resultDetails to NULL. So we must plug something in if there + * is a result. + */ + if (gameInfo->result != GameUnfinished) { + if (gameInfo->resultDetails) free(gameInfo->resultDetails); + gameInfo->resultDetails = strdup(""); + } + return 0; +} diff --git a/uci.c b/uci.c index fdf7e6c..5af3ce6 100644 --- a/uci.c +++ b/uci.c @@ -1,101 +1,101 @@ -/* - * UCI support thru Polyglot - * - * Author: Alessandro Scotti (Jan 2006) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#include "config.h" - -#include /* required for all Windows applications */ - -#include -#include -#include - -#include "common.h" -#include "winboard.h" -#include "frontend.h" -#include "backend.h" - -#define INIFILE_PREFIX "polyglot_" -#define INIFILE_SUFFIX_1ST "1st" -#define INIFILE_SUFFIX_2ND "2nd" -#define INIFILE_EXT ".ini" - -static const char * GetIniFilename( ChessProgramState * cps ) -{ - return cps == &first ? INIFILE_PREFIX INIFILE_SUFFIX_1ST INIFILE_EXT : INIFILE_PREFIX INIFILE_SUFFIX_2ND INIFILE_EXT; - } - -void InitEngineUCI( const char * iniDir, ChessProgramState * cps ) -{ - if( cps->isUCI ) { - const char * iniFileName = GetIniFilename( cps ); - char polyglotIniFile[ MAX_PATH ]; - FILE * f; - - /* Build name of initialization file */ - if( strchr( iniDir, ' ' ) != NULL ) { - char iniDirShort[ MAX_PATH ]; - - GetShortPathName( iniDir, iniDirShort, sizeof(iniDirShort) ); - - strcpy( polyglotIniFile, iniDirShort ); - } - else { - strcpy( polyglotIniFile, iniDir ); - } - - strcat( polyglotIniFile, "\\" ); - strcat( polyglotIniFile, iniFileName ); - - /* Create initialization file */ - f = fopen( polyglotIniFile, "w" ); - - if( f != NULL ) { - fprintf( f, "[Polyglot]\n" ); - - if( cps->dir != 0 && strlen(cps->dir) > 0 ) { - fprintf( f, "EngineDir = %s\n", cps->dir ); - } - - if( cps->program != 0 && strlen(cps->program) > 0 ) { - fprintf( f, "EngineCommand = %s\n", cps->program ); - } - - fprintf( f, "Book = %s\n", appData.usePolyglotBook ? "true" : "false" ); - fprintf( f, "BookFile = %s\n", appData.polyglotBook ); - - fprintf( f, "[Engine]\n" ); - fprintf( f, "Hash = %d\n", appData.defaultHashSize ); - - fprintf( f, "NalimovPath = %s\n", appData.defaultPathEGTB ); - fprintf( f, "NalimovCache = %d\n", appData.defaultCacheSizeEGTB ); - - fprintf( f, "OwnBook = %s\n", cps->hasOwnBookUCI ? "true" : "false" ); - - fclose( f ); - - /* Replace program with properly configured Polyglot */ - cps->dir = appData.polyglotDir; - cps->program = (char *) malloc( strlen(polyglotIniFile) + 32 ); - strcpy( cps->program, "polyglot " ); - strcat( cps->program, polyglotIniFile ); - } - } -} +/* + * UCI support thru Polyglot + * + * Author: Alessandro Scotti (Jan 2006) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#include "config.h" + +#include /* required for all Windows applications */ + +#include +#include +#include + +#include "common.h" +#include "winboard.h" +#include "frontend.h" +#include "backend.h" + +#define INIFILE_PREFIX "polyglot_" +#define INIFILE_SUFFIX_1ST "1st" +#define INIFILE_SUFFIX_2ND "2nd" +#define INIFILE_EXT ".ini" + +static const char * GetIniFilename( ChessProgramState * cps ) +{ + return cps == &first ? INIFILE_PREFIX INIFILE_SUFFIX_1ST INIFILE_EXT : INIFILE_PREFIX INIFILE_SUFFIX_2ND INIFILE_EXT; + } + +void InitEngineUCI( const char * iniDir, ChessProgramState * cps ) +{ + if( cps->isUCI ) { + const char * iniFileName = GetIniFilename( cps ); + char polyglotIniFile[ MAX_PATH ]; + FILE * f; + + /* Build name of initialization file */ + if( strchr( iniDir, ' ' ) != NULL ) { + char iniDirShort[ MAX_PATH ]; + + GetShortPathName( iniDir, iniDirShort, sizeof(iniDirShort) ); + + strcpy( polyglotIniFile, iniDirShort ); + } + else { + strcpy( polyglotIniFile, iniDir ); + } + + strcat( polyglotIniFile, "\\" ); + strcat( polyglotIniFile, iniFileName ); + + /* Create initialization file */ + f = fopen( polyglotIniFile, "w" ); + + if( f != NULL ) { + fprintf( f, "[Polyglot]\n" ); + + if( cps->dir != 0 && strlen(cps->dir) > 0 ) { + fprintf( f, "EngineDir = %s\n", cps->dir ); + } + + if( cps->program != 0 && strlen(cps->program) > 0 ) { + fprintf( f, "EngineCommand = %s\n", cps->program ); + } + + fprintf( f, "Book = %s\n", appData.usePolyglotBook ? "true" : "false" ); + fprintf( f, "BookFile = %s\n", appData.polyglotBook ); + + fprintf( f, "[Engine]\n" ); + fprintf( f, "Hash = %d\n", appData.defaultHashSize ); + + fprintf( f, "NalimovPath = %s\n", appData.defaultPathEGTB ); + fprintf( f, "NalimovCache = %d\n", appData.defaultCacheSizeEGTB ); + + fprintf( f, "OwnBook = %s\n", cps->hasOwnBookUCI ? "true" : "false" ); + + fclose( f ); + + /* Replace program with properly configured Polyglot */ + cps->dir = appData.polyglotDir; + cps->program = (char *) malloc( strlen(polyglotIniFile) + 32 ); + strcpy( cps->program, "polyglot " ); + strcat( cps->program, polyglotIniFile ); + } + } +} diff --git a/winboard/defaults.h b/winboard/defaults.h index c90fd9e..901bd5d 100644 --- a/winboard/defaults.h +++ b/winboard/defaults.h @@ -177,8 +177,8 @@ #define EDITTAGS_FONT_COLOSSAL "Courier New:8.0" #define EDITTAGS_FONT_TITANIC "Courier New:8.0" -#define MOVEHISTORY_FONT_ALL "MS Sans Serif:8.0" - +#define MOVEHISTORY_FONT_ALL "MS Sans Serif:8.0" + #define COLOR_SHOUT "#209000" #define COLOR_SSHOUT "b #289808" #define COLOR_CHANNEL1 "#2020E0" diff --git a/winboard/resource.h b/winboard/resource.h index 32e7081..4b08076 100644 --- a/winboard/resource.h +++ b/winboard/resource.h @@ -454,6 +454,10 @@ #define OPT_VariantAtomic 1513 #define OPT_VariantNormal 1514 #define OPT_VariantFairy 1515 +#define OPT_VariantFRC 1516 +#define OPT_VariantCylinder 1517 +#define OPT_VariantFalcon 1518 +#define OPT_VariantCRC 1519 #define IDC_Files 1550 #define IDC_Ranks 1551 #define IDC_Holdings 1552 diff --git a/winboard/wclipbrd.c b/winboard/wclipbrd.c index d04ce9a..55b9dfd 100644 --- a/winboard/wclipbrd.c +++ b/winboard/wclipbrd.c @@ -1,6 +1,6 @@ /* * wclipbrd.c -- Clipboard routines for WinBoard - * $Id: wclipbrd.c,v 2.1 2003/10/27 19:21:02 mann Exp $ + * $Id: wclipbrd.c,v 2.1 2003/10/27 19:21:02 mann Exp $ * * Copyright 2000 Free Software Foundation, Inc. * @@ -47,7 +47,7 @@ CopyFENToClipboard() { char *fen = NULL; - fen = PositionToFEN(currentMove,1); + fen = PositionToFEN(currentMove,1); if (!fen) { DisplayError("Unable to convert position to FEN.", 0); return; @@ -57,38 +57,38 @@ CopyFENToClipboard() free(fen); } -/* [AS] */ -HGLOBAL ExportGameListAsText(); - -VOID CopyGameListToClipboard() -{ - HGLOBAL hMem = ExportGameListAsText(); - - if( hMem != NULL ) { - /* Assign memory block to clipboard */ - BOOL ok = OpenClipboard( hwndMain ); - - if( ok ) { - ok = EmptyClipboard(); - - if( ok ) { - if( hMem != SetClipboardData( CF_TEXT, hMem ) ) { - ok = FALSE; - } - } - - CloseClipboard(); - - if( ! ok ) { - GlobalFree( hMem ); - } - } - - if( ! ok ) { - DisplayError( "Cannot copy list to clipboard.", 0 ); - } - } -} +/* [AS] */ +HGLOBAL ExportGameListAsText(); + +VOID CopyGameListToClipboard() +{ + HGLOBAL hMem = ExportGameListAsText(); + + if( hMem != NULL ) { + /* Assign memory block to clipboard */ + BOOL ok = OpenClipboard( hwndMain ); + + if( ok ) { + ok = EmptyClipboard(); + + if( ok ) { + if( hMem != SetClipboardData( CF_TEXT, hMem ) ) { + ok = FALSE; + } + } + + CloseClipboard(); + + if( ! ok ) { + GlobalFree( hMem ); + } + } + + if( ! ok ) { + DisplayError( "Cannot copy list to clipboard.", 0 ); + } + } +} VOID CopyGameToClipboard() @@ -226,16 +226,16 @@ CopyTextToClipboard(char *text) return TRUE; } -/* [AS] Reworked paste functions so they can work with strings too */ - -VOID PasteFENFromString( char * fen ) -{ - if (appData.debugMode) { - fprintf(debugFP, "PasteFenFromString(): fen '%s'\n", fen); - } - EditPositionPasteFEN(fen); /* call into backend */ - free(fen); -} +/* [AS] Reworked paste functions so they can work with strings too */ + +VOID PasteFENFromString( char * fen ) +{ + if (appData.debugMode) { + fprintf(debugFP, "PasteFenFromString(): fen '%s'\n", fen); + } + EditPositionPasteFEN(fen); /* call into backend */ + free(fen); +} VOID @@ -246,10 +246,10 @@ PasteFENFromClipboard() DisplayError("Unable to paste FEN from clipboard.", 0); return; } - PasteFENFromString( fen ); + PasteFENFromString( fen ); } -VOID PasteGameFromString( char * buf ) +VOID PasteGameFromString( char * buf ) { FILE *f; size_t len; @@ -259,55 +259,55 @@ VOID PasteGameFromString( char * buf ) f = fopen(pasteTemp, "w"); if (!f) { DisplayError("Unable to create temporary file.", 0); - free(buf); /* [AS] */ + free(buf); /* [AS] */ return; } len = fwrite(buf, sizeof(char), strlen(buf), f); fclose(f); if (len != strlen(buf)) { DisplayError("Error writing to temporary file.", 0); - free(buf); /* [AS] */ + free(buf); /* [AS] */ return; } LoadGameFromFile(pasteTemp, 0, "Clipboard", TRUE); - free( buf ); /* [AS] */ -} - - -VOID -PasteGameFromClipboard() -{ - /* Write the clipboard to a temp file, then let LoadGameFromFile() - * do all the work. */ - char *buf; - if (!PasteTextFromClipboard(&buf)) { - return; - } - PasteGameFromString( buf ); + free( buf ); /* [AS] */ +} + + +VOID +PasteGameFromClipboard() +{ + /* Write the clipboard to a temp file, then let LoadGameFromFile() + * do all the work. */ + char *buf; + if (!PasteTextFromClipboard(&buf)) { + return; + } + PasteGameFromString( buf ); } -/* [AS] Try to detect whether the clipboard contains FEN or PGN data */ -VOID PasteGameOrFENFromClipboard() -{ - char *buf; - char *tmp; - - if (!PasteTextFromClipboard(&buf)) { - return; - } - - tmp = buf; - while( *tmp == ' ' || *tmp == '\t' || *tmp == '\r' || *tmp == '\n' ) { - tmp++; - } - - if( *tmp == '[' ) { - PasteGameFromString( buf ); - } - else { - PasteFENFromString( buf ); - } -} +/* [AS] Try to detect whether the clipboard contains FEN or PGN data */ +VOID PasteGameOrFENFromClipboard() +{ + char *buf; + char *tmp; + + if (!PasteTextFromClipboard(&buf)) { + return; + } + + tmp = buf; + while( *tmp == ' ' || *tmp == '\t' || *tmp == '\r' || *tmp == '\n' ) { + tmp++; + } + + if( *tmp == '[' ) { + PasteGameFromString( buf ); + } + else { + PasteFENFromString( buf ); + } +} int PasteTextFromClipboard(char **text) diff --git a/winboard/wclipbrd.h b/winboard/wclipbrd.h index 791dc74..b2ea95b 100644 --- a/winboard/wclipbrd.h +++ b/winboard/wclipbrd.h @@ -1,6 +1,6 @@ /* * wclipbrd.c -- Clipboard routines for WinBoard - * $Id: wclipbrd.h,v 2.1 2003/10/27 19:21:02 mann Exp $ + * $Id: wclipbrd.h,v 2.1 2003/10/27 19:21:02 mann Exp $ * * Copyright 2000 Free Software Foundation, Inc. * @@ -23,7 +23,7 @@ VOID CopyFENToClipboard(); VOID CopyGameToClipboard(); -VOID CopyGameListToClipboard(); +VOID CopyGameListToClipboard(); int CopyTextToClipboard(char *text); VOID PasteFENFromClipboard(); @@ -31,5 +31,5 @@ VOID PasteGameFromClipboard(); int PasteTextFromClipboard(char **text); VOID DeleteClipboardTempFiles(); - -VOID PasteGameOrFENFromClipboard(); /* [AS] */ + +VOID PasteGameOrFENFromClipboard(); /* [AS] */ diff --git a/winboard/wedittags.c b/winboard/wedittags.c index 935e761..83cd607 100644 --- a/winboard/wedittags.c +++ b/winboard/wedittags.c @@ -1,6 +1,6 @@ /* * wedittags.c -- EditTags window for WinBoard - * $Id: wedittags.c,v 2.1 2003/10/27 19:21:02 mann Exp $ + * $Id: wedittags.c,v 2.1 2003/10/27 19:21:02 mann Exp $ * * Copyright 1995 Free Software Foundation, Inc. * diff --git a/winboard/wedittags.h b/winboard/wedittags.h index 9b3626a..0851d39 100644 --- a/winboard/wedittags.h +++ b/winboard/wedittags.h @@ -1,6 +1,6 @@ /* * wedittags.h -- EditTags window for WinBoard - * $Id: wedittags.h,v 2.1 2003/10/27 19:21:02 mann Exp $ + * $Id: wedittags.h,v 2.1 2003/10/27 19:21:02 mann Exp $ * * Copyright 1995 Free Software Foundation, Inc. * diff --git a/winboard/wengineoutput.c b/winboard/wengineoutput.c index 0eb7536..86715e3 100644 --- a/winboard/wengineoutput.c +++ b/winboard/wengineoutput.c @@ -1,749 +1,749 @@ -/* - * Engine output (PV) - * - * Author: Alessandro Scotti (Dec 2005) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#include "config.h" - -#include /* required for all Windows applications */ -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "winboard.h" -#include "frontend.h" -#include "backend.h" - -#include "wsnap.h" - -VOID EngineOutputPopUp(); -VOID EngineOutputPopDown(); -BOOL EngineOutputIsUp(); - -#define SHOW_PONDERING - -/* Imports from backend.c */ -char * SavePart(char *str); - -/* Imports from winboard.c */ -extern HWND engineOutputDialog; -extern BOOLEAN engineOutputDialogUp; - -extern HINSTANCE hInst; -extern HWND hwndMain; - -extern WindowPlacement wpEngineOutput; - -/* Module variables */ -#define H_MARGIN 2 -#define V_MARGIN 2 -#define LABEL_V_DISTANCE 1 /* Distance between label and memo */ -#define SPLITTER_SIZE 4 /* Distance between first memo and second label */ - -#define ICON_SIZE 14 - -#define STATE_UNKNOWN -1 -#define STATE_THINKING 0 -#define STATE_IDLE 1 -#define STATE_PONDERING 2 -#define STATE_ANALYZING 3 - -static int windowMode = 1; - -static BOOL needInit = TRUE; - -static HICON hiColorBlack = NULL; -static HICON hiColorWhite = NULL; -static HICON hiColorUnknown = NULL; -static HICON hiClear = NULL; -static HICON hiPondering = NULL; -static HICON hiThinking = NULL; -static HICON hiAnalyzing = NULL; - -static int lastDepth[2] = { -1, -1 }; -static int lastForwardMostMove[2] = { -1, -1 }; -static int engineState[2] = { -1, -1 }; - -typedef struct { - HWND hColorIcon; - HWND hLabel; - HWND hStateIcon; - HWND hStateData; - HWND hLabelNPS; - HWND hMemo; - char * name; - int which; - int depth; - unsigned long nodes; - int score; - int time; - char * pv; - char * hint; - int an_move_index; - int an_move_count; -} EngineOutputData; - -static HICON LoadIconEx( int id ) -{ - return LoadImage( hInst, MAKEINTRESOURCE(id), IMAGE_ICON, ICON_SIZE, ICON_SIZE, 0 ); -} - -static VOID InitializeEngineOutput() -{ - if( needInit ) { - hiColorBlack = LoadIconEx( IDI_BLACK_14 ); - hiColorWhite = LoadIconEx( IDI_WHITE_14 ); - hiColorUnknown = LoadIconEx( IDI_UNKNOWN_14 ); - hiClear = LoadIconEx( IDI_TRANS_14 ); - hiPondering = LoadIconEx( IDI_PONDER_14 ); - hiThinking = LoadIconEx( IDI_CLOCK_14 ); - hiAnalyzing = LoadIconEx( IDI_ANALYZE2_14 ); - needInit = FALSE; - } -} - -static VOID SetControlPos( HWND hDlg, int id, int x, int y, int width, int height ) -{ - HWND hControl = GetDlgItem( hDlg, id ); - - SetWindowPos( hControl, HWND_TOP, x, y, width, height, SWP_NOZORDER ); -} - -#define HIDDEN_X 20000 -#define HIDDEN_Y 20000 - -static VOID HideControl( HWND hDlg, int id ) -{ - HWND hControl = GetDlgItem( hDlg, id ); - RECT rc; - - GetWindowRect( hControl, &rc ); - - /* - Avoid hiding an already hidden control, because that causes many - unnecessary WM_ERASEBKGND messages! - */ - if( rc.left != HIDDEN_X || rc.top != HIDDEN_Y ) { - SetControlPos( hDlg, id, 20000, 20000, 100, 100 ); - } -} - -static int GetControlWidth( HWND hDlg, int id ) -{ - RECT rc; - - GetWindowRect( GetDlgItem( hDlg, id ), &rc ); - - return rc.right - rc.left; -} - -static int GetControlHeight( HWND hDlg, int id ) -{ - RECT rc; - - GetWindowRect( GetDlgItem( hDlg, id ), &rc ); - - return rc.bottom - rc.top; -} - -static int GetHeaderHeight() -{ - int result = GetControlHeight( engineOutputDialog, IDC_EngineLabel1 ); - - if( result < ICON_SIZE ) result = ICON_SIZE; - - return result; -} - -#define ENGINE_COLOR_WHITE 'w' -#define ENGINE_COLOR_BLACK 'b' -#define ENGINE_COLOR_UNKNOWN ' ' - -char GetEngineColor( int which ) -{ - char result = ENGINE_COLOR_UNKNOWN; - - if( which == 0 || which == 1 ) { - ChessProgramState * cps; - - switch (gameMode) { - case MachinePlaysBlack: - case IcsPlayingBlack: - result = ENGINE_COLOR_BLACK; - break; - case MachinePlaysWhite: - case IcsPlayingWhite: - result = ENGINE_COLOR_WHITE; - break; - case AnalyzeMode: - case AnalyzeFile: - result = WhiteOnMove(forwardMostMove) ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; - break; - case TwoMachinesPlay: - cps = (which == 0) ? &first : &second; - result = cps->twoMachinesColor[0]; - result = result == 'w' ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; - break; - } - } - - return result; -} - -char GetActiveEngineColor() -{ - char result = ENGINE_COLOR_UNKNOWN; - - if( gameMode == TwoMachinesPlay ) { - result = WhiteOnMove(forwardMostMove) ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; - } - - return result; -} - -static int IsEnginePondering( int which ) -{ - int result = FALSE; - - switch (gameMode) { - case MachinePlaysBlack: - case IcsPlayingBlack: - if( WhiteOnMove(forwardMostMove) ) result = TRUE; - break; - case MachinePlaysWhite: - case IcsPlayingWhite: - if( ! WhiteOnMove(forwardMostMove) ) result = TRUE; - break; - case TwoMachinesPlay: - if( GetActiveEngineColor() != ENGINE_COLOR_UNKNOWN ) { - if( GetEngineColor( which ) != GetActiveEngineColor() ) result = TRUE; - } - break; - } - - return result; -} - -static VOID PositionControlSet( HWND hDlg, int x, int y, int clientWidth, int memoHeight, int idColor, int idEngineLabel, int idNPS, int idMemo, int idStateIcon, int idStateData ) -{ - int label_x = x + ICON_SIZE + H_MARGIN; - int label_h = GetControlHeight( hDlg, IDC_EngineLabel1 ); - int label_y = y + ICON_SIZE - label_h; - int nps_w = GetControlWidth( hDlg, IDC_Engine1_NPS ); - int nps_x = clientWidth - H_MARGIN - nps_w; - int state_data_w = GetControlWidth( hDlg, IDC_StateData1 ); - int state_data_x = nps_x - H_MARGIN - state_data_w; - int state_icon_x = state_data_x - ICON_SIZE - 2; - int max_w = clientWidth - 2*H_MARGIN; - int memo_y = y + ICON_SIZE + LABEL_V_DISTANCE; - - SetControlPos( hDlg, idColor, x, y, ICON_SIZE, ICON_SIZE ); - SetControlPos( hDlg, idEngineLabel, label_x, label_y, state_icon_x - label_x, label_h ); - SetControlPos( hDlg, idStateIcon, state_icon_x, y, ICON_SIZE, ICON_SIZE ); - SetControlPos( hDlg, idStateData, state_data_x, label_y, state_data_w, label_h ); - SetControlPos( hDlg, idNPS, nps_x, label_y, nps_w, label_h ); - SetControlPos( hDlg, idMemo, x, memo_y, max_w, memoHeight ); -} - -static VOID ResizeWindowControls( HWND hDlg, int mode ) -{ - RECT rc; - int headerHeight = GetHeaderHeight(); - int labelHeight = GetControlHeight( hDlg, IDC_EngineLabel1 ); - int labelOffset = H_MARGIN + ICON_SIZE + H_MARGIN; - int labelDeltaY = ICON_SIZE - labelHeight; - int clientWidth; - int clientHeight; - int maxControlWidth; - int npsWidth; - - /* Initialize variables */ - GetClientRect( hDlg, &rc ); - - clientWidth = rc.right - rc.left; - clientHeight = rc.bottom - rc.top; - - maxControlWidth = clientWidth - 2*H_MARGIN; - - npsWidth = GetControlWidth( hDlg, IDC_Engine1_NPS ); - - /* Resize controls */ - if( mode == 0 ) { - /* One engine */ - PositionControlSet( hDlg, H_MARGIN, V_MARGIN, - clientWidth, - clientHeight - V_MARGIN - LABEL_V_DISTANCE - headerHeight- V_MARGIN, - IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); - - /* Hide controls for the second engine */ - HideControl( hDlg, IDC_Color2 ); - HideControl( hDlg, IDC_EngineLabel2 ); - HideControl( hDlg, IDC_StateIcon2 ); - HideControl( hDlg, IDC_StateData2 ); - HideControl( hDlg, IDC_Engine2_NPS ); - HideControl( hDlg, IDC_EngineMemo2 ); - SendDlgItemMessage( hDlg, IDC_EngineMemo2, WM_SETTEXT, 0, (LPARAM) "" ); - /* TODO: we should also hide/disable them!!! what about tab stops?!?! */ - } - else { - /* Two engines */ - int memo_h = (clientHeight - headerHeight*2 - V_MARGIN*2 - LABEL_V_DISTANCE*2 - SPLITTER_SIZE) / 2; - int header1_y = V_MARGIN; - int header2_y = V_MARGIN + headerHeight + LABEL_V_DISTANCE + memo_h + SPLITTER_SIZE; - - PositionControlSet( hDlg, H_MARGIN, header1_y, clientWidth, memo_h, - IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); - - PositionControlSet( hDlg, H_MARGIN, header2_y, clientWidth, memo_h, - IDC_Color2, IDC_EngineLabel2, IDC_Engine2_NPS, IDC_EngineMemo2, IDC_StateIcon2, IDC_StateData2 ); - } - - InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo1), NULL, FALSE ); - InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE ); -} - -static VOID SetDisplayMode( int mode ) -{ - if( windowMode != mode ) { - windowMode = mode; - - ResizeWindowControls( engineOutputDialog, mode ); - } -} - -static VOID VerifyDisplayMode() -{ - int mode; - - /* Get proper mode for current game */ - switch( gameMode ) { - case AnalyzeMode: - case AnalyzeFile: - case MachinePlaysWhite: - case MachinePlaysBlack: - case IcsPlayingWhite: - case IcsPlayingBlack: - mode = 0; - break; - case TwoMachinesPlay: - mode = 1; - break; - default: - /* Do not change */ - return; - } - - SetDisplayMode( mode ); -} - -static VOID InsertIntoMemo( HWND hMemo, char * text ) -{ - SendMessage( hMemo, EM_SETSEL, 0, 0 ); - - SendMessage( hMemo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); -} - -static VOID SetIcon( HWND hControl, HICON hIcon ) -{ - if( hIcon != NULL ) { - SendMessage( hControl, STM_SETICON, (WPARAM) hIcon, 0 ); - } -} - -static VOID SetEngineColorIcon( HWND hControl, int which ) -{ - char color = GetEngineColor(which); - HICON hicon = NULL; - - if( color == ENGINE_COLOR_BLACK ) - hicon = hiColorBlack; - else if( color == ENGINE_COLOR_WHITE ) - hicon = hiColorWhite; - else - hicon = hiColorUnknown; - - SetIcon( hControl, hicon ); -} - -static SetEngineState( int which, int state, char * state_data ) -{ - int x_which = 1 - which; - HWND hStateIcon = GetDlgItem( engineOutputDialog, which == 0 ? IDC_StateIcon1 : IDC_StateIcon2 ); - HWND hStateData = GetDlgItem( engineOutputDialog, which == 0 ? IDC_StateData1 : IDC_StateData2 ); - - if( engineState[ which ] != state ) { - engineState[ which ] = state; - - switch( state ) { - case STATE_THINKING: - SetIcon( hStateIcon, hiThinking ); - if( engineState[ x_which ] == STATE_THINKING ) { - SetEngineState( x_which, STATE_IDLE, "" ); - } - break; - case STATE_PONDERING: - SetIcon( hStateIcon, hiPondering ); - break; - case STATE_ANALYZING: - SetIcon( hStateIcon, hiAnalyzing ); - break; - default: - SetIcon( hStateIcon, hiClear ); - break; - } - } - - if( state_data != 0 ) { - SetWindowText( hStateData, state_data ); - } -} - -#define MAX_NAME_LENGTH 32 - -static VOID UpdateControls( EngineOutputData * ed ) -{ - BOOL isPondering = FALSE; - - char s_label[MAX_NAME_LENGTH + 32]; - - char * name = ed->name; - - /* Label */ - if( name == 0 || *name == '\0' ) { - name = "?"; - } - - strncpy( s_label, name, MAX_NAME_LENGTH ); - s_label[ MAX_NAME_LENGTH-1 ] = '\0'; - -#ifdef SHOW_PONDERING - if( IsEnginePondering( ed->which ) ) { - char buf[8]; - - buf[0] = '\0'; - - if( ed->hint != 0 && *ed->hint != '\0' ) { - strncpy( buf, ed->hint, sizeof(buf) ); - buf[sizeof(buf)-1] = '\0'; - } - else if( ed->pv != 0 && *ed->pv != '\0' ) { - char * sep = strchr( ed->pv, ' ' ); - int buflen = sizeof(buf); - - if( sep != NULL ) { - buflen = sep - ed->pv + 1; - if( buflen > sizeof(buf) ) buflen = sizeof(buf); - } - - strncpy( buf, ed->pv, buflen ); - buf[ buflen-1 ] = '\0'; - } - - SetEngineState( ed->which, STATE_PONDERING, buf ); - } - else if( gameMode == TwoMachinesPlay ) { - SetEngineState( ed->which, STATE_THINKING, "" ); - } - else if( gameMode == AnalyzeMode || gameMode == AnalyzeFile ) { - char buf[64]; - int time_secs = ed->time / 100; - int time_mins = time_secs / 60; - - buf[0] = '\0'; - - if( ed->an_move_index != 0 && ed->an_move_count != 0 && *ed->hint != '\0' ) { - char mov[16]; - - strncpy( mov, ed->hint, sizeof(mov) ); - mov[ sizeof(mov)-1 ] = '\0'; - - sprintf( buf, "%d/%d: %s [%02d:%02d:%02d]", ed->an_move_index, ed->an_move_count, mov, time_mins / 60, time_mins % 60, time_secs % 60 ); - } - - SetEngineState( ed->which, STATE_ANALYZING, buf ); - } - else { - SetEngineState( ed->which, STATE_IDLE, "" ); - } -#endif - - SetWindowText( ed->hLabel, s_label ); - - s_label[0] = '\0'; - - if( ed->time > 0 && ed->nodes > 0 ) { - unsigned long nps_100 = ed->nodes / ed->time; - - if( nps_100 < 100000 ) { - sprintf( s_label, "NPS: %lu", nps_100 * 100 ); - } - else { - sprintf( s_label, "NPS: %.1fk", nps_100 / 10.0 ); - } - } - - SetWindowText( ed->hLabelNPS, s_label ); - - /* Memo */ - if( ed->pv != 0 && *ed->pv != '\0' ) { - char s_nodes[24]; - char s_score[16]; - char s_time[24]; - char buf[256]; - int buflen; - int time_secs = ed->time / 100; - int time_cent = ed->time % 100; - - /* Nodes */ - if( ed->nodes < 1000000 ) { - sprintf( s_nodes, "%lu", ed->nodes ); - } - else { - sprintf( s_nodes, "%.1fM", ed->nodes / 1000000.0 ); - } - - /* Score */ - if( ed->score > 0 ) { - sprintf( s_score, "+%.2f", ed->score / 100.0 ); - } - else { - sprintf( s_score, "%.2f", ed->score / 100.0 ); - } - - /* Time */ - sprintf( s_time, "%d:%02d.%02d", time_secs / 60, time_secs % 60, time_cent ); - - /* Put all together... */ - sprintf( buf, "%3d\t%s\t%s\t%s\t", ed->depth, s_score, s_nodes, s_time ); - - /* Add PV */ - buflen = strlen(buf); - - strncpy( buf + buflen, ed->pv, sizeof(buf) - buflen ); - - buf[ sizeof(buf) - 3 ] = '\0'; - - strcat( buf + buflen, "\r\n" ); - - /* Update memo */ - InsertIntoMemo( ed->hMemo, buf ); - } - - /* Colors */ - SetEngineColorIcon( ed->hColorIcon, ed->which ); -} - -LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) -{ - static SnapData sd; - - switch (message) { - case WM_INITDIALOG: - if( engineOutputDialog == NULL ) { - engineOutputDialog = hDlg; - - RestoreWindowPlacement( hDlg, &wpEngineOutput ); /* Restore window placement */ - - ResizeWindowControls( hDlg, windowMode ); - - SetEngineState( 0, STATE_IDLE, "" ); - SetEngineState( 1, STATE_IDLE, "" ); - } - - return FALSE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - EndDialog(hDlg, TRUE); - return TRUE; - - case IDCANCEL: - EndDialog(hDlg, FALSE); - return TRUE; - - default: - break; - } - - break; - - case WM_GETMINMAXINFO: - { - MINMAXINFO * mmi = (MINMAXINFO *) lParam; - - mmi->ptMinTrackSize.x = 100; - mmi->ptMinTrackSize.y = 160; - } - break; - - case WM_CLOSE: - EngineOutputPopDown(); - break; - - case WM_SIZE: - ResizeWindowControls( hDlg, windowMode ); - break; - - case WM_ENTERSIZEMOVE: - return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); - - case WM_SIZING: - return OnSizing( &sd, hDlg, wParam, lParam ); - - case WM_MOVING: - return OnMoving( &sd, hDlg, wParam, lParam ); - - case WM_EXITSIZEMOVE: - return OnExitSizeMove( &sd, hDlg, wParam, lParam ); - } - - return FALSE; -} - -VOID EngineOutputPopUp() -{ - FARPROC lpProc; - - if( needInit ) { - InitializeEngineOutput(); - } - - CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_CHECKED); - - if( engineOutputDialog ) { - SendMessage( engineOutputDialog, WM_INITDIALOG, 0, 0 ); - - if( ! engineOutputDialogUp ) { - ShowWindow(engineOutputDialog, SW_SHOW); - } - } - else { - lpProc = MakeProcInstance( (FARPROC) EngineOutputProc, hInst ); - - /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ - CreateDialog( hInst, MAKEINTRESOURCE(DLG_EngineOutput), hwndMain, (DLGPROC)lpProc ); - - FreeProcInstance(lpProc); - } - - engineOutputDialogUp = TRUE; -} - -VOID EngineOutputPopDown() -{ - CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_UNCHECKED); - - if( engineOutputDialog ) { - ShowWindow(engineOutputDialog, SW_HIDE); - } - - engineOutputDialogUp = FALSE; -} - -BOOL EngineOutputIsUp() -{ - return engineOutputDialogUp; -} - -VOID EngineOutputUpdate( FrontEndProgramStats * stats ) -{ - EngineOutputData ed; - BOOL clearMemo = FALSE; - int which; - int depth; - - if( stats == 0 ) { - SetEngineState( 0, STATE_IDLE, "" ); - SetEngineState( 1, STATE_IDLE, "" ); - return; - } - - which = stats->which; - depth = stats->depth; - - if( which < 0 || which > 1 || depth < 0 || stats->time < 0 || stats->pv == 0 ) { - return; - } - - if( engineOutputDialog == NULL ) { - return; - } - - VerifyDisplayMode(); - - ed.which = which; - ed.depth = depth; - ed.nodes = stats->nodes; - ed.score = stats->score; - ed.time = stats->time; - ed.pv = stats->pv; - ed.hint = stats->hint; - ed.an_move_index = stats->an_move_index; - ed.an_move_count = stats->an_move_count; - - /* Get target control */ - if( which == 0 ) { - ed.hColorIcon = GetDlgItem( engineOutputDialog, IDC_Color1 ); - ed.hLabel = GetDlgItem( engineOutputDialog, IDC_EngineLabel1 ); - ed.hStateIcon = GetDlgItem( engineOutputDialog, IDC_StateIcon1 ); - ed.hStateData = GetDlgItem( engineOutputDialog, IDC_StateData1 ); - ed.hLabelNPS = GetDlgItem( engineOutputDialog, IDC_Engine1_NPS ); - ed.hMemo = GetDlgItem( engineOutputDialog, IDC_EngineMemo1 ); - ed.name = first.tidy; - } - else { - ed.hColorIcon = GetDlgItem( engineOutputDialog, IDC_Color2 ); - ed.hLabel = GetDlgItem( engineOutputDialog, IDC_EngineLabel2 ); - ed.hStateIcon = GetDlgItem( engineOutputDialog, IDC_StateIcon2 ); - ed.hStateData = GetDlgItem( engineOutputDialog, IDC_StateData2 ); - ed.hLabelNPS = GetDlgItem( engineOutputDialog, IDC_Engine2_NPS ); - ed.hMemo = GetDlgItem( engineOutputDialog, IDC_EngineMemo2 ); - ed.name = second.tidy; - } - - /* Clear memo if needed */ - if( lastDepth[which] > depth || (lastDepth[which] == depth && depth <= 1) ) { - clearMemo = TRUE; - } - - if( lastForwardMostMove[which] != forwardMostMove ) { - clearMemo = TRUE; - } - - if( clearMemo ) { - SendMessage( ed.hMemo, WM_SETTEXT, 0, (LPARAM) "" ); - } - - /* Update */ - lastDepth[which] = depth; - lastForwardMostMove[which] = forwardMostMove; - - if( ed.pv != 0 && ed.pv[0] == ' ' ) { - if( strncmp( ed.pv, " no PV", 6 ) == 0 ) { /* Hack on hack! :-O */ - ed.pv = ""; - } - } - - UpdateControls( &ed ); -} +/* + * Engine output (PV) + * + * Author: Alessandro Scotti (Dec 2005) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#include "config.h" + +#include /* required for all Windows applications */ +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "winboard.h" +#include "frontend.h" +#include "backend.h" + +#include "wsnap.h" + +VOID EngineOutputPopUp(); +VOID EngineOutputPopDown(); +BOOL EngineOutputIsUp(); + +#define SHOW_PONDERING + +/* Imports from backend.c */ +char * SavePart(char *str); + +/* Imports from winboard.c */ +extern HWND engineOutputDialog; +extern BOOLEAN engineOutputDialogUp; + +extern HINSTANCE hInst; +extern HWND hwndMain; + +extern WindowPlacement wpEngineOutput; + +/* Module variables */ +#define H_MARGIN 2 +#define V_MARGIN 2 +#define LABEL_V_DISTANCE 1 /* Distance between label and memo */ +#define SPLITTER_SIZE 4 /* Distance between first memo and second label */ + +#define ICON_SIZE 14 + +#define STATE_UNKNOWN -1 +#define STATE_THINKING 0 +#define STATE_IDLE 1 +#define STATE_PONDERING 2 +#define STATE_ANALYZING 3 + +static int windowMode = 1; + +static BOOL needInit = TRUE; + +static HICON hiColorBlack = NULL; +static HICON hiColorWhite = NULL; +static HICON hiColorUnknown = NULL; +static HICON hiClear = NULL; +static HICON hiPondering = NULL; +static HICON hiThinking = NULL; +static HICON hiAnalyzing = NULL; + +static int lastDepth[2] = { -1, -1 }; +static int lastForwardMostMove[2] = { -1, -1 }; +static int engineState[2] = { -1, -1 }; + +typedef struct { + HWND hColorIcon; + HWND hLabel; + HWND hStateIcon; + HWND hStateData; + HWND hLabelNPS; + HWND hMemo; + char * name; + int which; + int depth; + unsigned long nodes; + int score; + int time; + char * pv; + char * hint; + int an_move_index; + int an_move_count; +} EngineOutputData; + +static HICON LoadIconEx( int id ) +{ + return LoadImage( hInst, MAKEINTRESOURCE(id), IMAGE_ICON, ICON_SIZE, ICON_SIZE, 0 ); +} + +static VOID InitializeEngineOutput() +{ + if( needInit ) { + hiColorBlack = LoadIconEx( IDI_BLACK_14 ); + hiColorWhite = LoadIconEx( IDI_WHITE_14 ); + hiColorUnknown = LoadIconEx( IDI_UNKNOWN_14 ); + hiClear = LoadIconEx( IDI_TRANS_14 ); + hiPondering = LoadIconEx( IDI_PONDER_14 ); + hiThinking = LoadIconEx( IDI_CLOCK_14 ); + hiAnalyzing = LoadIconEx( IDI_ANALYZE2_14 ); + needInit = FALSE; + } +} + +static VOID SetControlPos( HWND hDlg, int id, int x, int y, int width, int height ) +{ + HWND hControl = GetDlgItem( hDlg, id ); + + SetWindowPos( hControl, HWND_TOP, x, y, width, height, SWP_NOZORDER ); +} + +#define HIDDEN_X 20000 +#define HIDDEN_Y 20000 + +static VOID HideControl( HWND hDlg, int id ) +{ + HWND hControl = GetDlgItem( hDlg, id ); + RECT rc; + + GetWindowRect( hControl, &rc ); + + /* + Avoid hiding an already hidden control, because that causes many + unnecessary WM_ERASEBKGND messages! + */ + if( rc.left != HIDDEN_X || rc.top != HIDDEN_Y ) { + SetControlPos( hDlg, id, 20000, 20000, 100, 100 ); + } +} + +static int GetControlWidth( HWND hDlg, int id ) +{ + RECT rc; + + GetWindowRect( GetDlgItem( hDlg, id ), &rc ); + + return rc.right - rc.left; +} + +static int GetControlHeight( HWND hDlg, int id ) +{ + RECT rc; + + GetWindowRect( GetDlgItem( hDlg, id ), &rc ); + + return rc.bottom - rc.top; +} + +static int GetHeaderHeight() +{ + int result = GetControlHeight( engineOutputDialog, IDC_EngineLabel1 ); + + if( result < ICON_SIZE ) result = ICON_SIZE; + + return result; +} + +#define ENGINE_COLOR_WHITE 'w' +#define ENGINE_COLOR_BLACK 'b' +#define ENGINE_COLOR_UNKNOWN ' ' + +char GetEngineColor( int which ) +{ + char result = ENGINE_COLOR_UNKNOWN; + + if( which == 0 || which == 1 ) { + ChessProgramState * cps; + + switch (gameMode) { + case MachinePlaysBlack: + case IcsPlayingBlack: + result = ENGINE_COLOR_BLACK; + break; + case MachinePlaysWhite: + case IcsPlayingWhite: + result = ENGINE_COLOR_WHITE; + break; + case AnalyzeMode: + case AnalyzeFile: + result = WhiteOnMove(forwardMostMove) ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; + break; + case TwoMachinesPlay: + cps = (which == 0) ? &first : &second; + result = cps->twoMachinesColor[0]; + result = result == 'w' ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; + break; + } + } + + return result; +} + +char GetActiveEngineColor() +{ + char result = ENGINE_COLOR_UNKNOWN; + + if( gameMode == TwoMachinesPlay ) { + result = WhiteOnMove(forwardMostMove) ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; + } + + return result; +} + +static int IsEnginePondering( int which ) +{ + int result = FALSE; + + switch (gameMode) { + case MachinePlaysBlack: + case IcsPlayingBlack: + if( WhiteOnMove(forwardMostMove) ) result = TRUE; + break; + case MachinePlaysWhite: + case IcsPlayingWhite: + if( ! WhiteOnMove(forwardMostMove) ) result = TRUE; + break; + case TwoMachinesPlay: + if( GetActiveEngineColor() != ENGINE_COLOR_UNKNOWN ) { + if( GetEngineColor( which ) != GetActiveEngineColor() ) result = TRUE; + } + break; + } + + return result; +} + +static VOID PositionControlSet( HWND hDlg, int x, int y, int clientWidth, int memoHeight, int idColor, int idEngineLabel, int idNPS, int idMemo, int idStateIcon, int idStateData ) +{ + int label_x = x + ICON_SIZE + H_MARGIN; + int label_h = GetControlHeight( hDlg, IDC_EngineLabel1 ); + int label_y = y + ICON_SIZE - label_h; + int nps_w = GetControlWidth( hDlg, IDC_Engine1_NPS ); + int nps_x = clientWidth - H_MARGIN - nps_w; + int state_data_w = GetControlWidth( hDlg, IDC_StateData1 ); + int state_data_x = nps_x - H_MARGIN - state_data_w; + int state_icon_x = state_data_x - ICON_SIZE - 2; + int max_w = clientWidth - 2*H_MARGIN; + int memo_y = y + ICON_SIZE + LABEL_V_DISTANCE; + + SetControlPos( hDlg, idColor, x, y, ICON_SIZE, ICON_SIZE ); + SetControlPos( hDlg, idEngineLabel, label_x, label_y, state_icon_x - label_x, label_h ); + SetControlPos( hDlg, idStateIcon, state_icon_x, y, ICON_SIZE, ICON_SIZE ); + SetControlPos( hDlg, idStateData, state_data_x, label_y, state_data_w, label_h ); + SetControlPos( hDlg, idNPS, nps_x, label_y, nps_w, label_h ); + SetControlPos( hDlg, idMemo, x, memo_y, max_w, memoHeight ); +} + +static VOID ResizeWindowControls( HWND hDlg, int mode ) +{ + RECT rc; + int headerHeight = GetHeaderHeight(); + int labelHeight = GetControlHeight( hDlg, IDC_EngineLabel1 ); + int labelOffset = H_MARGIN + ICON_SIZE + H_MARGIN; + int labelDeltaY = ICON_SIZE - labelHeight; + int clientWidth; + int clientHeight; + int maxControlWidth; + int npsWidth; + + /* Initialize variables */ + GetClientRect( hDlg, &rc ); + + clientWidth = rc.right - rc.left; + clientHeight = rc.bottom - rc.top; + + maxControlWidth = clientWidth - 2*H_MARGIN; + + npsWidth = GetControlWidth( hDlg, IDC_Engine1_NPS ); + + /* Resize controls */ + if( mode == 0 ) { + /* One engine */ + PositionControlSet( hDlg, H_MARGIN, V_MARGIN, + clientWidth, + clientHeight - V_MARGIN - LABEL_V_DISTANCE - headerHeight- V_MARGIN, + IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); + + /* Hide controls for the second engine */ + HideControl( hDlg, IDC_Color2 ); + HideControl( hDlg, IDC_EngineLabel2 ); + HideControl( hDlg, IDC_StateIcon2 ); + HideControl( hDlg, IDC_StateData2 ); + HideControl( hDlg, IDC_Engine2_NPS ); + HideControl( hDlg, IDC_EngineMemo2 ); + SendDlgItemMessage( hDlg, IDC_EngineMemo2, WM_SETTEXT, 0, (LPARAM) "" ); + /* TODO: we should also hide/disable them!!! what about tab stops?!?! */ + } + else { + /* Two engines */ + int memo_h = (clientHeight - headerHeight*2 - V_MARGIN*2 - LABEL_V_DISTANCE*2 - SPLITTER_SIZE) / 2; + int header1_y = V_MARGIN; + int header2_y = V_MARGIN + headerHeight + LABEL_V_DISTANCE + memo_h + SPLITTER_SIZE; + + PositionControlSet( hDlg, H_MARGIN, header1_y, clientWidth, memo_h, + IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); + + PositionControlSet( hDlg, H_MARGIN, header2_y, clientWidth, memo_h, + IDC_Color2, IDC_EngineLabel2, IDC_Engine2_NPS, IDC_EngineMemo2, IDC_StateIcon2, IDC_StateData2 ); + } + + InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo1), NULL, FALSE ); + InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE ); +} + +static VOID SetDisplayMode( int mode ) +{ + if( windowMode != mode ) { + windowMode = mode; + + ResizeWindowControls( engineOutputDialog, mode ); + } +} + +static VOID VerifyDisplayMode() +{ + int mode; + + /* Get proper mode for current game */ + switch( gameMode ) { + case AnalyzeMode: + case AnalyzeFile: + case MachinePlaysWhite: + case MachinePlaysBlack: + case IcsPlayingWhite: + case IcsPlayingBlack: + mode = 0; + break; + case TwoMachinesPlay: + mode = 1; + break; + default: + /* Do not change */ + return; + } + + SetDisplayMode( mode ); +} + +static VOID InsertIntoMemo( HWND hMemo, char * text ) +{ + SendMessage( hMemo, EM_SETSEL, 0, 0 ); + + SendMessage( hMemo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); +} + +static VOID SetIcon( HWND hControl, HICON hIcon ) +{ + if( hIcon != NULL ) { + SendMessage( hControl, STM_SETICON, (WPARAM) hIcon, 0 ); + } +} + +static VOID SetEngineColorIcon( HWND hControl, int which ) +{ + char color = GetEngineColor(which); + HICON hicon = NULL; + + if( color == ENGINE_COLOR_BLACK ) + hicon = hiColorBlack; + else if( color == ENGINE_COLOR_WHITE ) + hicon = hiColorWhite; + else + hicon = hiColorUnknown; + + SetIcon( hControl, hicon ); +} + +static SetEngineState( int which, int state, char * state_data ) +{ + int x_which = 1 - which; + HWND hStateIcon = GetDlgItem( engineOutputDialog, which == 0 ? IDC_StateIcon1 : IDC_StateIcon2 ); + HWND hStateData = GetDlgItem( engineOutputDialog, which == 0 ? IDC_StateData1 : IDC_StateData2 ); + + if( engineState[ which ] != state ) { + engineState[ which ] = state; + + switch( state ) { + case STATE_THINKING: + SetIcon( hStateIcon, hiThinking ); + if( engineState[ x_which ] == STATE_THINKING ) { + SetEngineState( x_which, STATE_IDLE, "" ); + } + break; + case STATE_PONDERING: + SetIcon( hStateIcon, hiPondering ); + break; + case STATE_ANALYZING: + SetIcon( hStateIcon, hiAnalyzing ); + break; + default: + SetIcon( hStateIcon, hiClear ); + break; + } + } + + if( state_data != 0 ) { + SetWindowText( hStateData, state_data ); + } +} + +#define MAX_NAME_LENGTH 32 + +static VOID UpdateControls( EngineOutputData * ed ) +{ + BOOL isPondering = FALSE; + + char s_label[MAX_NAME_LENGTH + 32]; + + char * name = ed->name; + + /* Label */ + if( name == 0 || *name == '\0' ) { + name = "?"; + } + + strncpy( s_label, name, MAX_NAME_LENGTH ); + s_label[ MAX_NAME_LENGTH-1 ] = '\0'; + +#ifdef SHOW_PONDERING + if( IsEnginePondering( ed->which ) ) { + char buf[8]; + + buf[0] = '\0'; + + if( ed->hint != 0 && *ed->hint != '\0' ) { + strncpy( buf, ed->hint, sizeof(buf) ); + buf[sizeof(buf)-1] = '\0'; + } + else if( ed->pv != 0 && *ed->pv != '\0' ) { + char * sep = strchr( ed->pv, ' ' ); + int buflen = sizeof(buf); + + if( sep != NULL ) { + buflen = sep - ed->pv + 1; + if( buflen > sizeof(buf) ) buflen = sizeof(buf); + } + + strncpy( buf, ed->pv, buflen ); + buf[ buflen-1 ] = '\0'; + } + + SetEngineState( ed->which, STATE_PONDERING, buf ); + } + else if( gameMode == TwoMachinesPlay ) { + SetEngineState( ed->which, STATE_THINKING, "" ); + } + else if( gameMode == AnalyzeMode || gameMode == AnalyzeFile ) { + char buf[64]; + int time_secs = ed->time / 100; + int time_mins = time_secs / 60; + + buf[0] = '\0'; + + if( ed->an_move_index != 0 && ed->an_move_count != 0 && *ed->hint != '\0' ) { + char mov[16]; + + strncpy( mov, ed->hint, sizeof(mov) ); + mov[ sizeof(mov)-1 ] = '\0'; + + sprintf( buf, "%d/%d: %s [%02d:%02d:%02d]", ed->an_move_index, ed->an_move_count, mov, time_mins / 60, time_mins % 60, time_secs % 60 ); + } + + SetEngineState( ed->which, STATE_ANALYZING, buf ); + } + else { + SetEngineState( ed->which, STATE_IDLE, "" ); + } +#endif + + SetWindowText( ed->hLabel, s_label ); + + s_label[0] = '\0'; + + if( ed->time > 0 && ed->nodes > 0 ) { + unsigned long nps_100 = ed->nodes / ed->time; + + if( nps_100 < 100000 ) { + sprintf( s_label, "NPS: %lu", nps_100 * 100 ); + } + else { + sprintf( s_label, "NPS: %.1fk", nps_100 / 10.0 ); + } + } + + SetWindowText( ed->hLabelNPS, s_label ); + + /* Memo */ + if( ed->pv != 0 && *ed->pv != '\0' ) { + char s_nodes[24]; + char s_score[16]; + char s_time[24]; + char buf[256]; + int buflen; + int time_secs = ed->time / 100; + int time_cent = ed->time % 100; + + /* Nodes */ + if( ed->nodes < 1000000 ) { + sprintf( s_nodes, "%lu", ed->nodes ); + } + else { + sprintf( s_nodes, "%.1fM", ed->nodes / 1000000.0 ); + } + + /* Score */ + if( ed->score > 0 ) { + sprintf( s_score, "+%.2f", ed->score / 100.0 ); + } + else { + sprintf( s_score, "%.2f", ed->score / 100.0 ); + } + + /* Time */ + sprintf( s_time, "%d:%02d.%02d", time_secs / 60, time_secs % 60, time_cent ); + + /* Put all together... */ + sprintf( buf, "%3d\t%s\t%s\t%s\t", ed->depth, s_score, s_nodes, s_time ); + + /* Add PV */ + buflen = strlen(buf); + + strncpy( buf + buflen, ed->pv, sizeof(buf) - buflen ); + + buf[ sizeof(buf) - 3 ] = '\0'; + + strcat( buf + buflen, "\r\n" ); + + /* Update memo */ + InsertIntoMemo( ed->hMemo, buf ); + } + + /* Colors */ + SetEngineColorIcon( ed->hColorIcon, ed->which ); +} + +LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) +{ + static SnapData sd; + + switch (message) { + case WM_INITDIALOG: + if( engineOutputDialog == NULL ) { + engineOutputDialog = hDlg; + + RestoreWindowPlacement( hDlg, &wpEngineOutput ); /* Restore window placement */ + + ResizeWindowControls( hDlg, windowMode ); + + SetEngineState( 0, STATE_IDLE, "" ); + SetEngineState( 1, STATE_IDLE, "" ); + } + + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + EndDialog(hDlg, TRUE); + return TRUE; + + case IDCANCEL: + EndDialog(hDlg, FALSE); + return TRUE; + + default: + break; + } + + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO * mmi = (MINMAXINFO *) lParam; + + mmi->ptMinTrackSize.x = 100; + mmi->ptMinTrackSize.y = 160; + } + break; + + case WM_CLOSE: + EngineOutputPopDown(); + break; + + case WM_SIZE: + ResizeWindowControls( hDlg, windowMode ); + break; + + case WM_ENTERSIZEMOVE: + return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); + + case WM_SIZING: + return OnSizing( &sd, hDlg, wParam, lParam ); + + case WM_MOVING: + return OnMoving( &sd, hDlg, wParam, lParam ); + + case WM_EXITSIZEMOVE: + return OnExitSizeMove( &sd, hDlg, wParam, lParam ); + } + + return FALSE; +} + +VOID EngineOutputPopUp() +{ + FARPROC lpProc; + + if( needInit ) { + InitializeEngineOutput(); + } + + CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_CHECKED); + + if( engineOutputDialog ) { + SendMessage( engineOutputDialog, WM_INITDIALOG, 0, 0 ); + + if( ! engineOutputDialogUp ) { + ShowWindow(engineOutputDialog, SW_SHOW); + } + } + else { + lpProc = MakeProcInstance( (FARPROC) EngineOutputProc, hInst ); + + /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ + CreateDialog( hInst, MAKEINTRESOURCE(DLG_EngineOutput), hwndMain, (DLGPROC)lpProc ); + + FreeProcInstance(lpProc); + } + + engineOutputDialogUp = TRUE; +} + +VOID EngineOutputPopDown() +{ + CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_UNCHECKED); + + if( engineOutputDialog ) { + ShowWindow(engineOutputDialog, SW_HIDE); + } + + engineOutputDialogUp = FALSE; +} + +BOOL EngineOutputIsUp() +{ + return engineOutputDialogUp; +} + +VOID EngineOutputUpdate( FrontEndProgramStats * stats ) +{ + EngineOutputData ed; + BOOL clearMemo = FALSE; + int which; + int depth; + + if( stats == 0 ) { + SetEngineState( 0, STATE_IDLE, "" ); + SetEngineState( 1, STATE_IDLE, "" ); + return; + } + + which = stats->which; + depth = stats->depth; + + if( which < 0 || which > 1 || depth < 0 || stats->time < 0 || stats->pv == 0 ) { + return; + } + + if( engineOutputDialog == NULL ) { + return; + } + + VerifyDisplayMode(); + + ed.which = which; + ed.depth = depth; + ed.nodes = stats->nodes; + ed.score = stats->score; + ed.time = stats->time; + ed.pv = stats->pv; + ed.hint = stats->hint; + ed.an_move_index = stats->an_move_index; + ed.an_move_count = stats->an_move_count; + + /* Get target control */ + if( which == 0 ) { + ed.hColorIcon = GetDlgItem( engineOutputDialog, IDC_Color1 ); + ed.hLabel = GetDlgItem( engineOutputDialog, IDC_EngineLabel1 ); + ed.hStateIcon = GetDlgItem( engineOutputDialog, IDC_StateIcon1 ); + ed.hStateData = GetDlgItem( engineOutputDialog, IDC_StateData1 ); + ed.hLabelNPS = GetDlgItem( engineOutputDialog, IDC_Engine1_NPS ); + ed.hMemo = GetDlgItem( engineOutputDialog, IDC_EngineMemo1 ); + ed.name = first.tidy; + } + else { + ed.hColorIcon = GetDlgItem( engineOutputDialog, IDC_Color2 ); + ed.hLabel = GetDlgItem( engineOutputDialog, IDC_EngineLabel2 ); + ed.hStateIcon = GetDlgItem( engineOutputDialog, IDC_StateIcon2 ); + ed.hStateData = GetDlgItem( engineOutputDialog, IDC_StateData2 ); + ed.hLabelNPS = GetDlgItem( engineOutputDialog, IDC_Engine2_NPS ); + ed.hMemo = GetDlgItem( engineOutputDialog, IDC_EngineMemo2 ); + ed.name = second.tidy; + } + + /* Clear memo if needed */ + if( lastDepth[which] > depth || (lastDepth[which] == depth && depth <= 1) ) { + clearMemo = TRUE; + } + + if( lastForwardMostMove[which] != forwardMostMove ) { + clearMemo = TRUE; + } + + if( clearMemo ) { + SendMessage( ed.hMemo, WM_SETTEXT, 0, (LPARAM) "" ); + } + + /* Update */ + lastDepth[which] = depth; + lastForwardMostMove[which] = forwardMostMove; + + if( ed.pv != 0 && ed.pv[0] == ' ' ) { + if( strncmp( ed.pv, " no PV", 6 ) == 0 ) { /* Hack on hack! :-O */ + ed.pv = ""; + } + } + + UpdateControls( &ed ); +} diff --git a/winboard/wevalgraph.c b/winboard/wevalgraph.c index 2896a23..997bd17 100644 --- a/winboard/wevalgraph.c +++ b/winboard/wevalgraph.c @@ -1,620 +1,620 @@ -/* - * Evaluation graph - * - * Author: Alessandro Scotti (Dec 2005) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#include "config.h" - -#include /* required for all Windows applications */ -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "winboard.h" -#include "frontend.h" -#include "backend.h" - -#include "wsnap.h" - -VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo ); -VOID EvalGraphPopUp(); -VOID EvalGraphPopDown(); -BOOL EvalGraphIsUp(); - -#define WM_REFRESH_GRAPH (WM_USER + 1) - -/* Imports from backend.c */ -char * SavePart(char *str); - -/* Imports from winboard.c */ -extern HWND evalGraphDialog; -extern BOOLEAN evalGraphDialogUp; - -extern HINSTANCE hInst; -extern HWND hwndMain; - -extern WindowPlacement wpEvalGraph; - -/* Module globals */ -static ChessProgramStats_Move * currPvInfo; -static int currFirst = 0; -static int currLast = 0; -static int currCurrent = -1; - -static COLORREF crWhite = RGB( 0xFF, 0xFF, 0xB0 ); -static COLORREF crBlack = RGB( 0xAD, 0x5D, 0x3D ); - -static HDC hdcPB = NULL; -static HBITMAP hbmPB = NULL; -static int nWidthPB = 0; -static int nHeightPB = 0; -static HPEN hpenDotted = NULL; -static HPEN hpenBlueDotted = NULL; -static HPEN hpenBold[2] = { NULL, NULL }; -static HBRUSH hbrHist[2] = { NULL, NULL }; - -static int MarginX = 18; -static int MarginW = 4; -static int MarginH = 4; - -#define MIN_HIST_WIDTH 4 -#define MAX_HIST_WIDTH 10 - -static int GetPvScore( int index ) -{ - int score = currPvInfo[ index ].score; - - if( index & 1 ) score = -score; /* Flip score for black */ - - return score; -} - -static VOID DrawLine( int x1, int y1, int x2, int y2 ) -{ - MoveToEx( hdcPB, x1, y1, NULL ); - - LineTo( hdcPB, x2, y2 ); -} - -static VOID DrawLineEx( int x1, int y1, int x2, int y2 ) -{ - POINT stPT; - - MoveToEx( hdcPB, x1, y1, &stPT ); - - LineTo( hdcPB, x2, y2 ); - - MoveToEx( hdcPB, stPT.x, stPT.y, NULL ); -} - -static HBRUSH CreateBrush( UINT style, COLORREF color ) -{ - LOGBRUSH stLB; - - stLB.lbStyle = style; - stLB.lbColor = color; - stLB.lbHatch = 0; - - return CreateBrushIndirect( &stLB ); -} - -/* - For a centipawn value, this function returns the height of the corresponding - histogram, centered on the reference axis. - - Note: height can be negative! -*/ -static int GetValueY( int value ) -{ - if( value < -700 ) value = -700; - if( value > +700 ) value = +700; - - return (nHeightPB / 2) - (int)(value * (nHeightPB - 2*MarginH) / 1400.0); -} - -static VOID DrawAxisSegmentHoriz( int value, BOOL drawValue ) -{ - int y = GetValueY( value*100 ); - - SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); - DrawLine( MarginX, y, MarginX + MarginW, y ); - SelectObject( hdcPB, hpenDotted ); - DrawLine( MarginX + MarginW, y, nWidthPB - MarginW, y ); - - if( drawValue ) { - SIZE stSize; - char buf[8]; - int cbBuf; - - if( value > 0 ) { - buf[0] = '+'; - itoa( value, buf+1, 10 ); - } - else { - itoa( value, buf, 10 ); - } - - cbBuf = strlen( buf ); - - GetTextExtentPoint32( hdcPB, buf, cbBuf, &stSize ); - - TextOut( hdcPB, MarginX - stSize.cx - 2, y - stSize.cy / 2, buf, cbBuf ); - } -} - -static VOID DrawAxis() -{ - int cy = nHeightPB / 2; - - SelectObject( hdcPB, GetStockObject(NULL_BRUSH) ); - - SetBkMode( hdcPB, TRANSPARENT ); - - DrawAxisSegmentHoriz( +5, TRUE ); - DrawAxisSegmentHoriz( +3, FALSE ); - DrawAxisSegmentHoriz( +1, FALSE ); - DrawAxisSegmentHoriz( 0, TRUE ); - DrawAxisSegmentHoriz( -1, FALSE ); - DrawAxisSegmentHoriz( -3, FALSE ); - DrawAxisSegmentHoriz( -5, TRUE ); - - SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); - - DrawLine( MarginX + MarginW, cy, nWidthPB - MarginW, cy ); - DrawLine( MarginX + MarginW, MarginH, MarginX + MarginW, nHeightPB - MarginH ); -} - -static VOID DrawHistogram( int x, int y, int width, int value, int side ) -{ - RECT rc; - - if( value > -25 && value < +25 ) return; - - rc.left = x; - rc.right = rc.left + width + 1; - - if( value > 0 ) { - rc.top = GetValueY( value ); - rc.bottom = y+1; - } - else { - rc.top = y; - rc.bottom = GetValueY( value ) + 1; - } - - - if( width == MIN_HIST_WIDTH ) { - rc.right--; - FillRect( hdcPB, &rc, hbrHist[side] ); - } - else { - SelectObject( hdcPB, hbrHist[side] ); - Rectangle( hdcPB, rc.left, rc.top, rc.right, rc.bottom ); - } -} - -static VOID DrawSeparator( int index, int x ) -{ - if( index > 0 ) { - if( index == currCurrent ) { - HPEN hp = SelectObject( hdcPB, hpenBlueDotted ); - DrawLineEx( x, MarginH, x, nHeightPB - MarginH ); - SelectObject( hdcPB, hp ); - } - else if( (index % 20) == 0 ) { - HPEN hp = SelectObject( hdcPB, hpenDotted ); - DrawLineEx( x, MarginH, x, nHeightPB - MarginH ); - SelectObject( hdcPB, hp ); - } - } -} - -/* Actually draw histogram as a diagram, cause there's too much data */ -static VOID DrawHistogramAsDiagram( int cy, int paint_width, int hist_count ) -{ - double step; - int i; - - /* Rescale the graph every few moves (as opposed to every move) */ - hist_count -= hist_count % 8; - hist_count += 8; - hist_count /= 2; - - step = (double) paint_width / (hist_count + 1); - - for( i=0; i<2; i++ ) { - int index = currFirst; - int side = (currCurrent + i + 1) & 1; /* Draw current side last */ - double x = MarginX + MarginW; - - if( (index & 1) != side ) { - x += step / 2; - index++; - } - - SelectObject( hdcPB, hpenBold[side] ); - - MoveToEx( hdcPB, (int) x, cy, NULL ); - - index += 2; - - while( index < currLast ) { - x += step; - - DrawSeparator( index, (int) x ); - - /* Extend line up to current point */ - if( currPvInfo[index].depth > 0 ) { - LineTo( hdcPB, (int) x, GetValueY( GetPvScore(index) ) ); - } - - index += 2; - } - } -} - -static VOID DrawHistogramFull( int cy, int hist_width, int hist_count ) -{ - int i; - - SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); - - for( i=0; i 0 ) { - DrawHistogram( x, cy, hist_width, GetPvScore(index), index & 1 ); - } - } -} - -typedef struct { - int cy; - int hist_width; - int hist_count; - int paint_width; -} VisualizationData; - -static BOOL InitVisualization( VisualizationData * vd ) -{ - BOOL result = FALSE; - - vd->cy = nHeightPB / 2; - vd->hist_width = MIN_HIST_WIDTH; - vd->hist_count = currLast - currFirst; - vd->paint_width = nWidthPB - MarginX - 2*MarginW; - - if( vd->hist_count > 0 ) { - result = TRUE; - - /* Compute width */ - vd->hist_width = vd->paint_width / vd->hist_count; - - if( vd->hist_width > MAX_HIST_WIDTH ) vd->hist_width = MAX_HIST_WIDTH; - - vd->hist_width -= vd->hist_width % 2; - } - - return result; -} - -static VOID DrawHistograms() -{ - VisualizationData vd; - - if( InitVisualization( &vd ) ) { - if( vd.hist_width < MIN_HIST_WIDTH ) { - DrawHistogramAsDiagram( vd.cy, vd.paint_width, vd.hist_count ); - } - else { - DrawHistogramFull( vd.cy, vd.hist_width, vd.hist_count ); - } - } -} - -static int GetMoveIndexFromPoint( int x, int y ) -{ - int result = -1; - int start_x = MarginX + MarginW; - VisualizationData vd; - - if( x >= start_x && InitVisualization( &vd ) ) { - /* Almost an hack here... we duplicate some of the paint logic */ - if( vd.hist_width < MIN_HIST_WIDTH ) { - double step; - - vd.hist_count -= vd.hist_count % 8; - vd.hist_count += 8; - vd.hist_count /= 2; - - step = (double) vd.paint_width / (vd.hist_count + 1); - step /= 2; - - result = (int) (0.5 + (double) (x - start_x) / step); - } - else { - result = (x - start_x) / vd.hist_width; - } - } - - if( result >= currLast ) { - result = -1; - } - - return result; -} - -static VOID DrawBackground() -{ - HBRUSH hbr; - RECT rc; - - hbr = CreateBrush( BS_SOLID, GetSysColor( COLOR_3DFACE ) ); - - rc.left = 0; - rc.top = 0; - rc.right = nWidthPB; - rc.bottom = nHeightPB; - - FillRect( hdcPB, &rc, hbr ); - - DeleteObject( hbr ); -} - -static VOID PaintEvalGraph( HWND hWnd, HDC hDC ) -{ - RECT rcClient; - int width; - int height; - - /* Get client area */ - GetClientRect( hWnd, &rcClient ); - - width = rcClient.right - rcClient.left; - height = rcClient.bottom - rcClient.top; - - /* Create or recreate paint box if needed */ - if( hbmPB == NULL || width != nWidthPB || height != nHeightPB ) { - if( hpenDotted == NULL ) { - hpenDotted = CreatePen( PS_DOT, 0, RGB(0xA0,0xA0,0xA0) ); - hpenBlueDotted = CreatePen( PS_DOT, 0, RGB(0x00,0x00,0xFF) ); - hpenBold[0] = CreatePen( PS_SOLID, 2, crWhite ); - hpenBold[1] = CreatePen( PS_SOLID, 2, crBlack ); - hbrHist[0] = CreateBrush( BS_SOLID, crWhite ); - hbrHist[1] = CreateBrush( BS_SOLID, crBlack ); - } - - if( hdcPB != NULL ) { - DeleteDC( hdcPB ); - hdcPB = NULL; - } - - if( hbmPB != NULL ) { - DeleteObject( hbmPB ); - hbmPB = NULL; - } - - hdcPB = CreateCompatibleDC( hDC ); - - nWidthPB = width; - nHeightPB = height; - hbmPB = CreateCompatibleBitmap( hDC, nWidthPB, nHeightPB ); - - SelectObject( hdcPB, hbmPB ); - } - - /* Draw */ - DrawBackground(); - DrawAxis(); - DrawHistograms(); - - /* Copy bitmap into destination DC */ - BitBlt( hDC, 0, 0, width, height, hdcPB, 0, 0, SRCCOPY ); -} - -LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) -{ - static SnapData sd; - - PAINTSTRUCT stPS; - HDC hDC; - - switch (message) { - case WM_INITDIALOG: - if( evalGraphDialog == NULL ) { - evalGraphDialog = hDlg; - - RestoreWindowPlacement( hDlg, &wpEvalGraph ); /* Restore window placement */ - } - - return FALSE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - EndDialog(hDlg, TRUE); - return TRUE; - - case IDCANCEL: - EndDialog(hDlg, FALSE); - return TRUE; - - default: - break; - } - - break; - - case WM_ERASEBKGND: - return TRUE; - - case WM_PAINT: - hDC = BeginPaint( hDlg, &stPS ); - PaintEvalGraph( hDlg, hDC ); - EndPaint( hDlg, &stPS ); - break; - - case WM_REFRESH_GRAPH: - hDC = GetDC( hDlg ); - PaintEvalGraph( hDlg, hDC ); - ReleaseDC( hDlg, hDC ); - break; - - case WM_LBUTTONDBLCLK: - if( wParam == 0 || wParam == MK_LBUTTON ) { - int index = GetMoveIndexFromPoint( LOWORD(lParam), HIWORD(lParam) ); - - if( index >= 0 && index < currLast ) { - ToNrEvent( index + 1 ); - } - } - return TRUE; - - case WM_SIZE: - InvalidateRect( hDlg, NULL, FALSE ); - break; - - case WM_GETMINMAXINFO: - { - MINMAXINFO * mmi = (MINMAXINFO *) lParam; - - mmi->ptMinTrackSize.x = 100; - mmi->ptMinTrackSize.y = 100; - } - break; - - /* Support for captionless window */ -#if 0 - case WM_NCLBUTTONDBLCLK: - if( wParam == HTCAPTION ) { - int index; - POINT mouse_xy; - POINTS pts = MAKEPOINTS(lParam); - - mouse_xy.x = pts.x; - mouse_xy.y = pts.y; - ScreenToClient( hDlg, &mouse_xy ); - - index = GetMoveIndexFromPoint( mouse_xy.x, mouse_xy.y ); - - if( index >= 0 && index < currLast ) { - ToNrEvent( index + 1 ); - } - } - break; - - case WM_NCHITTEST: - { - LRESULT res = DefWindowProc( hDlg, message, wParam, lParam ); - - if( res == HTCLIENT ) res = HTCAPTION; - - SetWindowLong( hDlg, DWL_MSGRESULT, res ); - - return TRUE; - } - break; -#endif - - case WM_CLOSE: - EvalGraphPopDown(); - break; - - case WM_ENTERSIZEMOVE: - return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); - - case WM_SIZING: - return OnSizing( &sd, hDlg, wParam, lParam ); - - case WM_MOVING: - return OnMoving( &sd, hDlg, wParam, lParam ); - - case WM_EXITSIZEMOVE: - return OnExitSizeMove( &sd, hDlg, wParam, lParam ); - } - - return FALSE; -} - -VOID EvalGraphPopUp() -{ - FARPROC lpProc; - - CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_CHECKED); - - if( evalGraphDialog ) { - SendMessage( evalGraphDialog, WM_INITDIALOG, 0, 0 ); - - if( ! evalGraphDialogUp ) { - ShowWindow(evalGraphDialog, SW_SHOW); - } - } - else { - crWhite = appData.evalHistColorWhite; - crBlack = appData.evalHistColorBlack; - - lpProc = MakeProcInstance( (FARPROC) EvalGraphProc, hInst ); - - /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ - CreateDialog( hInst, MAKEINTRESOURCE(DLG_EvalGraph), hwndMain, (DLGPROC)lpProc ); - - FreeProcInstance(lpProc); - } - - evalGraphDialogUp = TRUE; -} - -VOID EvalGraphPopDown() -{ - CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_UNCHECKED); - - if( evalGraphDialog ) { - ShowWindow(evalGraphDialog, SW_HIDE); - } - - evalGraphDialogUp = FALSE; -} - -VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo ) -{ - /* [AS] Danger! For now we rely on the pvInfo parameter being a static variable! */ - - currFirst = first; - currLast = last; - currCurrent = current; - currPvInfo = pvInfo; - - if( evalGraphDialog ) { - SendMessage( evalGraphDialog, WM_REFRESH_GRAPH, 0, 0 ); - } -} - -BOOL EvalGraphIsUp() -{ - return evalGraphDialogUp; -} +/* + * Evaluation graph + * + * Author: Alessandro Scotti (Dec 2005) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#include "config.h" + +#include /* required for all Windows applications */ +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "winboard.h" +#include "frontend.h" +#include "backend.h" + +#include "wsnap.h" + +VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo ); +VOID EvalGraphPopUp(); +VOID EvalGraphPopDown(); +BOOL EvalGraphIsUp(); + +#define WM_REFRESH_GRAPH (WM_USER + 1) + +/* Imports from backend.c */ +char * SavePart(char *str); + +/* Imports from winboard.c */ +extern HWND evalGraphDialog; +extern BOOLEAN evalGraphDialogUp; + +extern HINSTANCE hInst; +extern HWND hwndMain; + +extern WindowPlacement wpEvalGraph; + +/* Module globals */ +static ChessProgramStats_Move * currPvInfo; +static int currFirst = 0; +static int currLast = 0; +static int currCurrent = -1; + +static COLORREF crWhite = RGB( 0xFF, 0xFF, 0xB0 ); +static COLORREF crBlack = RGB( 0xAD, 0x5D, 0x3D ); + +static HDC hdcPB = NULL; +static HBITMAP hbmPB = NULL; +static int nWidthPB = 0; +static int nHeightPB = 0; +static HPEN hpenDotted = NULL; +static HPEN hpenBlueDotted = NULL; +static HPEN hpenBold[2] = { NULL, NULL }; +static HBRUSH hbrHist[2] = { NULL, NULL }; + +static int MarginX = 18; +static int MarginW = 4; +static int MarginH = 4; + +#define MIN_HIST_WIDTH 4 +#define MAX_HIST_WIDTH 10 + +static int GetPvScore( int index ) +{ + int score = currPvInfo[ index ].score; + + if( index & 1 ) score = -score; /* Flip score for black */ + + return score; +} + +static VOID DrawLine( int x1, int y1, int x2, int y2 ) +{ + MoveToEx( hdcPB, x1, y1, NULL ); + + LineTo( hdcPB, x2, y2 ); +} + +static VOID DrawLineEx( int x1, int y1, int x2, int y2 ) +{ + POINT stPT; + + MoveToEx( hdcPB, x1, y1, &stPT ); + + LineTo( hdcPB, x2, y2 ); + + MoveToEx( hdcPB, stPT.x, stPT.y, NULL ); +} + +static HBRUSH CreateBrush( UINT style, COLORREF color ) +{ + LOGBRUSH stLB; + + stLB.lbStyle = style; + stLB.lbColor = color; + stLB.lbHatch = 0; + + return CreateBrushIndirect( &stLB ); +} + +/* + For a centipawn value, this function returns the height of the corresponding + histogram, centered on the reference axis. + + Note: height can be negative! +*/ +static int GetValueY( int value ) +{ + if( value < -700 ) value = -700; + if( value > +700 ) value = +700; + + return (nHeightPB / 2) - (int)(value * (nHeightPB - 2*MarginH) / 1400.0); +} + +static VOID DrawAxisSegmentHoriz( int value, BOOL drawValue ) +{ + int y = GetValueY( value*100 ); + + SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); + DrawLine( MarginX, y, MarginX + MarginW, y ); + SelectObject( hdcPB, hpenDotted ); + DrawLine( MarginX + MarginW, y, nWidthPB - MarginW, y ); + + if( drawValue ) { + SIZE stSize; + char buf[8]; + int cbBuf; + + if( value > 0 ) { + buf[0] = '+'; + itoa( value, buf+1, 10 ); + } + else { + itoa( value, buf, 10 ); + } + + cbBuf = strlen( buf ); + + GetTextExtentPoint32( hdcPB, buf, cbBuf, &stSize ); + + TextOut( hdcPB, MarginX - stSize.cx - 2, y - stSize.cy / 2, buf, cbBuf ); + } +} + +static VOID DrawAxis() +{ + int cy = nHeightPB / 2; + + SelectObject( hdcPB, GetStockObject(NULL_BRUSH) ); + + SetBkMode( hdcPB, TRANSPARENT ); + + DrawAxisSegmentHoriz( +5, TRUE ); + DrawAxisSegmentHoriz( +3, FALSE ); + DrawAxisSegmentHoriz( +1, FALSE ); + DrawAxisSegmentHoriz( 0, TRUE ); + DrawAxisSegmentHoriz( -1, FALSE ); + DrawAxisSegmentHoriz( -3, FALSE ); + DrawAxisSegmentHoriz( -5, TRUE ); + + SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); + + DrawLine( MarginX + MarginW, cy, nWidthPB - MarginW, cy ); + DrawLine( MarginX + MarginW, MarginH, MarginX + MarginW, nHeightPB - MarginH ); +} + +static VOID DrawHistogram( int x, int y, int width, int value, int side ) +{ + RECT rc; + + if( value > -25 && value < +25 ) return; + + rc.left = x; + rc.right = rc.left + width + 1; + + if( value > 0 ) { + rc.top = GetValueY( value ); + rc.bottom = y+1; + } + else { + rc.top = y; + rc.bottom = GetValueY( value ) + 1; + } + + + if( width == MIN_HIST_WIDTH ) { + rc.right--; + FillRect( hdcPB, &rc, hbrHist[side] ); + } + else { + SelectObject( hdcPB, hbrHist[side] ); + Rectangle( hdcPB, rc.left, rc.top, rc.right, rc.bottom ); + } +} + +static VOID DrawSeparator( int index, int x ) +{ + if( index > 0 ) { + if( index == currCurrent ) { + HPEN hp = SelectObject( hdcPB, hpenBlueDotted ); + DrawLineEx( x, MarginH, x, nHeightPB - MarginH ); + SelectObject( hdcPB, hp ); + } + else if( (index % 20) == 0 ) { + HPEN hp = SelectObject( hdcPB, hpenDotted ); + DrawLineEx( x, MarginH, x, nHeightPB - MarginH ); + SelectObject( hdcPB, hp ); + } + } +} + +/* Actually draw histogram as a diagram, cause there's too much data */ +static VOID DrawHistogramAsDiagram( int cy, int paint_width, int hist_count ) +{ + double step; + int i; + + /* Rescale the graph every few moves (as opposed to every move) */ + hist_count -= hist_count % 8; + hist_count += 8; + hist_count /= 2; + + step = (double) paint_width / (hist_count + 1); + + for( i=0; i<2; i++ ) { + int index = currFirst; + int side = (currCurrent + i + 1) & 1; /* Draw current side last */ + double x = MarginX + MarginW; + + if( (index & 1) != side ) { + x += step / 2; + index++; + } + + SelectObject( hdcPB, hpenBold[side] ); + + MoveToEx( hdcPB, (int) x, cy, NULL ); + + index += 2; + + while( index < currLast ) { + x += step; + + DrawSeparator( index, (int) x ); + + /* Extend line up to current point */ + if( currPvInfo[index].depth > 0 ) { + LineTo( hdcPB, (int) x, GetValueY( GetPvScore(index) ) ); + } + + index += 2; + } + } +} + +static VOID DrawHistogramFull( int cy, int hist_width, int hist_count ) +{ + int i; + + SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); + + for( i=0; i 0 ) { + DrawHistogram( x, cy, hist_width, GetPvScore(index), index & 1 ); + } + } +} + +typedef struct { + int cy; + int hist_width; + int hist_count; + int paint_width; +} VisualizationData; + +static BOOL InitVisualization( VisualizationData * vd ) +{ + BOOL result = FALSE; + + vd->cy = nHeightPB / 2; + vd->hist_width = MIN_HIST_WIDTH; + vd->hist_count = currLast - currFirst; + vd->paint_width = nWidthPB - MarginX - 2*MarginW; + + if( vd->hist_count > 0 ) { + result = TRUE; + + /* Compute width */ + vd->hist_width = vd->paint_width / vd->hist_count; + + if( vd->hist_width > MAX_HIST_WIDTH ) vd->hist_width = MAX_HIST_WIDTH; + + vd->hist_width -= vd->hist_width % 2; + } + + return result; +} + +static VOID DrawHistograms() +{ + VisualizationData vd; + + if( InitVisualization( &vd ) ) { + if( vd.hist_width < MIN_HIST_WIDTH ) { + DrawHistogramAsDiagram( vd.cy, vd.paint_width, vd.hist_count ); + } + else { + DrawHistogramFull( vd.cy, vd.hist_width, vd.hist_count ); + } + } +} + +static int GetMoveIndexFromPoint( int x, int y ) +{ + int result = -1; + int start_x = MarginX + MarginW; + VisualizationData vd; + + if( x >= start_x && InitVisualization( &vd ) ) { + /* Almost an hack here... we duplicate some of the paint logic */ + if( vd.hist_width < MIN_HIST_WIDTH ) { + double step; + + vd.hist_count -= vd.hist_count % 8; + vd.hist_count += 8; + vd.hist_count /= 2; + + step = (double) vd.paint_width / (vd.hist_count + 1); + step /= 2; + + result = (int) (0.5 + (double) (x - start_x) / step); + } + else { + result = (x - start_x) / vd.hist_width; + } + } + + if( result >= currLast ) { + result = -1; + } + + return result; +} + +static VOID DrawBackground() +{ + HBRUSH hbr; + RECT rc; + + hbr = CreateBrush( BS_SOLID, GetSysColor( COLOR_3DFACE ) ); + + rc.left = 0; + rc.top = 0; + rc.right = nWidthPB; + rc.bottom = nHeightPB; + + FillRect( hdcPB, &rc, hbr ); + + DeleteObject( hbr ); +} + +static VOID PaintEvalGraph( HWND hWnd, HDC hDC ) +{ + RECT rcClient; + int width; + int height; + + /* Get client area */ + GetClientRect( hWnd, &rcClient ); + + width = rcClient.right - rcClient.left; + height = rcClient.bottom - rcClient.top; + + /* Create or recreate paint box if needed */ + if( hbmPB == NULL || width != nWidthPB || height != nHeightPB ) { + if( hpenDotted == NULL ) { + hpenDotted = CreatePen( PS_DOT, 0, RGB(0xA0,0xA0,0xA0) ); + hpenBlueDotted = CreatePen( PS_DOT, 0, RGB(0x00,0x00,0xFF) ); + hpenBold[0] = CreatePen( PS_SOLID, 2, crWhite ); + hpenBold[1] = CreatePen( PS_SOLID, 2, crBlack ); + hbrHist[0] = CreateBrush( BS_SOLID, crWhite ); + hbrHist[1] = CreateBrush( BS_SOLID, crBlack ); + } + + if( hdcPB != NULL ) { + DeleteDC( hdcPB ); + hdcPB = NULL; + } + + if( hbmPB != NULL ) { + DeleteObject( hbmPB ); + hbmPB = NULL; + } + + hdcPB = CreateCompatibleDC( hDC ); + + nWidthPB = width; + nHeightPB = height; + hbmPB = CreateCompatibleBitmap( hDC, nWidthPB, nHeightPB ); + + SelectObject( hdcPB, hbmPB ); + } + + /* Draw */ + DrawBackground(); + DrawAxis(); + DrawHistograms(); + + /* Copy bitmap into destination DC */ + BitBlt( hDC, 0, 0, width, height, hdcPB, 0, 0, SRCCOPY ); +} + +LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) +{ + static SnapData sd; + + PAINTSTRUCT stPS; + HDC hDC; + + switch (message) { + case WM_INITDIALOG: + if( evalGraphDialog == NULL ) { + evalGraphDialog = hDlg; + + RestoreWindowPlacement( hDlg, &wpEvalGraph ); /* Restore window placement */ + } + + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + EndDialog(hDlg, TRUE); + return TRUE; + + case IDCANCEL: + EndDialog(hDlg, FALSE); + return TRUE; + + default: + break; + } + + break; + + case WM_ERASEBKGND: + return TRUE; + + case WM_PAINT: + hDC = BeginPaint( hDlg, &stPS ); + PaintEvalGraph( hDlg, hDC ); + EndPaint( hDlg, &stPS ); + break; + + case WM_REFRESH_GRAPH: + hDC = GetDC( hDlg ); + PaintEvalGraph( hDlg, hDC ); + ReleaseDC( hDlg, hDC ); + break; + + case WM_LBUTTONDBLCLK: + if( wParam == 0 || wParam == MK_LBUTTON ) { + int index = GetMoveIndexFromPoint( LOWORD(lParam), HIWORD(lParam) ); + + if( index >= 0 && index < currLast ) { + ToNrEvent( index + 1 ); + } + } + return TRUE; + + case WM_SIZE: + InvalidateRect( hDlg, NULL, FALSE ); + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO * mmi = (MINMAXINFO *) lParam; + + mmi->ptMinTrackSize.x = 100; + mmi->ptMinTrackSize.y = 100; + } + break; + + /* Support for captionless window */ +#if 0 + case WM_NCLBUTTONDBLCLK: + if( wParam == HTCAPTION ) { + int index; + POINT mouse_xy; + POINTS pts = MAKEPOINTS(lParam); + + mouse_xy.x = pts.x; + mouse_xy.y = pts.y; + ScreenToClient( hDlg, &mouse_xy ); + + index = GetMoveIndexFromPoint( mouse_xy.x, mouse_xy.y ); + + if( index >= 0 && index < currLast ) { + ToNrEvent( index + 1 ); + } + } + break; + + case WM_NCHITTEST: + { + LRESULT res = DefWindowProc( hDlg, message, wParam, lParam ); + + if( res == HTCLIENT ) res = HTCAPTION; + + SetWindowLong( hDlg, DWL_MSGRESULT, res ); + + return TRUE; + } + break; +#endif + + case WM_CLOSE: + EvalGraphPopDown(); + break; + + case WM_ENTERSIZEMOVE: + return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); + + case WM_SIZING: + return OnSizing( &sd, hDlg, wParam, lParam ); + + case WM_MOVING: + return OnMoving( &sd, hDlg, wParam, lParam ); + + case WM_EXITSIZEMOVE: + return OnExitSizeMove( &sd, hDlg, wParam, lParam ); + } + + return FALSE; +} + +VOID EvalGraphPopUp() +{ + FARPROC lpProc; + + CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_CHECKED); + + if( evalGraphDialog ) { + SendMessage( evalGraphDialog, WM_INITDIALOG, 0, 0 ); + + if( ! evalGraphDialogUp ) { + ShowWindow(evalGraphDialog, SW_SHOW); + } + } + else { + crWhite = appData.evalHistColorWhite; + crBlack = appData.evalHistColorBlack; + + lpProc = MakeProcInstance( (FARPROC) EvalGraphProc, hInst ); + + /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ + CreateDialog( hInst, MAKEINTRESOURCE(DLG_EvalGraph), hwndMain, (DLGPROC)lpProc ); + + FreeProcInstance(lpProc); + } + + evalGraphDialogUp = TRUE; +} + +VOID EvalGraphPopDown() +{ + CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_UNCHECKED); + + if( evalGraphDialog ) { + ShowWindow(evalGraphDialog, SW_HIDE); + } + + evalGraphDialogUp = FALSE; +} + +VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo ) +{ + /* [AS] Danger! For now we rely on the pvInfo parameter being a static variable! */ + + currFirst = first; + currLast = last; + currCurrent = current; + currPvInfo = pvInfo; + + if( evalGraphDialog ) { + SendMessage( evalGraphDialog, WM_REFRESH_GRAPH, 0, 0 ); + } +} + +BOOL EvalGraphIsUp() +{ + return evalGraphDialogUp; +} diff --git a/winboard/wgamelist.c b/winboard/wgamelist.c index 5fa191c..e1bf978 100644 --- a/winboard/wgamelist.c +++ b/winboard/wgamelist.c @@ -1,6 +1,6 @@ /* * wgamelist.c -- Game list window for WinBoard - * $Id: wgamelist.c,v 2.1 2003/10/27 19:21:02 mann Exp $ + * $Id: wgamelist.c,v 2.1 2003/10/27 19:21:02 mann Exp $ * * Copyright 1995 Free Software Foundation, Inc. * @@ -36,8 +36,8 @@ #include "frontend.h" #include "backend.h" -#include "wsnap.h" - +#include "wsnap.h" + /* Module globals */ HWND gameListDialog = NULL; BOOLEAN gameListUp = FALSE; @@ -49,185 +49,185 @@ int gameListX, gameListY, gameListW, gameListH; extern HINSTANCE hInst; extern HWND hwndMain; -struct GameListStats -{ - int white_wins; - int black_wins; - int drawn; - int unfinished; -}; - -/* [AS] Wildcard pattern matching */ -static BOOL HasPattern( const char * text, const char * pattern ) -{ - while( *pattern != '\0' ) { - if( *pattern == '*' ) { - while( *pattern == '*' ) { - pattern++; - } - - if( *pattern == '\0' ) { - return TRUE; - } - - while( *text != '\0' ) { - if( HasPattern( text, pattern ) ) { - return TRUE; - } - text++; - } - } - else if( (*pattern == *text) || ((*pattern == '?') && (*text != '\0')) ) { - pattern++; - text++; - continue; - } - - return FALSE; - } - - return TRUE; -} - -static BOOL SearchPattern( const char * text, const char * pattern ) -{ - BOOL result = TRUE; - - if( pattern != NULL && *pattern != '\0' ) { - if( *pattern == '*' ) { - result = HasPattern( text, pattern ); - } - else { - result = FALSE; - - while( *text != '\0' ) { - if( HasPattern( text, pattern ) ) { - result = TRUE; - break; - } - text++; - } - } - } - - return result; -} - -/* [AS] Setup the game list according to the specified filter */ -static int GameListToListBox( HWND hDlg, BOOL boReset, char * pszFilter, struct GameListStats * stats ) -{ - ListGame * lg = (ListGame *) gameList.head; - int nItem; - BOOL hasFilter = FALSE; - int count = 0; - struct GameListStats dummy; - - /* Initialize stats (use a dummy variable if caller not interested in them) */ - if( stats == NULL ) { - stats = &dummy; - } - - stats->white_wins = 0; - stats->black_wins = 0; - stats->drawn = 0; - stats->unfinished = 0; - - if( boReset ) { - SendDlgItemMessage(hDlg, OPT_GameListText, LB_RESETCONTENT, 0, 0); - } - - if( pszFilter != NULL ) { - if( strlen( pszFilter ) > 0 ) { - hasFilter = TRUE; - } - } - - for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ - char * st = GameListLine(lg->number, &lg->gameInfo); - BOOL skip = FALSE; - - if( hasFilter ) { - if( ! SearchPattern( st, pszFilter ) ) { - skip = TRUE; - } - } - - if( ! skip ) { - SendDlgItemMessage(hDlg, OPT_GameListText, LB_ADDSTRING, 0, (LPARAM) st); - count++; - - /* Update stats */ - if( lg->gameInfo.result == WhiteWins ) - stats->white_wins++; - else if( lg->gameInfo.result == BlackWins ) - stats->black_wins++; - else if( lg->gameInfo.result == GameIsDrawn ) - stats->drawn++; - else - stats->unfinished++; - } - - free(st); - lg = (ListGame *) lg->node.succ; - } - - SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, 0, 0); - - return count; -} - -/* [AS] Show number of visible (filtered) games and total on window caption */ -static int GameListUpdateTitle( HWND hDlg, char * pszTitle, int item_count, int item_total, struct GameListStats * stats ) -{ - char buf[256]; - - sprintf( buf, "%s - %d/%d games", pszTitle, item_count, item_total ); - - if( stats != 0 ) { - sprintf( buf+strlen(buf), " (%d-%d-%d)", stats->white_wins, stats->black_wins, stats->drawn ); - } - - SetWindowText( hDlg, buf ); - - return 0; -} - -#define MAX_FILTER_LENGTH 128 +struct GameListStats +{ + int white_wins; + int black_wins; + int drawn; + int unfinished; +}; + +/* [AS] Wildcard pattern matching */ +static BOOL HasPattern( const char * text, const char * pattern ) +{ + while( *pattern != '\0' ) { + if( *pattern == '*' ) { + while( *pattern == '*' ) { + pattern++; + } + + if( *pattern == '\0' ) { + return TRUE; + } + + while( *text != '\0' ) { + if( HasPattern( text, pattern ) ) { + return TRUE; + } + text++; + } + } + else if( (*pattern == *text) || ((*pattern == '?') && (*text != '\0')) ) { + pattern++; + text++; + continue; + } + + return FALSE; + } + + return TRUE; +} + +static BOOL SearchPattern( const char * text, const char * pattern ) +{ + BOOL result = TRUE; + + if( pattern != NULL && *pattern != '\0' ) { + if( *pattern == '*' ) { + result = HasPattern( text, pattern ); + } + else { + result = FALSE; + + while( *text != '\0' ) { + if( HasPattern( text, pattern ) ) { + result = TRUE; + break; + } + text++; + } + } + } + + return result; +} + +/* [AS] Setup the game list according to the specified filter */ +static int GameListToListBox( HWND hDlg, BOOL boReset, char * pszFilter, struct GameListStats * stats ) +{ + ListGame * lg = (ListGame *) gameList.head; + int nItem; + BOOL hasFilter = FALSE; + int count = 0; + struct GameListStats dummy; + + /* Initialize stats (use a dummy variable if caller not interested in them) */ + if( stats == NULL ) { + stats = &dummy; + } + + stats->white_wins = 0; + stats->black_wins = 0; + stats->drawn = 0; + stats->unfinished = 0; + + if( boReset ) { + SendDlgItemMessage(hDlg, OPT_GameListText, LB_RESETCONTENT, 0, 0); + } + + if( pszFilter != NULL ) { + if( strlen( pszFilter ) > 0 ) { + hasFilter = TRUE; + } + } + + for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ + char * st = GameListLine(lg->number, &lg->gameInfo); + BOOL skip = FALSE; + + if( hasFilter ) { + if( ! SearchPattern( st, pszFilter ) ) { + skip = TRUE; + } + } + + if( ! skip ) { + SendDlgItemMessage(hDlg, OPT_GameListText, LB_ADDSTRING, 0, (LPARAM) st); + count++; + + /* Update stats */ + if( lg->gameInfo.result == WhiteWins ) + stats->white_wins++; + else if( lg->gameInfo.result == BlackWins ) + stats->black_wins++; + else if( lg->gameInfo.result == GameIsDrawn ) + stats->drawn++; + else + stats->unfinished++; + } + + free(st); + lg = (ListGame *) lg->node.succ; + } + + SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, 0, 0); + + return count; +} + +/* [AS] Show number of visible (filtered) games and total on window caption */ +static int GameListUpdateTitle( HWND hDlg, char * pszTitle, int item_count, int item_total, struct GameListStats * stats ) +{ + char buf[256]; + + sprintf( buf, "%s - %d/%d games", pszTitle, item_count, item_total ); + + if( stats != 0 ) { + sprintf( buf+strlen(buf), " (%d-%d-%d)", stats->white_wins, stats->black_wins, stats->drawn ); + } + + SetWindowText( hDlg, buf ); + + return 0; +} + +#define MAX_FILTER_LENGTH 128 LRESULT CALLBACK GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static char szDlgTitle[64]; + static char szDlgTitle[64]; static HANDLE hwndText; int nItem; RECT rect; static int sizeX, sizeY; int newSizeX, newSizeY, flags; MINMAXINFO *mmi; - static BOOL filterHasFocus = FALSE; - int count; - struct GameListStats stats; - static SnapData sd; + static BOOL filterHasFocus = FALSE; + int count; + struct GameListStats stats; + static SnapData sd; switch (message) { case WM_INITDIALOG: - GetWindowText( hDlg, szDlgTitle, sizeof(szDlgTitle) ); - szDlgTitle[ sizeof(szDlgTitle)-1 ] = '\0'; - + GetWindowText( hDlg, szDlgTitle, sizeof(szDlgTitle) ); + szDlgTitle[ sizeof(szDlgTitle)-1 ] = '\0'; + if (gameListDialog) { SendDlgItemMessage(hDlg, OPT_GameListText, LB_RESETCONTENT, 0, 0); } - + /* Initialize the dialog items */ hwndText = GetDlgItem(hDlg, OPT_TagsText); - - count = GameListToListBox( hDlg, gameListDialog ? TRUE : FALSE, NULL, &stats ); - - SendDlgItemMessage( hDlg, IDC_GameListFilter, WM_SETTEXT, 0, (LPARAM) "" ); - SendDlgItemMessage( hDlg, IDC_GameListFilter, EM_SETLIMITTEXT, MAX_FILTER_LENGTH, 0 ); - - filterHasFocus = FALSE; - + + count = GameListToListBox( hDlg, gameListDialog ? TRUE : FALSE, NULL, &stats ); + + SendDlgItemMessage( hDlg, IDC_GameListFilter, WM_SETTEXT, 0, (LPARAM) "" ); + SendDlgItemMessage( hDlg, IDC_GameListFilter, EM_SETLIMITTEXT, MAX_FILTER_LENGTH, 0 ); + + filterHasFocus = FALSE; + /* Size and position the dialog */ if (!gameListDialog) { gameListDialog = hDlg; @@ -257,8 +257,8 @@ GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) sizeX = newSizeX; sizeY = newSizeY; } - - GameListUpdateTitle( hDlg, szDlgTitle, count, ((ListGame *) gameList.tailPred)->number, &stats ); + + GameListUpdateTitle( hDlg, szDlgTitle, count, ((ListGame *) gameList.tailPred)->number, &stats ); } return FALSE; @@ -271,18 +271,18 @@ GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) sizeY = newSizeY; break; - case WM_ENTERSIZEMOVE: - return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); - - case WM_SIZING: - return OnSizing( &sd, hDlg, wParam, lParam ); - - case WM_MOVING: - return OnMoving( &sd, hDlg, wParam, lParam ); - - case WM_EXITSIZEMOVE: - return OnExitSizeMove( &sd, hDlg, wParam, lParam ); - + case WM_ENTERSIZEMOVE: + return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); + + case WM_SIZING: + return OnSizing( &sd, hDlg, wParam, lParam ); + + case WM_MOVING: + return OnMoving( &sd, hDlg, wParam, lParam ); + + case WM_EXITSIZEMOVE: + return OnExitSizeMove( &sd, hDlg, wParam, lParam ); + case WM_GETMINMAXINFO: /* Prevent resizing window too small */ mmi = (MINMAXINFO *) lParam; @@ -291,27 +291,27 @@ GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_COMMAND: - /* - [AS] - If is pressed while editing the filter, it's better to apply - the filter rather than selecting the current game. - */ - if( LOWORD(wParam) == IDC_GameListFilter ) { - switch( HIWORD(wParam) ) { - case EN_SETFOCUS: - filterHasFocus = TRUE; - break; - case EN_KILLFOCUS: - filterHasFocus = FALSE; - break; - } - } - - if( filterHasFocus && (LOWORD(wParam) == IDOK) ) { - wParam = IDC_GameListDoFilter; - } - /* [AS] End command replacement */ - + /* + [AS] + If is pressed while editing the filter, it's better to apply + the filter rather than selecting the current game. + */ + if( LOWORD(wParam) == IDC_GameListFilter ) { + switch( HIWORD(wParam) ) { + case EN_SETFOCUS: + filterHasFocus = TRUE; + break; + case EN_KILLFOCUS: + filterHasFocus = FALSE; + break; + } + } + + if( filterHasFocus && (LOWORD(wParam) == IDOK) ) { + wParam = IDC_GameListDoFilter; + } + /* [AS] End command replacement */ + switch (LOWORD(wParam)) { case IDOK: case OPT_GameListLoad: @@ -327,8 +327,8 @@ GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) nItem = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); nItem++; if (nItem >= ((ListGame *) gameList.tailPred)->number) { - /* [AS] Removed error message */ - /* DisplayError("Can't go forward any further", 0); */ + /* [AS] Removed error message */ + /* DisplayError("Can't go forward any further", 0); */ return TRUE; } SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, nItem, 0); @@ -338,27 +338,27 @@ GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) nItem = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); nItem--; if (nItem < 0) { - /* [AS] Removed error message, added return */ - /* DisplayError("Can't back up any further", 0); */ - return TRUE; + /* [AS] Removed error message, added return */ + /* DisplayError("Can't back up any further", 0); */ + return TRUE; } SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, nItem, 0); break; /* load the game*/ - - /* [AS] */ - case IDC_GameListDoFilter: - { - char filter[MAX_FILTER_LENGTH+1]; - - if( GetDlgItemText( hDlg, IDC_GameListFilter, filter, sizeof(filter) ) >= 0 ) { - filter[ sizeof(filter)-1 ] = '\0'; - count = GameListToListBox( hDlg, TRUE, filter, &stats ); - GameListUpdateTitle( hDlg, szDlgTitle, count, ((ListGame *) gameList.tailPred)->number, &stats ); - } - } - return FALSE; - break; - + + /* [AS] */ + case IDC_GameListDoFilter: + { + char filter[MAX_FILTER_LENGTH+1]; + + if( GetDlgItemText( hDlg, IDC_GameListFilter, filter, sizeof(filter) ) >= 0 ) { + filter[ sizeof(filter)-1 ] = '\0'; + count = GameListToListBox( hDlg, TRUE, filter, &stats ); + GameListUpdateTitle( hDlg, szDlgTitle, count, ((ListGame *) gameList.tailPred)->number, &stats ); + } + } + return FALSE; + break; + case IDCANCEL: case OPT_GameListClose: GameListPopDown(); @@ -374,47 +374,47 @@ GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) return FALSE; } break; - + default: return FALSE; } - + /* Load the game */ - { - /* [AS] Get index from the item itself, because filtering makes original order unuseable. */ - int index = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); - char * text; - LRESULT res; - - if( index < 0 ) { - return TRUE; - } - - res = SendDlgItemMessage( hDlg, OPT_GameListText, LB_GETTEXTLEN, index, 0 ); - - if( res == LB_ERR ) { - return TRUE; - } - - text = (char *) malloc( res+1 ); - - res = SendDlgItemMessage( hDlg, OPT_GameListText, LB_GETTEXT, index, (LPARAM)text ); - - index = atoi( text ); - - nItem = index - 1; - - free( text ); - /* [AS] End: nItem has been "patched" now! */ - - if (cmailMsgLoaded) { - CmailLoadGame(gameFile, nItem + 1, gameFileName, TRUE); - } - else { - LoadGame(gameFile, nItem + 1, gameFileName, TRUE); + { + /* [AS] Get index from the item itself, because filtering makes original order unuseable. */ + int index = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); + char * text; + LRESULT res; + + if( index < 0 ) { + return TRUE; + } + + res = SendDlgItemMessage( hDlg, OPT_GameListText, LB_GETTEXTLEN, index, 0 ); + + if( res == LB_ERR ) { + return TRUE; + } + + text = (char *) malloc( res+1 ); + + res = SendDlgItemMessage( hDlg, OPT_GameListText, LB_GETTEXT, index, (LPARAM)text ); + + index = atoi( text ); + + nItem = index - 1; + + free( text ); + /* [AS] End: nItem has been "patched" now! */ + + if (cmailMsgLoaded) { + CmailLoadGame(gameFile, nItem + 1, gameFileName, TRUE); + } + else { + LoadGame(gameFile, nItem + 1, gameFileName, TRUE); + } } - } - + return TRUE; default: @@ -483,56 +483,56 @@ VOID ShowGameListProc() } } } - -HGLOBAL ExportGameListAsText() -{ - HGLOBAL result = NULL; - LPVOID lpMem = NULL; - ListGame * lg = (ListGame *) gameList.head; - int nItem; - DWORD dwLen = 0; - - if( ! gameFileName || ((ListGame *) gameList.tailPred)->number <= 0 ) { - DisplayError("Game list not loaded or empty", 0); - return NULL; - } - - /* Get list size */ - for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ - char * st = GameListLineFull(lg->number, &lg->gameInfo); - - dwLen += strlen(st) + 2; /* Add extra characters for "\r\n" */ - - free(st); - lg = (ListGame *) lg->node.succ; - } - - /* Allocate memory for the list */ - result = GlobalAlloc(GHND, dwLen+1 ); - - if( result != NULL ) { - lpMem = GlobalLock(result); - } - - /* Copy the list into the global memory block */ - if( lpMem != NULL ) { - char * dst = (char *) lpMem; - size_t len; - - lg = (ListGame *) gameList.head; - - for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ - char * st = GameListLineFull(lg->number, &lg->gameInfo); - - len = sprintf( dst, "%s\r\n", st ); - dst += len; - - free(st); - lg = (ListGame *) lg->node.succ; - } - - GlobalUnlock( result ); - } - - return result; -} + +HGLOBAL ExportGameListAsText() +{ + HGLOBAL result = NULL; + LPVOID lpMem = NULL; + ListGame * lg = (ListGame *) gameList.head; + int nItem; + DWORD dwLen = 0; + + if( ! gameFileName || ((ListGame *) gameList.tailPred)->number <= 0 ) { + DisplayError("Game list not loaded or empty", 0); + return NULL; + } + + /* Get list size */ + for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ + char * st = GameListLineFull(lg->number, &lg->gameInfo); + + dwLen += strlen(st) + 2; /* Add extra characters for "\r\n" */ + + free(st); + lg = (ListGame *) lg->node.succ; + } + + /* Allocate memory for the list */ + result = GlobalAlloc(GHND, dwLen+1 ); + + if( result != NULL ) { + lpMem = GlobalLock(result); + } + + /* Copy the list into the global memory block */ + if( lpMem != NULL ) { + char * dst = (char *) lpMem; + size_t len; + + lg = (ListGame *) gameList.head; + + for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ + char * st = GameListLineFull(lg->number, &lg->gameInfo); + + len = sprintf( dst, "%s\r\n", st ); + dst += len; + + free(st); + lg = (ListGame *) lg->node.succ; + } + + GlobalUnlock( result ); + } + + return result; +} diff --git a/winboard/wgamelist.h b/winboard/wgamelist.h index 92b0ca1..e4895bf 100644 --- a/winboard/wgamelist.h +++ b/winboard/wgamelist.h @@ -1,6 +1,6 @@ /* * wgamelist.h -- Game list window for WinBoard - * $Id: wgamelist.h,v 2.1 2003/10/27 19:21:02 mann Exp $ + * $Id: wgamelist.h,v 2.1 2003/10/27 19:21:02 mann Exp $ * * Copyright 1995 Free Software Foundation, Inc. * diff --git a/winboard/whistory.c b/winboard/whistory.c index 60af898..6b5b857 100644 --- a/winboard/whistory.c +++ b/winboard/whistory.c @@ -1,472 +1,472 @@ -/* - * Move history for WinBoard - * - * Author: Alessandro Scotti (Dec 2005) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#include "config.h" - -#include /* required for all Windows applications */ -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "winboard.h" -#include "frontend.h" -#include "backend.h" - -#include "wsnap.h" - -VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo ); -VOID MoveHistoryPopUp(); -VOID MoveHistoryPopDown(); -BOOL MoveHistoryIsUp(); - -/* Imports from backend.c */ -char * SavePart(char *str); - -/* Imports from winboard.c */ -extern HWND moveHistoryDialog; -extern BOOLEAN moveHistoryDialogUp; - -extern HINSTANCE hInst; -extern HWND hwndMain; - -extern WindowPlacement wpMoveHistory; - -extern BoardSize boardSize; - -/* Module globals */ -typedef char MoveHistoryString[ MOVE_LEN*2 ]; - -static int lastFirst = 0; -static int lastLast = 0; -static int lastCurrent = -1; - -static char lastLastMove[ MOVE_LEN ]; - -static MoveHistoryString * currMovelist; -static ChessProgramStats_Move * currPvInfo; -static int currFirst = 0; -static int currLast = 0; -static int currCurrent = -1; - -typedef struct { - int memoOffset; - int memoLength; -} HistoryMove; - -static HistoryMove histMoves[ MAX_MOVES ]; - -#define WM_REFRESH_HISTORY (WM_USER+4657) - -#define DEFAULT_COLOR 0xFFFFFFFF - -#define H_MARGIN 2 -#define V_MARGIN 2 - -/* Note: in the following code a "Memo" is a Rich Edit control (it's Delphi lingo) */ - -static VOID HighlightMove( int index, BOOL highlight ) -{ - if( index >= 0 && index < MAX_MOVES ) { - CHARFORMAT cf; - HWND hMemo = GetDlgItem( moveHistoryDialog, IDC_MoveHistory ); - - SendMessage( hMemo, - EM_SETSEL, - histMoves[index].memoOffset, - histMoves[index].memoOffset + histMoves[index].memoLength ); - - - /* Set style */ - ZeroMemory( &cf, sizeof(cf) ); - - cf.cbSize = sizeof(cf); - cf.dwMask = CFM_BOLD | CFM_COLOR; - - if( highlight ) { - cf.dwEffects |= CFE_BOLD; - cf.crTextColor = RGB( 0x00, 0x00, 0xFF ); - } - else { - cf.dwEffects |= CFE_AUTOCOLOR; - } - - SendMessage( hMemo, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf ); - } -} - -static BOOL OnlyCurrentPositionChanged() -{ - BOOL result = FALSE; - - if( lastFirst >= 0 && - lastLast >= lastFirst && - lastCurrent >= lastFirst && - currFirst == lastFirst && - currLast == lastLast && - currCurrent >= 0 && - TRUE ) - { - result = TRUE; - - /* Special case: last move changed */ - if( currCurrent == currLast-1 ) { - if( strcmp( currMovelist[currCurrent], lastLastMove ) != 0 ) { - result = FALSE; - } - } - } - - return result; -} - -static BOOL OneMoveAppended() -{ - BOOL result = FALSE; - - if( lastCurrent >= 0 && lastCurrent >= lastFirst && lastLast >= lastFirst && - currCurrent >= 0 && currCurrent >= currFirst && currLast >= currFirst && - lastFirst == currFirst && - lastLast == (currLast-1) && - lastCurrent == (currCurrent-1) && - currCurrent == (currLast-1) && - TRUE ) - { - result = TRUE; - } - - return result; -} - -static VOID ClearMemo() -{ - SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_SETTEXT, 0, (LPARAM) "" ); -} - -static int AppendToMemo( char * text, DWORD flags, DWORD color ) -{ - CHARFORMAT cf; - - HWND hMemo = GetDlgItem( moveHistoryDialog, IDC_MoveHistory ); - - /* Select end of text */ - int cbTextLen = (int) SendMessage( hMemo, WM_GETTEXTLENGTH, 0, 0 ); - - SendMessage( hMemo, EM_SETSEL, cbTextLen, cbTextLen ); - - /* Set style */ - ZeroMemory( &cf, sizeof(cf) ); - - cf.cbSize = sizeof(cf); - cf.dwMask = CFM_BOLD | CFM_ITALIC | CFM_COLOR | CFM_UNDERLINE; - cf.dwEffects = flags; - - if( color != DEFAULT_COLOR ) { - cf.crTextColor = color; - } - else { - cf.dwEffects |= CFE_AUTOCOLOR; - } - - SendMessage( hMemo, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf ); - - /* Append text */ - SendMessage( hMemo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); - - /* Return offset of appended text */ - return cbTextLen; -} - -static VOID AppendMoveToMemo( int index ) -{ - char buf[64]; - DWORD flags = 0; - DWORD color = DEFAULT_COLOR; - - if( index < 0 || index >= MAX_MOVES ) { - return; - } - - buf[0] = '\0'; - - /* Move number */ - if( (index % 2) == 0 ) { - sprintf( buf, "%d.%s ", (index / 2)+1, index & 1 ? ".." : "" ); - AppendToMemo( buf, CFE_BOLD, DEFAULT_COLOR ); - } - - /* Move text */ - strcpy( buf, SavePart( currMovelist[index] ) ); - strcat( buf, " " ); - - histMoves[index].memoOffset = AppendToMemo( buf, flags, color ); - histMoves[index].memoLength = strlen(buf)-1; - - /* PV info (if any) */ - if( appData.showEvalInMoveHistory && currPvInfo[index].depth > 0 ) { - sprintf( buf, "{%s%.2f/%d} ", - currPvInfo[index].score >= 0 ? "+" : "", - currPvInfo[index].score / 100.0, - currPvInfo[index].depth ); - - AppendToMemo( buf, flags, - color == DEFAULT_COLOR ? GetSysColor(COLOR_GRAYTEXT) : color ); - } -} - -static void RefreshMemoContent() -{ - int i; - - ClearMemo(); - - for( i=currFirst; i 0 ) { - strcpy( lastLastMove, SavePart( currMovelist[lastLast-1] ) ); - } - - /* Deselect any text, move caret to end of memo */ - if( currCurrent >= 0 ) { - caretPos = histMoves[currCurrent].memoOffset + histMoves[currCurrent].memoLength; - } - else { - caretPos = (int) SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_GETTEXTLENGTH, 0, 0 ); - } - - SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETSEL, caretPos, caretPos ); - - SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SCROLLCARET, 0, 0 ); -} - -int FindMoveByCharIndex( int char_index ) -{ - int index; - - for( index=currFirst; index= histMoves[index].memoOffset && - char_index < (histMoves[index].memoOffset + histMoves[index].memoLength) ) - { - return index; - } - } - - return -1; -} - -LRESULT CALLBACK HistoryDialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) -{ - static SnapData sd; - - switch (message) { - case WM_INITDIALOG: - if( moveHistoryDialog == NULL ) { - moveHistoryDialog = hDlg; - - /* Enable word wrapping and notifications */ - SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETTARGETDEVICE, 0, 0 ); - - SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); - - /* Set font */ - SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); - - /* Restore window placement */ - RestoreWindowPlacement( hDlg, &wpMoveHistory ); - } - - /* Update memo */ - RefreshMemoContent(); - - MemoContentUpdated(); - - return FALSE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - EndDialog(hDlg, TRUE); - return TRUE; - - case IDCANCEL: - EndDialog(hDlg, FALSE); - return TRUE; - - default: - break; - } - - break; - - case WM_NOTIFY: - if( wParam == IDC_MoveHistory ) { - MSGFILTER * lpMF = (MSGFILTER *) lParam; - - if( lpMF->msg == WM_LBUTTONDBLCLK && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) { - POINTL pt; - LRESULT index; - - pt.x = LOWORD( lpMF->lParam ); - pt.y = HIWORD( lpMF->lParam ); - - index = SendDlgItemMessage( hDlg, IDC_MoveHistory, EM_CHARFROMPOS, 0, (LPARAM) &pt ); - - index = FindMoveByCharIndex( index ); - - if( index >= 0 ) { - ToNrEvent( index + 1 ); - } - - /* Zap the message for good: apparently, returning non-zero is not enough */ - lpMF->msg = WM_USER; - - return TRUE; - } - } - break; - - case WM_REFRESH_HISTORY: - /* Update the GUI */ - if( OnlyCurrentPositionChanged() ) { - /* Only "cursor" changed, no need to update memo content */ - } - else if( OneMoveAppended() ) { - AppendMoveToMemo( currCurrent ); - } - else { - RefreshMemoContent(); - } - - MemoContentUpdated(); - - break; - - case WM_SIZE: - SetWindowPos( GetDlgItem( moveHistoryDialog, IDC_MoveHistory ), - HWND_TOP, - H_MARGIN, V_MARGIN, - LOWORD(lParam) - 2*H_MARGIN, - HIWORD(lParam) - 2*V_MARGIN, - SWP_NOZORDER ); - break; - - case WM_GETMINMAXINFO: - { - MINMAXINFO * mmi = (MINMAXINFO *) lParam; - - mmi->ptMinTrackSize.x = 100; - mmi->ptMinTrackSize.y = 100; - } - break; - - case WM_CLOSE: - MoveHistoryPopDown(); - break; - - case WM_ENTERSIZEMOVE: - return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); - - case WM_SIZING: - return OnSizing( &sd, hDlg, wParam, lParam ); - - case WM_MOVING: - return OnMoving( &sd, hDlg, wParam, lParam ); - - case WM_EXITSIZEMOVE: - return OnExitSizeMove( &sd, hDlg, wParam, lParam ); - } - - return FALSE; -} - -VOID MoveHistoryPopUp() -{ - FARPROC lpProc; - - CheckMenuItem(GetMenu(hwndMain), IDM_ShowMoveHistory, MF_CHECKED); - - if( moveHistoryDialog ) { - SendMessage( moveHistoryDialog, WM_INITDIALOG, 0, 0 ); - - if( ! moveHistoryDialogUp ) { - ShowWindow(moveHistoryDialog, SW_SHOW); - } - } - else { - lpProc = MakeProcInstance( (FARPROC) HistoryDialogProc, hInst ); - - /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ - CreateDialog( hInst, MAKEINTRESOURCE(DLG_MoveHistory), hwndMain, (DLGPROC)lpProc ); - - FreeProcInstance(lpProc); - } - - moveHistoryDialogUp = TRUE; -} - -VOID MoveHistoryPopDown() -{ - CheckMenuItem(GetMenu(hwndMain), IDM_ShowMoveHistory, MF_UNCHECKED); - - if( moveHistoryDialog ) { - ShowWindow(moveHistoryDialog, SW_HIDE); - } - - moveHistoryDialogUp = FALSE; -} - -VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo ) -{ - /* [AS] Danger! For now we rely on the movelist parameter being a static variable! */ - - currMovelist = movelist; - currFirst = first; - currLast = last; - currCurrent = current; - currPvInfo = pvInfo; - - if( moveHistoryDialog ) { - SendMessage( moveHistoryDialog, WM_REFRESH_HISTORY, 0, 0 ); - } -} - -BOOL MoveHistoryIsUp() -{ - return moveHistoryDialogUp; -} +/* + * Move history for WinBoard + * + * Author: Alessandro Scotti (Dec 2005) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#include "config.h" + +#include /* required for all Windows applications */ +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "winboard.h" +#include "frontend.h" +#include "backend.h" + +#include "wsnap.h" + +VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo ); +VOID MoveHistoryPopUp(); +VOID MoveHistoryPopDown(); +BOOL MoveHistoryIsUp(); + +/* Imports from backend.c */ +char * SavePart(char *str); + +/* Imports from winboard.c */ +extern HWND moveHistoryDialog; +extern BOOLEAN moveHistoryDialogUp; + +extern HINSTANCE hInst; +extern HWND hwndMain; + +extern WindowPlacement wpMoveHistory; + +extern BoardSize boardSize; + +/* Module globals */ +typedef char MoveHistoryString[ MOVE_LEN*2 ]; + +static int lastFirst = 0; +static int lastLast = 0; +static int lastCurrent = -1; + +static char lastLastMove[ MOVE_LEN ]; + +static MoveHistoryString * currMovelist; +static ChessProgramStats_Move * currPvInfo; +static int currFirst = 0; +static int currLast = 0; +static int currCurrent = -1; + +typedef struct { + int memoOffset; + int memoLength; +} HistoryMove; + +static HistoryMove histMoves[ MAX_MOVES ]; + +#define WM_REFRESH_HISTORY (WM_USER+4657) + +#define DEFAULT_COLOR 0xFFFFFFFF + +#define H_MARGIN 2 +#define V_MARGIN 2 + +/* Note: in the following code a "Memo" is a Rich Edit control (it's Delphi lingo) */ + +static VOID HighlightMove( int index, BOOL highlight ) +{ + if( index >= 0 && index < MAX_MOVES ) { + CHARFORMAT cf; + HWND hMemo = GetDlgItem( moveHistoryDialog, IDC_MoveHistory ); + + SendMessage( hMemo, + EM_SETSEL, + histMoves[index].memoOffset, + histMoves[index].memoOffset + histMoves[index].memoLength ); + + + /* Set style */ + ZeroMemory( &cf, sizeof(cf) ); + + cf.cbSize = sizeof(cf); + cf.dwMask = CFM_BOLD | CFM_COLOR; + + if( highlight ) { + cf.dwEffects |= CFE_BOLD; + cf.crTextColor = RGB( 0x00, 0x00, 0xFF ); + } + else { + cf.dwEffects |= CFE_AUTOCOLOR; + } + + SendMessage( hMemo, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf ); + } +} + +static BOOL OnlyCurrentPositionChanged() +{ + BOOL result = FALSE; + + if( lastFirst >= 0 && + lastLast >= lastFirst && + lastCurrent >= lastFirst && + currFirst == lastFirst && + currLast == lastLast && + currCurrent >= 0 && + TRUE ) + { + result = TRUE; + + /* Special case: last move changed */ + if( currCurrent == currLast-1 ) { + if( strcmp( currMovelist[currCurrent], lastLastMove ) != 0 ) { + result = FALSE; + } + } + } + + return result; +} + +static BOOL OneMoveAppended() +{ + BOOL result = FALSE; + + if( lastCurrent >= 0 && lastCurrent >= lastFirst && lastLast >= lastFirst && + currCurrent >= 0 && currCurrent >= currFirst && currLast >= currFirst && + lastFirst == currFirst && + lastLast == (currLast-1) && + lastCurrent == (currCurrent-1) && + currCurrent == (currLast-1) && + TRUE ) + { + result = TRUE; + } + + return result; +} + +static VOID ClearMemo() +{ + SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_SETTEXT, 0, (LPARAM) "" ); +} + +static int AppendToMemo( char * text, DWORD flags, DWORD color ) +{ + CHARFORMAT cf; + + HWND hMemo = GetDlgItem( moveHistoryDialog, IDC_MoveHistory ); + + /* Select end of text */ + int cbTextLen = (int) SendMessage( hMemo, WM_GETTEXTLENGTH, 0, 0 ); + + SendMessage( hMemo, EM_SETSEL, cbTextLen, cbTextLen ); + + /* Set style */ + ZeroMemory( &cf, sizeof(cf) ); + + cf.cbSize = sizeof(cf); + cf.dwMask = CFM_BOLD | CFM_ITALIC | CFM_COLOR | CFM_UNDERLINE; + cf.dwEffects = flags; + + if( color != DEFAULT_COLOR ) { + cf.crTextColor = color; + } + else { + cf.dwEffects |= CFE_AUTOCOLOR; + } + + SendMessage( hMemo, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf ); + + /* Append text */ + SendMessage( hMemo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); + + /* Return offset of appended text */ + return cbTextLen; +} + +static VOID AppendMoveToMemo( int index ) +{ + char buf[64]; + DWORD flags = 0; + DWORD color = DEFAULT_COLOR; + + if( index < 0 || index >= MAX_MOVES ) { + return; + } + + buf[0] = '\0'; + + /* Move number */ + if( (index % 2) == 0 ) { + sprintf( buf, "%d.%s ", (index / 2)+1, index & 1 ? ".." : "" ); + AppendToMemo( buf, CFE_BOLD, DEFAULT_COLOR ); + } + + /* Move text */ + strcpy( buf, SavePart( currMovelist[index] ) ); + strcat( buf, " " ); + + histMoves[index].memoOffset = AppendToMemo( buf, flags, color ); + histMoves[index].memoLength = strlen(buf)-1; + + /* PV info (if any) */ + if( appData.showEvalInMoveHistory && currPvInfo[index].depth > 0 ) { + sprintf( buf, "{%s%.2f/%d} ", + currPvInfo[index].score >= 0 ? "+" : "", + currPvInfo[index].score / 100.0, + currPvInfo[index].depth ); + + AppendToMemo( buf, flags, + color == DEFAULT_COLOR ? GetSysColor(COLOR_GRAYTEXT) : color ); + } +} + +static void RefreshMemoContent() +{ + int i; + + ClearMemo(); + + for( i=currFirst; i 0 ) { + strcpy( lastLastMove, SavePart( currMovelist[lastLast-1] ) ); + } + + /* Deselect any text, move caret to end of memo */ + if( currCurrent >= 0 ) { + caretPos = histMoves[currCurrent].memoOffset + histMoves[currCurrent].memoLength; + } + else { + caretPos = (int) SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_GETTEXTLENGTH, 0, 0 ); + } + + SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETSEL, caretPos, caretPos ); + + SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SCROLLCARET, 0, 0 ); +} + +int FindMoveByCharIndex( int char_index ) +{ + int index; + + for( index=currFirst; index= histMoves[index].memoOffset && + char_index < (histMoves[index].memoOffset + histMoves[index].memoLength) ) + { + return index; + } + } + + return -1; +} + +LRESULT CALLBACK HistoryDialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) +{ + static SnapData sd; + + switch (message) { + case WM_INITDIALOG: + if( moveHistoryDialog == NULL ) { + moveHistoryDialog = hDlg; + + /* Enable word wrapping and notifications */ + SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETTARGETDEVICE, 0, 0 ); + + SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); + + /* Set font */ + SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); + + /* Restore window placement */ + RestoreWindowPlacement( hDlg, &wpMoveHistory ); + } + + /* Update memo */ + RefreshMemoContent(); + + MemoContentUpdated(); + + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + EndDialog(hDlg, TRUE); + return TRUE; + + case IDCANCEL: + EndDialog(hDlg, FALSE); + return TRUE; + + default: + break; + } + + break; + + case WM_NOTIFY: + if( wParam == IDC_MoveHistory ) { + MSGFILTER * lpMF = (MSGFILTER *) lParam; + + if( lpMF->msg == WM_LBUTTONDBLCLK && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) { + POINTL pt; + LRESULT index; + + pt.x = LOWORD( lpMF->lParam ); + pt.y = HIWORD( lpMF->lParam ); + + index = SendDlgItemMessage( hDlg, IDC_MoveHistory, EM_CHARFROMPOS, 0, (LPARAM) &pt ); + + index = FindMoveByCharIndex( index ); + + if( index >= 0 ) { + ToNrEvent( index + 1 ); + } + + /* Zap the message for good: apparently, returning non-zero is not enough */ + lpMF->msg = WM_USER; + + return TRUE; + } + } + break; + + case WM_REFRESH_HISTORY: + /* Update the GUI */ + if( OnlyCurrentPositionChanged() ) { + /* Only "cursor" changed, no need to update memo content */ + } + else if( OneMoveAppended() ) { + AppendMoveToMemo( currCurrent ); + } + else { + RefreshMemoContent(); + } + + MemoContentUpdated(); + + break; + + case WM_SIZE: + SetWindowPos( GetDlgItem( moveHistoryDialog, IDC_MoveHistory ), + HWND_TOP, + H_MARGIN, V_MARGIN, + LOWORD(lParam) - 2*H_MARGIN, + HIWORD(lParam) - 2*V_MARGIN, + SWP_NOZORDER ); + break; + + case WM_GETMINMAXINFO: + { + MINMAXINFO * mmi = (MINMAXINFO *) lParam; + + mmi->ptMinTrackSize.x = 100; + mmi->ptMinTrackSize.y = 100; + } + break; + + case WM_CLOSE: + MoveHistoryPopDown(); + break; + + case WM_ENTERSIZEMOVE: + return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); + + case WM_SIZING: + return OnSizing( &sd, hDlg, wParam, lParam ); + + case WM_MOVING: + return OnMoving( &sd, hDlg, wParam, lParam ); + + case WM_EXITSIZEMOVE: + return OnExitSizeMove( &sd, hDlg, wParam, lParam ); + } + + return FALSE; +} + +VOID MoveHistoryPopUp() +{ + FARPROC lpProc; + + CheckMenuItem(GetMenu(hwndMain), IDM_ShowMoveHistory, MF_CHECKED); + + if( moveHistoryDialog ) { + SendMessage( moveHistoryDialog, WM_INITDIALOG, 0, 0 ); + + if( ! moveHistoryDialogUp ) { + ShowWindow(moveHistoryDialog, SW_SHOW); + } + } + else { + lpProc = MakeProcInstance( (FARPROC) HistoryDialogProc, hInst ); + + /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ + CreateDialog( hInst, MAKEINTRESOURCE(DLG_MoveHistory), hwndMain, (DLGPROC)lpProc ); + + FreeProcInstance(lpProc); + } + + moveHistoryDialogUp = TRUE; +} + +VOID MoveHistoryPopDown() +{ + CheckMenuItem(GetMenu(hwndMain), IDM_ShowMoveHistory, MF_UNCHECKED); + + if( moveHistoryDialog ) { + ShowWindow(moveHistoryDialog, SW_HIDE); + } + + moveHistoryDialogUp = FALSE; +} + +VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo ) +{ + /* [AS] Danger! For now we rely on the movelist parameter being a static variable! */ + + currMovelist = movelist; + currFirst = first; + currLast = last; + currCurrent = current; + currPvInfo = pvInfo; + + if( moveHistoryDialog ) { + SendMessage( moveHistoryDialog, WM_REFRESH_HISTORY, 0, 0 ); + } +} + +BOOL MoveHistoryIsUp() +{ + return moveHistoryDialogUp; +} diff --git a/winboard/winboard.c b/winboard/winboard.c index a96aeb6..dbf3c90 100644 --- a/winboard/winboard.c +++ b/winboard/winboard.c @@ -424,7 +424,7 @@ VOID EngineOutputPopDown(); BOOL EngineOutputIsUp(); VOID EngineOutputUpdate( FrontEndProgramStats * stats ); -VOID GothicPopUp(char *title, char up); +VOID GothicPopUp(char *title, VariantClass variant); /* * Setting "frozen" should disable all user input other than deleting * the window. We do this while engines are initializing themselves. @@ -691,11 +691,12 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine) SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); +#if 0 /* [AS] Disable the FRC stuff if not playing the proper variant */ if( gameInfo.variant != VariantFischeRandom ) { EnableMenuItem( GetMenu(hwndMain), IDM_NewGameFRC, MF_GRAYED ); } - +#endif if (hwndConsole) { #if AOT_CONSOLE SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, @@ -1220,6 +1221,15 @@ ArgDescriptor argDescriptors[] = { /* Kludge to allow winboard.ini files from buggy 4.0.4 to be read: */ { "zippyReplyTimeout", ArgInt, (LPVOID)&junk, FALSE }, #endif + /* [HGM] options for broadcasting and time odds */ + { "serverMoves", ArgString, (LPVOID) &appData.serverMovesName, FALSE }, + { "suppressLoadMoves", ArgBoolean, (LPVOID) &appData.suppressLoadMoves, FALSE }, + { "serverPause", ArgInt, (LPVOID) &appData.serverPause, FALSE }, + { "firstTimeOdds", ArgInt, (LPVOID) &appData.firstTimeOdds, FALSE }, + { "secondTimeOdds", ArgInt, (LPVOID) &appData.secondTimeOdds, FALSE }, + { "timeOddsMode", ArgInt, (LPVOID) &appData.timeOddsMode, TRUE }, + { "firstAccumulateTC", ArgInt, (LPVOID) &appData.firstAccumulateTC, FALSE }, + { "secondAccumulateTC", ArgInt, (LPVOID) &appData.secondAccumulateTC, FALSE }, { NULL, ArgNone, NULL, FALSE } }; @@ -1896,6 +1906,13 @@ InitAppData(LPSTR lpCmdLine) appData.alphaRank = FALSE; appData.allWhite = FALSE; appData.upsideDown = FALSE; + appData.serverPause = 15; + appData.serverMovesName = NULL; + appData.suppressLoadMoves = FALSE; + appData.firstTimeOdds = 1; + appData.secondTimeOdds = 1; + appData.firstAccumulateTC = 1; // combine previous and current sessions + appData.secondAccumulateTC = 1; #ifdef ZIPPY appData.zippyTalk = ZIPPY_TALK; @@ -1940,6 +1957,35 @@ InitAppData(LPSTR lpCmdLine) appData.NrRanks > BOARD_SIZE ) DisplayFatalError("Recompile with BOARD_SIZE > 12, to support this size", 0, 2); + /* [HGM] After parsing the options from the .ini file, and overruling them + * with options from the command line, we now make an even higher priority + * overrule by WB options attached to the engine command line. This so that + * tournament managers can use WB options (such as /timeOdds) that follow + * the engines. + */ + if(appData.firstChessProgram != NULL) { + char *p = StrStr(appData.firstChessProgram, "WBopt"); + static char *f = "first"; + char buf[MSG_SIZ], *q = buf; + if(p != NULL) { // engine command line contains WinBoard options + sprintf(buf, p+6, f, f, f, f, f, f, f, f, f, f); // replace %s in them by "first" + ParseArgs(StringGet, &q); + p[-1] = 0; // cut them offengine command line + } + } + // now do same for second chess program + if(appData.secondChessProgram != NULL) { + char *p = StrStr(appData.secondChessProgram, "WBopt"); + static char *s = "second"; + char buf[MSG_SIZ], *q = buf; + if(p != NULL) { // engine command line contains WinBoard options + sprintf(buf, p+6, s, s, s, s, s, s, s, s, s, s); // replace %s in them by "first" + ParseArgs(StringGet, &q); + p[-1] = 0; // cut them offengine command line + } + } + + /* Propagate options that affect others */ if (appData.matchMode || appData.matchGames) chessProgram = TRUE; if (appData.icsActive || appData.noChessProgram) { @@ -2307,7 +2353,7 @@ enum { PM_WO = (int) WhiteCannon, PM_WU = (int) WhiteUnicorn, PM_WH = (int) WhiteNightrider, - PM_WA = (int) WhiteCardinal, + PM_WA = (int) WhiteAngel, PM_WC = (int) WhiteMarshall, PM_WG = (int) WhiteGrasshopper, PM_WK = (int) WhiteKing, @@ -2323,7 +2369,7 @@ enum { PM_BO = (int) BlackCannon, PM_BU = (int) BlackUnicorn, PM_BH = (int) BlackNightrider, - PM_BA = (int) BlackCardinal, + PM_BA = (int) BlackAngel, PM_BC = (int) BlackMarshall, PM_BG = (int) BlackGrasshopper, PM_BK = (int) BlackKing @@ -2554,8 +2600,7 @@ static int TranslatePieceToFontPiece( int piece ) return PM_WQ; case WhiteKing: return PM_WK; -#ifdef FAIRY - case BlackCardinal: + case BlackAngel: return PM_BA; case BlackMarshall: return PM_BC; @@ -2575,7 +2620,7 @@ static int TranslatePieceToFontPiece( int piece ) return PM_BG; case BlackMan: return PM_BM; - case WhiteCardinal: + case WhiteAngel: return PM_WA; case WhiteMarshall: return PM_WC; @@ -2595,7 +2640,6 @@ static int TranslatePieceToFontPiece( int piece ) return PM_WG; case WhiteMan: return PM_WM; -#endif } return 0; @@ -2677,7 +2721,7 @@ void CreatePiecesFromFont() } else if( strstr(lf.lfFaceName,"WinboardF") != NULL ) { /* Fairy symbols */ - SetCharTable(pieceToFontChar, "PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk"); + SetCharTable(pieceToFontChar, "PNBRQFEACWMOHIJGDVSLUKpnbrqfeacwmohijgdvsluk"); } else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) { /* Good Companion (Some characters get warped as literal :-( */ @@ -3057,10 +3101,15 @@ InitDrawingSizes(BoardSize boardSize, int flags) } } + /* [HGM] Licensing requirement */ #ifdef GOTHIC - /* [HGM] Gothic licensing requirement */ - GothicPopUp( GOTHIC, gameInfo.variant == VariantGothic ); + if(gameInfo.variant == VariantGothic) GothicPopUp( GOTHIC, VariantGothic); else #endif +#ifdef FALCON + if(gameInfo.variant == VariantFalcon) GothicPopUp( FALCON, VariantFalcon); else +#endif + GothicPopUp( "", VariantNormal); + /* if (boardSize == oldBoardSize) return; [HGM] variant might have changed */ oldBoardSize = boardSize; @@ -3076,6 +3125,7 @@ InitDrawingSizes(BoardSize boardSize, int flags) } } + // Orthodox Chess pieces pieceBitmap[0][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "s"); pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "s"); pieceBitmap[0][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "s"); @@ -3092,85 +3142,126 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "w"); pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "w"); if( !strcmp(appData.variant, "shogi") && (squareSize==72 || squareSize==49)) { - pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "s"); - pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "o"); - pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "w"); - } else { - pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s"); - pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o"); - pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w"); - } - if(squareSize==72 || squareSize==49) { /* experiment with some home-made bitmaps */ - pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "s"); - pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "o"); - pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "w"); - pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "s"); - pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "o"); - pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "w"); - pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s"); - pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o"); - pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w"); - pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s"); - pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o"); - pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w"); - pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s"); - pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o"); - pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w"); - pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s"); - pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o"); - pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w"); - if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */ - pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "wp", squareSize, "s"); - pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "wp", squareSize, "o"); - pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "w", squareSize, "w"); - pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "s"); - pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "o"); - pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "w", squareSize, "w"); - pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "s"); - pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "o"); - pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "w", squareSize, "w"); - pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "s"); - pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "o"); - pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "w", squareSize, "w"); - } else { - pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s"); - pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o"); - pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w"); - pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "s"); - pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "o"); - pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "w"); - pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "s"); - pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "o"); - pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "w"); - pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "s"); - pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "o"); - pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "w"); - } - if(gameInfo.variant != VariantCrazyhouse && gameInfo.variant != VariantShogi) { - pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s"); - pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o"); - pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "w"); + // in Shogi, Hijack the unused Queen for Lance + pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "s"); + pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "o"); + pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "w"); } else { - pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "s"); - pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "o"); - pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "w"); - } + pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s"); + pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o"); + pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w"); + } + + if(squareSize <= 72 && squareSize >= 33) { + /* A & C are available in most sizes now */ + if(squareSize != 49 && squareSize != 72 && squareSize != 33) { // Vortex-like + pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "s"); + pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "o"); + pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "w"); + pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "s"); + pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "o"); + pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "w"); + pieceBitmap[0][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "s"); + pieceBitmap[1][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "o"); + pieceBitmap[2][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "w"); + pieceBitmap[0][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "s"); + pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o"); + pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w"); + } else { // Smirf-like + pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "s"); + pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "o"); + pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "w"); + } + if(gameInfo.variant == VariantGothic) { // Vortex-like + pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "s"); + pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "o"); + pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "w"); + } else { // WinBoard standard + pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s"); + pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o"); + pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "w"); + } + } + + + if(squareSize==72 || squareSize==49 || squareSize==33) { /* experiment with some home-made bitmaps */ + pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "s"); + pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "o"); + pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "w"); + pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "s"); + pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "o"); + pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "w"); + pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s"); + pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o"); + pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w"); + pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s"); + pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o"); + pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w"); + pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s"); + pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o"); + pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w"); + pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "s"); + pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "o"); + pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "w"); + pieceBitmap[0][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "s"); + pieceBitmap[1][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "o"); + pieceBitmap[2][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "w"); + pieceBitmap[0][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "s"); + pieceBitmap[1][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "o"); + pieceBitmap[2][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "w"); + pieceBitmap[0][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "s"); + pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o"); + pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w"); + pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s"); + pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o"); + pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w"); + + if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */ + pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "s"); + pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "o"); + pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "w", squareSize, "w"); + pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "s"); + pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "o"); + pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "w", squareSize, "w"); + pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "s"); + pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "o"); + pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "w", squareSize, "w"); + pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "s"); + pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "o"); + pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "w", squareSize, "w"); + } else { + pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s"); + pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o"); + pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w"); + pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "s"); + pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "o"); + pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "w"); + pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "s"); + pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "o"); + pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "w"); + pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "s"); + pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "o"); + pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "w"); + } + } else { /* other size, no special bitmaps available. Use smaller symbols */ - if((int)boardSize < 2) minorSize = sizeInfo[0].squareSize; - else minorSize = sizeInfo[(int)boardSize - 2].squareSize; - pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "s"); - pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "o"); - pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "w"); - pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "s"); - pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "o"); - pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "w"); - pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "s"); - pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "o"); - pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "w"); - pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "s"); - pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "o"); - pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "w"); + if((int)boardSize < 2) minorSize = sizeInfo[0].squareSize; + else minorSize = sizeInfo[(int)boardSize - 2].squareSize; + pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "s"); + pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "o"); + pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "w"); + pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "s"); + pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "o"); + pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "w"); + pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "s"); + pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "o"); + pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "w"); + pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "s"); + pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "o"); + pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "w"); } + + if(gameInfo.variant == VariantShogi && squareSize == 58) /* special Shogi support in this size */ { for (i=0; i<=2; i++) { /* replace all bitmaps */ @@ -3189,10 +3280,10 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[0][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "o"); pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "sf", squareSize, "o"); pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "o"); - pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "su", squareSize, "o"); + pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "su", squareSize, "o"); pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "sh", squareSize, "o"); pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "sa", squareSize, "o"); - pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "sc", squareSize, "o"); + pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "sc", squareSize, "o"); pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "sg", squareSize, "o"); pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ss", squareSize, "o"); pieceBitmap[1][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "o"); @@ -3203,10 +3294,10 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[1][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "o"); pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "sf", squareSize, "o"); pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "o"); - pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "su", squareSize, "o"); + pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "su", squareSize, "o"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "sh", squareSize, "o"); pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "sa", squareSize, "o"); - pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "sc", squareSize, "o"); + pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "sc", squareSize, "o"); pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "sg", squareSize, "o"); pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ss", squareSize, "o"); pieceBitmap[2][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "w"); @@ -3217,10 +3308,10 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "w"); pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "sw", squareSize, "w"); pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "w"); - pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "sp", squareSize, "w"); + pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "sp", squareSize, "w"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "sn", squareSize, "w"); pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "sr", squareSize, "w"); - pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "sr", squareSize, "w"); + pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "sr", squareSize, "w"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "sl", squareSize, "w"); pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "sw", squareSize, "w"); minorSize = 0; @@ -3428,7 +3519,7 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, if( color ) oldBrush = SelectObject(hdc, whitePieceBrush); else oldBrush = SelectObject(hdc, blackPieceBrush); - if(appData.upsideDown && !color) + if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); @@ -3442,7 +3533,7 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, #else /* Use black for outline of white pieces */ SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE)); - if(appData.upsideDown && !color) + if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND); @@ -3464,7 +3555,7 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, /* Use square color for details of black pieces */ oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE)); oldBrush = SelectObject(hdc, blackPieceBrush); - if(appData.upsideDown) + if(appData.upsideDown && !flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); @@ -5558,7 +5649,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case EP_WhiteCardinal: - EditPositionMenuEvent(WhiteCardinal, fromX, fromY); + EditPositionMenuEvent(WhiteAngel, fromX, fromY); fromX = fromY = -1; break; @@ -5618,7 +5709,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case EP_BlackCardinal: - EditPositionMenuEvent(BlackCardinal, fromX, fromY); + EditPositionMenuEvent(BlackAngel, fromX, fromY); fromX = fromY = -1; break; @@ -6841,23 +6932,26 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) } VOID -GothicPopUp(char *title, char up) +GothicPopUp(char *title, VariantClass variant) { FARPROC lpProc; char *p, *q; BOOLEAN modal = hwndMain == NULL; + static char *lastTitle; strncpy(errorTitle, title, sizeof(errorTitle)); errorTitle[sizeof(errorTitle) - 1] = '\0'; - if(up && gothicDialog == NULL) { + if(lastTitle != title && gothicDialog != NULL) { + DestroyWindow(gothicDialog); + gothicDialog = NULL; + } + if(variant != VariantNormal && gothicDialog == NULL) { + title = lastTitle; lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); - } else if(!up && gothicDialog != NULL) { - DestroyWindow(gothicDialog); - gothicDialog = NULL; } } #endif @@ -9129,7 +9223,7 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr) void DestroyChildProcess(ProcRef pr, int/*boolean*/ signal) { - ChildProc *cp; + ChildProc *cp; int result; cp = (ChildProc *) pr; if (cp == NULL) return; @@ -9146,22 +9240,23 @@ DestroyChildProcess(ProcRef pr, int/*boolean*/ signal) /*!!if (signal) GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, cp->pid);*/ /* [AS] Special termination modes for misbehaving programs... */ - if( signal == 9 ) { + if( signal == 9 ) { + result = TerminateProcess( cp->hProcess, 0 ); + if ( appData.debugMode) { - fprintf( debugFP, "Terminating process %u\n", cp->pid ); + fprintf( debugFP, "Terminating process %u, result=%d\n", cp->pid, result ); } - - TerminateProcess( cp->hProcess, 0 ); } else if( signal == 10 ) { DWORD dw = WaitForSingleObject( cp->hProcess, 3*1000 ); // Wait 3 seconds at most if( dw != WAIT_OBJECT_0 ) { + result = TerminateProcess( cp->hProcess, 0 ); + if ( appData.debugMode) { - fprintf( debugFP, "Process %u still alive after timeout, killing...\n", cp->pid ); + fprintf( debugFP, "Process %u still alive after timeout, killing... result=%d\n", cp->pid, result ); } - TerminateProcess( cp->hProcess, 0 ); } } diff --git a/winboard/winboard.h b/winboard/winboard.h index 890e071..9944ccc 100644 --- a/winboard/winboard.h +++ b/winboard/winboard.h @@ -135,7 +135,8 @@ VOID ExitArgError(char *msg, char *badArg); #define CONSOLE_FONT 3 #define COMMENT_FONT 4 #define EDITTAGS_FONT 5 -#define NUM_FONTS 6 +#define MOVEHISTORY_FONT 6 +#define NUM_FONTS 7 /* Positions of some menu items. Origin is zero and separator lines count. */ /* It's gross that these are needed. */ @@ -163,18 +164,18 @@ extern MyFont *font[NUM_SIZES][NUM_FONTS]; #define COPY_TMP "wbcopy.tmp" #define PASTE_TMP "wbpaste.tmp" - -/* [AS] Layout management */ -typedef struct { - Boolean visible; - int x; - int y; - int width; - int height; -} WindowPlacement; - -VOID InitWindowPlacement( WindowPlacement * wp ); - -VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp ); - -VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild ); + +/* [AS] Layout management */ +typedef struct { + Boolean visible; + int x; + int y; + int width; + int height; +} WindowPlacement; + +VOID InitWindowPlacement( WindowPlacement * wp ); + +VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp ); + +VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild ); diff --git a/winboard/winboard.rc b/winboard/winboard.rc index 6682aab..d8d6aec 100644 --- a/winboard/winboard.rc +++ b/winboard/winboard.rc @@ -635,6 +635,12 @@ BEGIN 10 CONTROL "Shatran&j",OPT_VariantShatranj,"Button",BS_AUTORADIOBUTTON,134, 34,50,10 + CONTROL "&FRC",OPT_VariantFRC,"Button",BS_AUTORADIOBUTTON,134, + 44,50,10 + CONTROL "c&ylinder",OPT_VariantCylinder,"Button",BS_AUTORADIOBUTTON,134, + 54,50,10 + CONTROL "&Falcon",OPT_VariantFalcon,"Button",BS_AUTORADIOBUTTON,134, + 64,50,10 GROUPBOX "Variant",IDC_STATIC,4,4,185,75 LTEXT "Board size:",IDC_STATIC,10,95,40,8 EDITTEXT IDC_Ranks,60,91,14,14,ES_AUTOHSCROLL @@ -1657,7 +1663,9 @@ TIM BITMAP MOVEABLE PURE "bitmaps\\tim.bmp" // [HGM] Some fairy symbols: E72O BITMAP MOVEABLE PURE "bitmaps\\e72o.bmp" A72O BITMAP MOVEABLE PURE "bitmaps\\a72o.bmp" +AA72O BITMAP MOVEABLE PURE "bitmaps\\as72o.bmp" C72O BITMAP MOVEABLE PURE "bitmaps\\c72o.bmp" +CV72O BITMAP MOVEABLE PURE "bitmaps\\cv72o.bmp" F72O BITMAP MOVEABLE PURE "bitmaps\\f72o.bmp" M72O BITMAP MOVEABLE PURE "bitmaps\\m72o.bmp" W72O BITMAP MOVEABLE PURE "bitmaps\\w72o.bmp" @@ -1665,6 +1673,8 @@ O72O BITMAP MOVEABLE PURE "bitmaps\\o72o.bmp" U72O BITMAP MOVEABLE PURE "bitmaps\\u72o.bmp" H72O BITMAP MOVEABLE PURE "bitmaps\\h72o.bmp" G72O BITMAP MOVEABLE PURE "bitmaps\\g72o.bmp" +V72O BITMAP MOVEABLE PURE "bitmaps\\v72o.bmp" +S72O BITMAP MOVEABLE PURE "bitmaps\\s72o.bmp" L72O BITMAP MOVEABLE PURE "bitmaps\\l72o.bmp" DK72O BITMAP MOVEABLE PURE "bitmaps\\dk72o.bmp" WP72O BITMAP MOVEABLE PURE "bitmaps\\wp72o.bmp" @@ -1673,7 +1683,9 @@ WL72O BITMAP MOVEABLE PURE "bitmaps\\wl72o.bmp" WS72O BITMAP MOVEABLE PURE "bitmaps\\ws72o.bmp" E72S BITMAP MOVEABLE PURE "bitmaps\\e72s.bmp" A72S BITMAP MOVEABLE PURE "bitmaps\\a72s.bmp" +AA72S BITMAP MOVEABLE PURE "bitmaps\\as72s.bmp" C72S BITMAP MOVEABLE PURE "bitmaps\\c72s.bmp" +CV72S BITMAP MOVEABLE PURE "bitmaps\\cv72s.bmp" F72S BITMAP MOVEABLE PURE "bitmaps\\f72s.bmp" M72S BITMAP MOVEABLE PURE "bitmaps\\m72s.bmp" W72S BITMAP MOVEABLE PURE "bitmaps\\w72s.bmp" @@ -1681,6 +1693,8 @@ O72S BITMAP MOVEABLE PURE "bitmaps\\o72s.bmp" U72S BITMAP MOVEABLE PURE "bitmaps\\u72s.bmp" H72S BITMAP MOVEABLE PURE "bitmaps\\h72s.bmp" G72S BITMAP MOVEABLE PURE "bitmaps\\g72s.bmp" +V72S BITMAP MOVEABLE PURE "bitmaps\\v72s.bmp" +S72S BITMAP MOVEABLE PURE "bitmaps\\s72s.bmp" L72S BITMAP MOVEABLE PURE "bitmaps\\l72s.bmp" DK72S BITMAP MOVEABLE PURE "bitmaps\\dk72s.bmp" WP72S BITMAP MOVEABLE PURE "bitmaps\\wp72s.bmp" @@ -1689,7 +1703,9 @@ WL72S BITMAP MOVEABLE PURE "bitmaps\\wl72s.bmp" WS72S BITMAP MOVEABLE PURE "bitmaps\\ws72s.bmp" E72W BITMAP MOVEABLE PURE "bitmaps\\e72w.bmp" A72W BITMAP MOVEABLE PURE "bitmaps\\a72w.bmp" +AA72W BITMAP MOVEABLE PURE "bitmaps\\as72w.bmp" C72W BITMAP MOVEABLE PURE "bitmaps\\c72w.bmp" +CV72W BITMAP MOVEABLE PURE "bitmaps\\cv72w.bmp" F72W BITMAP MOVEABLE PURE "bitmaps\\f72w.bmp" M72W BITMAP MOVEABLE PURE "bitmaps\\m72w.bmp" W72W BITMAP MOVEABLE PURE "bitmaps\\w72w.bmp" @@ -1697,11 +1713,15 @@ O72W BITMAP MOVEABLE PURE "bitmaps\\o72w.bmp" U72W BITMAP MOVEABLE PURE "bitmaps\\u72w.bmp" H72W BITMAP MOVEABLE PURE "bitmaps\\h72w.bmp" G72W BITMAP MOVEABLE PURE "bitmaps\\g72w.bmp" +V72W BITMAP MOVEABLE PURE "bitmaps\\v72w.bmp" +S72W BITMAP MOVEABLE PURE "bitmaps\\s72w.bmp" L72W BITMAP MOVEABLE PURE "bitmaps\\l72w.bmp" DK72W BITMAP MOVEABLE PURE "bitmaps\\dk72w.bmp" E49O BITMAP MOVEABLE PURE "bitmaps\\e49o.bmp" A49O BITMAP MOVEABLE PURE "bitmaps\\a49o.bmp" +AA49O BITMAP MOVEABLE PURE "bitmaps\\as49o.bmp" C49O BITMAP MOVEABLE PURE "bitmaps\\c49o.bmp" +CV49O BITMAP MOVEABLE PURE "bitmaps\\cv49o.bmp" F49O BITMAP MOVEABLE PURE "bitmaps\\f49o.bmp" M49O BITMAP MOVEABLE PURE "bitmaps\\m49o.bmp" W49O BITMAP MOVEABLE PURE "bitmaps\\w49o.bmp" @@ -1709,6 +1729,8 @@ O49O BITMAP MOVEABLE PURE "bitmaps\\o49o.bmp" U49O BITMAP MOVEABLE PURE "bitmaps\\u49o.bmp" H49O BITMAP MOVEABLE PURE "bitmaps\\h49o.bmp" G49O BITMAP MOVEABLE PURE "bitmaps\\g49o.bmp" +V49O BITMAP MOVEABLE PURE "bitmaps\\v49o.bmp" +S49O BITMAP MOVEABLE PURE "bitmaps\\s49o.bmp" L49O BITMAP MOVEABLE PURE "bitmaps\\l49o.bmp" DK49O BITMAP MOVEABLE PURE "bitmaps\\dk49o.bmp" WP49O BITMAP MOVEABLE PURE "bitmaps\\wp49o.bmp" @@ -1717,7 +1739,9 @@ WL49O BITMAP MOVEABLE PURE "bitmaps\\wl49o.bmp" WS49O BITMAP MOVEABLE PURE "bitmaps\\ws49o.bmp" E49S BITMAP MOVEABLE PURE "bitmaps\\e49s.bmp" A49S BITMAP MOVEABLE PURE "bitmaps\\a49s.bmp" +AA49S BITMAP MOVEABLE PURE "bitmaps\\as49s.bmp" C49S BITMAP MOVEABLE PURE "bitmaps\\c49s.bmp" +CV49S BITMAP MOVEABLE PURE "bitmaps\\cv49s.bmp" F49S BITMAP MOVEABLE PURE "bitmaps\\f49s.bmp" M49S BITMAP MOVEABLE PURE "bitmaps\\m49s.bmp" W49S BITMAP MOVEABLE PURE "bitmaps\\w49s.bmp" @@ -1725,6 +1749,8 @@ O49S BITMAP MOVEABLE PURE "bitmaps\\o49s.bmp" U49S BITMAP MOVEABLE PURE "bitmaps\\u49s.bmp" H49S BITMAP MOVEABLE PURE "bitmaps\\h49s.bmp" G49S BITMAP MOVEABLE PURE "bitmaps\\g49s.bmp" +V49S BITMAP MOVEABLE PURE "bitmaps\\v49s.bmp" +S49S BITMAP MOVEABLE PURE "bitmaps\\s49s.bmp" L49S BITMAP MOVEABLE PURE "bitmaps\\l49s.bmp" DK49S BITMAP MOVEABLE PURE "bitmaps\\dk49s.bmp" WP49S BITMAP MOVEABLE PURE "bitmaps\\wp49s.bmp" @@ -1733,7 +1759,9 @@ WL49S BITMAP MOVEABLE PURE "bitmaps\\wl49s.bmp" WS49S BITMAP MOVEABLE PURE "bitmaps\\ws49s.bmp" E49W BITMAP MOVEABLE PURE "bitmaps\\e49w.bmp" A49W BITMAP MOVEABLE PURE "bitmaps\\a49w.bmp" +AA49W BITMAP MOVEABLE PURE "bitmaps\\as49w.bmp" C49W BITMAP MOVEABLE PURE "bitmaps\\c49w.bmp" +CV49W BITMAP MOVEABLE PURE "bitmaps\\cv49w.bmp" F49W BITMAP MOVEABLE PURE "bitmaps\\f49w.bmp" M49W BITMAP MOVEABLE PURE "bitmaps\\m49w.bmp" W49W BITMAP MOVEABLE PURE "bitmaps\\w49w.bmp" @@ -1741,8 +1769,128 @@ O49W BITMAP MOVEABLE PURE "bitmaps\\o49w.bmp" U49W BITMAP MOVEABLE PURE "bitmaps\\u49w.bmp" H49W BITMAP MOVEABLE PURE "bitmaps\\h49w.bmp" G49W BITMAP MOVEABLE PURE "bitmaps\\g49w.bmp" +V49W BITMAP MOVEABLE PURE "bitmaps\\v49w.bmp" +S49W BITMAP MOVEABLE PURE "bitmaps\\s49w.bmp" L49W BITMAP MOVEABLE PURE "bitmaps\\l49w.bmp" DK49W BITMAP MOVEABLE PURE "bitmaps\\dk49w.bmp" +A33O BITMAP MOVEABLE PURE "bitmaps\\a33o.bmp" +AA33O BITMAP MOVEABLE PURE "bitmaps\\as33o.bmp" +C33O BITMAP MOVEABLE PURE "bitmaps\\c33o.bmp" +CV33O BITMAP MOVEABLE PURE "bitmaps\\cv33o.bmp" +V33O BITMAP MOVEABLE PURE "bitmaps\\v33o.bmp" +E33O BITMAP MOVEABLE PURE "bitmaps\\e33o.bmp" +F33O BITMAP MOVEABLE PURE "bitmaps\\f33o.bmp" +H33O BITMAP MOVEABLE PURE "bitmaps\\h33o.bmp" +G33O BITMAP MOVEABLE PURE "bitmaps\\g33o.bmp" +L33O BITMAP MOVEABLE PURE "bitmaps\\l33o.bmp" +W33O BITMAP MOVEABLE PURE "bitmaps\\w33o.bmp" +M33O BITMAP MOVEABLE PURE "bitmaps\\m33o.bmp" +O33O BITMAP MOVEABLE PURE "bitmaps\\o33o.bmp" +DK33O BITMAP MOVEABLE PURE "bitmaps\\dk33o.bmp" +A33W BITMAP MOVEABLE PURE "bitmaps\\a33w.bmp" +AA33W BITMAP MOVEABLE PURE "bitmaps\\as33w.bmp" +C33W BITMAP MOVEABLE PURE "bitmaps\\c33w.bmp" +CV33W BITMAP MOVEABLE PURE "bitmaps\\cv33w.bmp" +V33W BITMAP MOVEABLE PURE "bitmaps\\v33w.bmp" +E33W BITMAP MOVEABLE PURE "bitmaps\\e33w.bmp" +F33W BITMAP MOVEABLE PURE "bitmaps\\f33w.bmp" +H33W BITMAP MOVEABLE PURE "bitmaps\\h33w.bmp" +G33W BITMAP MOVEABLE PURE "bitmaps\\g33w.bmp" +L33W BITMAP MOVEABLE PURE "bitmaps\\l33w.bmp" +W33W BITMAP MOVEABLE PURE "bitmaps\\w33w.bmp" +M33W BITMAP MOVEABLE PURE "bitmaps\\m33w.bmp" +O33W BITMAP MOVEABLE PURE "bitmaps\\o33w.bmp" +DK33W BITMAP MOVEABLE PURE "bitmaps\\dk33w.bmp" +A33S BITMAP MOVEABLE PURE "bitmaps\\a33s.bmp" +AA33S BITMAP MOVEABLE PURE "bitmaps\\as33s.bmp" +C33S BITMAP MOVEABLE PURE "bitmaps\\c33s.bmp" +CV33S BITMAP MOVEABLE PURE "bitmaps\\cv33s.bmp" +V33S BITMAP MOVEABLE PURE "bitmaps\\v33s.bmp" +E33S BITMAP MOVEABLE PURE "bitmaps\\e33s.bmp" +F33S BITMAP MOVEABLE PURE "bitmaps\\f33s.bmp" +H33S BITMAP MOVEABLE PURE "bitmaps\\h33s.bmp" +G33S BITMAP MOVEABLE PURE "bitmaps\\g33s.bmp" +L33S BITMAP MOVEABLE PURE "bitmaps\\l33s.bmp" +W33S BITMAP MOVEABLE PURE "bitmaps\\w33s.bmp" +M33S BITMAP MOVEABLE PURE "bitmaps\\m33s.bmp" +O33S BITMAP MOVEABLE PURE "bitmaps\\o33s.bmp" +DK33S BITMAP MOVEABLE PURE "bitmaps\\dk33s.bmp" + +A37O BITMAP MOVEABLE PURE "bitmaps\\a37o.bmp" +L37O BITMAP MOVEABLE PURE "bitmaps\\l37o.bmp" +C37O BITMAP MOVEABLE PURE "bitmaps\\c37o.bmp" +CV37O BITMAP MOVEABLE PURE "bitmaps\\cv37o.bmp" +A40O BITMAP MOVEABLE PURE "bitmaps\\a40o.bmp" +L40O BITMAP MOVEABLE PURE "bitmaps\\l40o.bmp" +C40O BITMAP MOVEABLE PURE "bitmaps\\c40o.bmp" +CV40O BITMAP MOVEABLE PURE "bitmaps\\cv40o.bmp" +A45O BITMAP MOVEABLE PURE "bitmaps\\a45o.bmp" +L45O BITMAP MOVEABLE PURE "bitmaps\\l45o.bmp" +C45O BITMAP MOVEABLE PURE "bitmaps\\c45o.bmp" +CV45O BITMAP MOVEABLE PURE "bitmaps\\cv45o.bmp" +A54O BITMAP MOVEABLE PURE "bitmaps\\a54o.bmp" +L54O BITMAP MOVEABLE PURE "bitmaps\\l54o.bmp" +C54O BITMAP MOVEABLE PURE "bitmaps\\c54o.bmp" +CV54O BITMAP MOVEABLE PURE "bitmaps\\cv54o.bmp" +V54O BITMAP MOVEABLE PURE "bitmaps\\v54o.bmp" +A58O BITMAP MOVEABLE PURE "bitmaps\\a58o.bmp" +L58O BITMAP MOVEABLE PURE "bitmaps\\l58o.bmp" +C58O BITMAP MOVEABLE PURE "bitmaps\\c58o.bmp" +CV58O BITMAP MOVEABLE PURE "bitmaps\\cv58o.bmp" +A64O BITMAP MOVEABLE PURE "bitmaps\\a64o.bmp" +L64O BITMAP MOVEABLE PURE "bitmaps\\l64o.bmp" +C64O BITMAP MOVEABLE PURE "bitmaps\\c64o.bmp" +CV64O BITMAP MOVEABLE PURE "bitmaps\\cv64o.bmp" +A37W BITMAP MOVEABLE PURE "bitmaps\\a37w.bmp" +L37W BITMAP MOVEABLE PURE "bitmaps\\l37w.bmp" +C37W BITMAP MOVEABLE PURE "bitmaps\\c37w.bmp" +CV37W BITMAP MOVEABLE PURE "bitmaps\\cv37w.bmp" +A40W BITMAP MOVEABLE PURE "bitmaps\\a40w.bmp" +L40W BITMAP MOVEABLE PURE "bitmaps\\l40w.bmp" +C40W BITMAP MOVEABLE PURE "bitmaps\\c40w.bmp" +CV40W BITMAP MOVEABLE PURE "bitmaps\\cv40w.bmp" +A45W BITMAP MOVEABLE PURE "bitmaps\\a45w.bmp" +L45W BITMAP MOVEABLE PURE "bitmaps\\l45w.bmp" +C45W BITMAP MOVEABLE PURE "bitmaps\\c45w.bmp" +CV45W BITMAP MOVEABLE PURE "bitmaps\\cv45w.bmp" +A54W BITMAP MOVEABLE PURE "bitmaps\\a54w.bmp" +L54W BITMAP MOVEABLE PURE "bitmaps\\l54w.bmp" +C54W BITMAP MOVEABLE PURE "bitmaps\\c54w.bmp" +CV54W BITMAP MOVEABLE PURE "bitmaps\\cv54w.bmp" +V54W BITMAP MOVEABLE PURE "bitmaps\\v54w.bmp" +A58W BITMAP MOVEABLE PURE "bitmaps\\a58w.bmp" +L58W BITMAP MOVEABLE PURE "bitmaps\\l58w.bmp" +C58W BITMAP MOVEABLE PURE "bitmaps\\c58w.bmp" +CV58W BITMAP MOVEABLE PURE "bitmaps\\cv58w.bmp" +A64W BITMAP MOVEABLE PURE "bitmaps\\a64w.bmp" +L64W BITMAP MOVEABLE PURE "bitmaps\\l64w.bmp" +C64W BITMAP MOVEABLE PURE "bitmaps\\c64w.bmp" +CV64W BITMAP MOVEABLE PURE "bitmaps\\cv64w.bmp" +A37S BITMAP MOVEABLE PURE "bitmaps\\a37s.bmp" +L37S BITMAP MOVEABLE PURE "bitmaps\\l37s.bmp" +C37S BITMAP MOVEABLE PURE "bitmaps\\c37s.bmp" +CV37S BITMAP MOVEABLE PURE "bitmaps\\cv37s.bmp" +A40S BITMAP MOVEABLE PURE "bitmaps\\a40s.bmp" +L40S BITMAP MOVEABLE PURE "bitmaps\\l40s.bmp" +C40S BITMAP MOVEABLE PURE "bitmaps\\c40s.bmp" +CV40S BITMAP MOVEABLE PURE "bitmaps\\cv40s.bmp" +A45S BITMAP MOVEABLE PURE "bitmaps\\a45s.bmp" +L45S BITMAP MOVEABLE PURE "bitmaps\\l45s.bmp" +C45S BITMAP MOVEABLE PURE "bitmaps\\c45s.bmp" +CV45S BITMAP MOVEABLE PURE "bitmaps\\cv45s.bmp" +A54S BITMAP MOVEABLE PURE "bitmaps\\a54s.bmp" +L54S BITMAP MOVEABLE PURE "bitmaps\\l54s.bmp" +C54S BITMAP MOVEABLE PURE "bitmaps\\c54s.bmp" +CV54S BITMAP MOVEABLE PURE "bitmaps\\cv54s.bmp" +V54S BITMAP MOVEABLE PURE "bitmaps\\v54s.bmp" +A58S BITMAP MOVEABLE PURE "bitmaps\\a58s.bmp" +L58S BITMAP MOVEABLE PURE "bitmaps\\l58s.bmp" +C58S BITMAP MOVEABLE PURE "bitmaps\\c58s.bmp" +CV58S BITMAP MOVEABLE PURE "bitmaps\\cv58s.bmp" +A64S BITMAP MOVEABLE PURE "bitmaps\\a64s.bmp" +L64S BITMAP MOVEABLE PURE "bitmaps\\l64s.bmp" +C64S BITMAP MOVEABLE PURE "bitmaps\\c64s.bmp" +CV64S BITMAP MOVEABLE PURE "bitmaps\\cv64s.bmp" SP58O BITMAP MOVEABLE PURE "shogibitmaps\\sp58o.bmp" SN58O BITMAP MOVEABLE PURE "shogibitmaps\\sn58o.bmp" diff --git a/winboard/wlayout.c b/winboard/wlayout.c index c0606bb..d5e8153 100644 --- a/winboard/wlayout.c +++ b/winboard/wlayout.c @@ -1,156 +1,156 @@ -/* - * Layout management - * - * Author: Alessandro Scotti (Dec 2005) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#include "config.h" - -#include /* required for all Windows applications */ -#include -#include -#include -#include -#include - -#include "common.h" -#include "winboard.h" - -VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp ) -{ - if( wp->x != CW_USEDEFAULT || - wp->y != CW_USEDEFAULT || - wp->width != CW_USEDEFAULT || - wp->height != CW_USEDEFAULT ) - { - WINDOWPLACEMENT stWP; - - ZeroMemory( &stWP, sizeof(stWP) ); - - EnsureOnScreen( &wp->x, &wp->y); - - stWP.length = sizeof(stWP); - stWP.flags = 0; - stWP.showCmd = SW_SHOW; - stWP.ptMaxPosition.x = 0; - stWP.ptMaxPosition.y = 0; - stWP.rcNormalPosition.left = wp->x; - stWP.rcNormalPosition.right = wp->x + wp->width; - stWP.rcNormalPosition.top = wp->y; - stWP.rcNormalPosition.bottom = wp->y + wp->height; - - SetWindowPlacement(hWnd, &stWP); - } -} - -VOID InitWindowPlacement( WindowPlacement * wp ) -{ - wp->visible = TRUE; - wp->x = CW_USEDEFAULT; - wp->y = CW_USEDEFAULT; - wp->width = CW_USEDEFAULT; - wp->height = CW_USEDEFAULT; -} - -static BOOL IsAttachDistance( int a, int b ) -{ - BOOL result = FALSE; - - if( a == b ) { - result = TRUE; - } - - return result; -} - -static BOOL IsDefaultPlacement( WindowPlacement * wp ) -{ - BOOL result = FALSE; - - if( wp->x == CW_USEDEFAULT || wp->y == CW_USEDEFAULT || wp->width == CW_USEDEFAULT || wp->height == CW_USEDEFAULT ) { - result = TRUE; - } - - return result; -} - -static BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp ) -{ - BOOL result = FALSE; - - if( hWnd != NULL ) { - WINDOWPLACEMENT stWP; - - ZeroMemory( &stWP, sizeof(stWP) ); - - stWP.length = sizeof(stWP); - - GetWindowPlacement( hWnd, &stWP ); - - wp->x = stWP.rcNormalPosition.left; - wp->y = stWP.rcNormalPosition.top; - wp->width = stWP.rcNormalPosition.right - stWP.rcNormalPosition.left; - wp->height = stWP.rcNormalPosition.bottom - stWP.rcNormalPosition.top; - - result = TRUE; - } - - return result; -} - -static BOOL IsAttachedByWindowPlacement( LPRECT lprcMain, WindowPlacement * wp ) -{ - BOOL result = FALSE; - - if( ! IsDefaultPlacement(wp) ) { - if( IsAttachDistance( lprcMain->right, wp->x ) || - IsAttachDistance( lprcMain->bottom, wp->y ) || - IsAttachDistance( lprcMain->left, (wp->x + wp->width) ) || - IsAttachDistance( lprcMain->top, (wp->y + wp->height) ) ) - { - result = TRUE; - } - } - - return result; -} - -VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild ) -{ - if( ! IsDefaultPlacement( pwpChild ) ) { - GetActualPlacement( hWndChild, pwpChild ); - - if( IsAttachedByWindowPlacement( lprcOldPos, pwpChild ) ) { - /* Get position delta */ - int delta_x = pwpChild->x - lprcOldPos->left; - int delta_y = pwpChild->y - lprcOldPos->top; - - /* Adjust placement */ - pwpChild->x = new_x + delta_x; - pwpChild->y = new_y + delta_y; - - /* Move window */ - if( hWndChild != NULL ) { - SetWindowPos( hWndChild, HWND_TOP, - pwpChild->x, pwpChild->y, - 0, 0, - SWP_NOZORDER | SWP_NOSIZE ); - } - } - } -} +/* + * Layout management + * + * Author: Alessandro Scotti (Dec 2005) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#include "config.h" + +#include /* required for all Windows applications */ +#include +#include +#include +#include +#include + +#include "common.h" +#include "winboard.h" + +VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp ) +{ + if( wp->x != CW_USEDEFAULT || + wp->y != CW_USEDEFAULT || + wp->width != CW_USEDEFAULT || + wp->height != CW_USEDEFAULT ) + { + WINDOWPLACEMENT stWP; + + ZeroMemory( &stWP, sizeof(stWP) ); + + EnsureOnScreen( &wp->x, &wp->y); + + stWP.length = sizeof(stWP); + stWP.flags = 0; + stWP.showCmd = SW_SHOW; + stWP.ptMaxPosition.x = 0; + stWP.ptMaxPosition.y = 0; + stWP.rcNormalPosition.left = wp->x; + stWP.rcNormalPosition.right = wp->x + wp->width; + stWP.rcNormalPosition.top = wp->y; + stWP.rcNormalPosition.bottom = wp->y + wp->height; + + SetWindowPlacement(hWnd, &stWP); + } +} + +VOID InitWindowPlacement( WindowPlacement * wp ) +{ + wp->visible = TRUE; + wp->x = CW_USEDEFAULT; + wp->y = CW_USEDEFAULT; + wp->width = CW_USEDEFAULT; + wp->height = CW_USEDEFAULT; +} + +static BOOL IsAttachDistance( int a, int b ) +{ + BOOL result = FALSE; + + if( a == b ) { + result = TRUE; + } + + return result; +} + +static BOOL IsDefaultPlacement( WindowPlacement * wp ) +{ + BOOL result = FALSE; + + if( wp->x == CW_USEDEFAULT || wp->y == CW_USEDEFAULT || wp->width == CW_USEDEFAULT || wp->height == CW_USEDEFAULT ) { + result = TRUE; + } + + return result; +} + +static BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp ) +{ + BOOL result = FALSE; + + if( hWnd != NULL ) { + WINDOWPLACEMENT stWP; + + ZeroMemory( &stWP, sizeof(stWP) ); + + stWP.length = sizeof(stWP); + + GetWindowPlacement( hWnd, &stWP ); + + wp->x = stWP.rcNormalPosition.left; + wp->y = stWP.rcNormalPosition.top; + wp->width = stWP.rcNormalPosition.right - stWP.rcNormalPosition.left; + wp->height = stWP.rcNormalPosition.bottom - stWP.rcNormalPosition.top; + + result = TRUE; + } + + return result; +} + +static BOOL IsAttachedByWindowPlacement( LPRECT lprcMain, WindowPlacement * wp ) +{ + BOOL result = FALSE; + + if( ! IsDefaultPlacement(wp) ) { + if( IsAttachDistance( lprcMain->right, wp->x ) || + IsAttachDistance( lprcMain->bottom, wp->y ) || + IsAttachDistance( lprcMain->left, (wp->x + wp->width) ) || + IsAttachDistance( lprcMain->top, (wp->y + wp->height) ) ) + { + result = TRUE; + } + } + + return result; +} + +VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild ) +{ + if( ! IsDefaultPlacement( pwpChild ) ) { + GetActualPlacement( hWndChild, pwpChild ); + + if( IsAttachedByWindowPlacement( lprcOldPos, pwpChild ) ) { + /* Get position delta */ + int delta_x = pwpChild->x - lprcOldPos->left; + int delta_y = pwpChild->y - lprcOldPos->top; + + /* Adjust placement */ + pwpChild->x = new_x + delta_x; + pwpChild->y = new_y + delta_y; + + /* Move window */ + if( hWndChild != NULL ) { + SetWindowPos( hWndChild, HWND_TOP, + pwpChild->x, pwpChild->y, + 0, 0, + SWP_NOZORDER | SWP_NOSIZE ); + } + } + } +} diff --git a/winboard/woptions.c b/winboard/woptions.c index df3c699..f2a797e 100644 --- a/winboard/woptions.c +++ b/winboard/woptions.c @@ -65,6 +65,7 @@ extern char installDir[]; extern HWND hCommPort; /* currently open comm port */ extern DCB dcb; extern BOOLEAN chessProgram; +extern startedFromPositionFile; /* [HGM] loadPos */ /* types */ @@ -773,7 +774,10 @@ VariantWhichRadio(HWND hDlg) (IsDlgButtonChecked(hDlg, OPT_VariantSuicide) ? VariantSuicide : (IsDlgButtonChecked(hDlg, OPT_VariantAtomic) ? VariantAtomic : (IsDlgButtonChecked(hDlg, OPT_VariantShatranj) ? VariantShatranj : - VariantNormal ))))))))))))))); + (IsDlgButtonChecked(hDlg, OPT_VariantFRC) ? VariantFischeRandom : + (IsDlgButtonChecked(hDlg, OPT_VariantCylinder) ? VariantCylinder : + (IsDlgButtonChecked(hDlg, OPT_VariantFalcon) ? VariantFalcon : + VariantNormal )))))))))))))))))); } LRESULT CALLBACK @@ -836,6 +840,9 @@ NewVariantDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case VariantShatranj: CheckDlgButton(hDlg, OPT_VariantShatranj, TRUE); break; + case VariantFischeRandom: + CheckDlgButton(hDlg, OPT_VariantFRC, TRUE); + break; } SetDlgItemInt( hDlg, IDC_Files, -1, TRUE ); @@ -874,6 +881,8 @@ NewVariantDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) if(!n2_ok) appData.NrRanks = -1; if(!n3_ok) appData.holdingsSize = -1; + startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */ + appData.pieceToCharTable = NULL; Reset(TRUE, TRUE); return TRUE; diff --git a/winboard/wplugin.c b/winboard/wplugin.c index 6213680..c6507d3 100644 --- a/winboard/wplugin.c +++ b/winboard/wplugin.c @@ -1,225 +1,225 @@ -#include "wplugin.h" - -static char * makePluginExeName( const char * name ) -{ - char buf[ MAX_PATH ]; - - strcpy( buf, "" ); - - strcat( buf, "plugins\\" ); - strcat( buf, name ); - strcat( buf, ".exe" ); - - return strdup( buf ); -} - -WbPlugin * wbpCreate( const char * name ) -{ - char buf[MAX_PATH]; - int result = 0; - - // Create the plugin - WbPlugin * plugin = (WbPlugin *) malloc( sizeof(WbPlugin) ); - - memset( plugin, 0, sizeof(WbPlugin) ); - - plugin->name_ = strdup( name ); - plugin->exe_name_ = makePluginExeName( name ); - plugin->hPipe_ = INVALID_HANDLE_VALUE; - plugin->hProcess_ = INVALID_HANDLE_VALUE; - - // Create the named pipe for plugin communication - if( result == 0 ) { - strcpy( buf, "\\\\.\\pipe\\" ); - strcat( buf, name ); - - plugin->hPipe_ = CreateNamedPipe( buf, - PIPE_ACCESS_DUPLEX, - 0, // Byte mode - 2, // Max instances - 4*1024, - 4*1024, - 1000, // Default timeout - NULL ); - - if( plugin->hPipe_ == INVALID_HANDLE_VALUE ) { - DWORD err = GetLastError(); - result = -1; - } - } - - // Create the plugin process - if( result == 0 ) { - STARTUPINFO si; - PROCESS_INFORMATION pi; - - ZeroMemory( &si, sizeof(si) ); - ZeroMemory( &pi, sizeof(pi) ); - - si.cb = sizeof(si); - - strcpy( buf, "\"" ); - strcat( buf, plugin->exe_name_ ); - strcat( buf, "\"" ); - - strcpy( buf, "\"C:\\Program Files\\Borland\\Delphi5\\Projects\\History\\History.exe\"" ); - - if( CreateProcess( NULL, - buf, - NULL, - NULL, - FALSE, // Inherit handles - 0, // Creation flags - NULL, // Environment - NULL, // Current directory - &si, - &pi ) ) - { - CloseHandle( pi.hThread ); - plugin->hProcess_ = pi.hProcess; - } - else { - result = -2; - } - } - - // Destroy the plugin instance if something went wrong - if( result != 0 ) { - wbpDelete( plugin ); - plugin = 0; - } - - return plugin; -} - -void wbpDelete( WbPlugin * plugin ) -{ - if( plugin != 0 ) { - if( plugin->hPipe_ != INVALID_HANDLE_VALUE ) { - CloseHandle( plugin->hPipe_ ); - } - - if( plugin->hProcess_ != INVALID_HANDLE_VALUE ) { - CloseHandle( plugin->hProcess_ ); - } - - free( plugin->name_ ); - - free( plugin->exe_name_ ); - - plugin->name_ = 0; - plugin->exe_name_ = 0; - plugin->hPipe_ = INVALID_HANDLE_VALUE; - plugin->hProcess_ = INVALID_HANDLE_VALUE; - - free( plugin ); - } -} - -int wbpSendMessage( WbPlugin * plugin, const char * msg, size_t msg_len ) -{ - int result = -1; - - if( plugin != 0 && plugin->hPipe_ != INVALID_HANDLE_VALUE ) { - DWORD zf = 0; - BOOL ok = TRUE; - - while( ok && (msg_len > 0) ) { - DWORD cb = 0; - - ok = WriteFile( plugin->hPipe_, - msg, - msg_len, - &cb, - NULL ); - - if( ok ) { - if( cb > msg_len ) break; // Should *never* happen! - - msg_len -= cb; - msg += cb; - } - - if( cb == 0 ) { - zf++; - if( zf >= 3 ) ok = FALSE; - } - else { - zf = 0; - } - } - - if( ok ) { - result = 0; - } - } - - return result; -} - -int wbpListInit( WbPluginList * list ) -{ - list->item_count_ = 0; - - return 0; -} - -int wbpListAdd( WbPluginList * list, WbPlugin * plugin ) -{ - int result = -1; - - if( plugin != 0 ) { - if( list->item_count_ < MaxWbPlugins ) { - list->item_[ list->item_count_ ] = plugin; - list->item_count_++; - - result = 0; - } - } - - return result; -} - -WbPlugin * wbpListGet( WbPluginList * list, int index ) -{ - WbPlugin * result = 0; - - if( index >= 0 && index < list->item_count_ ) { - result = list->item_[ index ]; - } - - return result; -} - -int wbpListGetCount( WbPluginList * list ) -{ - return list->item_count_; -} - -int wbpListDeleteAll( WbPluginList * list ) -{ - int i; - - for( i=0; iitem_count_; i++ ) { - wbpDelete( list->item_[i] ); - } - - return wbpListInit( list ); -} - -int wbpListBroadcastMessage( WbPluginList * list, const char * msg, size_t msg_len ) -{ - int result = 0; - int i; - - for( i=0; iitem_count_; i++ ) { - if( wbpSendMessage( list->item_[i], msg, msg_len ) == 0 ) { - result++; - } - else { - // Error sending message to plugin... - } - } - - return result; -} +#include "wplugin.h" + +static char * makePluginExeName( const char * name ) +{ + char buf[ MAX_PATH ]; + + strcpy( buf, "" ); + + strcat( buf, "plugins\\" ); + strcat( buf, name ); + strcat( buf, ".exe" ); + + return strdup( buf ); +} + +WbPlugin * wbpCreate( const char * name ) +{ + char buf[MAX_PATH]; + int result = 0; + + // Create the plugin + WbPlugin * plugin = (WbPlugin *) malloc( sizeof(WbPlugin) ); + + memset( plugin, 0, sizeof(WbPlugin) ); + + plugin->name_ = strdup( name ); + plugin->exe_name_ = makePluginExeName( name ); + plugin->hPipe_ = INVALID_HANDLE_VALUE; + plugin->hProcess_ = INVALID_HANDLE_VALUE; + + // Create the named pipe for plugin communication + if( result == 0 ) { + strcpy( buf, "\\\\.\\pipe\\" ); + strcat( buf, name ); + + plugin->hPipe_ = CreateNamedPipe( buf, + PIPE_ACCESS_DUPLEX, + 0, // Byte mode + 2, // Max instances + 4*1024, + 4*1024, + 1000, // Default timeout + NULL ); + + if( plugin->hPipe_ == INVALID_HANDLE_VALUE ) { + DWORD err = GetLastError(); + result = -1; + } + } + + // Create the plugin process + if( result == 0 ) { + STARTUPINFO si; + PROCESS_INFORMATION pi; + + ZeroMemory( &si, sizeof(si) ); + ZeroMemory( &pi, sizeof(pi) ); + + si.cb = sizeof(si); + + strcpy( buf, "\"" ); + strcat( buf, plugin->exe_name_ ); + strcat( buf, "\"" ); + + strcpy( buf, "\"C:\\Program Files\\Borland\\Delphi5\\Projects\\History\\History.exe\"" ); + + if( CreateProcess( NULL, + buf, + NULL, + NULL, + FALSE, // Inherit handles + 0, // Creation flags + NULL, // Environment + NULL, // Current directory + &si, + &pi ) ) + { + CloseHandle( pi.hThread ); + plugin->hProcess_ = pi.hProcess; + } + else { + result = -2; + } + } + + // Destroy the plugin instance if something went wrong + if( result != 0 ) { + wbpDelete( plugin ); + plugin = 0; + } + + return plugin; +} + +void wbpDelete( WbPlugin * plugin ) +{ + if( plugin != 0 ) { + if( plugin->hPipe_ != INVALID_HANDLE_VALUE ) { + CloseHandle( plugin->hPipe_ ); + } + + if( plugin->hProcess_ != INVALID_HANDLE_VALUE ) { + CloseHandle( plugin->hProcess_ ); + } + + free( plugin->name_ ); + + free( plugin->exe_name_ ); + + plugin->name_ = 0; + plugin->exe_name_ = 0; + plugin->hPipe_ = INVALID_HANDLE_VALUE; + plugin->hProcess_ = INVALID_HANDLE_VALUE; + + free( plugin ); + } +} + +int wbpSendMessage( WbPlugin * plugin, const char * msg, size_t msg_len ) +{ + int result = -1; + + if( plugin != 0 && plugin->hPipe_ != INVALID_HANDLE_VALUE ) { + DWORD zf = 0; + BOOL ok = TRUE; + + while( ok && (msg_len > 0) ) { + DWORD cb = 0; + + ok = WriteFile( plugin->hPipe_, + msg, + msg_len, + &cb, + NULL ); + + if( ok ) { + if( cb > msg_len ) break; // Should *never* happen! + + msg_len -= cb; + msg += cb; + } + + if( cb == 0 ) { + zf++; + if( zf >= 3 ) ok = FALSE; + } + else { + zf = 0; + } + } + + if( ok ) { + result = 0; + } + } + + return result; +} + +int wbpListInit( WbPluginList * list ) +{ + list->item_count_ = 0; + + return 0; +} + +int wbpListAdd( WbPluginList * list, WbPlugin * plugin ) +{ + int result = -1; + + if( plugin != 0 ) { + if( list->item_count_ < MaxWbPlugins ) { + list->item_[ list->item_count_ ] = plugin; + list->item_count_++; + + result = 0; + } + } + + return result; +} + +WbPlugin * wbpListGet( WbPluginList * list, int index ) +{ + WbPlugin * result = 0; + + if( index >= 0 && index < list->item_count_ ) { + result = list->item_[ index ]; + } + + return result; +} + +int wbpListGetCount( WbPluginList * list ) +{ + return list->item_count_; +} + +int wbpListDeleteAll( WbPluginList * list ) +{ + int i; + + for( i=0; iitem_count_; i++ ) { + wbpDelete( list->item_[i] ); + } + + return wbpListInit( list ); +} + +int wbpListBroadcastMessage( WbPluginList * list, const char * msg, size_t msg_len ) +{ + int result = 0; + int i; + + for( i=0; iitem_count_; i++ ) { + if( wbpSendMessage( list->item_[i], msg, msg_len ) == 0 ) { + result++; + } + else { + // Error sending message to plugin... + } + } + + return result; +} diff --git a/winboard/wplugin.h b/winboard/wplugin.h index 100ae1c..3b1830b 100644 --- a/winboard/wplugin.h +++ b/winboard/wplugin.h @@ -1,40 +1,40 @@ -#ifndef WPLUGIN_H_ -#define WPLUGIN_H_ - -#include - -#define MaxWbPlugins 16 - -typedef struct WbPlugin_tag -{ - char * name_; - char * exe_name_; - HANDLE hPipe_; - HANDLE hProcess_; -} WbPlugin; - -typedef struct WbPluginList_tag -{ - int item_count_; - WbPlugin * item_[MaxWbPlugins]; -} WbPluginList; - -WbPlugin * wbpCreate( const char * name ); - -void wbpDelete( WbPlugin * plugin ); - -int wbpSendMessage( WbPlugin * plugin, const char * msg, size_t msg_len ); - -int wbpListInit( WbPluginList * list ); - -int wbpListAdd( WbPluginList * list, WbPlugin * plugin ); - -WbPlugin * wbpListGet( WbPluginList * list, int index ); - -int wbpListGetCount( WbPluginList * list ); - -int wbpListDeleteAll( WbPluginList * list ); - -int wbpListBroadcastMessage( WbPluginList * list, const char * msg, size_t msg_len ); - -#endif // WPLUGIN_H_ +#ifndef WPLUGIN_H_ +#define WPLUGIN_H_ + +#include + +#define MaxWbPlugins 16 + +typedef struct WbPlugin_tag +{ + char * name_; + char * exe_name_; + HANDLE hPipe_; + HANDLE hProcess_; +} WbPlugin; + +typedef struct WbPluginList_tag +{ + int item_count_; + WbPlugin * item_[MaxWbPlugins]; +} WbPluginList; + +WbPlugin * wbpCreate( const char * name ); + +void wbpDelete( WbPlugin * plugin ); + +int wbpSendMessage( WbPlugin * plugin, const char * msg, size_t msg_len ); + +int wbpListInit( WbPluginList * list ); + +int wbpListAdd( WbPluginList * list, WbPlugin * plugin ); + +WbPlugin * wbpListGet( WbPluginList * list, int index ); + +int wbpListGetCount( WbPluginList * list ); + +int wbpListDeleteAll( WbPluginList * list ); + +int wbpListBroadcastMessage( WbPluginList * list, const char * msg, size_t msg_len ); + +#endif // WPLUGIN_H_ diff --git a/winboard/wsnap.c b/winboard/wsnap.c index e6f6151..6d84304 100644 --- a/winboard/wsnap.c +++ b/winboard/wsnap.c @@ -1,204 +1,204 @@ -/* - * Smart "snapping" for window moving and sizing - * - * Author: Alessandro Scotti (Dec 2005) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#include "wsnap.h" - -/* Imports from winboard.c */ -extern HINSTANCE hInst; - -extern HWND hwndMain; -extern HWND moveHistoryDialog; -extern HWND evalGraphDialog; -extern HWND engineOutputDialog; -extern HWND gameListDialog; - -static BOOL SnappingEnabled = TRUE; - -static void AddSnapPoint( int * grid, int * grid_len, int value ) -{ - int len = *grid_len; - - if( len < MAX_SNAP_POINTS ) { - int i; - - for( i=0; ix_grid, &sd->x_grid_len, rc->left ); - AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->right ); - - AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->top ); - AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->bottom ); -} - -static void AddSnapWindow( HWND hWndCaller, SnapData * sd, HWND hWndSnapWindow ) -{ - if( hWndSnapWindow != NULL && hWndCaller != hWndSnapWindow && IsWindowVisible(hWndSnapWindow) ) { - RECT rc; - - GetWindowRect( hWndSnapWindow, &rc ); - - AddSnapRectangle( sd, &rc ); - } -} - -static BOOL AdjustToSnapPoint( int * grid, int grid_len, int value, int * snap_size, int * delta ) -{ - BOOL result = FALSE; - int i; - - for( i=0; ix_grid_len = 0; - snapData->y_grid_len = 0; - - /* Add desktop area */ - if( SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 ) ) { - AddSnapRectangle( snapData, &rc ); - } - - if( hWnd != hwndMain ) { - /* Add other windows */ - AddSnapWindow( hWnd, snapData, hwndMain ); - AddSnapWindow( hWnd, snapData, moveHistoryDialog ); - AddSnapWindow( hWnd, snapData, evalGraphDialog ); - AddSnapWindow( hWnd, snapData, engineOutputDialog ); - AddSnapWindow( hWnd, snapData, gameListDialog ); - } - - return 0; -} - -LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) -{ - LPRECT lprc = (LPRECT) lParam; - int delta_x = 0; - int delta_y = 0; - int snap_size_x = SNAP_DISTANCE; - int snap_size_y = SNAP_DISTANCE; - - if( ! SnappingEnabled ) { - return FALSE; - } - - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); - - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); - - OffsetRect( lprc, delta_x, delta_y ); - - return TRUE; -} - -LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) -{ - LPRECT lprc = (LPRECT) lParam; - int delta_x = 0; - int delta_y = 0; - int snap_size_x = SNAP_DISTANCE; - int snap_size_y = SNAP_DISTANCE; - - if( ! SnappingEnabled ) { - return FALSE; - } - - switch( wParam ) { - case WMSZ_BOTTOM: - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); - lprc->bottom += delta_y; - break; - case WMSZ_BOTTOMLEFT: - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); - lprc->bottom += delta_y; - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); - lprc->left += delta_x; - break; - case WMSZ_BOTTOMRIGHT: - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); - lprc->bottom += delta_y; - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); - lprc->right += delta_x; - break; - case WMSZ_LEFT: - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); - lprc->left += delta_x; - break; - case WMSZ_RIGHT: - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); - lprc->right += delta_x; - break; - case WMSZ_TOP: - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); - lprc->top += delta_y; - break; - case WMSZ_TOPLEFT: - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); - lprc->top += delta_y; - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); - lprc->left += delta_x; - break; - case WMSZ_TOPRIGHT: - AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); - lprc->top += delta_y; - AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); - lprc->right += delta_x; - break; - default: - return FALSE; - } - - return TRUE; -} - -LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) -{ - return 0; -} +/* + * Smart "snapping" for window moving and sizing + * + * Author: Alessandro Scotti (Dec 2005) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#include "wsnap.h" + +/* Imports from winboard.c */ +extern HINSTANCE hInst; + +extern HWND hwndMain; +extern HWND moveHistoryDialog; +extern HWND evalGraphDialog; +extern HWND engineOutputDialog; +extern HWND gameListDialog; + +static BOOL SnappingEnabled = TRUE; + +static void AddSnapPoint( int * grid, int * grid_len, int value ) +{ + int len = *grid_len; + + if( len < MAX_SNAP_POINTS ) { + int i; + + for( i=0; ix_grid, &sd->x_grid_len, rc->left ); + AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->right ); + + AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->top ); + AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->bottom ); +} + +static void AddSnapWindow( HWND hWndCaller, SnapData * sd, HWND hWndSnapWindow ) +{ + if( hWndSnapWindow != NULL && hWndCaller != hWndSnapWindow && IsWindowVisible(hWndSnapWindow) ) { + RECT rc; + + GetWindowRect( hWndSnapWindow, &rc ); + + AddSnapRectangle( sd, &rc ); + } +} + +static BOOL AdjustToSnapPoint( int * grid, int grid_len, int value, int * snap_size, int * delta ) +{ + BOOL result = FALSE; + int i; + + for( i=0; ix_grid_len = 0; + snapData->y_grid_len = 0; + + /* Add desktop area */ + if( SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 ) ) { + AddSnapRectangle( snapData, &rc ); + } + + if( hWnd != hwndMain ) { + /* Add other windows */ + AddSnapWindow( hWnd, snapData, hwndMain ); + AddSnapWindow( hWnd, snapData, moveHistoryDialog ); + AddSnapWindow( hWnd, snapData, evalGraphDialog ); + AddSnapWindow( hWnd, snapData, engineOutputDialog ); + AddSnapWindow( hWnd, snapData, gameListDialog ); + } + + return 0; +} + +LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) +{ + LPRECT lprc = (LPRECT) lParam; + int delta_x = 0; + int delta_y = 0; + int snap_size_x = SNAP_DISTANCE; + int snap_size_y = SNAP_DISTANCE; + + if( ! SnappingEnabled ) { + return FALSE; + } + + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); + + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); + + OffsetRect( lprc, delta_x, delta_y ); + + return TRUE; +} + +LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) +{ + LPRECT lprc = (LPRECT) lParam; + int delta_x = 0; + int delta_y = 0; + int snap_size_x = SNAP_DISTANCE; + int snap_size_y = SNAP_DISTANCE; + + if( ! SnappingEnabled ) { + return FALSE; + } + + switch( wParam ) { + case WMSZ_BOTTOM: + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); + lprc->bottom += delta_y; + break; + case WMSZ_BOTTOMLEFT: + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); + lprc->bottom += delta_y; + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); + lprc->left += delta_x; + break; + case WMSZ_BOTTOMRIGHT: + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); + lprc->bottom += delta_y; + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); + lprc->right += delta_x; + break; + case WMSZ_LEFT: + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); + lprc->left += delta_x; + break; + case WMSZ_RIGHT: + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); + lprc->right += delta_x; + break; + case WMSZ_TOP: + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); + lprc->top += delta_y; + break; + case WMSZ_TOPLEFT: + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); + lprc->top += delta_y; + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); + lprc->left += delta_x; + break; + case WMSZ_TOPRIGHT: + AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); + lprc->top += delta_y; + AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); + lprc->right += delta_x; + break; + default: + return FALSE; + } + + return TRUE; +} + +LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) +{ + return 0; +} diff --git a/winboard/wsnap.h b/winboard/wsnap.h index 818144a..7cc428d 100644 --- a/winboard/wsnap.h +++ b/winboard/wsnap.h @@ -1,43 +1,43 @@ -/* - * Smart "snapping" for window moving and sizing - * - * Author: Alessandro Scotti (Dec 2005) - * - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * ------------------------------------------------------------------------ - */ -#ifndef WSNAP_H_ -#define WSNAP_H_ - -#include - -#define MAX_SNAP_POINTS 12 - -#define SNAP_DISTANCE 4 - -typedef struct { - int x_grid[ MAX_SNAP_POINTS ]; - int x_grid_len; - int y_grid[ MAX_SNAP_POINTS ]; - int y_grid_len; -} SnapData; - -LRESULT OnEnterSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); -LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); -LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); -LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); - -#endif // WSNAP_H_ +/* + * Smart "snapping" for window moving and sizing + * + * Author: Alessandro Scotti (Dec 2005) + * + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * ------------------------------------------------------------------------ + */ +#ifndef WSNAP_H_ +#define WSNAP_H_ + +#include + +#define MAX_SNAP_POINTS 12 + +#define SNAP_DISTANCE 4 + +typedef struct { + int x_grid[ MAX_SNAP_POINTS ]; + int x_grid_len; + int y_grid[ MAX_SNAP_POINTS ]; + int y_grid_len; +} SnapData; + +LRESULT OnEnterSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); +LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); +LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); +LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); + +#endif // WSNAP_H_ diff --git a/zippy.c b/zippy.c index aed634e..c788318 100644 --- a/zippy.c +++ b/zippy.c @@ -1,1111 +1,1114 @@ -/* - * zippy.c -- Implements Zippy the Pinhead chess player on ICS in XBoard - * $Id: zippy.c,v 2.2 2003/11/25 05:25:20 mann Exp $ - * - * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. - * Enhancements Copyright 1992-2001 Free Software Foundation, Inc. - * - * The following terms apply to Digital Equipment Corporation's copyright - * interest in XBoard: - * ------------------------------------------------------------------------ - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of Digital not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING - * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL - * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR - * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * ------------------------------------------------------------------------ - * - * The following terms apply to the enhanced version of XBoard distributed - * by the Free Software Foundation: - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * ------------------------------------------------------------------------ - */ - -#include "config.h" - -#include -#include -#include -#include -#include - -#if STDC_HEADERS -# include -# include -#else /* not STDC_HEADERS */ -extern char *getenv(); -# if HAVE_STRING_H -# include -# else /* not HAVE_STRING_H */ -# include -# endif /* not HAVE_STRING_H */ -#endif /* not STDC_HEADERS */ - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif -#define HI "hlelo " - -#if HAVE_UNISTD_H -# include -#endif - -#include "common.h" -#include "zippy.h" -#include "frontend.h" -#include "backend.h" -#include "backendz.h" - -static char zippyPartner[MSG_SIZ]; -static char zippyLastOpp[MSG_SIZ]; -static int zippyConsecGames; -static time_t zippyLastGameEnd; - -void ZippyInit() -{ - char *p; - - /* Get name of Zippy lines file */ - p = getenv("ZIPPYLINES"); - if (p != NULL) { - appData.zippyLines = p; - } - - /* Get word that Zippy thinks is insulting */ - p = getenv("ZIPPYPINHEAD"); - if (p != NULL) { - appData.zippyPinhead = p; - } - - /* What password is used for remote control? */ - p = getenv("ZIPPYPASSWORD"); - if (p != NULL) { - appData.zippyPassword = p; - } - - /* What password is used for remote commands to gnuchess? */ - p = getenv("ZIPPYPASSWORD2"); - if (p != NULL) { - appData.zippyPassword2 = p; - } - - /* Joke feature for people who try an old password */ - p = getenv("ZIPPYWRONGPASSWORD"); - if (p != NULL) { - appData.zippyWrongPassword = p; - } - - /* While testing, I want to accept challenges from only one person - (namely, my "anonymous" account), so I set an environment - variable ZIPPYACCEPTONLY. */ - p = getenv("ZIPPYACCEPTONLY"); - if ( p != NULL ) { - appData.zippyAcceptOnly = p; - } - - /* Should Zippy use "i" command? */ - /* Defaults to 1=true */ - p = getenv("ZIPPYUSEI"); - if (p != NULL) { - appData.zippyUseI = atoi(p); - } - - /* How does Zippy handle bughouse partnering? */ - /* 0=say we can't play, 1=manual partnering, 2=auto partnering */ - p = getenv("ZIPPYBUGHOUSE"); - if (p != NULL) { - appData.zippyBughouse = atoi(p); - } - - /* Does Zippy abort games with Crafty? */ - /* Defaults to 0=false */ - p = getenv("ZIPPYNOPLAYCRAFTY"); - if (p != NULL) { - appData.zippyNoplayCrafty = atoi(p); - } - - /* What ICS command does Zippy send at game end? Default: "gameend". */ - p = getenv("ZIPPYGAMEEND"); - if (p != NULL) { - appData.zippyGameEnd = p; - } - - /* What ICS command does Zippy send at game start? Default: none. */ - p = getenv("ZIPPYGAMESTART"); - if (p != NULL) { - appData.zippyGameStart = p; - } - - /* Should Zippy accept adjourns? */ - /* Defaults to 0=false */ - p = getenv("ZIPPYADJOURN"); - if (p != NULL) { - appData.zippyAdjourn = atoi(p); - } - - /* Should Zippy accept aborts? */ - /* Defaults to 0=false */ - p = getenv("ZIPPYABORT"); - if (p != NULL) { - appData.zippyAbort = atoi(p); - } - - /* Should Zippy play chess variants (besides bughouse)? */ - p = getenv("ZIPPYVARIANTS"); - if (p != NULL) { - appData.zippyVariants = p; - } - strcpy(first.variants, appData.zippyVariants); - - srandom(time(NULL)); -} - -/* - * Routines to implement Zippy talking - */ - - -char *swifties[] = { - "i acclaims:", "i admonishes:", "i advertises:", "i advises:", - "i advocates:", "i affirms:", "i alleges:", "i anathematizes:", - "i animadverts:", "i announces:", "i apostrophizes:", - "i appeals:", "i applauds:", "i approves:", "i argues:", - "i articulates:", "i asserts:", "i asseverates:", "i attests:", - "i avers:", "i avows:", "i baas:", "i babbles:", "i banters:", - "i barks:", "i bawls:", "i bays:", "i begs:", "i belches:", - "i bellows:", "i belts out:", "i berates:", "i beshrews:", - "i blabbers:", "i blabs:", "i blares:", "i blasphemes:", - "i blasts:", "i blathers:", "i bleats:", "i blithers:", - "i blubbers:", "i blurts out:", "i blusters:", "i boasts:", - "i brags:", "i brays:", "i broadcasts:", "i burbles:", - "i buzzes:", "i cachinnates:", "i cackles:", "i caterwauls:", - "i calumniates:", "i caws:", "i censures:", "i chants:", - "i chatters:", "i cheeps:", "i cheers:", "i chides:", "i chins:", - "i chirps:", "i chortles:", "i chuckles:", "i claims:", - "i clamors:", "i clucks:", "i commands:", "i commends:", - "i comments:", "i commiserates:", "i communicates:", - "i complains:", "i concludes:", "i confabulates:", "i confesses:", - "i coos:", "i coughs:", "i counsels:", "i cries:", "i croaks:", - "i crows:", "i curses:", "i daydreams:", "i debates:", - "i declaims:", "i declares:", "i delivers:", "i denounces:", - "i deposes:", "i directs:", "i discloses:", "i disparages:", - "i discourses:", "i divulges:", "i documents:", "i drawls:", - "i dreams:", "i drivels:", "i drones:", "i effuses:", - /*"i ejaculates:",*/ "i elucidates:", "i emotes:", "i endorses:", - "i enthuses:", "i entreats:", "i enunciates:", "i eulogizes:", - "i exclaims:", "i execrates:", "i exhorts:", "i expatiates:", - "i explains:", "i explicates:", "i explodes:", "i exposes:", - "i exposits:", "i expounds:", "i expresses:", "i extols:", - "i exults:", "i fantasizes:", "i fibs:", "i filibusters:", - "i flatters:", "i flutes:", "i fools:", "i free-associates:", - "i fulminates:", "i gabbles:", "i gabs:", "i gasps:", - "i giggles:", "i gossips:", "i gripes:", "i groans:", "i growls:", - "i grunts:", "i guesses:", "i guffaws:", "i gushes:", "i hails:", - "i hallucinates:", "i harangues:", "i harmonizes:", "i hectors:", - "i hints:", "i hisses:", "i hollers:", "i honks:", "i hoots:", - "i hosannas:", "i howls:", "i hums:", "i hypothecates:", - "i hypothesizes:", "i imagines:", "i implies:", "i implores:", - "i imprecates:", "i indicates:", "i infers:", - "i informs everyone:", "i instructs:", "i interjects:", - "i interposes:", "i intimates:", "i intones:", "i introspects:", - "i inveighs:", "i jabbers:", "i japes:", "i jests:", "i jibes:", - "i jives:", "i jokes:", "i joshes:", "i keens:", "i laments:", - "i lauds:", "i laughs:", "i lectures:", "i lies:", "i lilts:", - "i lisps:", "i maintains:", "i maledicts:", "i maunders:", - "i meows:", "i mewls:", "i mimes:", "i minces:", "i moans:", - "i moos:", "i mourns:", "i mouths:", "i mumbles:", "i murmurs:", - "i muses:", "i mutters:", "i nags:", "i natters:", "i neighs:", - "i notes:", "i nuncupates:", "i objurgates:", "i observes:", - "i offers:", "i oinks:", "i opines:", "i orates:", "i orders:", - "i panegyrizes:", "i pantomimes:", "i pants:", "i peals:", - "i peeps:", "i perorates:", "i persuades:", "i petitions:", - "i phonates:", "i pipes up:", "i pitches:", "i pleads:", - "i points out:", "i pontificates:", "i postulates:", "i praises:", - "i prates:", "i prattles:", "i preaches:", "i prescribes:", - "i prevaricates:", "i proclaims:", "i projects:", "i pronounces:", - "i proposes:", "i proscribes:", "i quacks:", "i queries:", - "i questions:", "i quips:", "i quotes:", "i rages:", "i rambles:", - "i rants:", "i raps:", "i rasps:", "i rattles:", "i raves:", - "i reacts:", "i recites:", "i recommends:", "i records:", - "i reiterates:", "i rejoins:", "i releases:", "i remarks:", - "i reminisces:", "i remonstrates:", "i repeats:", "i replies:", - "i reports:", "i reprimands:", "i reproaches:", "i reproves:", - "i resounds:", "i responds:", "i retorts:", "i reveals:", - "i reviles:", "i roars:", "i rumbles:", "i sanctions:", - "i satirizes:", "i sauces:", "i scolds:", "i screams:", - "i screeches:", "i semaphores:", "i sends:", "i sermonizes:", - "i shrieks:", "i sibilates:", "i sighs:", "i signals:", - "i signifies:", "i signs:", "i sings:", "i slurs:", "i snaps:", - "i snarls:", "i sneezes:", "i snickers:", "i sniggers:", - "i snivels:", "i snores:", "i snorts:", "i sobs:", - "i soliloquizes:", "i sounds off:", "i sounds out:", "i speaks:", - "i spews:", "i spits out:", "i splutters:", "i spoofs:", - "i spouts:", "i sputters:", "i squalls:", "i squawks:", - "i squeaks:", "i squeals:", "i stammers:", "i states:", - "i stresses:", "i stutters:", "i submits:", "i suggests:", - "i summarizes:", "i sums up:", "i swears:", "i talks:", - "i tattles:", "i teases:", "i telegraphs:", "i testifies:", - "i threatens:", "i thunders:", "i titters:", "i tongue-lashes:", - "i toots:", "i transcribes:", "i transmits:", "i trills:", - "i trumpets:", "i twaddles:", "i tweets:", "i twitters:", - "i types:", "i upbraids:", "i urges:", "i utters:", "i ventures:", - "i vibrates:", "i vilifies:", "i vituperates:", "i vocalizes:", - "i vociferates:", "i voices:", "i waffles:", "i wails:", - "i warbles:", "i warns:", "i weeps:", "i wheezes:", "i whimpers:", - "i whines:", "i whinnies:", "i whistles:", "i wisecracks:", - "i witnesses:", "i woofs:", "i writes:", "i yammers:", "i yawps:", - "i yells:", "i yelps:", "i yodels:", "i yowls:", "i zings:", -}; - -#define MAX_SPEECH 250 - -void Speak(how, whom) - char *how, *whom; -{ - static FILE *zipfile = NULL; - static struct stat zipstat; - char zipbuf[MAX_SPEECH + 1]; - static time_t lastShout = 0; - time_t now; - char *p; - int c, speechlen; - Boolean done; - - if (strcmp(how, "shout") == 0) { - now = time((time_t *) NULL); - if (now - lastShout < 1*60) return; - lastShout = now; - if (appData.zippyUseI) { - how = swifties[(unsigned) random() % - (sizeof(swifties)/sizeof(char *))]; - } - } - - if (zipfile == NULL) { - zipfile = fopen(appData.zippyLines, "r"); - if (zipfile == NULL) { - DisplayFatalError("Can't open Zippy lines file", errno, 1); - return; - } - fstat(fileno(zipfile), &zipstat); - } - - for (;;) { - fseek(zipfile, (unsigned) random() % zipstat.st_size, 0); - do { - c = getc(zipfile); - } while (c != NULLCHAR && c != '^' && c != EOF); - if (c == EOF) continue; - while ((c = getc(zipfile)) == '\n') ; - if (c == EOF) continue; - break; - } - done = FALSE; - - /* Don't use ics_prefix; we need to let FICS expand the alias i -> it, - but use the real command "i" on ICC */ - strcpy(zipbuf, how); - strcat(zipbuf, " "); - if (whom != NULL) { - strcat(zipbuf, whom); - strcat(zipbuf, " "); - } - speechlen = strlen(zipbuf); - p = zipbuf + speechlen; - - while (++speechlen < MAX_SPEECH) { - if (c == NULLCHAR || c == '^') { - *p++ = '\n'; - *p = '\0'; - SendToICS(zipbuf); - return; - } else if (c == '\n') { - *p++ = ' '; - do { - c = getc(zipfile); - } while (c == ' '); - } else if (c == EOF) { - break; - } else { - *p++ = c; - c = getc(zipfile); - } - } - /* Tried to say something too long, or junk at the end of the - file. Try something else. */ - Speak(how, whom); /* tail recursion */ -} - -int ZippyCalled(str) - char *str; -{ - return ics_handle[0] != NULLCHAR && StrCaseStr(str, ics_handle) != NULL; -} - -static char opp_name[128][32]; -static int num_opps=0; - -extern ColorClass curColor; - -static void SetCurColor( ColorClass color ) -{ - curColor = color; -} - -static void ColorizeEx( ColorClass color, int cont ) -{ - if( appData.colorize ) { - Colorize( color, cont ); - SetCurColor( color ); - } -} - -int ZippyControl(buf, i) - char *buf; - int *i; -{ - char *player, *p; - char reply[MSG_SIZ]; - -#if TRIVIA -#include "trivia.c" -#endif - - /* Possibly reject Crafty as opponent */ - if (appData.zippyPlay && appData.zippyNoplayCrafty && forwardMostMove < 4 - && looking_at(buf, i, "* kibitzes: Hello from Crafty")) - { - player = StripHighlightAndTitle(star_match[0]); - if ((gameMode == IcsPlayingWhite && - StrCaseCmp(player, gameInfo.black) == 0) || - (gameMode == IcsPlayingBlack && - StrCaseCmp(player, gameInfo.white) == 0)) { - - sprintf(reply, "%ssay This computer does not play Crafty clones\n%sabort\n%s+noplay %s\n", - ics_prefix, ics_prefix, ics_prefix, player); - SendToICS(reply); - } - return TRUE; - } - - /* If this is a computer, save the name. Then later, once the */ - /* game is really started, we will send the "computer" notice to */ - /* the engine. */ - if (appData.zippyPlay && - looking_at(buf, i, "* is in the computer list")) { - int i; - for (i=0;i= num_opps) strcpy(opp_name[num_opps++],star_match[0]); - } - if (appData.zippyPlay && looking_at(buf, i, "* * is a computer *")) { - int i; - for (i=0;i= num_opps) strcpy(opp_name[num_opps++],star_match[1]); - } - - /* Tells and says */ - if (appData.zippyPlay && - (looking_at(buf, i, "* offers to be your bughouse partner") || - looking_at(buf, i, "* tells you: [automatic message] I chose you"))) { - player = StripHighlightAndTitle(star_match[0]); - if (appData.zippyBughouse > 1 && first.initDone) { - sprintf(reply, "%spartner %s\n", ics_prefix, player); - SendToICS(reply); - if (strcmp(zippyPartner, player) != 0) { - strcpy(zippyPartner, player); - SendToProgram(reply + strlen(ics_prefix), &first); - } - } else if (appData.zippyBughouse > 0) { - sprintf(reply, "%sdecline %s\n", ics_prefix, player); - SendToICS(reply); - } else { - sprintf(reply, "%stell %s This computer cannot play bughouse\n", - ics_prefix, player); - SendToICS(reply); - } - return TRUE; - } - - if (appData.zippyPlay && appData.zippyBughouse && first.initDone && - looking_at(buf, i, "* agrees to be your partner")) { - player = StripHighlightAndTitle(star_match[0]); - sprintf(reply, "partner %s\n", player); - if (strcmp(zippyPartner, player) != 0) { - strcpy(zippyPartner, player); - SendToProgram(reply, &first); - } - return TRUE; - } - - if (appData.zippyPlay && appData.zippyBughouse && first.initDone && - (looking_at(buf, i, "are no longer *'s partner") || - looking_at(buf, i, - "* tells you: [automatic message] I'm no longer your"))) { - player = StripHighlightAndTitle(star_match[0]); - if (strcmp(zippyPartner, player) == 0) { - zippyPartner[0] = NULLCHAR; - SendToProgram("partner\n", &first); - } - return TRUE; - } - - if (appData.zippyPlay && appData.zippyBughouse && first.initDone && - (looking_at(buf, i, "no longer have a bughouse partner") || - looking_at(buf, i, "partner has disconnected") || - looking_at(buf, i, "partner has just chosen a new partner"))) { - zippyPartner[0] = NULLCHAR; - SendToProgram("partner\n", &first); - return TRUE; - } - - if (appData.zippyPlay && appData.zippyBughouse && first.initDone && - looking_at(buf, i, "* (your partner) tells you: *")) { - /* This pattern works on FICS but not ICC */ - player = StripHighlightAndTitle(star_match[0]); - if (strcmp(zippyPartner, player) != 0) { - strcpy(zippyPartner, player); - sprintf(reply, "partner %s\n", player); - SendToProgram(reply, &first); - } - sprintf(reply, "ptell %s\n", star_match[1]); - SendToProgram(reply, &first); - return TRUE; - } - - if (looking_at(buf, i, "* tells you: *") || - looking_at(buf, i, "* says: *")) - { - player = StripHighlightAndTitle(star_match[0]); - if (appData.zippyPassword[0] != NULLCHAR && - strncmp(star_match[1], appData.zippyPassword, - strlen(appData.zippyPassword)) == 0) { - p = star_match[1] + strlen(appData.zippyPassword); - while (*p == ' ') p++; - SendToICS(p); - SendToICS("\n"); - } else if (appData.zippyPassword2[0] != NULLCHAR && first.initDone && - strncmp(star_match[1], appData.zippyPassword2, - strlen(appData.zippyPassword2)) == 0) { - p = star_match[1] + strlen(appData.zippyPassword2); - while (*p == ' ') p++; - SendToProgram(p, &first); - SendToProgram("\n", &first); - } else if (appData.zippyWrongPassword[0] != NULLCHAR && - strncmp(star_match[1], appData.zippyWrongPassword, - strlen(appData.zippyWrongPassword)) == 0) { - p = star_match[1] + strlen(appData.zippyWrongPassword); - while (*p == ' ') p++; - sprintf(reply, "wrong %s\n", player); - SendToICS(reply); - } else if (appData.zippyBughouse && first.initDone && - strcmp(player, zippyPartner) == 0) { - SendToProgram("ptell ", &first); - SendToProgram(star_match[1], &first); - SendToProgram("\n", &first); - } else if (strncmp(star_match[1], HI, 6) == 0) { - extern char* programVersion; - sprintf(reply, "%stell %s %s\n", - ics_prefix, player, programVersion); - SendToICS(reply); - } else if (strncmp(star_match[1], "W0W!! ", 6) == 0) { - extern char* programVersion; - sprintf(reply, "%stell %s %s\n", ics_prefix, - player, programVersion); - SendToICS(reply); - } else if (appData.zippyTalk && (((unsigned) random() % 10) < 9)) { - if (strcmp(player, ics_handle) != 0) { - Speak("tell", player); - } - } - - ColorizeEx( ColorTell, FALSE ); - - return TRUE; - } - - if( appData.colorize && looking_at(buf, i, "* (*) seeking") ) { - ColorizeEx(ColorSeek, FALSE); - return FALSE; - } - - if (looking_at(buf, i, "* spoofs you:")) { - player = StripHighlightAndTitle(star_match[0]); - sprintf(reply, "spoofedby %s\n", player); - SendToICS(reply); - } - - return FALSE; -} - -int ZippyConverse(buf, i) - char *buf; - int *i; -{ - static char lastgreet[MSG_SIZ]; - char reply[MSG_SIZ]; - int oldi; - - /* Shouts and emotes */ - if (looking_at(buf, i, "--> * *") || - looking_at(buf, i, "* shouts: *")) - { - if (appData.zippyTalk) { - char *player = StripHighlightAndTitle(star_match[0]); - if (strcmp(player, ics_handle) == 0) { - return TRUE; - } else if (appData.zippyPinhead[0] != NULLCHAR && - StrCaseStr(star_match[1], appData.zippyPinhead) != NULL) { - sprintf(reply, "insult %s\n", player); - SendToICS(reply); - } else if (ZippyCalled(star_match[1])) { - Speak("shout", NULL); - } - } - - ColorizeEx(ColorShout, FALSE); - - return TRUE; - } - - if (looking_at(buf, i, "* kibitzes: *")) { - if (appData.zippyTalk && ((unsigned) random() % 10) < 9) { - char *player = StripHighlightAndTitle(star_match[0]); - if (strcmp(player, ics_handle) != 0) { - Speak("kibitz", NULL); - } - } - - ColorizeEx(ColorKibitz, FALSE); - - return TRUE; - } - - if (looking_at(buf, i, "* whispers: *")) { - if (appData.zippyTalk && ((unsigned) random() % 10) < 9) { - char *player = StripHighlightAndTitle(star_match[0]); - if (strcmp(player, ics_handle) != 0) { - Speak("whisper", NULL); - } - } - - ColorizeEx(ColorKibitz, FALSE); - - return TRUE; - } - - /* Messages */ - if ((looking_at(buf, i, ". * (*:*): *") && isdigit(star_match[1][0])) || - looking_at(buf, i, ". * at *:*: *")) { - if (appData.zippyTalk) { - FILE *f; - char *player = StripHighlightAndTitle(star_match[0]); - - if (strcmp(player, ics_handle) != 0) { - if (((unsigned) random() % 10) < 9) - Speak("message", player); - f = fopen("zippy.messagelog", "a"); - fprintf(f, "%s (%s:%s): %s\n", player, - star_match[1], star_match[2], star_match[3]); - fclose(f); - } - } - return TRUE; - } - - /* Channel tells */ - oldi = *i; - if (looking_at(buf, i, "*(*: *")) { - char *player; - char *channel; - if (star_match[0][0] == NULLCHAR || - strchr(star_match[0], ' ') || - strchr(star_match[1], ' ')) { - /* Oops, did not want to match this; probably a message */ - *i = oldi; - return FALSE; - } - if (appData.zippyTalk) { - player = StripHighlightAndTitle(star_match[0]); - channel = strrchr(star_match[1], '('); - if (channel == NULL) { - channel = star_match[1]; - } else { - channel++; - } - channel[strlen(channel)-1] = NULLCHAR; -#if 0 - /* Always tell to the channel (probability 90%) */ - if (strcmp(player, ics_handle) != 0 && - ((unsigned) random() % 10) < 9) { - Speak("tell", channel); - } -#else - /* Tell to the channel only if someone mentions our name */ - if (ZippyCalled(star_match[2])) { - Speak("tell", channel); - } -#endif - - ColorizeEx( atoi(channel) == 1 ? ColorChannel1 : ColorChannel, FALSE ); - } - return TRUE; - } - - if (!appData.zippyTalk) return FALSE; - - if ((looking_at(buf, i, "You have * message") && - atoi(star_match[0]) != 0) || - looking_at(buf, i, "* has left a message for you") || - looking_at(buf, i, "* just sent you a message")) { - sprintf(reply, "%smessages\n%sclearmessages *\n", - ics_prefix, ics_prefix); - SendToICS(reply); - return TRUE; - } - - if (looking_at(buf, i, "Notification: * has arrived")) { - if (((unsigned) random() % 3) == 0) { - char *player = StripHighlightAndTitle(star_match[0]); - strcpy(lastgreet, player); - sprintf(reply, "greet %s\n", player); - SendToICS(reply); - Speak("tell", player); - } - } - - if (looking_at(buf, i, "Notification: * has departed")) { - if (((unsigned) random() % 3) == 0) { - char *player = StripHighlightAndTitle(star_match[0]); - sprintf(reply, "farewell %s\n", player); - SendToICS(reply); - } - } - - if (looking_at(buf, i, "Not sent -- * is censoring you")) { - char *player = StripHighlightAndTitle(star_match[0]); - if (strcmp(player, lastgreet) == 0) { - sprintf(reply, "%s-notify %s\n", ics_prefix, player); - SendToICS(reply); - } - } - - if (looking_at(buf, i, "command is currently turned off")) { - appData.zippyUseI = 0; - } - - return FALSE; -} - -void ZippyGameStart(white, black) - char *white, *black; -{ - if (!first.initDone) { - /* Game is starting prematurely. We can't deal with this */ - SendToICS(ics_prefix); - SendToICS("abort\n"); - SendToICS(ics_prefix); - SendToICS("say Sorry, the chess program is not initialized yet.\n"); - return; - } - - if (appData.zippyGameStart[0] != NULLCHAR) { - SendToICS(appData.zippyGameStart); - SendToICS("\n"); - } -} - -void ZippyGameEnd(result, resultDetails) - ChessMove result; - char *resultDetails; -{ - if (appData.zippyAcceptOnly[0] == NULLCHAR && - appData.zippyGameEnd[0] != NULLCHAR) { - SendToICS(appData.zippyGameEnd); - SendToICS("\n"); - } - zippyLastGameEnd = time(0); -} - -/* - * Routines to implement Zippy playing chess - */ - -void ZippyHandleChallenge(srated, swild, sbase, sincrement, opponent) - char *srated, *swild, *sbase, *sincrement, *opponent; -{ - char buf[MSG_SIZ]; - int base, increment; - char rated; - VariantClass variant; - char *varname; - - rated = srated[0]; - variant = StringToVariant(swild); - varname = VariantName(variant); - base = atoi(sbase); - increment = atoi(sincrement); - - /* If desired, you can insert more code here to decline matches - based on rated, variant, base, and increment, but it is - easier to use the ICS formula feature instead. */ - - if (variant == VariantLoadable) { - sprintf(buf, - "%stell %s This computer can't play wild type %s\n%sdecline %s\n", - ics_prefix, opponent, swild, ics_prefix, opponent); - SendToICS(buf); - return; - } - if (StrStr(appData.zippyVariants, varname) == NULL) { - sprintf(buf, - "%stell %s This computer can't play %s [%s], only %s\n%sdecline %s\n", - ics_prefix, opponent, swild, varname, appData.zippyVariants, - ics_prefix, opponent); - SendToICS(buf); - return; - } - - /* Are we blocking match requests from all but one person? */ - if (appData.zippyAcceptOnly[0] != NULLCHAR && - StrCaseCmp(opponent, appData.zippyAcceptOnly)) { - /* Yes, and this isn't him. Ignore challenge. */ - return; - } - - /* Too many consecutive games with same opponent? If so, make him - wait until someone else has played or a timeout has elapsed. */ - if (appData.zippyMaxGames && - strcmp(opponent, zippyLastOpp) == 0 && - zippyConsecGames >= appData.zippyMaxGames && - difftime(time(0), zippyLastGameEnd) < appData.zippyReplayTimeout) { - sprintf(buf, "%stell %s Sorry, you have just played %d consecutive games against %s. To give others a chance, please wait %d seconds or until someone else has played.\n%sdecline %s\n", - ics_prefix, opponent, zippyConsecGames, ics_handle, - appData.zippyReplayTimeout, ics_prefix, opponent); - SendToICS(buf); - return; - } - - /* Engine not yet initialized or still thinking about last game? */ - if (!first.initDone || first.lastPing != first.lastPong) { - sprintf(buf, "%stell %s I'm not quite ready for a new game yet; try again soon.\n%sdecline %s\n", - ics_prefix, opponent, ics_prefix, opponent); - SendToICS(buf); - return; - } - - sprintf(buf, "%saccept %s\n", ics_prefix, opponent); - SendToICS(buf); - if (appData.zippyTalk) { - Speak("tell", opponent); - } -} - - -/* Accept matches */ -int ZippyMatch(buf, i) - char *buf; - int *i; -{ - if (looking_at(buf, i, "* * match * * requested with * (*)")) { - - ZippyHandleChallenge(star_match[0], star_match[1], - star_match[2], star_match[3], - StripHighlightAndTitle(star_match[4])); - return TRUE; - } - - /* Old FICS 0-increment form */ - if (looking_at(buf, i, "* * match * requested with * (*)")) { - - ZippyHandleChallenge(star_match[0], star_match[1], - star_match[2], "0", - StripHighlightAndTitle(star_match[3])); - return TRUE; - } - - if (looking_at(buf, i, - "* has made an alternate proposal of * * match * *.")) { - - ZippyHandleChallenge(star_match[1], star_match[2], - star_match[3], star_match[4], - StripHighlightAndTitle(star_match[0])); - return TRUE; - } - - /* FICS wild/nonstandard forms */ - if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * Loaded from *")) { - /* note: star_match[2] can include "[white] " or "[black] " - before our own name. */ - ZippyHandleChallenge(star_match[4], star_match[8], - star_match[6], star_match[7], - StripHighlightAndTitle(star_match[0])); - return TRUE; - } - - if (looking_at(buf, i, - "Challenge: * (*) *(*) * * * * : * * Loaded from *")) { - /* note: star_match[2] can include "[white] " or "[black] " - before our own name. */ - ZippyHandleChallenge(star_match[4], star_match[10], - star_match[8], star_match[9], - StripHighlightAndTitle(star_match[0])); - return TRUE; - } - - /* Regular forms */ - if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * : * *") | - looking_at(buf, i, "Challenge: * (*) *(*) * * * * * *")) { - /* note: star_match[2] can include "[white] " or "[black] " - before our own name. */ - ZippyHandleChallenge(star_match[4], star_match[5], - star_match[8], star_match[9], - StripHighlightAndTitle(star_match[0])); - return TRUE; - } - - if (looking_at(buf, i, "Challenge: * (*) *(*) * * * *")) { - /* note: star_match[2] can include "[white] " or "[black] " - before our own name. */ - ZippyHandleChallenge(star_match[4], star_match[5], - star_match[6], star_match[7], - StripHighlightAndTitle(star_match[0])); - return TRUE; - } - - if (looking_at(buf, i, "offers you a draw")) { - if (first.sendDrawOffers && first.initDone) { - SendToProgram("draw\n", &first); - } - return TRUE; - } - - if (looking_at(buf, i, "requests that the game be aborted") || - looking_at(buf, i, "would like to abort")) { - if (appData.zippyAbort || - (gameMode == IcsPlayingWhite && whiteTimeRemaining < 0) || - (gameMode == IcsPlayingBlack && blackTimeRemaining < 0)) { - SendToICS(ics_prefix); - SendToICS("abort\n"); - } else { - SendToICS(ics_prefix); - if (appData.zippyTalk) - SendToICS("say Whoa no! I am having FUN!!\n"); - else - SendToICS("say Sorry, this computer doesn't accept aborts.\n"); - } - return TRUE; - } - - if (looking_at(buf, i, "requests adjournment") || - looking_at(buf, i, "would like to adjourn")) { - if (appData.zippyAdjourn) { - SendToICS(ics_prefix); - SendToICS("adjourn\n"); - } else { - SendToICS(ics_prefix); - if (appData.zippyTalk) - SendToICS("say Whoa no! I am having FUN playing NOW!!\n"); - else - SendToICS("say Sorry, this computer doesn't accept adjourns.\n"); - } - return TRUE; - } - - return FALSE; -} - -/* Initialize chess program with data from the first board - * of a new or resumed game. - */ -void ZippyFirstBoard(moveNum, basetime, increment) - int moveNum, basetime, increment; -{ - char buf[MSG_SIZ]; - int w, b; - char *opp = (gameMode==IcsPlayingWhite ? gameInfo.black : gameInfo.white); - Boolean sentPos = FALSE; - - if (!first.initDone) { - /* Game is starting prematurely. We can't deal with this */ - SendToICS(ics_prefix); - SendToICS("abort\n"); - SendToICS(ics_prefix); - SendToICS("say Sorry, the chess program is not initialized yet.\n"); - return; - } - - /* Send the variant command if needed */ - if (gameInfo.variant != VariantNormal) { - sprintf(buf, "variant %s\n", VariantName(gameInfo.variant)); - SendToProgram(buf, &first); - } - - if ((startedFromSetupPosition && moveNum == 0) || - (!appData.getMoveList && moveNum > 0)) { - SendToProgram("force\n", &first); - SendBoard(&first, moveNum); - sentPos = TRUE; - } - - sprintf(buf, "level 0 %d %d\n", basetime, increment); - SendToProgram(buf, &first); - - /* Count consecutive games from one opponent */ - if (strcmp(opp, zippyLastOpp) == 0) { - zippyConsecGames++; - } else { - zippyConsecGames = 1; - strcpy(zippyLastOpp, opp); - } - - /* Send the "computer" command if the opponent is in the list - we've been gathering. */ - for (w=0; w= 0) ? gameInfo.whiteRating : 0; - b = (gameInfo.blackRating >= 0) ? gameInfo.blackRating : 0; - - firstMove = FALSE; - if (gameMode == IcsPlayingWhite) { - if (first.sendName) { - sprintf(buf, "name %s\n", gameInfo.black); - SendToProgram(buf, &first); - } - strcpy(ics_handle, gameInfo.white); - sprintf(buf, "rating %d %d\n", w, b); - SendToProgram(buf, &first); - if (sentPos) { - /* Position sent above, engine is in force mode */ - if (WhiteOnMove(moveNum)) { - /* Engine is on move now */ - if (first.sendTime) { - if (first.useColors) { - SendToProgram("black\n", &first); /*gnu kludge*/ - SendTimeRemaining(&first, TRUE); - SendToProgram("white\n", &first); - } else { - SendTimeRemaining(&first, TRUE); - } - } - SendToProgram("go\n", &first); - } else { - /* Engine's opponent is on move now */ - if (first.usePlayother) { - if (first.sendTime) { - SendTimeRemaining(&first, TRUE); - } - SendToProgram("playother\n", &first); - } else { - /* Need to send a "go" after opponent moves */ - firstMove = TRUE; - } - } - } else { - /* Position not sent above, move list might be sent later */ - if (moveNum == 0) { - /* No move list coming; at start of game */ - if (first.sendTime) { - if (first.useColors) { - SendToProgram("black\n", &first); /*gnu kludge*/ - SendTimeRemaining(&first, TRUE); - SendToProgram("white\n", &first); - } else { - SendTimeRemaining(&first, TRUE); - } - } - SendToProgram("go\n", &first); - } - } - } else if (gameMode == IcsPlayingBlack) { - if (first.sendName) { - sprintf(buf, "name %s\n", gameInfo.white); - SendToProgram(buf, &first); - } - strcpy(ics_handle, gameInfo.black); - sprintf(buf, "rating %d %d\n", b, w); - SendToProgram(buf, &first); - if (sentPos) { - /* Position sent above, engine is in force mode */ - if (!WhiteOnMove(moveNum)) { - /* Engine is on move now */ - if (first.sendTime) { - if (first.useColors) { - SendToProgram("white\n", &first); /*gnu kludge*/ - SendTimeRemaining(&first, FALSE); - SendToProgram("black\n", &first); - } else { - SendTimeRemaining(&first, FALSE); - } - } - SendToProgram("go\n", &first); - } else { - /* Engine's opponent is on move now */ - if (first.usePlayother) { - if (first.sendTime) { - SendTimeRemaining(&first, FALSE); - } - SendToProgram("playother\n", &first); - } else { - /* Need to send a "go" after opponent moves */ - firstMove = TRUE; - } - } - } else { - /* Position not sent above, move list might be sent later */ - /* Nothing needs to be done here */ - } - } -} - - -void -ZippyHoldings(white_holding, black_holding, new_piece) - char *white_holding, *black_holding, *new_piece; -{ - char buf[MSG_SIZ]; - if (gameMode != IcsPlayingBlack && gameMode != IcsPlayingWhite) return; - sprintf(buf, "holding [%s] [%s] %s\n", - white_holding, black_holding, new_piece); - SendToProgram(buf, &first); -} +/* + * zippy.c -- Implements Zippy the Pinhead chess player on ICS in XBoard + * $Id: zippy.c,v 2.2 2003/11/25 05:25:20 mann Exp $ + * + * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. + * Enhancements Copyright 1992-2001 Free Software Foundation, Inc. + * + * The following terms apply to Digital Equipment Corporation's copyright + * interest in XBoard: + * ------------------------------------------------------------------------ + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * ------------------------------------------------------------------------ + * + * The following terms apply to the enhanced version of XBoard distributed + * by the Free Software Foundation: + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * ------------------------------------------------------------------------ + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#if STDC_HEADERS +# include +# include +#else /* not STDC_HEADERS */ +extern char *getenv(); +# if HAVE_STRING_H +# include +# else /* not HAVE_STRING_H */ +# include +# endif /* not HAVE_STRING_H */ +#endif /* not STDC_HEADERS */ + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif +#define HI "hlelo " + +#if HAVE_UNISTD_H +# include +#endif + +#include "common.h" +#include "zippy.h" +#include "frontend.h" +#include "backend.h" +#include "backendz.h" + +static char zippyPartner[MSG_SIZ]; +static char zippyLastOpp[MSG_SIZ]; +static int zippyConsecGames; +static time_t zippyLastGameEnd; + +void ZippyInit() +{ + char *p; + + /* Get name of Zippy lines file */ + p = getenv("ZIPPYLINES"); + if (p != NULL) { + appData.zippyLines = p; + } + + /* Get word that Zippy thinks is insulting */ + p = getenv("ZIPPYPINHEAD"); + if (p != NULL) { + appData.zippyPinhead = p; + } + + /* What password is used for remote control? */ + p = getenv("ZIPPYPASSWORD"); + if (p != NULL) { + appData.zippyPassword = p; + } + + /* What password is used for remote commands to gnuchess? */ + p = getenv("ZIPPYPASSWORD2"); + if (p != NULL) { + appData.zippyPassword2 = p; + } + + /* Joke feature for people who try an old password */ + p = getenv("ZIPPYWRONGPASSWORD"); + if (p != NULL) { + appData.zippyWrongPassword = p; + } + + /* While testing, I want to accept challenges from only one person + (namely, my "anonymous" account), so I set an environment + variable ZIPPYACCEPTONLY. */ + p = getenv("ZIPPYACCEPTONLY"); + if ( p != NULL ) { + appData.zippyAcceptOnly = p; + } + + /* Should Zippy use "i" command? */ + /* Defaults to 1=true */ + p = getenv("ZIPPYUSEI"); + if (p != NULL) { + appData.zippyUseI = atoi(p); + } + + /* How does Zippy handle bughouse partnering? */ + /* 0=say we can't play, 1=manual partnering, 2=auto partnering */ + p = getenv("ZIPPYBUGHOUSE"); + if (p != NULL) { + appData.zippyBughouse = atoi(p); + } + + /* Does Zippy abort games with Crafty? */ + /* Defaults to 0=false */ + p = getenv("ZIPPYNOPLAYCRAFTY"); + if (p != NULL) { + appData.zippyNoplayCrafty = atoi(p); + } + + /* What ICS command does Zippy send at game end? Default: "gameend". */ + p = getenv("ZIPPYGAMEEND"); + if (p != NULL) { + appData.zippyGameEnd = p; + } + + /* What ICS command does Zippy send at game start? Default: none. */ + p = getenv("ZIPPYGAMESTART"); + if (p != NULL) { + appData.zippyGameStart = p; + } + + /* Should Zippy accept adjourns? */ + /* Defaults to 0=false */ + p = getenv("ZIPPYADJOURN"); + if (p != NULL) { + appData.zippyAdjourn = atoi(p); + } + + /* Should Zippy accept aborts? */ + /* Defaults to 0=false */ + p = getenv("ZIPPYABORT"); + if (p != NULL) { + appData.zippyAbort = atoi(p); + } + + /* Should Zippy play chess variants (besides bughouse)? */ + p = getenv("ZIPPYVARIANTS"); + if (p != NULL) { + appData.zippyVariants = p; + } + strcpy(first.variants, appData.zippyVariants); + + srandom(time(NULL)); +} + +/* + * Routines to implement Zippy talking + */ + + +char *swifties[] = { + "i acclaims:", "i admonishes:", "i advertises:", "i advises:", + "i advocates:", "i affirms:", "i alleges:", "i anathematizes:", + "i animadverts:", "i announces:", "i apostrophizes:", + "i appeals:", "i applauds:", "i approves:", "i argues:", + "i articulates:", "i asserts:", "i asseverates:", "i attests:", + "i avers:", "i avows:", "i baas:", "i babbles:", "i banters:", + "i barks:", "i bawls:", "i bays:", "i begs:", "i belches:", + "i bellows:", "i belts out:", "i berates:", "i beshrews:", + "i blabbers:", "i blabs:", "i blares:", "i blasphemes:", + "i blasts:", "i blathers:", "i bleats:", "i blithers:", + "i blubbers:", "i blurts out:", "i blusters:", "i boasts:", + "i brags:", "i brays:", "i broadcasts:", "i burbles:", + "i buzzes:", "i cachinnates:", "i cackles:", "i caterwauls:", + "i calumniates:", "i caws:", "i censures:", "i chants:", + "i chatters:", "i cheeps:", "i cheers:", "i chides:", "i chins:", + "i chirps:", "i chortles:", "i chuckles:", "i claims:", + "i clamors:", "i clucks:", "i commands:", "i commends:", + "i comments:", "i commiserates:", "i communicates:", + "i complains:", "i concludes:", "i confabulates:", "i confesses:", + "i coos:", "i coughs:", "i counsels:", "i cries:", "i croaks:", + "i crows:", "i curses:", "i daydreams:", "i debates:", + "i declaims:", "i declares:", "i delivers:", "i denounces:", + "i deposes:", "i directs:", "i discloses:", "i disparages:", + "i discourses:", "i divulges:", "i documents:", "i drawls:", + "i dreams:", "i drivels:", "i drones:", "i effuses:", + /*"i ejaculates:",*/ "i elucidates:", "i emotes:", "i endorses:", + "i enthuses:", "i entreats:", "i enunciates:", "i eulogizes:", + "i exclaims:", "i execrates:", "i exhorts:", "i expatiates:", + "i explains:", "i explicates:", "i explodes:", "i exposes:", + "i exposits:", "i expounds:", "i expresses:", "i extols:", + "i exults:", "i fantasizes:", "i fibs:", "i filibusters:", + "i flatters:", "i flutes:", "i fools:", "i free-associates:", + "i fulminates:", "i gabbles:", "i gabs:", "i gasps:", + "i giggles:", "i gossips:", "i gripes:", "i groans:", "i growls:", + "i grunts:", "i guesses:", "i guffaws:", "i gushes:", "i hails:", + "i hallucinates:", "i harangues:", "i harmonizes:", "i hectors:", + "i hints:", "i hisses:", "i hollers:", "i honks:", "i hoots:", + "i hosannas:", "i howls:", "i hums:", "i hypothecates:", + "i hypothesizes:", "i imagines:", "i implies:", "i implores:", + "i imprecates:", "i indicates:", "i infers:", + "i informs everyone:", "i instructs:", "i interjects:", + "i interposes:", "i intimates:", "i intones:", "i introspects:", + "i inveighs:", "i jabbers:", "i japes:", "i jests:", "i jibes:", + "i jives:", "i jokes:", "i joshes:", "i keens:", "i laments:", + "i lauds:", "i laughs:", "i lectures:", "i lies:", "i lilts:", + "i lisps:", "i maintains:", "i maledicts:", "i maunders:", + "i meows:", "i mewls:", "i mimes:", "i minces:", "i moans:", + "i moos:", "i mourns:", "i mouths:", "i mumbles:", "i murmurs:", + "i muses:", "i mutters:", "i nags:", "i natters:", "i neighs:", + "i notes:", "i nuncupates:", "i objurgates:", "i observes:", + "i offers:", "i oinks:", "i opines:", "i orates:", "i orders:", + "i panegyrizes:", "i pantomimes:", "i pants:", "i peals:", + "i peeps:", "i perorates:", "i persuades:", "i petitions:", + "i phonates:", "i pipes up:", "i pitches:", "i pleads:", + "i points out:", "i pontificates:", "i postulates:", "i praises:", + "i prates:", "i prattles:", "i preaches:", "i prescribes:", + "i prevaricates:", "i proclaims:", "i projects:", "i pronounces:", + "i proposes:", "i proscribes:", "i quacks:", "i queries:", + "i questions:", "i quips:", "i quotes:", "i rages:", "i rambles:", + "i rants:", "i raps:", "i rasps:", "i rattles:", "i raves:", + "i reacts:", "i recites:", "i recommends:", "i records:", + "i reiterates:", "i rejoins:", "i releases:", "i remarks:", + "i reminisces:", "i remonstrates:", "i repeats:", "i replies:", + "i reports:", "i reprimands:", "i reproaches:", "i reproves:", + "i resounds:", "i responds:", "i retorts:", "i reveals:", + "i reviles:", "i roars:", "i rumbles:", "i sanctions:", + "i satirizes:", "i sauces:", "i scolds:", "i screams:", + "i screeches:", "i semaphores:", "i sends:", "i sermonizes:", + "i shrieks:", "i sibilates:", "i sighs:", "i signals:", + "i signifies:", "i signs:", "i sings:", "i slurs:", "i snaps:", + "i snarls:", "i sneezes:", "i snickers:", "i sniggers:", + "i snivels:", "i snores:", "i snorts:", "i sobs:", + "i soliloquizes:", "i sounds off:", "i sounds out:", "i speaks:", + "i spews:", "i spits out:", "i splutters:", "i spoofs:", + "i spouts:", "i sputters:", "i squalls:", "i squawks:", + "i squeaks:", "i squeals:", "i stammers:", "i states:", + "i stresses:", "i stutters:", "i submits:", "i suggests:", + "i summarizes:", "i sums up:", "i swears:", "i talks:", + "i tattles:", "i teases:", "i telegraphs:", "i testifies:", + "i threatens:", "i thunders:", "i titters:", "i tongue-lashes:", + "i toots:", "i transcribes:", "i transmits:", "i trills:", + "i trumpets:", "i twaddles:", "i tweets:", "i twitters:", + "i types:", "i upbraids:", "i urges:", "i utters:", "i ventures:", + "i vibrates:", "i vilifies:", "i vituperates:", "i vocalizes:", + "i vociferates:", "i voices:", "i waffles:", "i wails:", + "i warbles:", "i warns:", "i weeps:", "i wheezes:", "i whimpers:", + "i whines:", "i whinnies:", "i whistles:", "i wisecracks:", + "i witnesses:", "i woofs:", "i writes:", "i yammers:", "i yawps:", + "i yells:", "i yelps:", "i yodels:", "i yowls:", "i zings:", +}; + +#define MAX_SPEECH 250 + +void Speak(how, whom) + char *how, *whom; +{ + static FILE *zipfile = NULL; + static struct stat zipstat; + char zipbuf[MAX_SPEECH + 1]; + static time_t lastShout = 0; + time_t now; + char *p; + int c, speechlen; + Boolean done; + + if (strcmp(how, "shout") == 0) { + now = time((time_t *) NULL); + if (now - lastShout < 1*60) return; + lastShout = now; + if (appData.zippyUseI) { + how = swifties[(unsigned) random() % + (sizeof(swifties)/sizeof(char *))]; + } + } + + if (zipfile == NULL) { + zipfile = fopen(appData.zippyLines, "r"); + if (zipfile == NULL) { + DisplayFatalError("Can't open Zippy lines file", errno, 1); + return; + } + fstat(fileno(zipfile), &zipstat); + } + + for (;;) { + fseek(zipfile, (unsigned) random() % zipstat.st_size, 0); + do { + c = getc(zipfile); + } while (c != NULLCHAR && c != '^' && c != EOF); + if (c == EOF) continue; + while ((c = getc(zipfile)) == '\n') ; + if (c == EOF) continue; + break; + } + done = FALSE; + + /* Don't use ics_prefix; we need to let FICS expand the alias i -> it, + but use the real command "i" on ICC */ + strcpy(zipbuf, how); + strcat(zipbuf, " "); + if (whom != NULL) { + strcat(zipbuf, whom); + strcat(zipbuf, " "); + } + speechlen = strlen(zipbuf); + p = zipbuf + speechlen; + + while (++speechlen < MAX_SPEECH) { + if (c == NULLCHAR || c == '^') { + *p++ = '\n'; + *p = '\0'; + SendToICS(zipbuf); + return; + } else if (c == '\n') { + *p++ = ' '; + do { + c = getc(zipfile); + } while (c == ' '); + } else if (c == EOF) { + break; + } else { + *p++ = c; + c = getc(zipfile); + } + } + /* Tried to say something too long, or junk at the end of the + file. Try something else. */ + Speak(how, whom); /* tail recursion */ +} + +int ZippyCalled(str) + char *str; +{ + return ics_handle[0] != NULLCHAR && StrCaseStr(str, ics_handle) != NULL; +} + +static char opp_name[128][32]; +static int num_opps=0; + +extern ColorClass curColor; + +static void SetCurColor( ColorClass color ) +{ + curColor = color; +} + +static void ColorizeEx( ColorClass color, int cont ) +{ + if( appData.colorize ) { + Colorize( color, cont ); + SetCurColor( color ); + } +} + +int ZippyControl(buf, i) + char *buf; + int *i; +{ + char *player, *p; + char reply[MSG_SIZ]; + +#if TRIVIA +#include "trivia.c" +#endif + + /* Possibly reject Crafty as opponent */ + if (appData.zippyPlay && appData.zippyNoplayCrafty && forwardMostMove < 4 + && looking_at(buf, i, "* kibitzes: Hello from Crafty")) + { + player = StripHighlightAndTitle(star_match[0]); + if ((gameMode == IcsPlayingWhite && + StrCaseCmp(player, gameInfo.black) == 0) || + (gameMode == IcsPlayingBlack && + StrCaseCmp(player, gameInfo.white) == 0)) { + + sprintf(reply, "%ssay This computer does not play Crafty clones\n%sabort\n%s+noplay %s\n", + ics_prefix, ics_prefix, ics_prefix, player); + SendToICS(reply); + } + return TRUE; + } + + /* If this is a computer, save the name. Then later, once the */ + /* game is really started, we will send the "computer" notice to */ + /* the engine. */ + if (appData.zippyPlay && + looking_at(buf, i, "* is in the computer list")) { + int i; + for (i=0;i= num_opps) strcpy(opp_name[num_opps++],star_match[0]); + } + if (appData.zippyPlay && looking_at(buf, i, "* * is a computer *")) { + int i; + for (i=0;i= num_opps) strcpy(opp_name[num_opps++],star_match[1]); + } + + /* Tells and says */ + if (appData.zippyPlay && + (looking_at(buf, i, "* offers to be your bughouse partner") || + looking_at(buf, i, "* tells you: [automatic message] I chose you"))) { + player = StripHighlightAndTitle(star_match[0]); + if (appData.zippyBughouse > 1 && first.initDone) { + sprintf(reply, "%spartner %s\n", ics_prefix, player); + SendToICS(reply); + if (strcmp(zippyPartner, player) != 0) { + strcpy(zippyPartner, player); + SendToProgram(reply + strlen(ics_prefix), &first); + } + } else if (appData.zippyBughouse > 0) { + sprintf(reply, "%sdecline %s\n", ics_prefix, player); + SendToICS(reply); + } else { + sprintf(reply, "%stell %s This computer cannot play bughouse\n", + ics_prefix, player); + SendToICS(reply); + } + return TRUE; + } + + if (appData.zippyPlay && appData.zippyBughouse && first.initDone && + looking_at(buf, i, "* agrees to be your partner")) { + player = StripHighlightAndTitle(star_match[0]); + sprintf(reply, "partner %s\n", player); + if (strcmp(zippyPartner, player) != 0) { + strcpy(zippyPartner, player); + SendToProgram(reply, &first); + } + return TRUE; + } + + if (appData.zippyPlay && appData.zippyBughouse && first.initDone && + (looking_at(buf, i, "are no longer *'s partner") || + looking_at(buf, i, + "* tells you: [automatic message] I'm no longer your"))) { + player = StripHighlightAndTitle(star_match[0]); + if (strcmp(zippyPartner, player) == 0) { + zippyPartner[0] = NULLCHAR; + SendToProgram("partner\n", &first); + } + return TRUE; + } + + if (appData.zippyPlay && appData.zippyBughouse && first.initDone && + (looking_at(buf, i, "no longer have a bughouse partner") || + looking_at(buf, i, "partner has disconnected") || + looking_at(buf, i, "partner has just chosen a new partner"))) { + zippyPartner[0] = NULLCHAR; + SendToProgram("partner\n", &first); + return TRUE; + } + + if (appData.zippyPlay && appData.zippyBughouse && first.initDone && + looking_at(buf, i, "* (your partner) tells you: *")) { + /* This pattern works on FICS but not ICC */ + player = StripHighlightAndTitle(star_match[0]); + if (strcmp(zippyPartner, player) != 0) { + strcpy(zippyPartner, player); + sprintf(reply, "partner %s\n", player); + SendToProgram(reply, &first); + } + sprintf(reply, "ptell %s\n", star_match[1]); + SendToProgram(reply, &first); + return TRUE; + } + + if (looking_at(buf, i, "* tells you: *") || + looking_at(buf, i, "* says: *")) + { + player = StripHighlightAndTitle(star_match[0]); + if (appData.zippyPassword[0] != NULLCHAR && + strncmp(star_match[1], appData.zippyPassword, + strlen(appData.zippyPassword)) == 0) { + p = star_match[1] + strlen(appData.zippyPassword); + while (*p == ' ') p++; + SendToICS(p); + SendToICS("\n"); + } else if (appData.zippyPassword2[0] != NULLCHAR && first.initDone && + strncmp(star_match[1], appData.zippyPassword2, + strlen(appData.zippyPassword2)) == 0) { + p = star_match[1] + strlen(appData.zippyPassword2); + while (*p == ' ') p++; + SendToProgram(p, &first); + SendToProgram("\n", &first); + } else if (appData.zippyWrongPassword[0] != NULLCHAR && + strncmp(star_match[1], appData.zippyWrongPassword, + strlen(appData.zippyWrongPassword)) == 0) { + p = star_match[1] + strlen(appData.zippyWrongPassword); + while (*p == ' ') p++; + sprintf(reply, "wrong %s\n", player); + SendToICS(reply); + } else if (appData.zippyBughouse && first.initDone && + strcmp(player, zippyPartner) == 0) { + SendToProgram("ptell ", &first); + SendToProgram(star_match[1], &first); + SendToProgram("\n", &first); + } else if (strncmp(star_match[1], HI, 6) == 0) { + extern char* programVersion; + sprintf(reply, "%stell %s %s\n", + ics_prefix, player, programVersion); + SendToICS(reply); + } else if (strncmp(star_match[1], "W0W!! ", 6) == 0) { + extern char* programVersion; + sprintf(reply, "%stell %s %s\n", ics_prefix, + player, programVersion); + SendToICS(reply); + } else if (appData.zippyTalk && (((unsigned) random() % 10) < 9)) { + if (strcmp(player, ics_handle) != 0) { + Speak("tell", player); + } + } + + ColorizeEx( ColorTell, FALSE ); + + return TRUE; + } + + if( appData.colorize && looking_at(buf, i, "* (*) seeking") ) { + ColorizeEx(ColorSeek, FALSE); + return FALSE; + } + + if (looking_at(buf, i, "* spoofs you:")) { + player = StripHighlightAndTitle(star_match[0]); + sprintf(reply, "spoofedby %s\n", player); + SendToICS(reply); + } + + return FALSE; +} + +int ZippyConverse(buf, i) + char *buf; + int *i; +{ + static char lastgreet[MSG_SIZ]; + char reply[MSG_SIZ]; + int oldi; + + /* Shouts and emotes */ + if (looking_at(buf, i, "--> * *") || + looking_at(buf, i, "* shouts: *")) + { + if (appData.zippyTalk) { + char *player = StripHighlightAndTitle(star_match[0]); + if (strcmp(player, ics_handle) == 0) { + return TRUE; + } else if (appData.zippyPinhead[0] != NULLCHAR && + StrCaseStr(star_match[1], appData.zippyPinhead) != NULL) { + sprintf(reply, "insult %s\n", player); + SendToICS(reply); + } else if (ZippyCalled(star_match[1])) { + Speak("shout", NULL); + } + } + + ColorizeEx(ColorShout, FALSE); + + return TRUE; + } + + if (looking_at(buf, i, "* kibitzes: *")) { + if (appData.zippyTalk && ((unsigned) random() % 10) < 9) { + char *player = StripHighlightAndTitle(star_match[0]); + if (strcmp(player, ics_handle) != 0) { + Speak("kibitz", NULL); + } + } + + ColorizeEx(ColorKibitz, FALSE); + + return TRUE; + } + + if (looking_at(buf, i, "* whispers: *")) { + if (appData.zippyTalk && ((unsigned) random() % 10) < 9) { + char *player = StripHighlightAndTitle(star_match[0]); + if (strcmp(player, ics_handle) != 0) { + Speak("whisper", NULL); + } + } + + ColorizeEx(ColorKibitz, FALSE); + + return TRUE; + } + + /* Messages */ + if ((looking_at(buf, i, ". * (*:*): *") && isdigit(star_match[1][0])) || + looking_at(buf, i, ". * at *:*: *")) { + if (appData.zippyTalk) { + FILE *f; + char *player = StripHighlightAndTitle(star_match[0]); + + if (strcmp(player, ics_handle) != 0) { + if (((unsigned) random() % 10) < 9) + Speak("message", player); + f = fopen("zippy.messagelog", "a"); + fprintf(f, "%s (%s:%s): %s\n", player, + star_match[1], star_match[2], star_match[3]); + fclose(f); + } + } + return TRUE; + } + + /* Channel tells */ + oldi = *i; + if (looking_at(buf, i, "*(*: *")) { + char *player; + char *channel; + if (star_match[0][0] == NULLCHAR || + strchr(star_match[0], ' ') || + strchr(star_match[1], ' ')) { + /* Oops, did not want to match this; probably a message */ + *i = oldi; + return FALSE; + } + if (appData.zippyTalk) { + player = StripHighlightAndTitle(star_match[0]); + channel = strrchr(star_match[1], '('); + if (channel == NULL) { + channel = star_match[1]; + } else { + channel++; + } + channel[strlen(channel)-1] = NULLCHAR; +#if 0 + /* Always tell to the channel (probability 90%) */ + if (strcmp(player, ics_handle) != 0 && + ((unsigned) random() % 10) < 9) { + Speak("tell", channel); + } +#else + /* Tell to the channel only if someone mentions our name */ + if (ZippyCalled(star_match[2])) { + Speak("tell", channel); + } +#endif + + ColorizeEx( atoi(channel) == 1 ? ColorChannel1 : ColorChannel, FALSE ); + } + return TRUE; + } + + if (!appData.zippyTalk) return FALSE; + + if ((looking_at(buf, i, "You have * message") && + atoi(star_match[0]) != 0) || + looking_at(buf, i, "* has left a message for you") || + looking_at(buf, i, "* just sent you a message")) { + sprintf(reply, "%smessages\n%sclearmessages *\n", + ics_prefix, ics_prefix); + SendToICS(reply); + return TRUE; + } + + if (looking_at(buf, i, "Notification: * has arrived")) { + if (((unsigned) random() % 3) == 0) { + char *player = StripHighlightAndTitle(star_match[0]); + strcpy(lastgreet, player); + sprintf(reply, "greet %s\n", player); + SendToICS(reply); + Speak("tell", player); + } + } + + if (looking_at(buf, i, "Notification: * has departed")) { + if (((unsigned) random() % 3) == 0) { + char *player = StripHighlightAndTitle(star_match[0]); + sprintf(reply, "farewell %s\n", player); + SendToICS(reply); + } + } + + if (looking_at(buf, i, "Not sent -- * is censoring you")) { + char *player = StripHighlightAndTitle(star_match[0]); + if (strcmp(player, lastgreet) == 0) { + sprintf(reply, "%s-notify %s\n", ics_prefix, player); + SendToICS(reply); + } + } + + if (looking_at(buf, i, "command is currently turned off")) { + appData.zippyUseI = 0; + } + + return FALSE; +} + +void ZippyGameStart(white, black) + char *white, *black; +{ + if (!first.initDone) { + /* Game is starting prematurely. We can't deal with this */ + SendToICS(ics_prefix); + SendToICS("abort\n"); + SendToICS(ics_prefix); + SendToICS("say Sorry, the chess program is not initialized yet.\n"); + return; + } + + if (appData.zippyGameStart[0] != NULLCHAR) { + SendToICS(appData.zippyGameStart); + SendToICS("\n"); + } +} + +void ZippyGameEnd(result, resultDetails) + ChessMove result; + char *resultDetails; +{ + if (appData.zippyAcceptOnly[0] == NULLCHAR && + appData.zippyGameEnd[0] != NULLCHAR) { + SendToICS(appData.zippyGameEnd); + SendToICS("\n"); + } + zippyLastGameEnd = time(0); +} + +/* + * Routines to implement Zippy playing chess + */ + +void ZippyHandleChallenge(srated, swild, sbase, sincrement, opponent) + char *srated, *swild, *sbase, *sincrement, *opponent; +{ + char buf[MSG_SIZ]; + int base, increment, i=0; + char rated; + VariantClass variant; + char *varname; + + rated = srated[0]; + variant = StringToVariant(swild); + varname = VariantName(variant); + base = atoi(sbase); + increment = atoi(sincrement); + + /* If desired, you can insert more code here to decline matches + based on rated, variant, base, and increment, but it is + easier to use the ICS formula feature instead. */ + + if (variant == VariantLoadable) { + sprintf(buf, + "%stell %s This computer can't play wild type %s\n%sdecline %s\n", + ics_prefix, opponent, swild, ics_prefix, opponent); + SendToICS(buf); + return; + } + if (StrStr(appData.zippyVariants, varname) == NULL || + (i=first.protocolVersion) != 1 && StrStr(first.variants, varname) == NULL /* [HGM] zippyvar */ + ) { + sprintf(buf, + "%stell %s This computer can't play %s [%s], only %s\n%sdecline %s\n", + ics_prefix, opponent, swild, varname, + i ? first.variants : appData.zippyVariants, /* [HGM] zippyvar */ + ics_prefix, opponent); + SendToICS(buf); + return; + } + + /* Are we blocking match requests from all but one person? */ + if (appData.zippyAcceptOnly[0] != NULLCHAR && + StrCaseCmp(opponent, appData.zippyAcceptOnly)) { + /* Yes, and this isn't him. Ignore challenge. */ + return; + } + + /* Too many consecutive games with same opponent? If so, make him + wait until someone else has played or a timeout has elapsed. */ + if (appData.zippyMaxGames && + strcmp(opponent, zippyLastOpp) == 0 && + zippyConsecGames >= appData.zippyMaxGames && + difftime(time(0), zippyLastGameEnd) < appData.zippyReplayTimeout) { + sprintf(buf, "%stell %s Sorry, you have just played %d consecutive games against %s. To give others a chance, please wait %d seconds or until someone else has played.\n%sdecline %s\n", + ics_prefix, opponent, zippyConsecGames, ics_handle, + appData.zippyReplayTimeout, ics_prefix, opponent); + SendToICS(buf); + return; + } + + /* Engine not yet initialized or still thinking about last game? */ + if (!first.initDone || first.lastPing != first.lastPong) { + sprintf(buf, "%stell %s I'm not quite ready for a new game yet; try again soon.\n%sdecline %s\n", + ics_prefix, opponent, ics_prefix, opponent); + SendToICS(buf); + return; + } + + sprintf(buf, "%saccept %s\n", ics_prefix, opponent); + SendToICS(buf); + if (appData.zippyTalk) { + Speak("tell", opponent); + } +} + + +/* Accept matches */ +int ZippyMatch(buf, i) + char *buf; + int *i; +{ + if (looking_at(buf, i, "* * match * * requested with * (*)")) { + + ZippyHandleChallenge(star_match[0], star_match[1], + star_match[2], star_match[3], + StripHighlightAndTitle(star_match[4])); + return TRUE; + } + + /* Old FICS 0-increment form */ + if (looking_at(buf, i, "* * match * requested with * (*)")) { + + ZippyHandleChallenge(star_match[0], star_match[1], + star_match[2], "0", + StripHighlightAndTitle(star_match[3])); + return TRUE; + } + + if (looking_at(buf, i, + "* has made an alternate proposal of * * match * *.")) { + + ZippyHandleChallenge(star_match[1], star_match[2], + star_match[3], star_match[4], + StripHighlightAndTitle(star_match[0])); + return TRUE; + } + + /* FICS wild/nonstandard forms */ + if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * Loaded from *")) { + /* note: star_match[2] can include "[white] " or "[black] " + before our own name. */ + ZippyHandleChallenge(star_match[4], star_match[8], + star_match[6], star_match[7], + StripHighlightAndTitle(star_match[0])); + return TRUE; + } + + if (looking_at(buf, i, + "Challenge: * (*) *(*) * * * * : * * Loaded from *")) { + /* note: star_match[2] can include "[white] " or "[black] " + before our own name. */ + ZippyHandleChallenge(star_match[4], star_match[10], + star_match[8], star_match[9], + StripHighlightAndTitle(star_match[0])); + return TRUE; + } + + /* Regular forms */ + if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * : * *") | + looking_at(buf, i, "Challenge: * (*) *(*) * * * * * *")) { + /* note: star_match[2] can include "[white] " or "[black] " + before our own name. */ + ZippyHandleChallenge(star_match[4], star_match[5], + star_match[8], star_match[9], + StripHighlightAndTitle(star_match[0])); + return TRUE; + } + + if (looking_at(buf, i, "Challenge: * (*) *(*) * * * *")) { + /* note: star_match[2] can include "[white] " or "[black] " + before our own name. */ + ZippyHandleChallenge(star_match[4], star_match[5], + star_match[6], star_match[7], + StripHighlightAndTitle(star_match[0])); + return TRUE; + } + + if (looking_at(buf, i, "offers you a draw")) { + if (first.sendDrawOffers && first.initDone) { + SendToProgram("draw\n", &first); + } + return TRUE; + } + + if (looking_at(buf, i, "requests that the game be aborted") || + looking_at(buf, i, "would like to abort")) { + if (appData.zippyAbort || + (gameMode == IcsPlayingWhite && whiteTimeRemaining < 0) || + (gameMode == IcsPlayingBlack && blackTimeRemaining < 0)) { + SendToICS(ics_prefix); + SendToICS("abort\n"); + } else { + SendToICS(ics_prefix); + if (appData.zippyTalk) + SendToICS("say Whoa no! I am having FUN!!\n"); + else + SendToICS("say Sorry, this computer doesn't accept aborts.\n"); + } + return TRUE; + } + + if (looking_at(buf, i, "requests adjournment") || + looking_at(buf, i, "would like to adjourn")) { + if (appData.zippyAdjourn) { + SendToICS(ics_prefix); + SendToICS("adjourn\n"); + } else { + SendToICS(ics_prefix); + if (appData.zippyTalk) + SendToICS("say Whoa no! I am having FUN playing NOW!!\n"); + else + SendToICS("say Sorry, this computer doesn't accept adjourns.\n"); + } + return TRUE; + } + + return FALSE; +} + +/* Initialize chess program with data from the first board + * of a new or resumed game. + */ +void ZippyFirstBoard(moveNum, basetime, increment) + int moveNum, basetime, increment; +{ + char buf[MSG_SIZ]; + int w, b; + char *opp = (gameMode==IcsPlayingWhite ? gameInfo.black : gameInfo.white); + Boolean sentPos = FALSE; + + if (!first.initDone) { + /* Game is starting prematurely. We can't deal with this */ + SendToICS(ics_prefix); + SendToICS("abort\n"); + SendToICS(ics_prefix); + SendToICS("say Sorry, the chess program is not initialized yet.\n"); + return; + } + + /* Send the variant command if needed */ + if (gameInfo.variant != VariantNormal) { + sprintf(buf, "variant %s\n", VariantName(gameInfo.variant)); + SendToProgram(buf, &first); + } + + if ((startedFromSetupPosition && moveNum == 0) || + (!appData.getMoveList && moveNum > 0)) { + SendToProgram("force\n", &first); + SendBoard(&first, moveNum); + sentPos = TRUE; + } + + sprintf(buf, "level 0 %d %d\n", basetime, increment); + SendToProgram(buf, &first); + + /* Count consecutive games from one opponent */ + if (strcmp(opp, zippyLastOpp) == 0) { + zippyConsecGames++; + } else { + zippyConsecGames = 1; + strcpy(zippyLastOpp, opp); + } + + /* Send the "computer" command if the opponent is in the list + we've been gathering. */ + for (w=0; w= 0) ? gameInfo.whiteRating : 0; + b = (gameInfo.blackRating >= 0) ? gameInfo.blackRating : 0; + + firstMove = FALSE; + if (gameMode == IcsPlayingWhite) { + if (first.sendName) { + sprintf(buf, "name %s\n", gameInfo.black); + SendToProgram(buf, &first); + } + strcpy(ics_handle, gameInfo.white); + sprintf(buf, "rating %d %d\n", w, b); + SendToProgram(buf, &first); + if (sentPos) { + /* Position sent above, engine is in force mode */ + if (WhiteOnMove(moveNum)) { + /* Engine is on move now */ + if (first.sendTime) { + if (first.useColors) { + SendToProgram("black\n", &first); /*gnu kludge*/ + SendTimeRemaining(&first, TRUE); + SendToProgram("white\n", &first); + } else { + SendTimeRemaining(&first, TRUE); + } + } + SendToProgram("go\n", &first); + } else { + /* Engine's opponent is on move now */ + if (first.usePlayother) { + if (first.sendTime) { + SendTimeRemaining(&first, TRUE); + } + SendToProgram("playother\n", &first); + } else { + /* Need to send a "go" after opponent moves */ + firstMove = TRUE; + } + } + } else { + /* Position not sent above, move list might be sent later */ + if (moveNum == 0) { + /* No move list coming; at start of game */ + if (first.sendTime) { + if (first.useColors) { + SendToProgram("black\n", &first); /*gnu kludge*/ + SendTimeRemaining(&first, TRUE); + SendToProgram("white\n", &first); + } else { + SendTimeRemaining(&first, TRUE); + } + } + SendToProgram("go\n", &first); + } + } + } else if (gameMode == IcsPlayingBlack) { + if (first.sendName) { + sprintf(buf, "name %s\n", gameInfo.white); + SendToProgram(buf, &first); + } + strcpy(ics_handle, gameInfo.black); + sprintf(buf, "rating %d %d\n", b, w); + SendToProgram(buf, &first); + if (sentPos) { + /* Position sent above, engine is in force mode */ + if (!WhiteOnMove(moveNum)) { + /* Engine is on move now */ + if (first.sendTime) { + if (first.useColors) { + SendToProgram("white\n", &first); /*gnu kludge*/ + SendTimeRemaining(&first, FALSE); + SendToProgram("black\n", &first); + } else { + SendTimeRemaining(&first, FALSE); + } + } + SendToProgram("go\n", &first); + } else { + /* Engine's opponent is on move now */ + if (first.usePlayother) { + if (first.sendTime) { + SendTimeRemaining(&first, FALSE); + } + SendToProgram("playother\n", &first); + } else { + /* Need to send a "go" after opponent moves */ + firstMove = TRUE; + } + } + } else { + /* Position not sent above, move list might be sent later */ + /* Nothing needs to be done here */ + } + } +} + + +void +ZippyHoldings(white_holding, black_holding, new_piece) + char *white_holding, *black_holding, *new_piece; +{ + char buf[MSG_SIZ]; + if (gameMode != IcsPlayingBlack && gameMode != IcsPlayingWhite) return; + sprintf(buf, "holding [%s] [%s] %s\n", + white_holding, black_holding, new_piece); + SendToProgram(buf, &first); +} diff --git a/zippy.h b/zippy.h index c8cf6e8..f42d1d3 100644 --- a/zippy.h +++ b/zippy.h @@ -1,57 +1,57 @@ -/* - * zippy.h -- Interface to zippy.c module in XBoard - * $Id: zippy.h,v 2.1 2003/10/27 19:21:01 mann Exp $ - * - * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. - * Enhancements Copyright 1992-95 Free Software Foundation, Inc. - * - * The following terms apply to Digital Equipment Corporation's copyright - * interest in XBoard: - * ------------------------------------------------------------------------ - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of Digital not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING - * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL - * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR - * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * ------------------------------------------------------------------------ - * - * The following terms apply to the enhanced version of XBoard distributed - * by the Free Software Foundation: - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * ------------------------------------------------------------------------ - */ - -void ZippyInit P((void)); -int ZippyControl P((char *buf, int *i)); -int ZippyConverse P((char *buf, int *i)); -void ZippyGameStart P((char *white, char *black)); -int ZippyMatch P((char *buf, int *i)); -void ZippyFirstBoard P((int moveNum, int basetime, int increment)); -void ZippyGameEnd P((ChessMove result, char *resultDetails)); -void ZippyHoldings P((char *white_holding, char *black_holding, - char *new_piece)); +/* + * zippy.h -- Interface to zippy.c module in XBoard + * $Id: zippy.h,v 2.1 2003/10/27 19:21:01 mann Exp $ + * + * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. + * Enhancements Copyright 1992-95 Free Software Foundation, Inc. + * + * The following terms apply to Digital Equipment Corporation's copyright + * interest in XBoard: + * ------------------------------------------------------------------------ + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * ------------------------------------------------------------------------ + * + * The following terms apply to the enhanced version of XBoard distributed + * by the Free Software Foundation: + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * ------------------------------------------------------------------------ + */ + +void ZippyInit P((void)); +int ZippyControl P((char *buf, int *i)); +int ZippyConverse P((char *buf, int *i)); +void ZippyGameStart P((char *white, char *black)); +int ZippyMatch P((char *buf, int *i)); +void ZippyFirstBoard P((int moveNum, int basetime, int increment)); +void ZippyGameEnd P((ChessMove result, char *resultDetails)); +void ZippyHoldings P((char *white_holding, char *black_holding, + char *new_piece)); -- 1.7.0.4