X-Git-Url: http://winboard.nl/cgi-bin?p=gnushogi.git;a=blobdiff_plain;f=gnushogi%2Frawdsp.c;h=588f13f74da33b2bc85025057a4d88104a339419;hp=54bb7a1e16fee4205959e6e899a903252edde1cb;hb=7496586755298a8115a3988a8b52b32d41a4dcb7;hpb=3abc03f7170b55bfcf97c4009abb570f62e48a24 diff --git a/gnushogi/rawdsp.c b/gnushogi/rawdsp.c index 54bb7a1..588f13f 100644 --- a/gnushogi/rawdsp.c +++ b/gnushogi/rawdsp.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -42,57 +43,48 @@ #endif #include "gnushogi.h" -#include "rawdsp.h" -unsigned short MV[MAXDEPTH]; -int MSCORE; - -int mycnt1, mycnt2; -char *DRAW; -extern char *InPtr; -extern short pscore[]; +/**************************************** + * forward declarations + ****************************************/ +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) @@ -100,7 +92,7 @@ Raw_ShowGameType(void) } -void +static void Raw_ShowLine(unsigned short *bstline) { int i; @@ -118,7 +110,7 @@ Raw_ShowLine(unsigned short *bstline) } -void +static void Raw_ShowMessage(char *s) { if (!XSHOGI) @@ -126,41 +118,54 @@ Raw_ShowMessage(char *s) } -void -Raw_AlwaysShowMessage(const char *format, va_list ap) +static void +Raw_AlwaysShowMessage(const char *format, ...) { + va_list ap; + va_start(ap, format); vprintf(format, ap); printf("\n"); + va_end(ap); } -void -Raw_Printf(const char *format, va_list ap) +static void +Raw_Printf(const char *format, ...) { + va_list ap; + va_start(ap, format); vprintf(format, ap); + va_end(ap); } -void +static void Raw_doRequestInputString(const char* fmt, char* buffer) { scanf(fmt, buffer); } -int +static int Raw_GetString(char* sx) { int eof = 0; + char *nl; sx[0] = '\0'; while(!eof && !sx[0]) eof = (fgets(sx, 80, stdin) == NULL); + + /* remove any trailing newline */ + nl = strchr(sx, '\n'); + if (nl) + nl[0] = '\0'; + return eof; } -void +static void Raw_ShowNodeCnt(long NodeCnt) { printf("Nodes = %ld Nodes/sec = %ld\n", @@ -168,7 +173,7 @@ Raw_ShowNodeCnt(long NodeCnt) } -void +static void Raw_ShowPatternCount(short side, short n) { if (flag.post) @@ -176,13 +181,13 @@ Raw_ShowPatternCount(short side, short n) } -void +static void Raw_ShowResponseTime(void) { } -void +static void Raw_ShowResults(short score, unsigned short *bstline, char ch) { if (flag.post && !XSHOGI) @@ -195,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); @@ -213,7 +218,7 @@ Raw_ShowStage(void) * End of trivial output routines. ****************************************/ -void +static void Raw_Initialize(void) { mycnt1 = mycnt2 = 0; @@ -245,7 +250,7 @@ Raw_Initialize(void) } -void +static void Raw_ExitShogi(void) { /* CHECKME: what purpose does this next statement serve? */ @@ -258,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 @@ -285,35 +277,53 @@ Raw_TerminateSearch(int sig) } -void +static void Raw_help(void) { Raw_ClearScreen(); printf("GNU Shogi %s command summary\n", PACKAGE_VERSION); - printf("----------------------------------" - "------------------------------\n"); - fputs ("7g7f move from 7g to 7f quit Exit Shogi\n", stdout); - printf("S6h move silver to 6h beep turn %s\n", (flag.beep) ? "OFF" : "ON"); - printf("2d2c+ move to 2c and promote material turn %s\n", (flag.material) ? "OFF" : "ON"); - printf("P*5e drop pawn to 5e easy turn %s\n", (flag.easy) ? "OFF" : "ON"); - printf("tsume toggle tsume mode hash turn %s\n", (flag.hash) ? "OFF" : "ON"); - fputs ("bd redraw board reverse board display\n", stdout); - printf("list game to shogi.lst book turn %s used %d of %d\n", (Book) ? "OFF" : "ON", bookcount, booksize); - fputs ("undo undo last ply remove take back a move\n", stdout); - fputs ("edit edit board force toggle manual move mode\n", stdout); - fputs ("switch sides with computer both computer match\n", stdout); - fputs ("black computer plays black white computer plays white\n", stdout); - fputs ("depth set search depth clock set time control\n", stdout); - fputs ("post principle variation hint suggest a move\n", stdout); - fputs ("save game to file get game from file\n", stdout); - printf("xsave pos. to xshogi file xget" - " pos. from xshogi file\n"); - fputs("random randomize play new start new game\n", stdout); - printf("--------------------------------" - "--------------------------------\n"); + printf("----------------------------------------------------------------\n"); + printf("7g7f move from 7g to 7f quit Exit Shogi\n"); + printf("S6h move silver to 6h beep turn %s\n", + (flag.beep) ? "OFF" : "ON"); + printf("2d2c+ move to 2c and promote material turn %s\n", + (flag.material) ? "OFF" : "ON"); + printf("P*5e drop pawn to 5e easy turn %s\n", + (flag.easy) ? "OFF" : "ON"); + printf("tsume toggle tsume mode hash turn %s\n", + (flag.hash) ? "OFF" : "ON"); + printf("bd redraw board reverse board display\n"); + printf("list game to shogi.lst book turn %s used %d of %d\n", + (Book) ? "OFF" : "ON", bookcount, booksize); + printf("undo undo last ply remove take back a move\n"); + 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("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"); + printf("random randomize play new start new game\n"); + printf("setup first \n"); + printf("go computer plays now material turn %s\n", + flag.material ? "OFF" : "ON"); + printf("level time control gamein \n"); + printf("time set engine clock otime set opponent clock\n"); + printf("Awindow Bwindow \n"); + printf("rcptr turn %3s bsave book save\n", + flag.rcptr ? "OFF" : "ON "); + printf("hashdepth hard turn easy OFF\n"); + printf("contempt xwndw \n"); + printf("rv turn %3s coords turn %s\n", + flag.rv ? "OFF" : "ON ", flag.coords ? "OFF" : "ON"); + printf("stars turn %3s moves \n", + flag.stars ? "OFF" : "ON "); + printf("test p \n"); + printf("debug depth alias for 'sd'\n"); + printf("----------------------------------------------------------------\n"); printf("Computer: %-12s Opponent: %s\n", ColorStr[computer], ColorStr[opponent]); - printf("Depth: %-12d Response time: %d sec\n", + printf("Depth: %-12d Response time: %ld sec\n", MaxSearchDepth, MaxResponseTime/100); printf("Random: %-12s Easy mode: %s\n", (dither) ? "ON" : "OFF", (flag.easy) ? "ON" : "OFF"); @@ -321,7 +331,7 @@ Raw_help(void) (flag.beep) ? "ON" : "OFF", (flag.hash) ? "ON" : "OFF"); printf("Tsume: %-12s Force: %s\n", (flag.tsume) ? "ON" : "OFF", (flag.force) ? "ON" : "OFF"); - printf("Time Control %s %d moves %d sec %d add %d depth\n", + printf("Time Control %s %d moves %ld sec %d add %d depth\n", (TCflag) ? "ON" : "OFF", TimeControl.moves[black], TimeControl.clock[black] / 100, TCadd/100, MaxSearchDepth); @@ -332,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; @@ -437,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; @@ -487,7 +497,7 @@ Raw_SetupBoard(void) } -void +static void Raw_SearchStartStuff(short side) { if (flag.post) @@ -499,7 +509,7 @@ Raw_SearchStartStuff(short side) } -void +static void Raw_OutputMove(void) { if (flag.illegal) @@ -512,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)) @@ -565,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)) - { + else if (!XSHOGI && (root->score < -SCORE_LIMIT)) printf("%s has a forced mate in %d moves!\n", ColorStr[opponent], SCORE_LIMIT + 999 + root->score - 1); - } - else if (!barebones && (root->score > SCORE_LIMIT)) - { + else if (!XSHOGI && (root->score > SCORE_LIMIT)) printf("%s has a forced mate in %d moves!\n", 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) { @@ -656,7 +652,7 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec) } -void +static void Raw_ChangeAlphaWindow(void) { printf("WAwindow: "); @@ -666,7 +662,7 @@ Raw_ChangeAlphaWindow(void) } -void +static void Raw_ChangeBetaWindow(void) { printf("WBwindow: "); @@ -676,7 +672,7 @@ Raw_ChangeBetaWindow(void) } -void +static void Raw_GiveHint(void) { if (hint) @@ -689,31 +685,20 @@ Raw_GiveHint(void) } -void +static void Raw_SelectLevel(char *sx) { + /* FIXME: NO_SQUARES is nonsense here */ + char T[NO_SQUARES + 1], *p; - char T[NO_SQUARES + 1], *p, *q; - - if ((p = strstr(sx, "level")) != NULL) - p += strlen("level"); - else if ((p = strstr(sx, "clock")) != NULL) - p += strlen("clock"); - - strcat(sx, "XX"); - q = T; - *q = '\0'; + strncpy(T, sx, NO_SQUARES); + T[NO_SQUARES] = '\0'; - for (; *p != 'X'; *q++ = *p++); - - *q = '\0'; - - /* line empty ask for input */ + /* if line empty, ask for input */ if (!T[0]) { fputs("Enter #moves #minutes: ", stdout); fgets(T, NO_SQUARES + 1, stdin); - strcat(T, "XX"); } /* skip blackspace */ @@ -723,6 +708,7 @@ Raw_SelectLevel(char *sx) if (*p == 'f') { /* its a fischer clock game */ + char *q; p++; TCminutes = (short)strtol(p, &q, 10); TCadd = (short)strtol(q, NULL, 10) *100; @@ -732,6 +718,7 @@ Raw_SelectLevel(char *sx) else { /* regular game */ + char *q; TCadd = 0; TCmoves = (short)strtol(p, &q, 10); TCminutes = (short)strtol(q, &q, 10); @@ -771,16 +758,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 = "); @@ -790,7 +783,7 @@ Raw_ChangeHashDepth(void) } -void +static void Raw_SetContempt(void) { printf("contempt = "); @@ -798,7 +791,7 @@ Raw_SetContempt(void) } -void +static void Raw_ChangeXwindow(void) { printf("xwndw = "); @@ -810,11 +803,10 @@ Raw_ChangeXwindow(void) * Raw_ShowPostnValue(short sq) * must have called ExaminePosition() first */ -void +static void Raw_ShowPostnValue(short sq) { - short score; - score = ScorePosition(color[sq]); + (void) ScorePosition(color[sq]); if (color[sq] != neutral) { @@ -831,7 +823,7 @@ Raw_ShowPostnValue(short sq) } -void +static void Raw_DoDebug(void) { short c, p, sq, tp, tc, tsq, score, j, k; @@ -909,7 +901,7 @@ Raw_DoDebug(void) } -void +static void Raw_DoTable(short table[NO_SQUARES]) { short sq, j, k; @@ -928,7 +920,7 @@ Raw_DoTable(short table[NO_SQUARES]) } -void +static void Raw_ShowPostnValues(void) { short sq, score, j, k; @@ -953,7 +945,7 @@ Raw_ShowPostnValues(void) } -void +static void Raw_PollForInput(void) { #ifdef WIN32 @@ -961,12 +953,12 @@ Raw_PollForInput(void) if (!PeekNamedPipe(GetStdHandle(STD_INPUT_HANDLE), NULL, 0, NULL, &cnt, NULL)) cnt = 1; #else - static struct pollfd pollfds[1] = { /* [0] = */ { /* .fd = */ STDIN_FILENO, - /* .events = */ POLLIN } }; + static struct pollfd pollfds[1] = { [0] = { .fd = STDIN_FILENO, + .events = POLLIN } }; int cnt = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 0); if (cnt < 0) { perror("polling standard input"); - ExitShogi(); + Raw_ExitShogi(); } #endif if (cnt) { /* if anything to read, or error occured */ @@ -975,3 +967,47 @@ Raw_PollForInput(void) flag.bothsides = false; } } + +struct display raw_display = +{ + .ChangeAlphaWindow = Raw_ChangeAlphaWindow, + .ChangeBetaWindow = Raw_ChangeBetaWindow, + .ChangeHashDepth = Raw_ChangeHashDepth, + .ChangeSearchDepth = Raw_ChangeSearchDepth, + .ChangeXwindow = Raw_ChangeXwindow, + .ClearScreen = Raw_ClearScreen, + .DoDebug = Raw_DoDebug, + .DoTable = Raw_DoTable, + .EditBoard = Raw_EditBoard, + .ExitShogi = Raw_ExitShogi, + .GiveHint = Raw_GiveHint, + .Initialize = Raw_Initialize, + .ShowNodeCnt = Raw_ShowNodeCnt, + .OutputMove = Raw_OutputMove, + .PollForInput = Raw_PollForInput, + .SetContempt = Raw_SetContempt, + .SearchStartStuff = Raw_SearchStartStuff, + .SelectLevel = Raw_SelectLevel, + .ShowCurrentMove = Raw_ShowCurrentMove, + .ShowDepth = Raw_ShowDepth, + .ShowGameType = Raw_ShowGameType, + .ShowLine = Raw_ShowLine, + .ShowMessage = Raw_ShowMessage, + .AlwaysShowMessage = Raw_AlwaysShowMessage, + .Printf = Raw_Printf, + .doRequestInputString = Raw_doRequestInputString, + .GetString = Raw_GetString, + .SetupBoard = Raw_SetupBoard, + .ShowPatternCount = Raw_ShowPatternCount, + .ShowPostnValue = Raw_ShowPostnValue, + .ShowPostnValues = Raw_ShowPostnValues, + .ShowPrompt = Raw_ShowPrompt, + .ShowResponseTime = Raw_ShowResponseTime, + .ShowResults = Raw_ShowResults, + .ShowSidetoMove = Raw_ShowSidetoMove, + .ShowStage = Raw_ShowStage, + .TerminateSearch = Raw_TerminateSearch, + .UpdateClocks = Raw_UpdateClocks, + .UpdateDisplay = Raw_UpdateDisplay, + .help = Raw_help, +};