Fix use of (COL|ROW)_NAME macros to compute numbers from names.
[gnushogi.git] / gnushogi / rawdsp.c
index 8512633..d4ac301 100644 (file)
@@ -4,6 +4,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
  *
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/file.h>
+#ifndef WIN32
+#include <poll.h>
+#include <unistd.h>
+#endif
 
 #include "gnushogi.h"
 #include "rawdsp.h"
@@ -60,14 +65,12 @@ Raw_ClearScreen(void)
 }
 
 
-/* FIXME: change to ShowPrompt? */
 void
-PromptForMove(void)
+Raw_ShowPrompt(void)
 {
     if (!barebones && !XSHOGI)
     {
-        /* printf("\nYour move is? "); */
-        fputs(CP[124], stdout);
+        fputs("\nYour move is? ", stdout);
     }
 }
 
@@ -83,7 +86,7 @@ Raw_ShowDepth(char ch)
 {
     if (!barebones && !XSHOGI)
     {
-        printf(CP[53], Sdepth, ch);   /* Depth = %d%c */
+        printf("Depth= %d%c ", Sdepth, ch);
         printf("\n");
     }
 }
@@ -124,14 +127,20 @@ Raw_ShowMessage(char *s)
 
 
 void
-Raw_Printf(const char *format, ...)
+Raw_AlwaysShowMessage(const char *format, va_list ap)
+{
+    vprintf(format, ap);
+    printf("\n");
+}
+
+
+void
+Raw_Printf(const char *format, va_list ap)
 {
-    va_list ap;
-    va_start(ap, format);
     vprintf(format, ap);
-    va_end(ap);
 }
 
