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