dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
- AC_INIT([gnushogi],[1.4.1-rc1+],[https://savannah.gnu.org/bugs/?group=gnushogi])
+ AC_INIT([gnushogi],[1.4.1+],[https://savannah.gnu.org/bugs/?group=gnushogi])
+AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([gnushogi/gnushogi.h])
AC_CONFIG_HEADER(config.h)
AS_IF([test "x$with_curses" != xno],
[AC_CHECK_LIB([curses], [clrtoeol],
[AC_SUBST([LIBCURSES], [-lcurses])
- AC_SUBST([CURSESDSP], [cursesdsp.o])
+ AC_SUBST([CURSESDSP], [gnushogi-cursesdsp.o])
+ AC_SUBST([CURSESDSPMINI], [gnuminishogi-cursesdsp.o])
AC_DEFINE([HAVE_LIBCURSES], [1],
[Define if you have lib])
],
if [[ $ac_cv_c_compiler_gnu = yes ]]
then
-WARNINGS="-Wall -Wno-implicit-int -Wstrict-prototypes -ansi -pedantic"
+WARNINGS="-Wall -Wno-implicit-int -Wstrict-prototypes -ansi"
CEXTRAFLAGS="-fsigned-char -funroll-loops"
else
# Who knows what warnings your compiler uses?
# Set various user-definable options.
#
-AC_ARG_ENABLE([minishogi],
-[ --enable-minishogi
- Build gnuminishogi instead of gnushogi (default: no)],
-[AC_DEFINE([MINISHOGI], [], [Define to build gnuminishogi instead of gnushogi])
-AC_SUBST([PROGNAME], [gnuminishogi])
-],
-[AC_SUBST([PROGNAME], [gnushogi])
-])
-
OPT=
FIRST_SHOGI_PROGRAM=gnushogi
SECOND_SHOGI_PROGRAM=gnushogi
if [[ $enable_xshogi = yes ]]
then
-XSHOGI=xshogi_compile
-XSHOGIINSTALL=xshogi_install
-XSHOGICLEAN=xshogi_clean
+XSHOGI=xshogi
+XSHOGIMAN=xshogi.6
+XDOCS='$(XDOCS)'
else
XSHOGI=
-XSHOGIINSTALL=
-XSHOGICLEAN=
+XSHOGIMAN=
+XDOCS=
fi
AC_SUBST(XSHOGI)
-AC_SUBST(XSHOGIINSTALL)
-AC_SUBST(XSHOGICLEAN)
+AC_SUBST(XSHOGIMAN)
+AC_SUBST(XDOCS)
##########
AC_CONFIG_FILES([Makefile
#
# Copyright (c) 1993, 1994 Matthias Mutz
# Copyright (c) 1998, 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
# Copyright (c) 1992 Free Software Foundation
# patterns may be described in order to support the correct order of moves.
PATTERNFILE=$(ROOT)/misc/$(PROGNAME).pat
-PATTERN = -DPATTERNFILE=\"$(PATTERNFILE)\"
all:
book.o \
commondsp.o \
@CURSESDSP@ \
- dspwrappers.o \
eval.o \
genmove.o \
init.o \
cursesdsp.o: cursesdsp.c
$(CC) $(CFLAGS) -c $<
-dspwrappers.o: dspwrappers.c
- $(CC) $(CFLAGS) -c $<
-
genmove.o: genmove.c
$(CC) $(CFLAGS) -c $<
# pattern textfile must be used.
makepattern.o: makepattern.c
- $(CC) $(CFLAGS) $(PATTERN) -c $<
+ $(CC) $(CFLAGS) -c $<
pattern.o: pattern.c
$(CC) $(CFLAGS) -c $<
$(CC) $(CFLAGS) -c $<
pattern.inc: $(PATTERNFILE) pat2inc
- ./pat2inc
+ ./pat2inc $< $@
#
# Other targets.
book.o: book.c gnushogi.h
commondsp.o: commondsp.c gnushogi.h
cursesdsp.o: cursesdsp.c gnushogi.h
-dspwrappers.o: dspwrappers.c gnushogi.h
genmove.o: genmove.c gnushogi.h
globals.o: globals.c gnushogi.h
eval.o: eval.c eval.h gnushogi.h $(SRCDIR)/pattern.h
init.o: init.c gnushogi.h $(SRCDIR)/pattern.h
+init-common.o: init-common.c gnushogi.h
main.o: main.c gnushogi.h
makepattern.o: pattern.c gnushogi.h $(SRCDIR)/pattern.h
pattern.o: pattern.c gnushogi.h $(SRCDIR)/pattern.h pattern.inc
* ----------------------------------------------------------------------
* 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
*
static
int
-Vparse (FILE * fd, USHORT *mv, USHORT *flags, USHORT side, int moveno)
+Vparse (FILE * fd, USHORT *mv, USHORT *flags, int moveno)
{
int c, i;
char s[255];
{
short i;
int mustwrite = false, first;
- unsigned short xside, side;
+ unsigned short side;
short c;
USHORT mv, flags;
unsigned int x;
{
/* setvbuf(fd, buffr, _IOFBF, 2048); */
side = black;
hashbd = hashkey = 0;
i = 0;
- while ((c = Vparse(fd, &mv, &flags, side, i)) >= 0)
+ while ((c = Vparse(fd, &mv, &flags, i)) >= 0)
{
if (c == 1)
{
computer = opponent;
opponent = computer ^ 1;
- xside = side;
side = side ^ 1;
}
else if (i > 0)
RESET();
i = 0;
side = black;
- xside = white;
-
}
}
}
- sprintf(msg, "Book used %d(%d).", B.bookcount, B.booksize);
- ShowMessage(msg);
+ sprintf(msg, "Book used %lu(%lu).", B.bookcount, B.booksize);
+ dsp->ShowMessage(msg);
}
/* Set everything back to start the game. */
/* Now get ready to play .*/
if (!B.bookcount)
{
- ShowMessage("Can't find book.");
+ dsp->ShowMessage("Can't find book.");
Book = 0;
}
}
/*
- * OpeningBook(hint, side)
+ * OpeningBook(hint)
*
* Go through each of the opening lines of play and check for a match with
* the current game listing. If a match occurs, generate a random
*/
int
-OpeningBook(unsigned short *hint, short side)
+OpeningBook(unsigned short *hint)
{
unsigned short r, m;
int possibles = TrPnt[2] - TrPnt[1];
* ----------------------------------------------------------------------
* 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
*
char mvstr[4][6];
char *InPtr;
int InBackground = false;
+struct display *dsp = &raw_display;
#if defined(BOOKTEST)
#endif /* BOOKTEST */
-
-
/*
* Generate move strings in different formats.
*
if ((f == t) && ((f != 0) || (t != 0)))
{
if (!barebones) {
- Printf("error in algbr: FROM=TO=%d, flag=0x%4x\n", t, flag);
+ dsp->Printf("error in algbr: FROM=TO=%d, flag=0x%4x\n", t, flag);
}
mvstr[0][0] = mvstr[1][0] = mvstr[2][0] = mvstr[3][0] = '\0';
}
-
/*
* Compare the string 's' to the list of legal moves available for the
* opponent. If a match is found, make the move on the board.
if (SqAttacked(PieceList[opponent][0], computer, &blocked))
{
UnmakeMove(opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
- AlwaysShowMessage("Illegal move (in check) %s", s);
+ dsp->AlwaysShowMessage("Illegal move (in check) %s", s);
return false;
}
else
if (iop == VERIFY_AND_TRY_MODE)
return true;
- UpdateDisplay(xnode.f, xnode.t, 0, (short) xnode.flags);
+ dsp->UpdateDisplay(xnode.f, xnode.t, 0, (short) xnode.flags);
GameList[GameCnt].depth = GameList[GameCnt].score = 0;
GameList[GameCnt].nodes = 0;
ElapsedTime(COMPUTE_AND_INIT_MODE);
char buf[20];
sprintf(buf, "%s mates!\n", ColorStr[opponent]);
- ShowMessage(buf);
+ dsp->ShowMessage(buf);
flag.mate = true;
}
}
}
}
- AlwaysShowMessage("Illegal move (no match) %s", s);
+ dsp->AlwaysShowMessage("Illegal move (no match) %s", s);
if (!barebones && (cnt > 1))
{
sprintf(buffer, "Ambiguous Move %s!", s);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
}
return false;
}
-
static int
-parser(char *f, int side, short *fpiece)
+parser(char *f, short *fpiece)
{
int c1, r1, c2, r2;
short i, p = false;
}
-
void
skipb()
{
}
+void RequestInputString(char* buffer, unsigned bufsize)
+{
+ static char fmt[10];
+ int ret = snprintf(fmt, sizeof(fmt), "%%%us", bufsize);
+ if (ret < 0 ) {
+ perror("RequestInputString snprintf");
+ exit(1);
+ }
+ if (ret >= sizeof(fmt)) {
+ fprintf(stderr,
+ "Insufficient format-buffer size in %s for bufsize=%u\n",
+ __FUNCTION__, bufsize);
+ exit(1);
+ }
+ dsp->doRequestInputString(fmt, buffer);
+}
+
-void
+static void
GetGame(void)
{
FILE *fd;
if (savefile[0]) {
strcpy(fname, savefile);
} else {
- ShowMessage("Enter file name: ");
+ dsp->ShowMessage("Enter file name: ");
RequestInputString(fname, sizeof(fname)-1);
}
InPtr = fname;
skipb();
g = &GameList[GameCnt];
- g->gmove = parser(InPtr, side, &g->fpiece);
+ g->gmove = parser(InPtr, &g->fpiece);
skip();
g->score = atoi(InPtr);
skip();
ZeroRPT();
InitializeStats();
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
Sdepth = 0;
hint = 0;
}
-
-void
+static void
SaveGame(void)
{
FILE *fd;
if (savefile[0]) {
strcpy(fname, savefile);
} else {
- ShowMessage("Enter file name: ");
+ dsp->ShowMessage("Enter file name: ");
RequestInputString(fname, sizeof(fname)-1);
}
fclose(fd);
- ShowMessage("Game saved");
+ dsp->ShowMessage("Game saved");
}
else
{
- ShowMessage("Could not open file");
+ dsp->ShowMessage("Could not open file");
}
}
-
/*
* GetXGame, SaveXGame and BookGame used to only be defined if
* xshogi wasn't defined -- wonder why?
*/
-void
+static void
GetXGame(void)
{
FILE *fd;
short sq;
short side, isp;
- ShowMessage("Enter file name: ");
+ dsp->ShowMessage("Enter file name: ");
RequestInputString(fname, sizeof(fname)-1);
if (fname[0] == '\0')
Game50 = 1;
ZeroRPT();
InitializeStats();
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
Sdepth = 0;
hint = 0;
}
-void
+static void
SaveXGame(void)
{
FILE *fd;
short sq, piece;
short side, isp;
- ShowMessage("Enter file name: ");
+ dsp->ShowMessage("Enter file name: ");
RequestInputString(fname, sizeof(fname)-1);
if (fname[0] == '\0')
}
-void
+static void
BookSave(void)
{
FILE *fd;
strcpy(fname, savefile);
} else {
/* Enter file name */
- ShowMessage("Enter file name: ");
+ dsp->ShowMessage("Enter file name: ");
RequestInputString(fname, sizeof(fname)-1);
}
fclose(fd);
- ShowMessage("Game saved");
+ dsp->ShowMessage("Game saved");
}
else
{
- ShowMessage("Could not open file");
+ dsp->ShowMessage("Could not open file");
}
}
-
void
ListGame(void)
{
}
-
-void
+static void
FlagMove(char c)
{
switch(c)
}
-
-
/*
* Undo the most recent half-move.
*/
-void
+static void
Undo(void)
{
short f, t;
flag.mate = false;
Sdepth = 0;
player = player ^ 1;
- ShowSidetoMove();
- UpdateDisplay(0, 0, 1, 0);
+ dsp->ShowSidetoMove();
+ dsp->UpdateDisplay(0, 0, 1, 0);
if (flag.regularstart)
Book = false;
}
-
void
FlagString(unsigned short flags, char *s)
{
}
-
-void
+static void
TestSpeed(void(*f)(short side, short ply,
short in_check, short blockable),
unsigned j)
else
et = 1;
- ShowNodeCnt(cnt);
+ dsp->ShowNodeCnt(cnt);
}
-
-void
+static void
TestPSpeed(short(*f) (short side), unsigned j)
{
- short i;
+ unsigned i;
long cnt, t1, t2;
#ifdef HAVE_GETTIMEOFDAY
struct timeval tv;
else
et = 1;
- ShowNodeCnt(cnt);
+ dsp->ShowNodeCnt(cnt);
}
-
-void
-SetOppTime(char *s)
+static void
+SetOppTime(char *time)
{
int m, t, sec;
sec = 0;
- time = &s[strlen("otime")];
t = (int)strtol(time, &time, 10);
if (*time == ':')
{
time++;
+ /* FIXME: sec is parsed but ignored */
sec = (int)strtol(time, &time, 10);
}
}
-
-void
-SetMachineTime(char *s)
+static void
+SetMachineTime(char *time)
{
- char *time;
int m, t, sec;
- time = &s[strlen("time")];
sec = 0;
t = (int)strtol(time, &time, 10);
if (*time == ':')
{
time++;
+ /* FIXME: sec is parsed but ignored */
sec = (int)strtol(time, &time, 10);
}
}
-
-
-
/* FIXME! This is truly the function from hell! */
/*
* Process the user's command. If easy mode is OFF (the computer is thinking
* on opponents time) and the program is out of book, then make the 'hint'
* move on the board and call SelectMove() to find a response. The user
- * terminates the search by entering ^C (quit siqnal) before entering a
- * command. If the opponent does not make the hint move, then set Sdepth to
- * zero.
+ * terminates the search by entering a command. If the opponent does not make
+ * the hint move, then set Sdepth to zero.
*/
void
InputCommand(char *command)
{
- int eof = 0;
short have_shown_prompt = false;
short ok, done, is_move = false;
unsigned short mv;
algbr((short) hint >> 8, (short) hint & 0xff, false);
strcpy(s, mvstr[0]);
-#if !defined NOPOST
if (flag.post)
- GiveHint();
-#endif
+ dsp->GiveHint();
/* do the hint move */
if (VerifyMove(s, VERIFY_AND_TRY_MODE, &mv))
Sdepth = 0;
#ifdef QUIETBACKGROUND
- ShowPrompt();
+ dsp->ShowPrompt();
have_shown_prompt = true;
#endif /* QUIETBACKGROUND */
{
#endif /* QUIETBACKGROUND */
- ShowPrompt();
+ dsp->ShowPrompt();
#ifdef QUIETBACKGROUND
}
#endif /* QUIETBACKGROUND */
if (command == NULL) {
- if (NOT_CURSES)
- s[0] = '\0';
-
- eof = GetString(sx);
+ int eof = dsp->GetString(sx);
+ if (eof)
+ dsp->ExitShogi();
} else {
strcpy(sx, command);
done = true;
}
- sscanf(sx, "%s", s);
-
- if (eof)
- ExitShogi();
-
- if (s[0] == '\0')
+ /* extract first word */
+ if (sscanf(sx, "%s", s) < 1)
continue;
if (strcmp(s, "bd") == 0) /* bd -- display board */
if (old_xshogi)
display_type = DISPLAY_RAW;
- ClearScreen();
- UpdateDisplay(0, 0, 1, 0);
+ dsp->ClearScreen();
+ dsp->UpdateDisplay(0, 0, 1, 0);
if (old_xshogi)
display_type = DISPLAY_X;
}
else if (strcmp(s, "alg") == 0)
{
- /* noop */ ; /* alg */
+ /* noop */ ;
}
else if ((strcmp(s, "quit") == 0)
|| (strcmp(s, "exit") == 0))
{
flag.quit = true;
}
else if ((strcmp(s, "set") == 0)
|| (strcmp(s, "edit") == 0))
{
- EditBoard();
+ dsp->EditBoard();
}
- else if ((strcmp(s, "setup") == 0))
+ else if (strcmp(s, "setup") == 0)
{
- SetupBoard();
+ dsp->SetupBoard();
}
else if (strcmp(s, "first") == 0)
{
}
else if (strcmp(s, "help") == 0)
{
- help();
+ dsp->help();
}
else if (strcmp(s, "material") == 0)
{
else if (strcmp(s, "new") == 0)
{
NewGame();
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
}
else if (strcmp(s, "list") == 0)
{
ListGame();
}
- else if ((strcmp(s, "level") == 0)
- || (strcmp(s, "clock") == 0))
+ else if (strcmp(s, "level") == 0)
+ {
+ dsp->SelectLevel(sx + strlen("level"));
+ }
+ else if (strcmp(s, "clock") == 0)
{
- SelectLevel(sx);
+ dsp->SelectLevel(sx + strlen("clock"));
}
else if (strcmp(s, "hash") == 0)
{
}
else if (strcmp(s, "time") == 0)
{
- SetMachineTime(sx);
+ SetMachineTime(sx + strlen("time"));
}
else if (strcmp(s, "otime") == 0)
{
- SetOppTime(sx);
+ SetOppTime(sx + strlen("otime"));
}
else if (strcmp(s, "Awindow") == 0)
{
- ChangeAlphaWindow();
+ dsp->ChangeAlphaWindow();
}
else if (strcmp(s, "Bwindow") == 0)
{
- ChangeBetaWindow();
+ dsp->ChangeBetaWindow();
}
else if (strcmp(s, "rcptr") == 0)
{
}
else if (strcmp(s, "hint") == 0)
{
- GiveHint();
+ dsp->GiveHint();
}
else if (strcmp(s, "both") == 0)
{
else if (strcmp(s, "reverse") == 0)
{
flag.reverse = !flag.reverse;
- ClearScreen();
- UpdateDisplay(0, 0, 1, 0);
+ dsp->ClearScreen();
+ dsp->UpdateDisplay(0, 0, 1, 0);
}
else if (strcmp(s, "switch") == 0)
{
}
else if (strcmp(s, "depth") == 0)
{
- ChangeSearchDepth();
+ dsp->ChangeSearchDepth(sx + strlen("depth"));
+ }
+ else if (strcmp(s, "sd") == 0)
+ {
+ dsp->ChangeSearchDepth(sx + strlen("sd"));
}
else if (strcmp(s, "hashdepth") == 0)
{
- ChangeHashDepth();
+ dsp->ChangeHashDepth();
}
else if (strcmp(s, "random") == 0)
{
}
else if (strcmp(s, "contempt") == 0)
{
- SetContempt();
+ dsp->SetContempt();
}
else if (strcmp(s, "xwndw") == 0)
{
- ChangeXwindow();
+ dsp->ChangeXwindow();
}
else if (strcmp(s, "rv") == 0)
{
flag.rv = !flag.rv;
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
}
else if (strcmp(s, "coords") == 0)
{
flag.coords = !flag.coords;
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
}
else if (strcmp(s, "stars") == 0)
{
flag.stars = !flag.stars;
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
}
else if (!XSHOGI && strcmp(s, "moves") == 0)
{
#endif
SwagHt = 0;
- ShowMessage("Testing MoveList Speed");
+ dsp->ShowMessage("Testing MoveList Speed");
temp = generate_move_flags;
generate_move_flags = true;
TestSpeed(MoveList, 1);
generate_move_flags = temp;
- ShowMessage("Testing CaptureList Speed");
+ dsp->ShowMessage("Testing CaptureList Speed");
TestSpeed(CaptureList, 1);
- ShowMessage("Testing Eval Speed");
+ dsp->ShowMessage("Testing Eval Speed");
ExaminePosition(opponent);
TestPSpeed(ScorePosition, 1);
}
else if (!XSHOGI && strcmp(s, "test") == 0)
{
#ifdef SLOW_CPU
- ShowMessage("Testing MoveList Speed");
+ dsp->ShowMessage("Testing MoveList Speed");
TestSpeed(MoveList, 2000);
- ShowMessage("Testing CaptureList Speed");
+ dsp->ShowMessage("Testing CaptureList Speed");
TestSpeed(CaptureList, 3000);
- ShowMessage("Testing Eval Speed");
+ dsp->ShowMessage("Testing Eval Speed");
ExaminePosition(opponent);
TestPSpeed(ScorePosition, 1500);
#else
- ShowMessage("Testing MoveList Speed");
+ dsp->ShowMessage("Testing MoveList Speed");
TestSpeed(MoveList, 20000);
- ShowMessage("Testing CaptureList Speed");
+ dsp->ShowMessage("Testing CaptureList Speed");
TestSpeed(CaptureList, 30000);
- ShowMessage("Testing Eval Speed");
+ dsp->ShowMessage("Testing Eval Speed");
ExaminePosition(opponent);
TestPSpeed(ScorePosition, 15000);
#endif
}
else if (!XSHOGI && strcmp(s, "p") == 0)
{
- ShowPostnValues();
+ dsp->ShowPostnValues();
}
else if (!XSHOGI && strcmp(s, "debug") == 0)
{
- DoDebug();
+ dsp->DoDebug();
}
else
{
if (rpt >= 3)
{
DRAW = DRAW_REPETITION;
- ShowMessage(DRAW);
+ dsp->ShowMessage(DRAW);
GameList[GameCnt].flags |= draw;
flag.mate = true;
}
#ifdef notdef /* optional pass best line to frontend with move */
-# if !defined NOPOST
-
if (flag.post && !flag.mate)
{
int i;
printf("%5s ", mvstr[0]);
}
}
-# endif
printf("\n");
#endif
}
}
-
-
void
SetTimeControl(void)
{
et = 0;
ElapsedTime(COMPUTE_AND_INIT_MODE);
}
-
* ----------------------------------------------------------------------
* 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 <ctype.h>
#include <signal.h>
#include <stdio.h>
+#include <stdarg.h>
#include <sys/param.h>
#include <sys/types.h>
#include <curses.h>
#include "gnushogi.h"
-#include "cursesdsp.h"
#if HAVE_UNISTD_H
#include <unistd.h>
int MSCORE;
char *DRAW;
-/* Forward declarations. */
-/* FIXME: change this name, puh-leeze! */
+/****************************************
+ * forward declarations
+ ****************************************/
+/* FIXME: change this name, puh-leeze! */
static void UpdateCatched(void);
static void DrawPiece(short sq);
static void ShowScore(short score);
+void Curses_UpdateDisplay(short f, short t, short redraw, short isspec);
+void Curses_Die(int sig);
+void Curses_ShowSidetoMove(void);
/****************************************
* Trivial output functions.
}
-static void
-ClearMessage(void)
-{
- gotoXY(TAB, 6);
- ClearEoln();
-}
-
-
void
Curses_ShowCurrentMove(short pnt, short f, short t)
{
void
-Curses_AlwaysShowMessage(const char *format, va_list ap)
+Curses_AlwaysShowMessage(const char *format, ...)
{
static char buffer[60];
+ va_list ap;
+ va_start(ap, format);
vsnprintf(buffer, sizeof(buffer), format, ap);
Curses_ShowMessage(buffer);
+ va_end(ap);
}
void
-Curses_Printf(const char *format, va_list ap)
+Curses_Printf(const char *format, ...)
{
static char buffer[60];
+ va_list ap;
+ va_start(ap, format);
vsnprintf(buffer, sizeof(buffer), format, ap);
printw("%s", buffer);
+ va_end(ap);
}
t = (l + h) >> 1;
}
- ShowNodeCnt(NodeCnt);
+ Curses_ShowNodeCnt(NodeCnt);
gotoXY(TAB, 23);
printw("Max Tree = %5d", t);
ClearEoln();
printw("%d:%02d ", m, s);
if (flag.post)
- ShowNodeCnt(NodeCnt);
+ Curses_ShowNodeCnt(NodeCnt);
refresh();
}
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
void
-Curses_ChangeSearchDepth(void)
+Curses_ChangeSearchDepth(char* sx)
{
Curses_ShowMessage("depth = ");
FLUSH_SCANW("%hd", &MaxSearchDepth);
{
Curses_ShowMessage("'setup' command is not supported in Cursesmode");
}
+
+
+struct display curses_display =
+{
+ .ChangeAlphaWindow = Curses_ChangeAlphaWindow,
+ .ChangeBetaWindow = Curses_ChangeBetaWindow,
+ .ChangeHashDepth = Curses_ChangeHashDepth,
+ .ChangeSearchDepth = Curses_ChangeSearchDepth,
+ .ChangeXwindow = Curses_ChangeXwindow,
+ .ClearScreen = Curses_ClearScreen,
+ .DoDebug = Curses_DoDebug,
+ .DoTable = Curses_DoTable,
+ .EditBoard = Curses_EditBoard,
+ .ExitShogi = Curses_ExitShogi,
+ .GiveHint = Curses_GiveHint,
+ .Initialize = Curses_Initialize,
+ .ShowNodeCnt = Curses_ShowNodeCnt,
+ .OutputMove = Curses_OutputMove,
+ .PollForInput = Curses_PollForInput,
+ .SetContempt = Curses_SetContempt,
+ .SearchStartStuff = Curses_SearchStartStuff,
+ .SelectLevel = Curses_SelectLevel,
+ .ShowCurrentMove = Curses_ShowCurrentMove,
+ .ShowDepth = Curses_ShowDepth,
+ .ShowGameType = Curses_ShowGameType,
+ .ShowLine = Curses_ShowLine,
+ .ShowMessage = Curses_ShowMessage,
+ .AlwaysShowMessage = Curses_AlwaysShowMessage,
+ .Printf = Curses_Printf,
+ .doRequestInputString = Curses_doRequestInputString,
+ .GetString = Curses_GetString,
+ .SetupBoard = Curses_SetupBoard,
+ .ShowPatternCount = Curses_ShowPatternCount,
+ .ShowPostnValue = Curses_ShowPostnValue,
+ .ShowPostnValues = Curses_ShowPostnValues,
+ .ShowPrompt = Curses_ShowPrompt,
+ .ShowResponseTime = Curses_ShowResponseTime,
+ .ShowResults = Curses_ShowResults,
+ .ShowSidetoMove = Curses_ShowSidetoMove,
+ .ShowStage = Curses_ShowStage,
+ .TerminateSearch = Curses_TerminateSearch,
+ .UpdateClocks = Curses_UpdateClocks,
+ .UpdateDisplay = Curses_UpdateDisplay,
+ .help = Curses_help,
+};
* ----------------------------------------------------------------------
* 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"
#include "pattern.h"
-extern void
-ShowStage(void);
-
/* Hash table for preventing multiple scoring of the same position */
int EADD = 0; /* number of writes to the cache table */
static int
-AttackedPieceValue(short sq, short side)
+AttackedPieceValue(short sq)
{
- short s, ds;
+ short s;
s = 0;
- ds = -fv1[HUNGP] * 2;
hung[c1]++;
shung[sq]++;
*/
static inline int
-LanceValue(short sq, short side)
+LanceValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-KnightValue(short sq, short side)
+KnightValue(short sq)
{
short s = 0, ad;
short ds, checked_trapped = false;
*/
static inline int
-SilverValue(short sq, short side)
+SilverValue(short sq)
{
short s= 0, ds, ad;
*/
static inline int
-GoldValue(short sq, short side)
+GoldValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-BishopValue(short sq, short side)
+BishopValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-PPawnValue(short sq, short side)
+PPawnValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-PLanceValue(short sq, short side)
+PLanceValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-PKnightValue(short sq, short side)
+PKnightValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-PSilverValue(short sq, short side)
+PSilverValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-PBishopValue(short sq, short side)
+PBishopValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-PRookValue(short sq, short side)
+PRookValue(short sq)
{
short s = 0, ds, ad;
*/
static inline int
-KingValue(short sq, short side)
+KingValue(short sq)
{
short s = 0, ds;
if (a1 == 0)
{
/* undefended piece */
- s += AttackedPieceValue(sq, side);
+ s += AttackedPieceValue(sq);
}
else
{
if (attack_value < piece_value)
{
/* attacked by a weaker piece */
- s += AttackedPieceValue(sq, side) / 2;
+ s += AttackedPieceValue(sq) / 2;
}
else if (abs(attack_value - piece_value) < 10)
{
#ifndef MINISHOGI
case lance:
- s += LanceValue(sq, side);
+ s += LanceValue(sq);
break;
case knight:
- s += KnightValue(sq, side);
+ s += KnightValue(sq);
break;
#endif
case silver:
- s += SilverValue(sq, side);
+ s += SilverValue(sq);
break;
case gold:
- s += GoldValue(sq, side);
+ s += GoldValue(sq);
break;
case bishop:
- s += BishopValue(sq, side);
+ s += BishopValue(sq);
break;
case rook:
break;
case king:
- s += KingValue(sq, side);
+ s += KingValue(sq);
break;
case ppawn:
- s += PPawnValue(sq, side);
+ s += PPawnValue(sq);
break;
#ifndef MINISHOGI
case plance:
- s += PLanceValue(sq, side);
+ s += PLanceValue(sq);
break;
case pknight:
- s += PKnightValue(sq, side);
+ s += PKnightValue(sq);
break;
#endif
case psilver:
- s += PSilverValue(sq, side);
+ s += PSilverValue(sq);
break;
case pbishop:
- s += PBishopValue(sq, side);
+ s += PBishopValue(sq);
break;
case prook:
- s += PRookValue(sq, side);
+ s += PRookValue(sq);
break;
}
}
if (flag.post)
- ShowPatternCount(side, n);
+ dsp->ShowPatternCount(side, n);
if (os != END_OF_SEQUENCES)
update_advance_bonus(side, os);
}
else
{
- ShowPatternCount(black, -1);
- ShowPatternCount(white, -1);
+ dsp->ShowPatternCount(black, -1);
+ dsp->ShowPatternCount(white, -1);
}
}
stage = 0;
if (flag.post)
- ShowStage();
+ dsp->ShowStage();
/* Determine stage dependant weights */
void
UpdateWeights(short stage)
{
+ /* FIXME: this was emptied between 1.1p02 ans 1.2p03, do we keep it ? */
}
* ----------------------------------------------------------------------
* 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
*
inline static void
-Link(short side, short piece,
+Link(short side,
short from, short to, unsigned short local_flag, short s)
{
if (*TrP == TREE)
{
- ShowMessage("TREE overflow\n");
+ dsp->ShowMessage("TREE overflow\n");
}
else
{
}
-inline int
-NonPromotionPossible(short color, short f,
+static inline int
+NonPromotionPossible(short color,
short t, short p)
{
switch (p)
/* bonus for possible next moves */
inline static short
-field_bonus(short ply, short side, short piece,
+field_bonus(short side, short piece,
short f, short t, unsigned short *local_flag)
{
short s, u, ptyp;
if (score_if_impossible < 0)
{
/* The move is flagged as illegal. */
- Link(side, piece,
+ Link(side,
f, t, local_flag, score_if_impossible);
return;
s -= 16 / Captured[side][silver];
#if defined DROPBONUS
- s += field_bonus(ply, side, piece, f, t, &local_flag);
+ s += field_bonus(side, piece, f, t, &local_flag);
if (s == 10 && piece != pawn)
local_flag |= questionable;
else
{
#if defined FIELDBONUS
- s += field_bonus(ply, side, piece, f, t, &local_flag);
+ s += field_bonus(side, piece, f, t, &local_flag);
#endif
}
}
if (try_link || GenerateAllMoves)
{
- Link(side, piece, f, t, local_flag,
+ Link(side, f, t, local_flag,
s - ((SCORE_LIMIT + 1000) * 2));
}
LinkMove(ply, sq, u, local_flag | promote, xside, true);
if ((possible
- = NonPromotionPossible(color[sq], sq, u, piece)))
+ = NonPromotionPossible(color[sq], u, piece)))
{
LinkMove(ply, sq, u, local_flag, xside, possible);
}
if ((PP = PromotionPossible(color[sq], sq, u, piece)))
{
- Link(side, piece,
+ Link(side,
sq, u, capture | promote,
(*value)[stage][board[u]]
#if !defined SAVE_SVALUE
if (!PP || flag.tsume)
{
- Link(side, piece,
+ Link(side,
sq, u, capture,
(*value)[stage][board[u]]
#if !defined SAVE_SVALUE
* ----------------------------------------------------------------------
* 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 "debug.h"
#include "opts.h" /* Various option-setting #defines. */
+#include <stdarg.h>
+
/*
* Display options.
*/
extern display_t display_type;
#define XSHOGI (display_type == DISPLAY_X)
-#define NOT_CURSES ((display_type == DISPLAY_X) \
- || (display_type == DISPLAY_RAW))
/* Miscellaneous globals. */
extern void Initialize_dist(void); /* init.c */
extern void Initialize_eval(void); /* eval.c */
extern void NewGame(void);
-extern int parse(FILE * fd, unsigned short *mv,
- short side, char *opening);
extern void GetOpenings(void);
-extern int OpeningBook(unsigned short *hint, short side);
+extern int OpeningBook(unsigned short *hint);
typedef enum
{
short score,
short depth,
short ply,
- short alpha,
short beta,
unsigned short mv);
extern int VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv);
extern unsigned short TTage;
-#include "dspwrappers.h" /* Display functions. */
+/* display driver framework */
+
+struct display
+{
+ void (*ChangeAlphaWindow)(void);
+ void (*ChangeBetaWindow)(void);
+ void (*ChangeHashDepth)(void);
+ void (*ChangeSearchDepth)(char *sx);
+ void (*ChangeXwindow)(void);
+ void (*ClearScreen)(void);
+ void (*DoDebug)(void);
+ void (*DoTable)(short table[NO_SQUARES]);
+ void (*EditBoard)(void);
+ void (*ExitShogi)(void);
+ void (*GiveHint)(void);
+ void (*Initialize)(void);
+ void (*ShowNodeCnt)(long NodeCnt);
+ void (*OutputMove)(void);
+ void (*PollForInput)(void);
+ void (*SetContempt)(void);
+ void (*SearchStartStuff)(short side);
+ void (*SelectLevel)(char *sx);
+ void (*ShowCurrentMove)(short pnt, short f, short t);
+ void (*ShowDepth)(char ch);
+ void (*ShowGameType)(void);
+ void (*ShowLine)(unsigned short *bstline);
+ void (*ShowMessage)(char *s);
+ void (*AlwaysShowMessage)(const char *format, ...);
+ void (*Printf)(const char *format, ...);
+ void (*doRequestInputString)(const char* fmt, char* buffer);
+ int (*GetString)(char* sx);
+ void (*SetupBoard)(void);
+ void (*ShowPatternCount)(short side, short n);
+ void (*ShowPostnValue)(short sq);
+ void (*ShowPostnValues)(void);
+ void (*ShowPrompt)(void);
+ void (*ShowResponseTime)(void);
+ void (*ShowResults)(short score, unsigned short *bstline, char ch);
+ void (*ShowSidetoMove)(void);
+ void (*ShowStage)(void);
+ void (*TerminateSearch)(int sig);
+ void (*UpdateClocks)(void);
+ void (*UpdateDisplay)(short f, short t, short redraw, short isspec);
+ void (*help)(void);
+};
+
+extern struct display *dsp;
+
+extern struct display raw_display;
+extern struct display curses_display;
#endif /* _GNUSHOGI_H_ */
+ /*
+ * FILE: init-common.c
+ *
+ * ----------------------------------------------------------------------
+ * 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
+ *
+ * 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
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with GNU Shogi; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ * ----------------------------------------------------------------------
+ *
+ */
#include "gnushogi.h"
#include "pattern.h"
if (x >= 0)
{
- ShowMessage("datatype 'small_short' is unsigned; "
+ dsp->ShowMessage("datatype 'small_short' is unsigned; "
"check gnushogi.h\n");
return 1;
}
{
sprintf(buffer, "Cannot allocate %ld bytes for search tree",
(long)n);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
return 1;
}
if (!hashcode)
{
sprintf(buffer, "Cannot allocate %ld bytes for hashcode", (long)n);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
return 1;
}
sprintf(buffer,
"Cannot allocate %ld bytes for drop_hashcode",
(long)n);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
return 1;
}
sprintf(buffer,
"Cannot allocate %ld bytes for game record",
(long)n);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
return 1;
}
{
sprintf(buffer, "cannot allocate %ld space for nextdir %d",
(long)(n), i);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
}
nextdir[i] = NULL;
{
sprintf(buffer, "cannot allocate %ld space for nextpos %d",
(long)(n), i);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
}
use_nextpos = false;
if (!value)
{
- ShowMessage("cannot allocate value space");
+ dsp->ShowMessage("cannot allocate value space");
return 1;
}
if (!fscore)
{
- ShowMessage("cannot allocate fscore space");
+ dsp->ShowMessage("cannot allocate fscore space");
return 1;
}
{
sprintf(buffer, "Cannot allocate %ld bytes for history table",
(long)sizeof_history);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
use_history = false;
}
#endif
{
sprintf(buffer, "Cannot allocate %ld bytes for cache table %ld",
(long)n, (long)i);
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
use_etable = false;
}
}
{
sprintf(buffer, "Cannot allocate %ld bytes for transposition table",
(long)(2 * n));
- ShowMessage(buffer);
+ dsp->ShowMessage(buffer);
ttable[0] = ttable[1] = NULL;
}
#endif /* ttblsz */
if (!distdata)
{
- ShowMessage("cannot allocate distdata space...");
+ dsp->ShowMessage("cannot allocate distdata space...");
use_distdata = false;
}
#endif
* ----------------------------------------------------------------------
* 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
*
}
ClearCaptured();
- ClearScreen();
+ dsp->ClearScreen();
InitializeStats();
#ifdef HAVE_GETTIMEOFDAY
if (TCflag)
SetTimeControl();
else if (MaxResponseTime == 0)
- SelectLevel(sx);
+ dsp->SelectLevel(sx);
- UpdateDisplay(0, 0, 1, 0);
+ dsp->UpdateDisplay(0, 0, 1, 0);
GetOpenings();
GetOpeningPatterns(&max_opening_sequence);
barebones = 0;
}
- Initialize();
+ dsp->Initialize();
Initialize_dist();
Initialize_eval();
#if !defined SAVE_NEXTPOS
#endif /* HASHFILE */
#endif /* ttblsz */
- ExitShogi();
+ dsp->ExitShogi();
}
* ----------------------------------------------------------------------
* 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
*
binbookfile = NULL;
#endif
}
-
break;
#ifdef BINBOOK
case 'B':
argc--;
argv++;
-
if (argc > 0)
binbookfile = argv[0];
-
break;
#endif
case 'C':
/* Curses interface. */
display_type = DISPLAY_CURSES;
-
+ dsp = &curses_display;
break;
#endif
hash = ((argv[0][0] == '-') ? false : true);
break;
-
case 'l':
argc--;
argv++;
if (argc > 0)
Lang = argv[0];
-
break;
-
case 'L':
argc--;
argv++;
strcpy(listfile, argv[0]);
break;
-
case 's':
argc--;
argv++;
if (argc > 0)
strcpy(savefile, argv[0]);
-
break;
-
case 'P':
argc--;
argv++;
if (argc > 0)
bookmaxply = atoi(argv[0]);
-
break;
case 'R':
/* Raw text interface. */
display_type = DISPLAY_RAW;
-
+ dsp = &raw_display;
break;
-
case 'S':
argc--;
argv++;
if (argc > 0)
rehash = atoi(argv[0]);
-
if (rehash > MAXrehash)
rehash = MAXrehash;
-
break;
-
case 'T':
argc--;
argv++;
if (argc > 0)
ttblsize = atoi(argv[0]);
-
- if ((ttblsize <= MINTTABLE))
+ if (ttblsize <= MINTTABLE)
ttblsize = (MINTTABLE) + 1;
-
break;
#ifdef HASHFILE
return 0;
-
case 't': /* Create or test persistent transposition table. */
hashfile = fopen(HASHFILE, RWA_ACC);
}
}
- printf("The file contains %d entries out of max %d\n", nr[0], i);
+ printf("The file contains %d entries out of max %ld\n", nr[0], i);
for (j = 1; j < MAXDEPTH; j++)
printf("%d ", nr[j]);
return 0;
-
#endif /* HASHFILE */
#endif /* ttblsz */
case 'X':
/* X interface. */
display_type = DISPLAY_X;
-
+ dsp = &raw_display;
break;
-
case 'x':
argc--;
argv++;
if (argc > 0)
xwin = argv[0];
-
break;
-
default:
fputs("Usage: gnushogi [-a] [-t] [-c size] [-s savefile][-l listfile] [-x xwndw]\n", stderr);
exit(1);
* ----------------------------------------------------------------------
* 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
*
#define MAX_OPENING_SEQUENCE 20
#define MAX_PATTERN 200
small_short pattern_data[MAX_PATTERN_DATA];
/* minimal ShowMessage to avoid dependency on extraneous display code */
-void
-ShowMessage(char *s)
+static void
+Dummy_ShowMessage(char *s)
{
printf("%s\n", s);
}
+static struct display dummydsp = {
+ .ShowMessage = Dummy_ShowMessage,
+};
+struct display *dsp = &dummydsp;
#define is_digit(c) (((c) >= '0') && ((c) <= '9'))
#define is_alpha(c) ((((c) >= 'a') && ((c) <= 'z')) \
void
-ReadOpeningSequences (short *pindex)
+ReadOpeningSequences (short *pindex, const char* patternfile)
{
FILE *fd;
char s[256];
short max_pattern = 0;
short max_opening_sequence = 0;
- if ((fd = fopen (patternfile, "r")) == NULL)
- fd = fopen ("gnushogi.pat", "r");
+ fd = fopen (patternfile, "r");
- if (fd != NULL)
- {
- *pindex = 0;
+ if (fd == NULL) {
+ sprintf(s, "no pattern file '%s'", patternfile);
+ dsp->ShowMessage(s);
+ return;
+ }
- while (fgets (s, 256, fd) != NULL)
+ *pindex = 0;
+
+ while (fgets (s, 256, fd) != NULL)
+ {
+ if (*s == '#')
+ {
+ /* comment, skip line */
+ }
+ else if (is_alpha(*s))
{
- if (*s == '#')
+ if (max_opening_sequence++ > 0)
{
- /* comment, skip line */
+ pattern_data[(*pindex)++] = END_OF_PATTERNS;
}
- else if (is_alpha(*s))
- {
- if (max_opening_sequence++ > 0)
- {
- pattern_data[(*pindex)++] = END_OF_PATTERNS;
- }
- pattern_data[(*pindex)++] = ValueOfOpeningName(s);
+ pattern_data[(*pindex)++] = ValueOfOpeningName(s);
+ }
+ else
+ {
+ if (ScanPattern(s, pindex))
+ {
+ dsp->ShowMessage("error in pattern sequence...");
+ exit(1);
}
else
{
- if (ScanPattern(s, pindex))
- {
- ShowMessage("error in pattern sequence...");
- exit(1);
- }
- else
- {
- max_pattern++;
- }
+ max_pattern++;
}
}
+ }
- pattern_data[(*pindex)++] = END_OF_PATTERNS;
- pattern_data[(*pindex)++] = END_OF_SEQUENCES;
+ pattern_data[(*pindex)++] = END_OF_PATTERNS;
+ pattern_data[(*pindex)++] = END_OF_SEQUENCES;
- sprintf(s,
- "Pattern: %d bytes for %d sequences with %d patterns.\n",
- *pindex, max_opening_sequence, max_pattern);
- ShowMessage(s);
+ sprintf(s,
+ "Pattern: %d bytes for %d sequences with %d patterns.\n",
+ *pindex, max_opening_sequence, max_pattern);
+ dsp->ShowMessage(s);
- fclose(fd);
- } else {
- sprintf(s, "no pattern file '%s'", patternfile);
- ShowMessage(s);
- }
+ fclose(fd);
}
void
-WriteOpeningSequences (short pindex)
+WriteOpeningSequences (short pindex, const char* patternincfile)
{
FILE *fd;
short n = 0;
short max_pattern = 0;
short max_opening_sequence = 0;
- fd = fopen ("pattern.inc", "w");
+ fd = fopen (patternincfile, "w");
fprintf(fd, "#define MAX_PATTERN_DATA %d\n\n", pindex);
fprintf(fd, "small_short pattern_data[MAX_PATTERN_DATA] =\n{\n");
* ----------------------------------------------------------------------
* 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 "pattern.h"
-extern void ReadOpeningSequences(short *pindex);
-extern void WriteOpeningSequences(short pindex);
+extern void ReadOpeningSequences(short *pindex, const char* patternfile);
+extern void WriteOpeningSequences(short pindex, const char* patternincfile);
small_short board[NO_SQUARES];
small_short color[NO_SQUARES];
{
short sq, side, max_pattern_data;
+ if (argc != 3) {
+ fprintf(stderr, "Usage: %s gnushogi.pat pattern.inc\n", argv[0]);
+ exit(1);
+ }
+ char* patternfile = argv[1];
+ char* patternincfile = argv[2];
+
#ifdef TEST_DISTANCE
short d;
char s[80];
#endif
- ReadOpeningSequences(&max_pattern_data);
- WriteOpeningSequences(max_pattern_data);
+ ReadOpeningSequences(&max_pattern_data, patternfile);
+ WriteOpeningSequences(max_pattern_data, patternincfile);
return 0;
}
* ----------------------------------------------------------------------
* 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"
#include "pattern.h"
- /* constants and pattern_data are generated by "pat2inc" */
+ /* "pat2inc" generates constants and pattern_data */
-#include "pattern.inc"
+#ifndef MINISHOGI
+# include "gnushogi-pattern.inc"
+#else
+# include "gnuminishogi-pattern.inc"
+#endif
struct Pattern_rec Pattern[MAX_PATTERN];
struct OpeningSequence_rec OpeningSequence[MAX_OPENING_SEQUENCE];
* ----------------------------------------------------------------------
* 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 <ctype.h>
#include <signal.h>
#include <stdarg.h>
+#include <stdio.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/file.h>
#endif
#include "gnushogi.h"
-#include "rawdsp.h"
unsigned short MV[MAXDEPTH];
int MSCORE;
extern char *InPtr;
extern short pscore[];
+/****************************************
+ * forward declarations
+ ****************************************/
+
+void Raw_UpdateDisplay(short f, short t, short redraw, short isspec);
/****************************************
* Trivial output functions.
void
-Raw_AlwaysShowMessage(const char *format, va_list ap)
+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)
+Raw_Printf(const char *format, ...)
{
+ va_list ap;
+ va_start(ap, format);
vprintf(format, ap);
+ va_end(ap);
}
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;
}
{
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");
(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);
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 */
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)
+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
Raw_ShowPostnValue(short sq)
{
- short score;
- score = ScorePosition(color[sq]);
+ (void) ScorePosition(color[sq]);
if (color[sq] != neutral)
{
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 */
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,
+};
* ----------------------------------------------------------------------
* 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
*
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowResponseTime();
+ dsp->ShowResponseTime();
ExtraTime = 0;
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowSidetoMove();
+ dsp->ShowSidetoMove();
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- SearchStartStuff(side);
+ dsp->SearchStartStuff(side);
#ifdef HISTORY
array_zero(history, sizeof_history);
if (flag.regularstart && Book)
{
- flag.timeout = bookflag = OpeningBook(&hint, side);
+ flag.timeout = bookflag = OpeningBook(&hint);
if (TCflag)
ResponseTime += ResponseTime;
# ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowDepth(' ');
+ dsp->ShowDepth(' ');
/* search at this level returns score of PV */
score = search(side, 1, Sdepth, alpha, beta, PrVar, &rpt);
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowDepth('-');
+ dsp->ShowDepth('-');
if (TCflag && TCcount < MAXTCCOUNTR)
{
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowDepth('+');
+ dsp->ShowDepth('+');
score = search(side, 1, Sdepth, -(SCORE_LIMIT + 999),
(SCORE_LIMIT + 999), PrVar, &rpt);
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowResults(score, PrVar, '.');
+ dsp->ShowResults(score, PrVar, '.');
}
/********************** end of main loop ***************************/
ElapsedTime(COMPUTE_AND_INIT_MODE);
/* update time control info */
- OutputMove();
+ dsp->OutputMove();
/* if mate set flag */
if ((score == -(SCORE_LIMIT + 999) || score == (SCORE_LIMIT + 998)))
#ifdef QUIETBACKGROUND
if (!background)
#endif
- ShowResponseTime();
+ dsp->ShowResponseTime();
}
else if (!TCflag && flag.musttimeout && Sdepth > MINDEPTH)
{
&& (ProbeFTable(side, depth, ply, &alpha, &beta, &score)
== true))
{
- PutInTTable(side, score, depth, ply, alpha, beta, PV);
+ PutInTTable(side, score, depth, ply, beta, PV);
bstline[ply] = PV;
bstline[ply + 1] = 0;
nxtline[ply + 1] = 0;
/* if at top level */
-#if !defined NOPOST
if (ply == 1)
{
/* at the top update search status */
#ifdef QUIETBACKGROUND
if (!background)
#endif /* QUIETBACKGROUND */
- ShowCurrentMove(pnt, node->f, node->t);
+ dsp->ShowCurrentMove(pnt, node->f, node->t);
}
}
-#endif
if (!(node->flags & exact))
{
{
if (best > beta)
{
- ShowResults(best, bstline, '+');
+ dsp->ShowResults(best, bstline, '+');
}
else if (best < alpha)
{
- ShowResults(best, bstline, '-');
+ dsp->ShowResults(best, bstline, '-');
}
else
{
- ShowResults (best, bstline, '&');
+ dsp->ShowResults(best, bstline, '&');
}
}
#ifdef QUIETBACKGROUND
{
# ifdef HASHFILE /* MCV: warning: this confuses the formatter. */
if (use_ttable
- && PutInTTable(side, best, depth, ply, alpha, beta, mv)
+ && PutInTTable(side, best, depth, ply, beta, mv)
&& hashfile
&& (depth > HashDepth)
&& (GameCnt < HashMoveLimit))
# else
if (use_ttable
- && PutInTTable(side, best, depth, ply, alpha, beta, mv))
+ && PutInTTable(side, best, depth, ply, beta, mv))
# endif
{
PutInFTable(side, best, depth, ply,
/* Make or Unmake drop move. */
-void
-drop(short side, short piece, short f, short t, short iop)
+static void
+drop(short side, short piece, short t, short iop)
{
if (iop == 1)
{
*tempst = svalue[t];
#endif
- (void)drop(side, g->fpiece, f, t, 1);
+ (void)drop(side, g->fpiece, t, 1);
}
else
{
if (node->flags & dropmask)
{
- (void)drop(side, (node->flags & pmask), f, t, 2);
+ (void)drop(side, (node->flags & pmask), t, 2);
#if !defined SAVE_SVALUE
svalue[t] = *tempst;
* ----------------------------------------------------------------------
* 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
*
#endif
if (flag.timeout)
- ShowMessage("timeout");
+ dsp->ShowMessage("timeout");
}
struct timeval tv;
#endif
- PollForInput();
+ dsp->PollForInput();
#ifdef HAVE_GETTIMEOFDAY
gettimeofday(&tv, NULL);
#ifdef QUIETBACKGROUND
if (!background)
#endif
- UpdateClocks();
+ dsp->UpdateClocks();
}
}
* ----------------------------------------------------------------------
* 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
*
short recycle;
short ISZERO = 1;
-
+#if 0
int
-parse(FILE * fd, unsigned short *mv, short side, char *opening)
+parse(FILE * fd, unsigned short *mv, char *opening)
{
int c, i, r1, r2, c1, c2;
char s[128];
return 1;
}
-
+#endif
/*
* The field of a hashtable is computed as follows:
short score,
short depth,
short ply,
- short alpha,
short beta,
unsigned short mv)
{