+
 void
 Raw_doRequestInputString(const char* fmt, char* buffer)
 {
@@ -139,6 +148,26 @@ Raw_doRequestInputString(const char* fmt, char* 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("Nodes = %ld Nodes/sec = %ld\n",
+           NodeCnt, (((et) ? ((NodeCnt * 100) / et) : 0)));
+}
+
+
 void
 Raw_ShowPatternCount(short side, short n)
 {
@@ -184,7 +213,6 @@ Raw_ShowStage(void)
  * End of trivial output routines.
  ****************************************/
 
-
 void
 Raw_Initialize(void)
 {
@@ -192,16 +220,21 @@ Raw_Initialize(void)
 
     if (XSHOGI)
     {
-#ifdef HAVE_SETLINEBUF
-        setlinebuf(stdout);
+#ifdef WIN32
+        /* needed because of inconsistency between MSVC run-time system and gcc includes */
+        setbuf(stdout, NULL);
 #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
-        printf("GNU Shogi %sp%s\n", version, patchlevel);
+#endif
+        printf("GNU Shogi %s\n", PACKAGE_VERSION);
     }
 
     if (hard_time_limit)
@@ -212,7 +245,6 @@ Raw_Initialize(void)
 }
 
 
-
 void
 Raw_ExitShogi(void)
 {
@@ -231,15 +263,14 @@ Raw_Die(int sig)
 {
     char s[80];
 
-    Raw_ShowMessage(CP[31]);        /* Abort? */
+    Raw_ShowMessage("Abort? ");
     scanf("%s", s);
 
-    if (strcmp(s, CP[210]) == 0)    /* yes */
+    if (strcmp(s, "yes") == 0)
         Raw_ExitShogi();
 }
 
 
-
 void
 Raw_TerminateSearch(int sig)
 {
@@ -254,93 +285,53 @@ Raw_TerminateSearch(int sig)
 }
 
 
-
 void
 Raw_help(void)
 {
     Raw_ClearScreen();
-    /* printf("SHOGI command summary\n"); */
-    printf(CP[40], version, patchlevel);
+    printf("GNU Shogi %s command summary\n", PACKAGE_VERSION);
     printf("----------------------------------"
            "------------------------------\n");
-    /* printf("7g7f      move from 7g to 7f      quit
-     * Exit Shogi\n"); */
-    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]);
-    /* printf("2d2c+     move from 2d to 2c and promote\n"); */
-    printf(CP[128], (flag.material) ? CP[92] : CP[93]);
-    /* printf("P*5e      drop pawn to 5e         easy
-     * turn %s\n", (flag.easy) ? "off" : "on"); */
-    printf(CP[173], (flag.easy) ? CP[92] : CP[93]);
-    /* printf("                                  hash
-     * turn %s\n", (flag.hash) ? "off" : "on"); */
-    printf(CP[174], (flag.hash) ? CP[92] : CP[93]);
-    /* printf("bd        redraw board            reverse
-     * board display\n"); */
-    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"); */
-    fputs(CP[200], stdout);
-    /* printf("edit      edit board              force
-     * enter game moves\n"); */
-    fputs(CP[153], stdout);
-    /* printf("switch    sides with computer     both
-     * computer match\n"); */
-    fputs(CP[194], stdout);
-    /* printf("black     computer plays black    white
-     * computer plays white\n"); */
-    fputs(CP[202], stdout);
-    /* printf("depth     set search depth        clock
-     * set time control\n"); */
-    fputs(CP[149], stdout);
-    /* printf("post      principle variation     hint
-     * suggest a move\n"); */
-    fputs(CP[177], stdout);
-    /* printf("save      game to file            get
-     * game from file\n"); */
-    fputs(CP[188], stdout);
+    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");
-    /* printf("random    randomize play          new
-     * start new game\n"); */
-    fputs(CP[181], stdout);
+    fputs("random    randomize play          new       start new game\n", stdout);
     printf("--------------------------------"
            "--------------------------------\n");
-    /* printf("Computer: %-12s Opponent:            %s\n", */
-    printf(CP[46],
+    printf("Computer: %-12s Opponent:            %s\n",
            ColorStr[computer], ColorStr[opponent]);
-    /* printf("Depth:    %-12d Response time:       %d sec\n", */
-    printf(CP[51],
+    printf("Depth:    %-12d Response time:       %d sec\n",
            MaxSearchDepth, MaxResponseTime/100);
-    /* printf("Random:   %-12s Easy mode:           %s\n", */
-    printf(CP[99],
-           (dither) ? CP[93] : CP[92], (flag.easy) ? CP[93] : CP[92]);
-    /* printf("Beep:     %-12s Transposition file: %s\n", */
-    printf(CP[36],
-           (flag.beep) ? CP[93] : CP[92], (flag.hash) ? CP[93] : CP[92]);
-    /* printf("Tsume:    %-12s Force:               %s\n")*/
-    printf(CP[232],
-           (flag.tsume) ? CP[93] : CP[92], (flag.force) ? CP[93] : CP[92]);
-    /* printf("Time Control %s %d moves %d seconds %d opr %d
-     * depth\n", (TCflag) ? "ON" : "OFF", */
-    printf(CP[110],
-           (TCflag) ? CP[93] : CP[92],
+    printf("Random:   %-12s Easy mode:           %s\n",
+           (dither) ? "ON" : "OFF", (flag.easy) ? "ON" : "OFF");
+    printf("Beep:     %-12s Transposition file:  %s\n",
+           (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",
+           (TCflag) ? "ON" : "OFF",
            TimeControl.moves[black], TimeControl.clock[black] / 100,
            TCadd/100, MaxSearchDepth);
 }
 
 
-
 /*
  * 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)
 {
@@ -351,14 +342,10 @@ Raw_EditBoard(void)
     Book = BOOKFAIL;
     Raw_ClearScreen();
     Raw_UpdateDisplay(0, 0, 1, 0);
-    /* printf(".   exit to main\n"); */
-    fputs(CP[29], stdout);
-    /* printf("#   clear board\n"); */
-    fputs(CP[28], stdout);
-    /* printf("c   change sides\n"); */
-    fputs(CP[136], stdout);
-    /* printf("enter piece & location: \n"); */
-    fputs(CP[155], stdout);
+    fputs(".   Exit to main\n", stdout);
+    fputs("#   Clear board\n", stdout);
+    fputs("c   Change sides\n", stdout);
+    fputs("enter piece & location: \n", stdout);
 
     a = black;
 
@@ -367,7 +354,7 @@ Raw_EditBoard(void)
         scanf("%s", s);
         found = 0;
 
-        if (s[0] == CP[28][0])  /*#*/
+        if (s[0] == '#')
         {
             for (sq = 0; sq < NO_SQUARES; sq++)
             {
@@ -378,7 +365,7 @@ Raw_EditBoard(void)
             ClearCaptured();
         }
 
-        if (s[0] == CP[136][0]) /*c*/
+        if (s[0] == 'c')
             a = otherside[a];
 
         if (s[1] == '*')
@@ -398,8 +385,8 @@ Raw_EditBoard(void)
         }
         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))
@@ -426,7 +413,7 @@ Raw_EditBoard(void)
                 color[sq] = neutral;
         }
     }
-    while (s[0] != CP[29][0]);
+    while (s[0] != '.');
 
     for (sq = 0; sq < NO_SQUARES; sq++)
         Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
@@ -441,16 +428,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;
@@ -495,8 +479,7 @@ SetupBoard(void)
     InitializeStats();
     Raw_ClearScreen();
     Raw_UpdateDisplay(0, 0, 1, 0);
-    /* printf("Setup successful\n"); */
-    fputs(CP[106], stdout);
+    fputs("Setup successful\n", stdout);
 }
 
 
