* ----------------------------------------------------------------------
* 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
*
#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)
}
-void
+static void
Raw_ShowLine(unsigned short *bstline)
{
int i;
}
-void
+static void
Raw_ShowMessage(char *s)
{
if (!XSHOGI)
}
-void
+static void
Raw_AlwaysShowMessage(const char *format, ...)
{
va_list ap;
}
-void
+static void
Raw_Printf(const char *format, ...)
{
va_list 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",
}
-void
+static void
Raw_ShowPatternCount(short side, short n)
{
if (flag.post)
}
-void
+static void
Raw_ShowResponseTime(void)
{
}
-void
+static void
Raw_ShowResults(short score, unsigned short *bstline, char ch)
{
if (flag.post && !XSHOGI)
}
-void
+static void
Raw_ShowSidetoMove(void)
{
}
-void
+static void
Raw_ShowStage(void)
{
printf("stage = %d\n", stage);
* End of trivial output routines.
****************************************/
-void
+static void
Raw_Initialize(void)
{
mycnt1 = mycnt2 = 0;
/* 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
}
-void
+static void
Raw_ExitShogi(void)
{
/* CHECKME: what purpose does this next statement serve? */
}
-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
}
-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: %ld sec\n",
* 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;
* 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;
}
-void
+static void
Raw_SearchStartStuff(short side)
{
if (flag.post)
}
-void
+static void
Raw_OutputMove(void)
{
if (flag.illegal)
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))
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)
{
}
-void
+static void
Raw_ChangeAlphaWindow(void)
{
printf("WAwindow: ");
}
-void
+static void
Raw_ChangeBetaWindow(void)
{
printf("WBwindow: ");
}
-void
+static void
Raw_GiveHint(void)
{
if (hint)
}
-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;
+ strncpy(T, sx, NO_SQUARES);
+ T[NO_SQUARES] = '\0';
- 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';
-
- 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 */
if (*p == 'f')
{
/* its a fischer clock game */
+ char *q;
p++;
TCminutes = (short)strtol(p, &q, 10);
TCadd = (short)strtol(q, NULL, 10) *100;
else
{
/* regular game */
+ char *q;
TCadd = 0;
TCmoves = (short)strtol(p, &q, 10);
TCminutes = (short)strtol(q, &q, 10);
}
-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 = ");
}
-void
+static void
Raw_SetContempt(void)
{
printf("contempt = ");
}
-void
+static void
Raw_ChangeXwindow(void)
{
printf("xwndw = ");
* Raw_ShowPostnValue(short sq)
* must have called ExaminePosition() first
*/
-void
+static void
Raw_ShowPostnValue(short sq)
{
(void) ScorePosition(color[sq]);
}
-void
+static void
Raw_DoDebug(void)
{
short c, p, sq, tp, tc, tsq, score, j, k;
}
-void
+static void
Raw_DoTable(short table[NO_SQUARES])
{
short sq, j, k;
}
-void
+static void
Raw_ShowPostnValues(void)
{
short sq, score, j, k;
}
-void
+static void
Raw_PollForInput(void)
{
#ifdef WIN32