X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Fcursesdsp.c;h=76650a60854798c94abd745d238fb4f68d970324;hb=b8e35b1d447cee3c38bc8177ea8609360a88872d;hp=4d00015a30b575c5f72be2951b29feff31461ff0;hpb=4f565f2015c84ab0d9432ce077de82283ffbd35b;p=gnushogi.git diff --git a/gnushogi/cursesdsp.c b/gnushogi/cursesdsp.c index 4d00015..76650a6 100644 --- a/gnushogi/cursesdsp.c +++ b/gnushogi/cursesdsp.c @@ -6,6 +6,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 * @@ -36,6 +37,7 @@ #include #include #include +#include #include #include @@ -43,7 +45,6 @@ #include #include "gnushogi.h" -#include "cursesdsp.h" #if HAVE_UNISTD_H #include @@ -61,23 +62,23 @@ #define FLUSH_SCANW fflush(stdout), scanw -int mycnt1, mycnt2; - +#define MARGIN (5) #define TAB (58) #define VIR_C(s) ((flag.reverse) ? (NO_COLS - 1 - column(s)) : column(s)) #define VIR_R(s) ((flag.reverse) ? (NO_ROWS - 1 - row(s)) : row(s)) -unsigned short MV[MAXDEPTH]; -int MSCORE; -char *DRAW; +/**************************************** + * forward declarations + ****************************************/ -/* Forward declarations. */ /* FIXME: change this name, puh-leeze! */ - static void UpdateCatched(void); static void DrawPiece(short sq); static void ShowScore(short score); +static void Curses_UpdateDisplay(short f, short t, short redraw, short isspec); +static void Curses_Die(int sig); +static void Curses_ShowSidetoMove(void); /**************************************** * Trivial output functions. @@ -91,7 +92,7 @@ ClearEoln(void) } -void +static void Curses_ClearScreen(void) { clear(); @@ -113,8 +114,7 @@ ClearMessage(void) ClearEoln(); } - -void +static void Curses_ShowCurrentMove(short pnt, short f, short t) { algbr(f, t, false); @@ -123,7 +123,7 @@ Curses_ShowCurrentMove(short pnt, short f, short t) } -void +static void Curses_ShowDepth(char ch) { gotoXY(TAB, 4); @@ -132,7 +132,7 @@ Curses_ShowDepth(char ch) } -void +static void Curses_ShowGameType(void) { if (flag.post) @@ -143,7 +143,7 @@ Curses_ShowGameType(void) } -void +static void ShowHeader(void) { gotoXY(TAB, 2); @@ -151,47 +151,61 @@ ShowHeader(void) } -void +static void Curses_ShowLine(unsigned short *bstline) { } -void -Curses_ShowMessage(char *s) +static void +_vprintw(const char *format, va_list ap) { + static char buffer[60]; + vsnprintf(buffer, sizeof(buffer), format, ap); + printw("%s", buffer); +} + +static void +Curses_ShowMessage(char *format, ...) +{ + va_list ap; + va_start(ap, format); gotoXY(TAB, 6); - printw("%s", s); + _vprintw(format, ap); + va_end(ap); ClearEoln(); } - -void -Curses_AlwaysShowMessage(const char *format, va_list ap) +static void +Curses_AlwaysShowMessage(const char *format, ...) { - static char buffer[60]; - vsnprintf(buffer, sizeof(buffer), format, ap); - Curses_ShowMessage(buffer); + va_list ap; + va_start(ap, format); + gotoXY(TAB, 6); + _vprintw(format, ap); + va_end(ap); + ClearEoln(); } -void -Curses_Printf(const char *format, va_list ap) +static void +Curses_Printf(const char *format, ...) { - static char buffer[60]; - vsnprintf(buffer, sizeof(buffer), format, ap); - printw("%s", buffer); + va_list ap; + va_start(ap, format); + _vprintw(format, ap); + va_end(ap); } -void +static void Curses_doRequestInputString(const char* fmt, char* buffer) { FLUSH_SCANW(fmt, buffer); } -int +static int Curses_GetString(char* sx) { fflush(stdout); @@ -199,7 +213,7 @@ Curses_GetString(char* sx) } -void +static void Curses_ShowNodeCnt(long NodeCnt) { gotoXY(TAB, 22); @@ -210,7 +224,7 @@ Curses_ShowNodeCnt(long NodeCnt) } -void +static void Curses_ShowPatternCount(short side, short n) { if (flag.post) @@ -235,7 +249,7 @@ ShowPlayers(void) } -void +static void Curses_ShowPrompt(void) { Curses_ShowSidetoMove(); @@ -245,7 +259,7 @@ Curses_ShowPrompt(void) } -void +static void Curses_ShowResponseTime(void) { if (flag.post) @@ -259,7 +273,7 @@ Curses_ShowResponseTime(void) } -void +static void Curses_ShowResults(short score, unsigned short *bstline, char ch) { unsigned char d, ply; @@ -303,7 +317,7 @@ ShowScore(short score) } -void +static void Curses_ShowSidetoMove(void) { gotoXY(TAB, 14); @@ -312,7 +326,7 @@ Curses_ShowSidetoMove(void) } -void +static void Curses_ShowStage(void) { gotoXY(TAB, 19); @@ -325,7 +339,7 @@ Curses_ShowStage(void) * End of trivial output routines. ****************************************/ -void +static void Curses_Initialize(void) { signal(SIGINT, Curses_Die); @@ -335,7 +349,7 @@ Curses_Initialize(void) } -void +static void Curses_ExitShogi(void) { if (!nolist) @@ -351,7 +365,7 @@ Curses_ExitShogi(void) } -void +static void Curses_Die(int sig) { char s[80]; @@ -370,7 +384,7 @@ Curses_Die(int sig) } -void +static void Curses_TerminateSearch(int sig) { signal(SIGINT, SIG_IGN); @@ -386,7 +400,7 @@ Curses_TerminateSearch(int sig) } -void +static void Curses_help(void) { Curses_ClearScreen(); @@ -444,8 +458,8 @@ Curses_help(void) } -static const short x0[2] = { 54, 2 }; -static const short y0[2] = { 20, 4 }; +static const short x0[2] = { MARGIN + 5*NO_COLS + 4, 2 }; +static const short y0[2] = { 4 + 2 * (NO_ROWS - 1), 4 }; /* @@ -454,10 +468,10 @@ static const short y0[2] = { 20, 4 }; * P* will put a pawn to the captured pieces. */ -void +static void Curses_EditBoard(void) { - short a, c, sq, i; + short a, c, sq, i, found; short r = 0; char s[80]; @@ -465,23 +479,28 @@ Curses_EditBoard(void) Book = BOOKFAIL; Curses_ClearScreen(); Curses_UpdateDisplay(0, 0, 1, 0); - gotoXY(TAB, 3); + gotoXY(TAB, 11); printw(". Exit to main\n"); - gotoXY(TAB, 4); + gotoXY(TAB, 12); printw("# Clear board\n"); - gotoXY(TAB, 5); + gotoXY(TAB, 13); printw("c Change sides\n"); gotoXY(TAB, 7); printw("Enter piece & location: "); a = black; - do + while(1) { - gotoXY(TAB, 6); + gotoXY(TAB, 4); printw("Editing: %s", ColorStr[a]); - gotoXY(TAB + 24, 7); + gotoXY(TAB + 2, 8); ClearEoln(); FLUSH_SCANW("%s", s); + found = 0; + ClearMessage(); + + if (s[0] == '.') + break; if (s[0] == '#') { @@ -494,50 +513,61 @@ Curses_EditBoard(void) ClearCaptured(); UpdateCatched(); + continue; } - if (s[0] == 'c') + if (s[0] == 'c') { a = otherside[a]; + continue; + } if (s[1] == '*') { for (i = NO_PIECES; i > no_piece; i--) { if ((s[0] == pxx[i]) || (s[0] == qxx[i])) + { + Captured[a][unpromoted[i]]++; + UpdateCatched(); + found = 1; break; + } } - - Captured[a][unpromoted[i]]++; - UpdateCatched(); - c = -1; + if (!found) + dsp->AlwaysShowMessage("Invalid piece type '%c'", 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)) { + dsp->AlwaysShowMessage("Out-of-board '%c%c'", s[1], s[2]); + continue; } - if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS)) - { - sq = locn(r, c); + sq = locn(r, c); - for (i = NO_PIECES; i > no_piece; i--) + for (i = NO_PIECES; i > no_piece; i--) + { + if ((s[0] == pxx[i]) || (s[0] == qxx[i])) { - if ((s[0] == pxx[i]) || (s[0] == qxx[i])) - break; + color[sq] = a; + if (s[3] == '+') + board[sq] = promoted[i]; + else + board[sq] = unpromoted[i]; + + found = 1; + break; } + } - if (s[3] == '+') - i = promoted[i]; - else - i = unpromoted[i]; + if (!found) + dsp->AlwaysShowMessage("Invalid piece type '%c'", s[0]); - board[sq] = i; - color[sq] = ((board[sq] == no_piece) ? neutral : a); - DrawPiece(sq); - } + DrawPiece(sq); } - while (s[0] != '.'); for (sq = 0; sq < NO_SQUARES; sq++) Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0); @@ -603,7 +633,7 @@ UpdateCatched() } -void +static void Curses_SearchStartStuff(short side) { short i; @@ -619,7 +649,7 @@ Curses_SearchStartStuff(short side) } -void +static void Curses_OutputMove(void) { @@ -674,7 +704,7 @@ Curses_OutputMove(void) t = (l + h) >> 1; } - ShowNodeCnt(NodeCnt); + Curses_ShowNodeCnt(NodeCnt); gotoXY(TAB, 23); printw("Max Tree = %5d", t); ClearEoln(); @@ -684,7 +714,7 @@ Curses_OutputMove(void) } -void +static void Curses_UpdateClocks(void) { short m, s; @@ -708,15 +738,15 @@ Curses_UpdateClocks(void) s = 0; if (player == black) - gotoXY(20, (flag.reverse) ? 2 : 23); + gotoXY(20, (flag.reverse) ? 2 : (5 + 2*NO_ROWS)); else - gotoXY(20, (flag.reverse) ? 23 : 2); + gotoXY(20, (flag.reverse) ? (5 + 2*NO_ROWS) : 2); /* printw("%d:%02d %ld ", m, s, dt); */ printw("%d:%02d ", m, s); if (flag.post) - ShowNodeCnt(NodeCnt); + Curses_ShowNodeCnt(NodeCnt); refresh(); } @@ -755,7 +785,7 @@ DrawPiece(short sq) y = pxx[(int)piece]; } - gotoXY(8 + 5 * VIR_C(sq), 4 + 2 * ((NO_ROWS - 1) - VIR_R(sq))); + gotoXY(MARGIN + 3 + 5 * VIR_C(sq), 4 + 2 * ((NO_ROWS - 1) - VIR_R(sq))); printw("%c%c%c%c", l, p, y, r); } @@ -763,13 +793,11 @@ DrawPiece(short sq) /* * Curses_ShowPostnValue(): must have called ExaminePosition() first */ -void +static void Curses_ShowPostnValue(short sq) { - short score; - gotoXY(4 + 5 * VIR_C(sq), 5 + 2 * (7 - VIR_R(sq))); /* CHECKME */ - score = ScorePosition(color[sq]); + (void) ScorePosition(color[sq]); if (color[sq] != neutral) #if defined SAVE_SVALUE @@ -788,7 +816,7 @@ Curses_ShowPostnValue(short sq) } -void +static void Curses_ShowPostnValues(void) { short sq, score; @@ -808,7 +836,7 @@ Curses_ShowPostnValues(void) } -void +static void Curses_UpdateDisplay(short f, short t, short redraw, short isspec) { short i, sq, z; @@ -820,42 +848,41 @@ Curses_UpdateDisplay(short f, short t, short redraw, short isspec) ShowPlayers(); i = 2; - gotoXY(3, ++i); + gotoXY(MARGIN, ++i); - printw(" +"); + printw(" +"); for (j=0; j