@@ -505,20 +488,19 @@ Raw_SearchStartStuff(short side)
 {
     if (flag.post)
     {
-        printf(CP[123],
+        printf("\nMove# %d    Target = %ld    Clock: %ld\n",
                GameCnt/2 + 1,
                ResponseTime, TimeControl.clock[side]);
     }
 }
 
 
-
 void
 Raw_OutputMove(void)
 {
     if (flag.illegal)
     {
-        printf("%s\n", CP[225]);
+        printf("Illegal position.\n");
         return;
     }
 
@@ -559,15 +541,11 @@ Raw_OutputMove(void)
             t = (l + h) >> 1;
         }
 
-        /* printf("Nodes %ld Tree %d Eval %ld
-         * Rate %ld RS high %ld low %ld\n", */
-        printf(CP[89], GenCnt, NodeCnt, t, EvalNodes,
+        printf("Gen %ld Node %ld Tree %d Eval %ld Rate %ld EC %d/%d RS hi %ld lo %ld \n", GenCnt, NodeCnt, t, EvalNodes,
                (et > 100) ? (NodeCnt / (et / 100)) : 0,
                EADD, EGET, reminus, replus);
 
-        /* printf("Hin/Hout/Coll/Fin/Fout =
-         * %ld/%ld/%ld/%ld/%ld\n", */
-        printf(CP[71],
+        printf("Hin/Hout/Tcol/Coll/Fin/Fout = %ld/%ld/%ld/%ld/%ld/%ld\n",
                HashAdd, HashCnt, THashCol, HashCol, FHashCnt, FHashAdd);
     }
 
@@ -575,8 +553,7 @@ Raw_OutputMove(void)
 
     if (!XSHOGI)
     {
-        /* printf("My move is: %s\n", mvstr[0]); */
-        printf(CP[83], mvstr[0]);
+        printf("My move is: %5s\n", mvstr[0]);
 
         if (flag.beep)
             printf("%c", 7);
@@ -585,8 +562,7 @@ Raw_OutputMove(void)
  summary:
     if (root->flags & draw)
     {
-        /*  printf("Drawn game!\n"); */
-        fputs(CP[57], stdout);
+        fputs("Drawn game!\n", stdout);
     }
     else if (root->score == -(SCORE_LIMIT + 999))
     {
@@ -612,6 +588,12 @@ Raw_OutputMove(void)
 
 
 void
+Raw_UpdateClocks(void)
+{
+}
+
+
+void
 Raw_UpdateDisplay(short f, short t, short redraw, short isspec)
 {
 
@@ -624,8 +606,7 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec)
         c = (short)((TimeControl.clock[black] % 6000) / 100);
         l = (short)(TimeControl.clock[white] / 6000);
         m = (short)((TimeControl.clock[white] % 6000) / 100);
-        /* printf("Black %d:%02d  White %d:%02d\n", r, c, l, m); */
-        printf(CP[116], r, c, l, m);
+        printf("Black %d:%02d  White %d:%02d\n", r, c, l, m);
         printf("\n");
 
         for (r = (NO_ROWS - 1); r >= 0; r--)
@@ -671,7 +652,6 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec)
 }
 
 
-
 void
 Raw_ChangeAlphaWindow(void)
 {
@@ -682,7 +662,6 @@ Raw_ChangeAlphaWindow(void)
 }
 
 
-
 void
 Raw_ChangeBetaWindow(void)
 {
@@ -693,31 +672,29 @@ Raw_ChangeBetaWindow(void)
 }
 
 
-
 void
 Raw_GiveHint(void)
 {
     if (hint)
     {
         algbr((short) (hint >> 8), (short) (hint & 0xFF), false);
-        printf(CP[72], mvstr[0]);   /*hint*/
+        printf("Hint: %s\n", mvstr[0]);
     }
     else
-        fputs(CP[223], stdout);
+        fputs("I have no idea.\n", stdout);
 }
 
 
-
 void
 Raw_SelectLevel(char *sx)
 {
 
     char T[NO_SQUARES + 1], *p, *q;
 
-    if ((p = strstr(sx, CP[169])) != NULL)
-        p += strlen(CP[169]);
-    else if ((p = strstr(sx, CP[217])) != NULL)
-        p += strlen(CP[217]);
+    if ((p = strstr(sx, "level")) != NULL)
+        p += strlen("level");
+    else if ((p = strstr(sx, "clock")) != NULL)
+        p += strlen("clock");
 
     strcat(sx, "XX");
     q = T;
@@ -730,7 +707,7 @@ Raw_SelectLevel(char *sx)
     /* line empty ask for input */
     if (!T[0])
     {
-        fputs(CP[61], stdout);
+        fputs("Enter #moves #minutes: ", stdout);
         fgets(T, NO_SQUARES + 1, stdin);
         strcat(T, "XX");
     }
@@ -761,7 +738,7 @@ Raw_SelectLevel(char *sx)
             TCseconds = 0;
 
 #ifdef OPERATORTIME
-        fputs(CP[94], stdout);
+        fputs("Operator time (hundredths) = ", stdout);
         scanf("%hd", &OperatorTime);
 #endif
 
@@ -790,8 +767,6 @@ Raw_SelectLevel(char *sx)
 }
 
 
-
-
 void
 Raw_ChangeSearchDepth(void)
 {
@@ -801,8 +776,6 @@ Raw_ChangeSearchDepth(void)
 }
 
 
-
-
 void
 Raw_ChangeHashDepth(void)
 {
@@ -813,7 +786,6 @@ Raw_ChangeHashDepth(void)
 }
 
 
-
 void
 Raw_SetContempt(void)
 {
@@ -822,7 +794,6 @@ Raw_SetContempt(void)
 }
 
 
-
 void
 Raw_ChangeXwindow(void)
 {
@@ -835,7 +806,6 @@ Raw_ChangeXwindow(void)
  * Raw_ShowPostnValue(short sq)
  * must have called ExaminePosition() first
  */
-
 void
 Raw_ShowPostnValue(short sq)
 {
@@ -857,7 +827,6 @@ Raw_ShowPostnValue(short sq)
 }
 
 
-
 void
 Raw_DoDebug(void)
 {
@@ -865,14 +834,14 @@ Raw_DoDebug(void)
     char s[40];
 
     ExaminePosition(opponent);
-    Raw_ShowMessage(CP[65]);
+    Raw_ShowMessage("Enter piece: ");
     scanf("%s", s);
     c = neutral;
 
-    if ((s[0] == CP[9][0]) || (s[0] == CP[9][1]))    /* w W */
+    if ((s[0] == 'b') || (s[0] == 'B'))
         c = black;
 
-    if ((s[0] == CP[9][2]) || (s[0] == CP[9][3]))    /* b B */
+    if ((s[0] == 'w') || (s[0] == 'W'))
         c = white;
 
     for (p = king; p > no_piece; p--)
@@ -930,13 +899,12 @@ Raw_DoDebug(void)
     }
 
     printf("stage = %d\n", stage);
-    printf(CP[103], score,
+    printf("S%d m%d ps%d gt%c m%d ps%d gt%c", score,
            mtl[computer], pscore[computer], GameType[computer],
            mtl[opponent], pscore[opponent], GameType[opponent]);
 }
 
 
-
 void
 Raw_DoTable(short table[NO_SQUARES])
 {
@@ -956,7 +924,6 @@ Raw_DoTable(short table[NO_SQUARES])
 }
 
 
-
 void
 Raw_ShowPostnValues(void)
 {
@@ -975,8 +942,32 @@ Raw_ShowPostnValues(void)
     }
 
     score = ScorePosition(opponent);
-    printf(CP[103], score,
+    printf("S%d m%d ps%d gt%c m%d ps%d gt%c", score,
            mtl[computer], pscore[computer], GameType[computer],
            mtl[opponent], pscore[opponent], GameType[opponent]);
     printf("\nhung black %d hung white %d\n", hung[black], hung[white]);
 }
+
+
+void
+Raw_PollForInput(void)
+{
+#ifdef WIN32
+    DWORD cnt;
+    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 } };
+    int cnt = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 0);
+    if (cnt < 0) {
+        perror("polling standard input");
+        ExitShogi();
+    }
+#endif
+    if (cnt) { /* if anything to read, or error occured */
+        if (!flag.timeout)
+            flag.back = true; /* previous: flag.timeout = true; */
+        flag.bothsides = false;
+    }
+}