X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Frawdsp.c;h=5f04dca4a3510145d803dc192937fde0b87e8da4;hb=6462b833d86f80fa7b633a87d57af3d53625e1c5;hp=b73bd0abb79cfe627d5c62fe2ba7d85e6c55537f;hpb=949b99b045640dc69303dab9d34c3522baa19caf;p=gnushogi.git diff --git a/gnushogi/rawdsp.c b/gnushogi/rawdsp.c index b73bd0a..5f04dca 100644 --- a/gnushogi/rawdsp.c +++ b/gnushogi/rawdsp.c @@ -4,6 +4,7 @@ * ---------------------------------------------------------------------- * Copyright (c) 1993, 1994, 1995 Matthias Mutz * Copyright (c) 1999 Michael Vanier and the Free Software Foundation + * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation * * GNU SHOGI is based on GNU CHESS * @@ -43,60 +44,47 @@ #include "gnushogi.h" -unsigned short MV[MAXDEPTH]; -int MSCORE; - -int mycnt1, mycnt2; -char *DRAW; -extern char *InPtr; -extern short pscore[]; - /**************************************** * forward declarations ****************************************/ -void Raw_UpdateDisplay(short f, short t, short redraw, short isspec); +static void Raw_UpdateDisplay(short f, short t, short redraw, short isspec); /**************************************** * Trivial output functions. ****************************************/ -void +static void Raw_ClearScreen(void) { - if (!barebones && !XSHOGI) + if (!XSHOGI) printf("\n"); } -void +static void Raw_ShowPrompt(void) { - if (!barebones && !XSHOGI) - { + if (!XSHOGI) fputs("\nYour move is? ", stdout); - } } -void +static void Raw_ShowCurrentMove(short pnt, short f, short t) { } -void +static void Raw_ShowDepth(char ch) { - if (!barebones && !XSHOGI) - { - printf("Depth= %d%c ", Sdepth, ch); - printf("\n"); - } + if (!XSHOGI) + printf("Depth= %d%c \n", Sdepth, ch); } -void +static void Raw_ShowGameType(void) { if (flag.post) @@ -104,7 +92,7 @@ Raw_ShowGameType(void) } -void +static void Raw_ShowLine(unsigned short *bstline) { int i; @@ -122,7 +110,7 @@ Raw_ShowLine(unsigned short *bstline) } -void +static void Raw_ShowMessage(char *s) { if (!XSHOGI) @@ -130,7 +118,7 @@ Raw_ShowMessage(char *s) } -void +static void Raw_AlwaysShowMessage(const char *format, ...) { va_list ap; @@ -141,7 +129,7 @@ Raw_AlwaysShowMessage(const char *format, ...) } -void +static void Raw_Printf(const char *format, ...) { va_list ap; @@ -151,14 +139,14 @@ Raw_Printf(const char *format, ...) } -void +static void Raw_doRequestInputString(const char* fmt, char* buffer) { scanf(fmt, buffer); } -int +static int Raw_GetString(char* sx) { int eof = 0; @@ -177,7 +165,7 @@ Raw_GetString(char* sx) } -void +static void Raw_ShowNodeCnt(long NodeCnt) { printf("Nodes = %ld Nodes/sec = %ld\n", @@ -185,24 +173,24 @@ Raw_ShowNodeCnt(long NodeCnt) } -void +static void Raw_ShowPatternCount(short side, short n) { if (flag.post) - printf("%s matches %d pattern(s)\n", ColorStr[side], n); + printf("%s%s matches %d pattern(s)\n", xboard ? "# " : "" , ColorStr[side], n); } -void +static void Raw_ShowResponseTime(void) { } -void +static void Raw_ShowResults(short score, unsigned short *bstline, char ch) { - if (flag.post && !XSHOGI) + if (flag.post && (xboard || !XSHOGI)) { ElapsedTime(2); printf("%2d%c %6d %4ld %8ld ", @@ -212,13 +200,13 @@ Raw_ShowResults(short score, unsigned short *bstline, char ch) } -void +static void Raw_ShowSidetoMove(void) { } -void +static void Raw_ShowStage(void) { printf("stage = %d\n", stage); @@ -230,7 +218,7 @@ Raw_ShowStage(void) * End of trivial output routines. ****************************************/ -void +static void Raw_Initialize(void) { mycnt1 = mycnt2 = 0; @@ -241,13 +229,13 @@ Raw_Initialize(void) /* needed because of inconsistency between MSVC run-time system and gcc includes */ setbuf(stdout, NULL); #else -#ifdef HAVE_SETLINEBUF - setlinebuf(stdout); -#else -# ifdef HAVE_SETVBUF +#ifdef HAVE_SETVBUF setvbuf(stdout, NULL, _IOLBF, BUFSIZ); +#else +# ifdef HAVE_SETLINEBUF + setlinebuf(stdout); # else -# error "Need setlinebuf() or setvbuf() to compile gnushogi!" +# error "Need setvbuf() or setlinebuf() to compile gnushogi!" # endif #endif #endif @@ -262,7 +250,7 @@ Raw_Initialize(void) } -void +static void Raw_ExitShogi(void) { /* CHECKME: what purpose does this next statement serve? */ @@ -275,20 +263,7 @@ Raw_ExitShogi(void) } -void -Raw_Die(int sig) -{ - char s[80]; - - Raw_ShowMessage("Abort? "); - scanf("%s", s); - - if (strcmp(s, "yes") == 0) - Raw_ExitShogi(); -} - - -void +static void Raw_TerminateSearch(int sig) { #ifdef INTERRUPT_TEST @@ -302,7 +277,7 @@ Raw_TerminateSearch(int sig) } -void +static void Raw_help(void) { Raw_ClearScreen(); @@ -324,7 +299,7 @@ Raw_help(void) printf("edit edit board force toggle manual move mode\n"); printf("switch sides with computer both computer match\n"); printf("black computer plays black white computer plays white\n"); - printf("depth set search depth clock set time control\n"); + printf("sd set search depth clock set time control\n"); printf("post principle variation hint suggest a move\n"); printf("save game to file get game from file\n"); printf("xsave pos. to xshogi file xget pos. from xshogi file\n"); @@ -344,7 +319,7 @@ Raw_help(void) printf("stars turn %3s moves \n", flag.stars ? "OFF" : "ON "); printf("test p \n"); - printf("debug \n"); + printf("debug depth alias for 'sd'\n"); printf("----------------------------------------------------------------\n"); printf("Computer: %-12s Opponent: %s\n", ColorStr[computer], ColorStr[opponent]); @@ -367,7 +342,7 @@ Raw_help(void) * Set up a board position. Pieces are entered by typing the piece followed * by the location. For example, Nf3 will place a knight on square f3. */ -void +static void Raw_EditBoard(void) { short a, r, c, sq, i, found; @@ -377,18 +352,21 @@ Raw_EditBoard(void) Book = BOOKFAIL; Raw_ClearScreen(); Raw_UpdateDisplay(0, 0, 1, 0); - fputs(". Exit to main\n", stdout); - fputs("# Clear board\n", stdout); - fputs("c Change sides\n", stdout); - fputs("enter piece & location: \n", stdout); + printf(". Exit to main\n"); + printf("# Clear board\n"); + printf("c Change sides\n"); + printf("enter piece & location:\n"); a = black; - do + while(1) { scanf("%s", s); found = 0; + if (s[0] == '.') + break; + if (s[0] == '#') { for (sq = 0; sq < NO_SQUARES; sq++) @@ -398,10 +376,13 @@ Raw_EditBoard(void) } ClearCaptured(); + continue; } - if (s[0] == 'c') + if (s[0] == 'c') { a = otherside[a]; + continue; + } if (s[1] == '*') { @@ -414,41 +395,39 @@ Raw_EditBoard(void) break; } } - - c = -1; - r = -1; + if (!found) + printf("# Invalid piece type '%c'\n", s[0]); + continue; } - else - { - c = COL_NAME(s[1]); - r = ROW_NAME(s[2]); + + c = COL_NUM(s[1]); + r = ROW_NUM(s[2]); + + if ((c < 0) || (c >= NO_COLS) || (r < 0) || (r >= NO_ROWS)) { + printf("# Out-of-board position '%c%c'\n", s[1], s[2]); + continue; } - if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS)) - { - sq = locn(r, c); - color[sq] = a; - board[sq] = no_piece; + sq = locn(r, c); - for (i = no_piece; i <= king; i++) + for (i = no_piece; i <= king; i++) + { + if ((s[0] == pxx[i]) || (s[0] == qxx[i])) { - if ((s[0] == pxx[i]) || (s[0] == qxx[i])) - { - if (s[3] == '+') - board[sq] = promoted[i]; - else - board[sq] = i; + color[sq] = a; + if (s[3] == '+') + board[sq] = promoted[i]; + else + board[sq] = i; - found = 1; - break; - } + found = 1; + break; } - - if (found == 0) - color[sq] = neutral; } + + if (!found) + printf("# Invalid piece type '%c'\n", s[0]); } - while (s[0] != '.'); for (sq = 0; sq < NO_SQUARES; sq++) Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0); @@ -468,7 +447,7 @@ Raw_EditBoard(void) * Nine lines of nine characters are used to setup the board. 9a-1a is the * first line. White pieces are represented by uppercase characters. */ -void +static void Raw_SetupBoard(void) { short r, c, sq, i; @@ -518,7 +497,7 @@ Raw_SetupBoard(void) } -void +static void Raw_SearchStartStuff(short side) { if (flag.post) @@ -530,7 +509,7 @@ Raw_SearchStartStuff(short side) } -void +static void Raw_OutputMove(void) { if (flag.illegal) @@ -543,15 +522,11 @@ Raw_OutputMove(void) goto nomove; if (XSHOGI) - { /* add remaining time in milliseconds to xshogi */ printf("%d. ... %s %ld\n", ++mycnt1, mvstr[0], (TimeControl.clock[player] - et) * 10); - } else - { printf("%d. ... %s\n", ++mycnt1, mvstr[0]); - } nomove: if ((root->flags & draw) || (root->score == -(SCORE_LIMIT + 999)) @@ -596,39 +571,29 @@ Raw_OutputMove(void) summary: if (root->flags & draw) - { fputs("Drawn game!\n", stdout); - } else if (root->score == -(SCORE_LIMIT + 999)) - { printf("%s mates!\n", ColorStr[opponent]); - } else if (root->score == (SCORE_LIMIT + 998)) - { printf("%s mates!\n", ColorStr[computer]); - } #ifdef VERYBUGGY - else if (!barebones && (root->score < -SCORE_LIMIT)) - { - printf("%s has a forced mate in %d moves!\n", + else if (!XSHOGI && (root->score < -SCORE_LIMIT)) + printf("%s%s has a forced mate in %d moves!\n", xboard ? "# " : "", ColorStr[opponent], SCORE_LIMIT + 999 + root->score - 1); - } - else if (!barebones && (root->score > SCORE_LIMIT)) - { - printf("%s has a forced mate in %d moves!\n", + else if (!XSHOGI && (root->score > SCORE_LIMIT)) + printf("%s%s has a forced mate in %d moves!\n", xboard ? "# " : "", ColorStr[computer], SCORE_LIMIT + 998 - root->score - 1); - } #endif /* VERYBUGGY */ } -void +static void Raw_UpdateClocks(void) { } -void +static void Raw_UpdateDisplay(short f, short t, short redraw, short isspec) { @@ -687,7 +652,7 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec) } -void +static void Raw_ChangeAlphaWindow(void) { printf("WAwindow: "); @@ -697,7 +662,7 @@ Raw_ChangeAlphaWindow(void) } -void +static void Raw_ChangeBetaWindow(void) { printf("WBwindow: "); @@ -707,7 +672,7 @@ Raw_ChangeBetaWindow(void) } -void +static void Raw_GiveHint(void) { if (hint) @@ -720,7 +685,7 @@ Raw_GiveHint(void) } -void +static void Raw_SelectLevel(char *sx) { /* FIXME: NO_SQUARES is nonsense here */ @@ -729,56 +694,67 @@ Raw_SelectLevel(char *sx) strncpy(T, sx, NO_SQUARES); T[NO_SQUARES] = '\0'; - /* if line empty, ask for input */ - if (!T[0]) - { - fputs("Enter #moves #minutes: ", stdout); - fgets(T, NO_SQUARES + 1, stdin); - } - - /* skip blackspace */ - for (p = T; *p == ' '; p++) ; - /* could be moves or a fischer clock */ - if (*p == 'f') - { - /* its a fischer clock game */ - char *q; - p++; - TCminutes = (short)strtol(p, &q, 10); - TCadd = (short)strtol(q, NULL, 10) *100; - TCseconds = 0; - TCmoves = 50; - } - else - { - /* regular game */ - char *q; - TCadd = 0; - TCmoves = (short)strtol(p, &q, 10); - TCminutes = (short)strtol(q, &q, 10); - - if (*q == ':') - TCseconds = (short)strtol(q + 1, (char **) NULL, 10); - else - TCseconds = 0; - -#ifdef OPERATORTIME - fputs("Operator time (hundredths) = ", stdout); - scanf("%hd", &OperatorTime); -#endif - - if (TCmoves == 0) + if (!xboard) { + /* if line empty, ask for input */ + if (!T[0]) { - TCflag = false; - MaxResponseTime = TCminutes*60L * 100L + TCseconds * 100L; - TCminutes = TCseconds = 0; + fputs("Enter #moves #minutes: ", stdout); + fgets(T, NO_SQUARES + 1, stdin); + } + + /* skip blackspace */ + for (p = T; *p == ' '; p++) ; + + /* could be moves or a fischer clock */ + if (*p == 'f') + { + /* its a fischer clock game */ + char *q; + p++; + TCminutes = (short)strtol(p, &q, 10); + TCadd = (short)strtol(q, NULL, 10) *100; + TCseconds = 0; + TCmoves = 50; } else { - TCflag = true; - MaxResponseTime = 0; + /* regular game */ + char *q; + TCadd = 0; + TCmoves = (short)strtol(p, &q, 10); + TCminutes = (short)strtol(q, &q, 10); + + if (*q == ':') + TCseconds = (short)strtol(q + 1, (char **) NULL, 10); + else + TCseconds = 0; + + #ifdef OPERATORTIME + fputs("Operator time (hundredths) = ", stdout); + scanf("%hd", &OperatorTime); + #endif + + if (TCmoves == 0) + { + TCflag = false; + MaxResponseTime = TCminutes*60L * 100L + TCseconds * 100L; + TCminutes = TCseconds = 0; + } + else + { + TCflag = true; + MaxResponseTime = 0; + } } + } else { + int min, sec=0, inc, mps; + /* parse regular "level MPS TC INC" command of WB protocol */ + sscanf(sx, "%d %d %d", &mps, &min, &inc) == 3 || + sscanf(sx, "%d %d:%d %d", &mps, &min, &sec, &inc); + TCminutes = min; TCseconds = sec; + TCadd = inc*100; TCmoves = mps ? mps : 50; + MaxResponseTime = 0; TCflag = true; } TimeControl.clock[black] = TimeControl.clock[white] = 0; @@ -793,16 +769,22 @@ Raw_SelectLevel(char *sx) } -void -Raw_ChangeSearchDepth(void) +static void +Raw_ChangeSearchDepth(char *sx) { - printf("depth = "); - scanf("%hd", &MaxSearchDepth); + char buf[80+1]; + strncpy(buf, sx, 80); buf[80] = '\0'; + /* if line empty, ask for input */ + if (!buf[0]) { + printf("depth = "); + fgets(buf, 80+1, stdin); + } + sscanf(buf, "%hd", &MaxSearchDepth); TCflag = !(MaxSearchDepth > 0); } -void +static void Raw_ChangeHashDepth(void) { printf("hashdepth = "); @@ -812,7 +794,7 @@ Raw_ChangeHashDepth(void) } -void +static void Raw_SetContempt(void) { printf("contempt = "); @@ -820,7 +802,7 @@ Raw_SetContempt(void) } -void +static void Raw_ChangeXwindow(void) { printf("xwndw = "); @@ -832,7 +814,7 @@ Raw_ChangeXwindow(void) * Raw_ShowPostnValue(short sq) * must have called ExaminePosition() first */ -void +static void Raw_ShowPostnValue(short sq) { (void) ScorePosition(color[sq]); @@ -852,7 +834,7 @@ Raw_ShowPostnValue(short sq) } -void +static void Raw_DoDebug(void) { short c, p, sq, tp, tc, tsq, score, j, k; @@ -930,7 +912,7 @@ Raw_DoDebug(void) } -void +static void Raw_DoTable(short table[NO_SQUARES]) { short sq, j, k; @@ -949,7 +931,7 @@ Raw_DoTable(short table[NO_SQUARES]) } -void +static void Raw_ShowPostnValues(void) { short sq, score, j, k; @@ -974,7 +956,7 @@ Raw_ShowPostnValues(void) } -void +static void Raw_PollForInput(void) { #ifdef WIN32