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);
}
skipb();
Captured[side][pawn] = atoi(InPtr);
skip();
+#ifndef MINISHOGI
Captured[side][lance] = atoi(InPtr);
skip();
Captured[side][knight] = atoi(InPtr);
skip();
+#endif
Captured[side][silver] = atoi(InPtr);
skip();
Captured[side][gold] = atoi(InPtr);
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);
}
}
fputs(empty, fd);
- fprintf(fd, " 9 8 7 6 5 4 3 2 1\n"); /* FIXME */
+#ifndef MINISHOGI
+ fprintf(fd, " 9 8 7 6 5 4 3 2 1\n");
fputs(empty, fd);
fprintf(fd, " p l n s g b r k\n");
+#else
+ fprintf(fd, " 5 4 3 2 1\n");
+ fputs(empty, fd);
+ fprintf(fd, " p s g b r k\n");
+#endif
for (side = 0; side <= 1; side++)
{
fprintf(fd, "%c", (side == black) ? 'B' : 'W');
fprintf(fd, " %2d", Captured[side][pawn]);
+#ifndef MINISHOGI
fprintf(fd, " %2d", Captured[side][lance]);
fprintf(fd, " %2d", Captured[side][knight]);
+#endif
fprintf(fd, " %2d", Captured[side][silver]);
fprintf(fd, " %2d", Captured[side][gold]);
fprintf(fd, " %2d", Captured[side][bishop]);
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')
InPtr = fname;
Captured[side][pawn] = atoi(InPtr);
skip();
+#ifndef MINISHOGI
Captured[side][lance] = atoi(InPtr);
skip();
Captured[side][knight] = atoi(InPtr);
skip();
+#endif
Captured[side][silver] = atoi(InPtr);
skip();
Captured[side][gold] = atoi(InPtr);
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')
for (side = 0; side <= 1; side++)
{
- sprintf(fname, "%d %d %d %d %d %d %d %d\n",
+ sprintf(fname,
+#ifndef MINISHOGI
+ "%d %d %d %d %d %d %d %d\n",
+#else
+ "%d %d %d %d %d %d\n",
+#endif
Captured[side][pawn],
+#ifndef MINISHOGI
Captured[side][lance],
Captured[side][knight],
+#endif
Captured[side][silver],
Captured[side][gold],
Captured[side][bishop],
}
-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)
{
- 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;
{
flag.quit = true;
}
-#if !defined NOPOST
- else if (strcmp(s, "post") == 0)
- {
- flag.post = !flag.post;
- }
-#endif
else if ((strcmp(s, "set") == 0)
|| (strcmp(s, "edit") == 0))
{
- EditBoard();
+ dsp->EditBoard();
}
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, "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);
}
-