X-Git-Url: http://winboard.nl/cgi-bin?p=gnushogi.git;a=blobdiff_plain;f=gnushogi%2Fcommondsp.c;h=a6f567d1ea86fda729df94d7e770b221d06bddbb;hp=49b3805f76dbdf50348958678eca33b75ebea2f5;hb=1907f35d3370f971df16e40dec4135110386a84c;hpb=2e0ba7d65fd8be45d46122e07ca246a762e1edb6 diff --git a/gnushogi/commondsp.c b/gnushogi/commondsp.c index 49b3805..a6f567d 100644 --- a/gnushogi/commondsp.c +++ b/gnushogi/commondsp.c @@ -52,6 +52,7 @@ char mvstr[4][6]; char *InPtr; int InBackground = false; +struct display *dsp = &raw_display; #if defined(BOOKTEST) @@ -128,8 +129,6 @@ movealgbr(short m, char *s) #endif /* BOOKTEST */ - - /* * Generate move strings in different formats. * @@ -169,7 +168,7 @@ algbr(short f, short t, short flag) if ((f == t) && ((f != 0) || (t != 0))) { if (!barebones) { - Printf("error in algbr: FROM=TO=%d, flag=0x%4x\n", t, flag); + dsp->Printf("error in algbr: FROM=TO=%d, flag=0x%4x\n", t, flag); } mvstr[0][0] = mvstr[1][0] = mvstr[2][0] = mvstr[3][0] = '\0'; @@ -221,7 +220,6 @@ algbr(short f, short t, short flag) } - /* * Compare the string 's' to the list of legal moves available for the * opponent. If a match is found, make the move on the board. @@ -302,7 +300,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv) if (SqAttacked(PieceList[opponent][0], computer, &blocked)) { UnmakeMove(opponent, &xnode, &tempb, &tempc, &tempsf, &tempst); - AlwaysShowMessage("Illegal move (in check) %s", s); + dsp->AlwaysShowMessage("Illegal move (in check) %s", s); return false; } else @@ -310,7 +308,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv) if (iop == VERIFY_AND_TRY_MODE) return true; - UpdateDisplay(xnode.f, xnode.t, 0, (short) xnode.flags); + dsp->UpdateDisplay(xnode.f, xnode.t, 0, (short) xnode.flags); GameList[GameCnt].depth = GameList[GameCnt].score = 0; GameList[GameCnt].nodes = 0; ElapsedTime(COMPUTE_AND_INIT_MODE); @@ -335,7 +333,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv) char buf[20]; sprintf(buf, "%s mates!\n", ColorStr[opponent]); - ShowMessage(buf); + dsp->ShowMessage(buf); flag.mate = true; } } @@ -344,21 +342,20 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv) } } - AlwaysShowMessage("Illegal move (no match) %s", s); + dsp->AlwaysShowMessage("Illegal move (no match) %s", s); if (!barebones && (cnt > 1)) { sprintf(buffer, "Ambiguous Move %s!", s); - ShowMessage(buffer); + dsp->ShowMessage(buffer); } return false; } - static int -parser(char *f, int side, short *fpiece) +parser(char *f, short *fpiece) { int c1, r1, c2, r2; short i, p = false; @@ -406,7 +403,6 @@ skip() } - void skipb() { @@ -415,8 +411,25 @@ skipb() } +void RequestInputString(char* buffer, unsigned bufsize) +{ + static char fmt[10]; + int ret = snprintf(fmt, sizeof(fmt), "%%%us", bufsize); + if (ret < 0 ) { + perror("RequestInputString snprintf"); + exit(1); + } + if (ret >= sizeof(fmt)) { + fprintf(stderr, + "Insufficient format-buffer size in %s for bufsize=%u\n", + __FUNCTION__, bufsize); + exit(1); + } + dsp->doRequestInputString(fmt, buffer); +} + -void +static void GetGame(void) { FILE *fd; @@ -428,7 +441,7 @@ GetGame(void) if (savefile[0]) { strcpy(fname, savefile); } else { - ShowMessage("Enter file name: "); + dsp->ShowMessage("Enter file name: "); RequestInputString(fname, sizeof(fname)-1); } @@ -580,7 +593,7 @@ GetGame(void) InPtr = fname; skipb(); g = &GameList[GameCnt]; - g->gmove = parser(InPtr, side, &g->fpiece); + g->gmove = parser(InPtr, &g->fpiece); skip(); g->score = atoi(InPtr); skip(); @@ -633,14 +646,13 @@ GetGame(void) ZeroRPT(); InitializeStats(); - UpdateDisplay(0, 0, 1, 0); + dsp->UpdateDisplay(0, 0, 1, 0); Sdepth = 0; hint = 0; } - -void +static void SaveGame(void) { FILE *fd; @@ -653,7 +665,7 @@ SaveGame(void) if (savefile[0]) { strcpy(fname, savefile); } else { - ShowMessage("Enter file name: "); + dsp->ShowMessage("Enter file name: "); RequestInputString(fname, sizeof(fname)-1); } @@ -778,22 +790,21 @@ SaveGame(void) fclose(fd); - ShowMessage("Game saved"); + dsp->ShowMessage("Game saved"); } else { - ShowMessage("Could not open file"); + dsp->ShowMessage("Could not open file"); } } - /* * GetXGame, SaveXGame and BookGame used to only be defined if * xshogi wasn't defined -- wonder why? */ -void +static void GetXGame(void) { FILE *fd; @@ -802,7 +813,7 @@ GetXGame(void) short sq; short side, isp; - ShowMessage("Enter file name: "); + dsp->ShowMessage("Enter file name: "); RequestInputString(fname, sizeof(fname)-1); if (fname[0] == '\0') @@ -916,13 +927,13 @@ GetXGame(void) Game50 = 1; ZeroRPT(); InitializeStats(); - UpdateDisplay(0, 0, 1, 0); + dsp->UpdateDisplay(0, 0, 1, 0); Sdepth = 0; hint = 0; } -void +static void SaveXGame(void) { FILE *fd; @@ -931,7 +942,7 @@ SaveXGame(void) short sq, piece; short side, isp; - ShowMessage("Enter file name: "); + dsp->ShowMessage("Enter file name: "); RequestInputString(fname, sizeof(fname)-1); if (fname[0] == '\0') @@ -1002,7 +1013,7 @@ SaveXGame(void) } -void +static void BookSave(void) { FILE *fd; @@ -1013,7 +1024,7 @@ BookSave(void) strcpy(fname, savefile); } else { /* Enter file name */ - ShowMessage("Enter file name: "); + dsp->ShowMessage("Enter file name: "); RequestInputString(fname, sizeof(fname)-1); } @@ -1085,16 +1096,15 @@ BookSave(void) fclose(fd); - ShowMessage("Game saved"); + dsp->ShowMessage("Game saved"); } else { - ShowMessage("Could not open file"); + dsp->ShowMessage("Could not open file"); } } - void ListGame(void) { @@ -1222,8 +1232,7 @@ ListGame(void) } - -void +static void FlagMove(char c) { switch(c) @@ -1245,13 +1254,11 @@ FlagMove(char c) } - - /* * Undo the most recent half-move. */ -void +static void Undo(void) { short f, t; @@ -1300,15 +1307,14 @@ Undo(void) flag.mate = false; Sdepth = 0; player = player ^ 1; - ShowSidetoMove(); - UpdateDisplay(0, 0, 1, 0); + dsp->ShowSidetoMove(); + dsp->UpdateDisplay(0, 0, 1, 0); if (flag.regularstart) Book = false; } - void FlagString(unsigned short flags, char *s) { @@ -1361,8 +1367,7 @@ FlagString(unsigned short flags, char *s) } - -void +static void TestSpeed(void(*f)(short side, short ply, short in_check, short blockable), unsigned j) @@ -1412,15 +1417,14 @@ TestSpeed(void(*f)(short side, short ply, else et = 1; - ShowNodeCnt(cnt); + dsp->ShowNodeCnt(cnt); } - -void +static void TestPSpeed(short(*f) (short side), unsigned j) { - short i; + unsigned i; long cnt, t1, t2; #ifdef HAVE_GETTIMEOFDAY struct timeval tv; @@ -1450,24 +1454,22 @@ TestPSpeed(short(*f) (short side), unsigned j) else et = 1; - ShowNodeCnt(cnt); + dsp->ShowNodeCnt(cnt); } - -void -SetOppTime(char *s) +static void +SetOppTime(char *time) { - char *time; int m, t, sec; sec = 0; - time = &s[strlen("otime")]; t = (int)strtol(time, &time, 10); if (*time == ':') { time++; + /* FIXME: sec is parsed but ignored */ sec = (int)strtol(time, &time, 10); } @@ -1489,20 +1491,18 @@ SetOppTime(char *s) } - -void -SetMachineTime(char *s) +static void +SetMachineTime(char *time) { - char *time; int m, t, sec; - time = &s[strlen("time")]; sec = 0; t = (int)strtol(time, &time, 10); if (*time == ':') { time++; + /* FIXME: sec is parsed but ignored */ sec = (int)strtol(time, &time, 10); } @@ -1524,24 +1524,19 @@ SetMachineTime(char *s) } - - - /* FIXME! This is truly the function from hell! */ /* * Process the user's command. If easy mode is OFF (the computer is thinking * on opponents time) and the program is out of book, then make the 'hint' * move on the board and call SelectMove() to find a response. The user - * terminates the search by entering ^C (quit siqnal) before entering a - * command. If the opponent does not make the hint move, then set Sdepth to - * zero. + * terminates the search by entering a command. If the opponent does not make + * the hint move, then set Sdepth to zero. */ void InputCommand(char *command) { - int eof = 0; short have_shown_prompt = false; short ok, done, is_move = false; unsigned short mv; @@ -1568,10 +1563,8 @@ InputCommand(char *command) algbr((short) hint >> 8, (short) hint & 0xff, false); strcpy(s, mvstr[0]); -#if !defined NOPOST if (flag.post) - GiveHint(); -#endif + dsp->GiveHint(); /* do the hint move */ if (VerifyMove(s, VERIFY_AND_TRY_MODE, &mv)) @@ -1579,7 +1572,7 @@ InputCommand(char *command) Sdepth = 0; #ifdef QUIETBACKGROUND - ShowPrompt(); + dsp->ShowPrompt(); have_shown_prompt = true; #endif /* QUIETBACKGROUND */ @@ -1626,7 +1619,7 @@ InputCommand(char *command) { #endif /* QUIETBACKGROUND */ - ShowPrompt(); + dsp->ShowPrompt(); #ifdef QUIETBACKGROUND } @@ -1635,21 +1628,16 @@ InputCommand(char *command) #endif /* QUIETBACKGROUND */ if (command == NULL) { - if (NOT_CURSES) - s[0] = '\0'; - - eof = GetString(sx); + int eof = dsp->GetString(sx); + if (eof) + dsp->ExitShogi(); } else { strcpy(sx, command); done = true; } - sscanf(sx, "%s", s); - - if (eof) - ExitShogi(); - - if (s[0] == '\0') + /* extract first word */ + if (sscanf(sx, "%s", s) < 1) continue; if (strcmp(s, "bd") == 0) /* bd -- display board */ @@ -1660,8 +1648,8 @@ InputCommand(char *command) if (old_xshogi) display_type = DISPLAY_RAW; - ClearScreen(); - UpdateDisplay(0, 0, 1, 0); + dsp->ClearScreen(); + dsp->UpdateDisplay(0, 0, 1, 0); if (old_xshogi) display_type = DISPLAY_X; @@ -1672,27 +1660,21 @@ InputCommand(char *command) } else if (strcmp(s, "alg") == 0) { - /* noop */ ; /* alg */ + /* noop */ ; } else if ((strcmp(s, "quit") == 0) || (strcmp(s, "exit") == 0)) { flag.quit = true; } -#if !defined NOPOST - else if (strcmp(s, "post") == 0) - { - flag.post = !flag.post; - } -#endif else if ((strcmp(s, "set") == 0) || (strcmp(s, "edit") == 0)) { - EditBoard(); + dsp->EditBoard(); } - else if ((strcmp(s, "setup") == 0)) + else if (strcmp(s, "setup") == 0) { - SetupBoard(); + dsp->SetupBoard(); } else if (strcmp(s, "first") == 0) { @@ -1716,7 +1698,7 @@ InputCommand(char *command) } else if (strcmp(s, "help") == 0) { - help(); + dsp->help(); } else if (strcmp(s, "material") == 0) { @@ -1742,16 +1724,19 @@ InputCommand(char *command) else if (strcmp(s, "new") == 0) { NewGame(); - UpdateDisplay(0, 0, 1, 0); + dsp->UpdateDisplay(0, 0, 1, 0); } else if (strcmp(s, "list") == 0) { ListGame(); } - else if ((strcmp(s, "level") == 0) - || (strcmp(s, "clock") == 0)) + else if (strcmp(s, "level") == 0) + { + dsp->SelectLevel(sx + strlen("level")); + } + else if (strcmp(s, "clock") == 0) { - SelectLevel(sx); + dsp->SelectLevel(sx + strlen("clock")); } else if (strcmp(s, "hash") == 0) { @@ -1767,19 +1752,19 @@ InputCommand(char *command) } else if (strcmp(s, "time") == 0) { - SetMachineTime(sx); + SetMachineTime(sx + strlen("time")); } else if (strcmp(s, "otime") == 0) { - SetOppTime(sx); + SetOppTime(sx + strlen("otime")); } else if (strcmp(s, "Awindow") == 0) { - ChangeAlphaWindow(); + dsp->ChangeAlphaWindow(); } else if (strcmp(s, "Bwindow") == 0) { - ChangeBetaWindow(); + dsp->ChangeBetaWindow(); } else if (strcmp(s, "rcptr") == 0) { @@ -1787,7 +1772,7 @@ InputCommand(char *command) } else if (strcmp(s, "hint") == 0) { - GiveHint(); + dsp->GiveHint(); } else if (strcmp(s, "both") == 0) { @@ -1801,8 +1786,8 @@ InputCommand(char *command) else if (strcmp(s, "reverse") == 0) { flag.reverse = !flag.reverse; - ClearScreen(); - UpdateDisplay(0, 0, 1, 0); + dsp->ClearScreen(); + dsp->UpdateDisplay(0, 0, 1, 0); } else if (strcmp(s, "switch") == 0) { @@ -1880,11 +1865,15 @@ InputCommand(char *command) } else if (strcmp(s, "depth") == 0) { - ChangeSearchDepth(); + dsp->ChangeSearchDepth(sx + strlen("depth")); + } + else if (strcmp(s, "sd") == 0) + { + dsp->ChangeSearchDepth(sx + strlen("sd")); } else if (strcmp(s, "hashdepth") == 0) { - ChangeHashDepth(); + dsp->ChangeHashDepth(); } else if (strcmp(s, "random") == 0) { @@ -1904,26 +1893,26 @@ InputCommand(char *command) } else if (strcmp(s, "contempt") == 0) { - SetContempt(); + dsp->SetContempt(); } else if (strcmp(s, "xwndw") == 0) { - ChangeXwindow(); + dsp->ChangeXwindow(); } else if (strcmp(s, "rv") == 0) { flag.rv = !flag.rv; - UpdateDisplay(0, 0, 1, 0); + dsp->UpdateDisplay(0, 0, 1, 0); } else if (strcmp(s, "coords") == 0) { flag.coords = !flag.coords; - UpdateDisplay(0, 0, 1, 0); + dsp->UpdateDisplay(0, 0, 1, 0); } else if (strcmp(s, "stars") == 0) { flag.stars = !flag.stars; - UpdateDisplay(0, 0, 1, 0); + dsp->UpdateDisplay(0, 0, 1, 0); } else if (!XSHOGI && strcmp(s, "moves") == 0) { @@ -1941,44 +1930,44 @@ InputCommand(char *command) #endif SwagHt = 0; - ShowMessage("Testing MoveList Speed"); + dsp->ShowMessage("Testing MoveList Speed"); temp = generate_move_flags; generate_move_flags = true; TestSpeed(MoveList, 1); generate_move_flags = temp; - ShowMessage("Testing CaptureList Speed"); + dsp->ShowMessage("Testing CaptureList Speed"); TestSpeed(CaptureList, 1); - ShowMessage("Testing Eval Speed"); + dsp->ShowMessage("Testing Eval Speed"); ExaminePosition(opponent); TestPSpeed(ScorePosition, 1); } else if (!XSHOGI && strcmp(s, "test") == 0) { #ifdef SLOW_CPU - ShowMessage("Testing MoveList Speed"); + dsp->ShowMessage("Testing MoveList Speed"); TestSpeed(MoveList, 2000); - ShowMessage("Testing CaptureList Speed"); + dsp->ShowMessage("Testing CaptureList Speed"); TestSpeed(CaptureList, 3000); - ShowMessage("Testing Eval Speed"); + dsp->ShowMessage("Testing Eval Speed"); ExaminePosition(opponent); TestPSpeed(ScorePosition, 1500); #else - ShowMessage("Testing MoveList Speed"); + dsp->ShowMessage("Testing MoveList Speed"); TestSpeed(MoveList, 20000); - ShowMessage("Testing CaptureList Speed"); + dsp->ShowMessage("Testing CaptureList Speed"); TestSpeed(CaptureList, 30000); - ShowMessage("Testing Eval Speed"); + dsp->ShowMessage("Testing Eval Speed"); ExaminePosition(opponent); TestPSpeed(ScorePosition, 15000); #endif } else if (!XSHOGI && strcmp(s, "p") == 0) { - ShowPostnValues(); + dsp->ShowPostnValues(); } else if (!XSHOGI && strcmp(s, "debug") == 0) { - DoDebug(); + dsp->DoDebug(); } else { @@ -1994,7 +1983,7 @@ InputCommand(char *command) if (rpt >= 3) { DRAW = DRAW_REPETITION; - ShowMessage(DRAW); + dsp->ShowMessage(DRAW); GameList[GameCnt].flags |= draw; flag.mate = true; @@ -2027,8 +2016,6 @@ InputCommand(char *command) } #ifdef notdef /* optional pass best line to frontend with move */ -# if !defined NOPOST - if (flag.post && !flag.mate) { int i; @@ -2041,15 +2028,12 @@ InputCommand(char *command) printf("%5s ", mvstr[0]); } } -# endif printf("\n"); #endif } } - - void SetTimeControl(void) { @@ -2069,4 +2053,3 @@ SetTimeControl(void) et = 0; ElapsedTime(COMPUTE_AND_INIT_MODE); } -