1 /* 2 * backend.h -- Interface exported by XBoard back end 3 * 4 * Copyright 1991 by Digital Equipment Corporation, Maynard, 5 * Massachusetts. 6 * 7 * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, 8 * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free 9 * Software Foundation, Inc. 10 * 11 * Enhancements Copyright 2005 Alessandro Scotti 12 * 13 * The following terms apply to Digital Equipment Corporation's copyright 14 * interest in XBoard: 15 * ------------------------------------------------------------------------ 16 * All Rights Reserved 17 * 18 * Permission to use, copy, modify, and distribute this software and its 19 * documentation for any purpose and without fee is hereby granted, 20 * provided that the above copyright notice appear in all copies and that 21 * both that copyright notice and this permission notice appear in 22 * supporting documentation, and that the name of Digital not be 23 * used in advertising or publicity pertaining to distribution of the 24 * software without specific, written prior permission. 25 * 26 * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 27 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 28 * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 29 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 30 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 31 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 32 * SOFTWARE. 33 * ------------------------------------------------------------------------ 34 * 35 * The following terms apply to the enhanced version of XBoard 36 * distributed by the Free Software Foundation: 37 * ------------------------------------------------------------------------ 38 * 39 * GNU XBoard is free software: you can redistribute it and/or modify 40 * it under the terms of the GNU General Public License as published by 41 * the Free Software Foundation, either version 3 of the License, or (at 42 * your option) any later version. 43 * 44 * GNU XBoard is distributed in the hope that it will be useful, but 45 * WITHOUT ANY WARRANTY; without even the implied warranty of 46 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 47 * General Public License for more details. 48 * 49 * You should have received a copy of the GNU General Public License 50 * along with this program. If not, see http://www.gnu.org/licenses/. * 51 * 52 *------------------------------------------------------------------------ 53 ** See the file ChangeLog for a revision history. */ 54 55 #ifndef XB_BACKEND 56 #define XB_BACKEND 57 58 #include "lists.h" 59 60 typedef int (*FileProc) P((FILE *f, int n, char *title)); 61 62 extern char *wbOptions; 63 extern int gotPremove; 64 extern GameMode gameMode; 65 extern int matchMode; 66 extern int matchGame; 67 extern int pausing, cmailMsgLoaded, flipView, mute; 68 extern char white_holding[], black_holding[]; 69 extern int currentMove, backwardMostMove, forwardMostMove; 70 extern int blackPlaysFirst; 71 extern FILE *debugFP; 72 extern char* programVersion; 73 extern Board boards[]; 74 extern char marker[BOARD_RANKS][BOARD_FILES]; 75 extern char lastMsg[MSG_SIZ]; 76 extern Boolean bookUp; 77 extern Boolean addToBookFlag; 78 extern int tinyLayout, smallLayout; 79 extern Boolean mcMode; 80 extern int dragging; 81 extern char variantError[]; 82 extern char lastTalker[]; 83 extern int transparency[]; 84 85 void MarkMenuItem P((char *menuRef, int state)); 86 char *CmailMsg P((void)); 87 /* Tord: Added the useFEN960 parameter in PositionToFEN() below */ 88 char *PositionToFEN P((int move, char* useFEN960, int moveCounts)); 89 void AlphaRank P((char *s, int n)); /* [HGM] Shogi move preprocessor */ 90 void EditPositionPasteFEN P((char *fen)); 91 void TimeDelay P((long ms)); 92 void SendMultiLineToICS P(( char *text )); 93 void AnalysisPeriodicEvent P((int force)); 94 void SetWhiteToPlayEvent P((void)); 95 void SetBlackToPlayEvent P((void)); 96 void UploadGameEvent P((void)); 97 void InitBackEnd1 P((void)); 98 void InitBackEnd2 P((void)); 99 int HasPromotionChoice P((int fromX, int fromY, int toX, int toY, char *choice, int sweep)); 100 int InPalace P((int row, int column)); 101 int PieceForSquare P((int x, int y)); 102 int OKToStartUserMove P((int x, int y)); 103 void Reset P((int redraw, int init)); 104 void ResetGameEvent P((void)); 105 Boolean HasPattern P(( const char * text, const char * pattern )); 106 Boolean SearchPattern P(( const char * text, const char * pattern )); 107 int LoadGame P((FILE *f, int n, char *title, int useList)); 108 int LoadGameFromFile P((char *filename, int n, char *title, int useList)); 109 int CmailLoadGame P((FILE *f, int n, char *title, int useList)); 110 int ReloadGame P((int offset)); 111 int SaveSelected P((FILE *f, int dummy, char *dummy2)); 112 int SaveGame P((FILE *f, int dummy, char *dummy2)); 113 int SaveGameToFile P((char *filename, int append)); 114 int LoadPosition P((FILE *f, int n, char *title)); 115 int ReloadPosition P((int offset)); 116 int SavePosition P((FILE *f, int dummy, char *dummy2)); 117 int DrawSeekGraph P(()); 118 int SeekGraphClick P((ClickType click, int x, int y, int moving)); 119 void EditPositionEvent P((void)); 120 void FlipViewEvent P((void)); 121 void MachineWhiteEvent P((void)); 122 void MachineBlackEvent P((void)); 123 void TwoMachinesEvent P((void)); 124 void EditGameEvent P((void)); 125 void TrainingEvent P((void)); 126 void IcsClientEvent P((void)); 127 void ForwardEvent P((void)); 128 void BackwardEvent P((void)); 129 void ToEndEvent P((void)); 130 void ToStartEvent P((void)); 131 void ToNrEvent P((int to)); 132 void RevertEvent P((Boolean annotate)); 133 void RetractMoveEvent P((void)); 134 void MoveNowEvent P((void)); 135 void TruncateGameEvent P((void)); 136 void PauseEvent P((void)); 137 void CallFlagEvent P((void)); 138 void ClockClick P((int which)); 139 void AcceptEvent P((void)); 140 void DeclineEvent P((void)); 141 void RematchEvent P((void)); 142 void DrawEvent P((void)); 143 void AbortEvent P((void)); 144 void AdjournEvent P((void)); 145 void ResignEvent P((void)); 146 void UserAdjudicationEvent P((int result)); 147 void StopObservingEvent P((void)); 148 void StopExaminingEvent P((void)); 149 void PonderNextMoveEvent P((int newState)); 150 void ShowThinkingEvent P(()); 151 void PeriodicUpdatesEvent P((int newState)); 152 void HintEvent P((void)); 153 void BookEvent P((void)); 154 void AboutGameEvent P((void)); 155 void ExitEvent P((int status)); 156 char *DefaultFileName P((char *)); 157 ChessMove UserMoveTest P((int fromX, int fromY, int toX, int toY, int promoChar, Boolean captureOwn)); 158 void UserMoveEvent P((int fromX, int fromY, int toX, int toY, int promoChar)); 159 void DecrementClocks P((void)); 160 char *TimeString P((long millisec)); 161 void AutoPlayGameLoop P((void)); 162 void AdjustClock P((Boolean which, int dir)); 163 void DisplayBothClocks P((void)); 164 void EditPositionMenuEvent P((ChessSquare selection, int x, int y)); 165 void DropMenuEvent P((ChessSquare selection, int x, int y)); 166 int ParseTimeControl P((char *tc, float ti, int mps)); 167 void EscapeExpand(char *p, char *q); 168 void ProcessICSInitScript P((FILE * f)); 169 void EditCommentEvent P((void)); 170 void ReplaceComment P((int index, char *text)); 171 int ReplaceTags P((char *tags, GameInfo *gi));/* returns nonzero on error */ 172 void AppendComment P((int index, char *text, Boolean addBraces)); 173 void LoadVariation P((int index, char *text)); 174 void ReloadCmailMsgEvent P((int unregister)); 175 void MailMoveEvent P((void)); 176 void EditTagsEvent P((void)); 177 void GetMoveListEvent P((void)); 178 void ExitAnalyzeMode P((void)); 179 int AnalyzeModeEvent P((void)); 180 void AnalyzeFileEvent P((void)); 181 void MatchEvent P((int mode)); 182 void RecentEngineEvent P((int nr)); 183 void TypeInEvent P((char first)); 184 void TypeInDoneEvent P((char *move)); 185 void InitPosition P((int redraw)); 186 void NewSettingEvent P((int option, int *feature, char *command, int value)); 187 void SettingsMenuIfReady P((void)); 188 void DoEcho P((void)); 189 void DontEcho P((void)); 190 void TidyProgramName P((char *prog, char *host, char *buf)); 191 void SetGameInfo P((void)); 192 void AskQuestionEvent P((char *title, char *question, 193 char *replyPrefix, char *which)); 194 Boolean ParseOneMove P((char *move, int moveNum, 195 ChessMove *moveType, int *fromX, int *fromY, 196 int *toX, int *toY, char *promoChar)); 197 char *VariantName P((VariantClass v)); 198 VariantClass StringToVariant P((char *e)); 199 double u64ToDouble P((u64 value)); 200 void OutputChatMessage P((int partner, char *mess)); 201 void EditPositionDone P((Boolean fakeRights)); 202 Boolean GetArgValue P((char *name)); 203 Boolean LoadPV P((int x, int y)); 204 Boolean LoadMultiPV P((int x, int y, char *buf, int index, int *start, int *end, int pane)); 205 void UnLoadPV P(()); 206 void MovePV P((int x, int y, int h)); 207 int PromoScroll P((int x, int y)); 208 void EditBookEvent P((void)); 209 Boolean DisplayBook P((int moveNr)); 210 void SaveToBook P((char *text)); 211 void AddBookMove P((char *text)); 212 void PlayBookMove P((char *text, int index)); 213 void HoverEvent P((int hiX, int hiY, int x, int y)); 214 int PackGame P((Board board)); 215 Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen, Boolean autoSize)); 216 void ApplyMove P((int fromX, int fromY, int toX, int toY, int promoChar, Board board)); 217 void PackMove P((int fromX, int fromY, int toX, int toY, ChessSquare promoPiece)); 218 void ics_printf P((char *format, ...)); 219 int GetEngineLine P((char *nick, int engine)); 220 void AddGameToBook P((int always)); 221 void FlushBook P((void)); 222 char PieceToChar P((ChessSquare p)); 223 int LoadPieceDesc P((char *s)); 224 225 char *StrStr P((char *string, char *match)); 226 char *StrCaseStr P((char *string, char *match)); 227 char *StrSave P((char *s)); 228 char *StrSavePtr P((char *s, char **savePtr)); 229 char *SavePart P((char *)); 230 char* safeStrCpy P(( char *dst, const char *src, size_t count )); 231 232 #ifndef _amigados 233 int StrCaseCmp P((char *s1, char *s2)); 234 int ToLower P((int c)); 235 int ToUpper P((int c)); 236 #else 237 #define StrCaseCmp Stricmp /* Use utility.library functions */ 238 #include <proto/utility.h> 239 #endif 240 241 extern GameInfo gameInfo; 242 243 /* ICS vars used with backend.c and zippy.c */ 244 enum ICS_TYPE { ICS_GENERIC, ICS_ICC, ICS_FICS, ICS_CHESSNET /* not really supported */ }; 245 enum ICS_TYPE ics_type; 246 247 /* pgntags.c prototypes 248 */ 249 char *PGNTags P((GameInfo *)); 250 void PrintPGNTags P((FILE *f, GameInfo *)); 251 int ParsePGNTag P((char *, GameInfo *)); 252 char *PGNResult P((ChessMove result)); 253 254 255 /* gamelist.c prototypes 256 */ 257 /* A game node in the double linked list of games. 258 */ 259 typedef struct XB_ListGame { 260 ListNode node; 261 int number; 262 int position; 263 int moves; 264 unsigned long offset; /* Byte offset of game within file. */ 265 GameInfo gameInfo; /* Note that some entries may be NULL. */ 266 } ListGame; 267 268 extern int border; 269 extern int doubleClick; 270 extern int storedGames; 271 extern int opponentKibitzes; 272 extern ChessSquare gatingPiece; 273 extern List gameList; 274 extern int lastLoadGameNumber; 275 void ClearGameInfo P((GameInfo *)); 276 int GameListBuild P((FILE *)); 277 void GameListInitGameInfo P((GameInfo *)); 278 char *GameListLine P((int, GameInfo *)); 279 char * GameListLineFull P(( int, GameInfo *)); 280 void InitSearch P((void)); 281 int GameContainsPosition P((FILE *f, ListGame *lg)); 282 void GLT_TagsToList P(( char * tags )); 283 void GLT_ParseList P((void)); 284 int NamesToList P((char *name, char **engines, char **mnemonics, char *group)); 285 int CreateTourney P((char *name)); 286 char *MakeName P((char *templ)); 287 void SwapEngines P((int n)); 288 void Substitute P((char *participants, int expunge)); 289 290 extern char* StripHighlight P((char *)); /* returns static data */ 291 extern char* StripHighlightAndTitle P((char *)); /* returns static data */ 292 extern void ics_update_width P((int new_width)); 293 extern Boolean set_cont_sequence P((char *new_seq)); 294 extern int wrap P((char *dest, char *src, int count, int width, int *lp)); 295 int Explode P((Board board, int fromX, int fromY, int toX, int toY)); 296 297 typedef enum { CheckBox, ComboBox, TextBox, Button, Spin, ResetButton, SaveButton, ListBox, Graph, PopUp, 298 FileName, PathName, Slider, Message, Fractional, Label, Icon, 299 BoxBegin, BoxEnd, BarBegin, BarEnd, DropDown, Break, EndMark, Skip } Control; 300 301 typedef struct XB_OPT { // [HGM] options: descriptor of UCI-style option 302 int value; // current setting, starts as default 303 int min; // Also used for flags 304 int max; 305 void *handle; // for use by front end 306 void *target; // for use by front end 307 char *textValue; // points to beginning of text value in name field 308 char **choice; // points to array of combo choices in cps->combo 309 Control type; 310 char *name; // holds both option name and text value (in allocated memory) 311 char **font; 312 } Option; 313 314 typedef struct XB_CPS { 315 char *which; 316 int maybeThinking; 317 ProcRef pr; 318 InputSourceRef isr; 319 char *twoMachinesColor; /* "white\n" or "black\n" */ 320 char *program; 321 char *host; 322 char *dir; 323 struct XB_CPS *other; 324 char *initString; 325 char *computerString; 326 int sendTime; /* 0=don't, 1=do, 2=test */ 327 int sendDrawOffers; 328 int useSigint; 329 int useSigterm; 330 int offeredDraw; /* countdown */ 331 int reuse; 332 int useSetboard; /* 0=use "edit"; 1=use "setboard" */ 333 int extendedEdit;/* 1=also set holdings with "edit" */ 334 int useSAN; /* 0=use coordinate notation; 1=use SAN */ 335 int usePing; /* 0=not OK to use ping; 1=OK */ 336 int lastPing; 337 int lastPong; 338 int usePlayother;/* 0=not OK to use playother; 1=OK */ 339 int useColors; /* 0=avoid obsolete white/black commands; 1=use them */ 340 int useUsermove; /* 0=just send move; 1=send "usermove move" */ 341 int sendICS; /* 0=don't use "ics" command; 1=do */ 342 int sendName; /* 0=don't use "name" command; 1=do */ 343 int sdKludge; /* 0=use "sd DEPTH" command; 1=use "depth\nDEPTH" */ 344 int stKludge; /* 0=use "st TIME" command; 1=use "level 1 TIME" */ 345 int excludeMoves;/* 0=don't use "exclude" command; 1=do */ 346 char *tidy; 347 int matchWins; 348 char *variants; 349 int analysisSupport; 350 int analyzing; 351 int protocolVersion; 352 int initDone; 353 int pseudo; 354 355 /* Added by Tord: */ 356 int useFEN960; /* 0=use "KQkq" style FENs, 1=use "HAha" style FENs */ 357 int useOOCastle; /* 0="O-O" notation for castling, 1="king capture rook" notation */ 358 /* End of additions by Tord */ 359 360 int scoreIsAbsolute; /* [AS] 0=don't know (standard), 1=score is always from white side */ 361 int isUCI; /* [AS] 0=no (Winboard), 1=UCI (requires Polyglot) */ 362 int hasOwnBookUCI; /* [AS] 0=use GUI or Polyglot book, 1=has own book */ 363 364 /* [HGM] time odds */ 365 float timeOdds; /* factor through which we divide time for this engine */ 366 int debug; /* [HGM] ignore engine debug lines starting with '#' */ 367 int maxNrOfSessions; /* [HGM] secondary TC: max args in 'level' command */ 368 int accumulateTC; /* [HGM] secondary TC: how to handle extra sessions */ 369 int drawDepth; /* [HGM] egbb: search depth to play egbb draws */ 370 int nps; /* [HGM] nps: factor for node count to replace time */ 371 int supportsNPS; 372 int alphaRank; /* [HGM] shogi: engine uses shogi-type coordinates */ 373 int maxCores; /* [HGM] SMP: engine understands cores command */ 374 int memSize; /* [HGM] memsize: engine understands memory command */ 375 char *egtFormats; /* [HGM] EGT: supported tablebase formats */ 376 int bookSuspend; /* [HGM] book: go was deferred because of book hit */ 377 int pause; /* [HGM] pause: 1=supports it, 2=actually paused */ 378 int highlight; /* [HGM] engine wants to get lift and put commands */ 379 int nrOptions; /* [HGM] options: remembered option="..." features */ 380 #define MAX_OPTIONS 200 381 Option option[MAX_OPTIONS]; 382 int comboCnt; 383 char *comboList[20*MAX_OPTIONS]; 384 char *optionSettings; 385 void *programLogo; /* [HGM] logo: bitmap of the logo */ 386 char *fenOverride; /* [HGM} FRC: force FEN casling & ep fields by hand */ 387 char userError; /* [HGM] crash: flag to suppress fatal-error messages*/ 388 char reload; /* [HGM] options: flag to resend options with xreuse */ 389 } ChessProgramState; 390 391 extern ChessProgramState first, second; 392 393 /* Search stats from chessprogram */ 394 typedef struct { 395 char movelist[2*MSG_SIZ]; /* Last PV we were sent */ 396 int depth; /* Current search depth */ 397 int nr_moves; /* Total nr of root moves */ 398 int moves_left; /* Moves remaining to be searched */ 399 char move_name[MOVE_LEN]; /* Current move being searched, if provided */ 400 u64 nodes; /* # of nodes searched */ 401 int time; /* Search time (centiseconds) */ 402 int score; /* Score (centipawns) */ 403 int got_only_move; /* If last msg was "(only move)" */ 404 int got_fail; /* 0 - nothing, 1 - got "--", 2 - got "++" */ 405 int ok_to_send; /* handshaking between send & recv */ 406 int line_is_book; /* 1 if movelist is book moves */ 407 int seen_stat; /* 1 if we've seen the stat01: line */ 408 } ChessProgramStats; 409 410 extern ChessProgramStats_Move pvInfoList[MAX_MOVES]; 411 extern Boolean shuffleOpenings; 412 extern ChessProgramStats programStats; 413 extern int opponentKibitzes; // used by wengineo.c 414 extern int errorExitStatus; 415 extern char *recentEngines; 416 extern char *comboLine; 417 extern Boolean partnerUp, twoBoards; 418 extern char engineVariant[]; 419 char *EngineDefinedVariant P((ChessProgramState *cps, int n)); 420 void SettingsPopUp P((ChessProgramState *cps)); // [HGM] really in front-end, but CPS not known in frontend.h 421 int WaitForEngine P((ChessProgramState *cps, DelayedEventCallback x)); 422 void Load P((ChessProgramState *cps, int n)); 423 int MultiPV P((ChessProgramState *cps, int kind)); 424 void MoveHistorySet P(( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo )); 425 void MakeEngineOutputTitle P((void)); 426 void LoadTheme P((void)); 427 void CreateBookEvent P((void)); 428 char *SupportedVariant P((char *list, VariantClass v, int w, int h, int s, int proto, char *engine)); 429 char *CollectPieceDescriptors P((void)); 430 void RefreshSettingsDialog P((ChessProgramState *cps, int val)); 431 void StartChessProgram P((ChessProgramState *cps)); 432 void SendToICS P((char *s)); 433 int PosFlags P((int n)); 434 435 436 /* A point in time */ 437 typedef struct { 438 long sec; /* Assuming this is >= 32 bits */ 439 int ms; /* Assuming this is >= 16 bits */ 440 } TimeMark; 441 442 extern TimeMark programStartTime; 443 444 void GetTimeMark P((TimeMark *)); 445 long SubtractTimeMarks P((TimeMark *, TimeMark *)); 446 447 #endif /* XB_BACKEND */ 448