X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Frawdsp.c;h=6c8e654edb71fdf7abfbc39bd102ef7e6e5a4e08;hb=6cdb4afe21c8d0eb740a6a22a02a0adf922fddfc;hp=8d195ce8d1ce835b05f9ba4f25bd28ec75da0389;hpb=038b16407dd418cd990370408543b32ab9294e00;p=gnushogi.git diff --git a/gnushogi/rawdsp.c b/gnushogi/rawdsp.c index 8d195ce..6c8e654 100644 --- a/gnushogi/rawdsp.c +++ b/gnushogi/rawdsp.c @@ -2,11 +2,14 @@ * FILE: rawdsp.c * * ---------------------------------------------------------------------- - * - * Copyright (c) 2012 Free Software Foundation + * Copyright (c) 1993, 1994, 1995 Matthias Mutz + * Copyright (c) 1999 Michael Vanier and the Free Software Foundation * * GNU SHOGI is based on GNU CHESS * + * Copyright (c) 1988, 1989, 1990 John Stanback + * Copyright (c) 1992 Free Software Foundation + * * This file is part of GNU SHOGI. * * GNU Shogi is free software; you can redistribute it and/or modify it @@ -28,6 +31,7 @@ #include #include +#include #include #include #include @@ -56,14 +60,13 @@ Raw_ClearScreen(void) } -/* FIXME: change to ShowPrompt? */ void -PromptForMove(void) +Raw_ShowPrompt(void) { if (!barebones && !XSHOGI) { /* printf("\nYour move is? "); */ - printf(CP[124]); + fputs(CP[124], stdout); } } @@ -120,6 +123,54 @@ Raw_ShowMessage(char *s) void +Raw_AlwaysShowMessage(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vprintf(format, ap); + va_end(ap); + printf("\n"); +} + + +void +Raw_Printf(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vprintf(format, ap); + va_end(ap); +} + + +void +Raw_doRequestInputString(const char* fmt, char* buffer) +{ + scanf(fmt, buffer); +} + + +int +Raw_GetString(char* sx) +{ + int eof = 0; + sx[0] = '\0'; + + while(!eof && !sx[0]) + eof = (fgets(sx, 80, stdin) == NULL); + return eof; +} + + +void +Raw_ShowNodeCnt(long NodeCnt) +{ + printf(CP[91], + NodeCnt, (((et) ? ((NodeCnt * 100) / et) : 0))); +} + + +void Raw_ShowPatternCount(short side, short n) { if (flag.post) @@ -164,7 +215,6 @@ Raw_ShowStage(void) * End of trivial output routines. ****************************************/ - void Raw_Initialize(void) { @@ -192,7 +242,6 @@ Raw_Initialize(void) } - void Raw_ExitShogi(void) { @@ -201,6 +250,8 @@ Raw_ExitShogi(void) if (!nolist) ListGame(); + + exit(0); } @@ -217,7 +268,6 @@ Raw_Die(int sig) } - void Raw_TerminateSearch(int sig) { @@ -232,7 +282,6 @@ Raw_TerminateSearch(int sig) } - void Raw_help(void) { @@ -243,7 +292,7 @@ Raw_help(void) "------------------------------\n"); /* printf("7g7f move from 7g to 7f quit * Exit Shogi\n"); */ - printf(CP[158]); + fputs(CP[158], stdout); /* printf("S6h move silver to 6h beep * turn %s\n", (flag.beep) ? "off" : "on"); */ printf(CP[86], (flag.beep) ? CP[92] : CP[93]); @@ -257,36 +306,36 @@ Raw_help(void) printf(CP[174], (flag.hash) ? CP[92] : CP[93]); /* printf("bd redraw board reverse * board display\n"); */ - printf(CP[130]); + fputs(CP[130], stdout); /* printf("list game to shogi.lst book * turn %s used %d of %d\n", (Book) ? "off" : "on", bookcount); */ printf(CP[170], (Book) ? CP[92] : CP[93], bookcount, booksize); /* printf("undo undo last ply remove * take back a move\n"); */ - printf(CP[200]); + fputs(CP[200], stdout); /* printf("edit edit board force * enter game moves\n"); */ - printf(CP[153]); + fputs(CP[153], stdout); /* printf("switch sides with computer both * computer match\n"); */ - printf(CP[194]); + fputs(CP[194], stdout); /* printf("black computer plays black white * computer plays white\n"); */ - printf(CP[202]); + fputs(CP[202], stdout); /* printf("depth set search depth clock * set time control\n"); */ - printf(CP[149]); + fputs(CP[149], stdout); /* printf("post principle variation hint * suggest a move\n"); */ - printf(CP[177]); + fputs(CP[177], stdout); /* printf("save game to file get * game from file\n"); */ - printf(CP[188]); + fputs(CP[188], stdout); printf("xsave pos. to xshogi file xget" " pos. from xshogi file\n"); /* printf("random randomize play new * start new game\n"); */ - printf(CP[181]); + fputs(CP[181], stdout); printf("--------------------------------" "--------------------------------\n"); /* printf("Computer: %-12s Opponent: %s\n", */ @@ -310,17 +359,13 @@ Raw_help(void) (TCflag) ? CP[93] : CP[92], TimeControl.moves[black], TimeControl.clock[black] / 100, TCadd/100, MaxSearchDepth); - - signal(SIGUSR1, Raw_TerminateSearch); } - /* * 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 Raw_EditBoard(void) { @@ -332,13 +377,13 @@ Raw_EditBoard(void) Raw_ClearScreen(); Raw_UpdateDisplay(0, 0, 1, 0); /* printf(". exit to main\n"); */ - printf(CP[29]); + fputs(CP[29], stdout); /* printf("# clear board\n"); */ - printf(CP[28]); + fputs(CP[28], stdout); /* printf("c change sides\n"); */ - printf(CP[136]); + fputs(CP[136], stdout); /* printf("enter piece & location: \n"); */ - printf(CP[155]); + fputs(CP[155], stdout); a = black; @@ -378,8 +423,8 @@ Raw_EditBoard(void) } else { - c = '9' - s[1]; - r = 'i' - s[2]; + c = COL_NAME(s[1]); + r = ROW_NAME(s[2]); } if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS)) @@ -421,16 +466,13 @@ Raw_EditBoard(void) } - - /* * Set up a board position. * 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 -SetupBoard(void) +Raw_SetupBoard(void) { short r, c, sq, i; char ch; @@ -476,15 +518,13 @@ SetupBoard(void) Raw_ClearScreen(); Raw_UpdateDisplay(0, 0, 1, 0); /* printf("Setup successful\n"); */ - printf(CP[106]); + fputs(CP[106], stdout); } void Raw_SearchStartStuff(short side) { - signal(SIGUSR1, Raw_TerminateSearch); - if (flag.post) { printf(CP[123], @@ -494,7 +534,6 @@ Raw_SearchStartStuff(short side) } - void Raw_OutputMove(void) { @@ -568,7 +607,7 @@ Raw_OutputMove(void) if (root->flags & draw) { /* printf("Drawn game!\n"); */ - printf(CP[57]); + fputs(CP[57], stdout); } else if (root->score == -(SCORE_LIMIT + 999)) { @@ -653,7 +692,6 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec) } - void Raw_ChangeAlphaWindow(void) { @@ -664,7 +702,6 @@ Raw_ChangeAlphaWindow(void) } - void Raw_ChangeBetaWindow(void) { @@ -675,7 +712,6 @@ Raw_ChangeBetaWindow(void) } - void Raw_GiveHint(void) { @@ -685,11 +721,10 @@ Raw_GiveHint(void) printf(CP[72], mvstr[0]); /*hint*/ } else - printf(CP[223]); + fputs(CP[223], stdout); } - void Raw_SelectLevel(char *sx) { @@ -712,7 +747,7 @@ Raw_SelectLevel(char *sx) /* line empty ask for input */ if (!T[0]) { - printf(CP[61]); + fputs(CP[61], stdout); fgets(T, NO_SQUARES + 1, stdin); strcat(T, "XX"); } @@ -743,7 +778,7 @@ Raw_SelectLevel(char *sx) TCseconds = 0; #ifdef OPERATORTIME - printf(CP[94]); + fputs(CP[94], stdout); scanf("%hd", &OperatorTime); #endif @@ -772,8 +807,6 @@ Raw_SelectLevel(char *sx) } - - void Raw_ChangeSearchDepth(void) { @@ -783,8 +816,6 @@ Raw_ChangeSearchDepth(void) } - - void Raw_ChangeHashDepth(void) { @@ -795,7 +826,6 @@ Raw_ChangeHashDepth(void) } - void Raw_SetContempt(void) { @@ -804,7 +834,6 @@ Raw_SetContempt(void) } - void Raw_ChangeXwindow(void) { @@ -817,7 +846,6 @@ Raw_ChangeXwindow(void) * Raw_ShowPostnValue(short sq) * must have called ExaminePosition() first */ - void Raw_ShowPostnValue(short sq) { @@ -839,7 +867,6 @@ Raw_ShowPostnValue(short sq) } - void Raw_DoDebug(void) { @@ -918,7 +945,6 @@ Raw_DoDebug(void) } - void Raw_DoTable(short table[NO_SQUARES]) { @@ -938,7 +964,6 @@ Raw_DoTable(short table[NO_SQUARES]) } - void Raw_ShowPostnValues(void) { @@ -963,3 +988,58 @@ Raw_ShowPostnValues(void) printf("\nhung black %d hung white %d\n", hung[black], hung[white]); } + +/* + * Determine the time that has passed since the search was started. If the + * elapsed time exceeds the target(ResponseTime + ExtraTime) then set timeout + * to true which will terminate the search. + * iop = COMPUTE_MODE calculate et, bump ETnodes + * iop = COMPUTE_AND_INIT_MODE calculate et, set timeout if time exceeded, + * set reference time + */ +void +Raw_ElapsedTime(ElapsedTime_mode iop) +{ + long current_time; +#ifdef HAVE_GETTIMEOFDAY + struct timeval tv; + gettimeofday(&tv, NULL); + current_time = tv.tv_sec*100 + (tv.tv_usec/10000); +#else + et = ((current_time = time((long *) 0)) - time0) * 100; +#endif + +#ifdef INTERRUPT_TEST + if (iop == INIT_INTERRUPT_MODE) + { + itime0 = current_time; + } + else if (iop == COMPUTE_INTERRUPT_MODE) + { + it = current_time - itime0; + } + else +#endif + { +#ifdef HAVE_GETTIMEOFDAY + et = current_time - time0; +#endif + ETnodes = NodeCnt + znodes; + + if (et < 0) + { +#ifdef INTERRUPT_TEST + printf("elapsed time %ld not positive\n", et); +#endif + et = 0; + } + + if (iop == COMPUTE_AND_INIT_MODE) + { + if ((et > (ResponseTime + ExtraTime)) && (Sdepth > MINDEPTH)) + flag.timeout = true; + + time0 = current_time; + } + } +}