Merge branch 'maint'
[gnushogi.git] / gnushogi / commondsp.c
index 49b3805..a6f567d 100644 (file)
@@ -52,6 +52,7 @@
 char mvstr[4][6];
 char *InPtr;
 int InBackground = false;
+struct display *dsp = &raw_display;
 
 
 #if defined(BOOKTEST)
@@ -128,8 +129,6 @@ movealgbr(short m, char *s)
 #endif /* BOOKTEST */
 
 
-
-
 /*
  * Generate move strings in different formats.
  *
@@ -169,7 +168,7 @@ algbr(short f, short t, short flag)
     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';
@@ -221,7 +220,6 @@ algbr(short f, short t, short flag)
 }
 
 
-
 /*
  * 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.
@@ -302,7 +300,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv)
         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
@@ -310,7 +308,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv)
             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);
@@ -335,7 +333,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv)
                     char buf[20];
 
                     sprintf(buf, "%s mates!\n", ColorStr[opponent]);
-                    ShowMessage(buf);
+                    dsp->ShowMessage(buf);
                     flag.mate = true;
                 }
             }
@@ -344,21 +342,20 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv)
         }
     }
 
-    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;
@@ -406,7 +403,6 @@ skip()
 }
 
 
-
 void
 skipb()
 {
@@ -415,8 +411,25 @@ 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;
@@ -428,7 +441,7 @@ GetGame(void)
     if (savefile[0]) {
         strcpy(fname, savefile);
     } else {
-        ShowMessage("Enter file name: ");
+        dsp->ShowMessage("Enter file name: ");
         RequestInputString(fname, sizeof(fname)-1);
     }
 
@@ -580,7 +593,7 @@ GetGame(void)
             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();
@@ -633,14 +646,13 @@ GetGame(void)
 
     ZeroRPT();
     InitializeStats();
-    UpdateDisplay(0, 0, 1, 0);
+    dsp->UpdateDisplay(0, 0, 1, 0);
     Sdepth = 0;
     hint = 0;
 }
 
 
-
-void
+static void
 SaveGame(void)
 {
     FILE *fd;
@@ -653,7 +665,7 @@ SaveGame(void)
     if (savefile[0]) {
         strcpy(fname, savefile);
     } else {
-        ShowMessage("Enter file name: ");
+        dsp->ShowMessage("Enter file name: ");
         RequestInputString(fname, sizeof(fname)-1);
     }
 
@@ -778,22 +790,21 @@ SaveGame(void)
 
         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;
@@ -802,7 +813,7 @@ GetXGame(void)
     short sq;
     short side, isp;
 
-    ShowMessage("Enter file name: ");
+    dsp->ShowMessage("Enter file name: ");
     RequestInputString(fname, sizeof(fname)-1);
 
     if (fname[0] == '\0')
@@ -916,13 +927,13 @@ GetXGame(void)
     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;
@@ -931,7 +942,7 @@ SaveXGame(void)
     short sq, piece;
     short side, isp;
 
-    ShowMessage("Enter file name: ");
+    dsp->ShowMessage("Enter file name: ");
     RequestInputString(fname, sizeof(fname)-1);
 
     if (fname[0] == '\0')
@@ -1002,7 +1013,7 @@ SaveXGame(void)
 }
 
 
-void
+static void
 BookSave(void)
 {
     FILE *fd;
@@ -1013,7 +1024,7 @@ BookSave(void)
         strcpy(fname, savefile);
     } else {
         /* Enter file name */
-        ShowMessage("Enter file name: ");
+        dsp->ShowMessage("Enter file name: ");
         RequestInputString(fname, sizeof(fname)-1);
     }
 
@@ -1085,16 +1096,15 @@ BookSave(void)
 
         fclose(fd);
 
-        ShowMessage("Game saved");
+        dsp->ShowMessage("Game saved");
     }
     else
     {
-        ShowMessage("Could not open file");
+        dsp->ShowMessage("Could not open file");
     }
 }
 
 
-
 void
 ListGame(void)
 {
@@ -1222,8 +1232,7 @@ ListGame(void)
 }
 
 
-
-void
+static void
 FlagMove(char c)
 {
     switch(c)
@@ -1245,13 +1254,11 @@ FlagMove(char c)
 }
 
 
-
-
 /*
  * Undo the most recent half-move.
  */
 
-void
+static void
 Undo(void)
 {
     short f, t;
@@ -1300,15 +1307,14 @@ Undo(void)
     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)
 {
@@ -1361,8 +1367,7 @@ FlagString(unsigned short flags, char *s)
 }
 
 
-
-void
+static void
 TestSpeed(void(*f)(short side, short ply,
                    short in_check, short blockable),
           unsigned j)
@@ -1412,15 +1417,14 @@ TestSpeed(void(*f)(short side, short ply,
     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;
@@ -1450,24 +1454,22 @@ TestPSpeed(short(*f) (short side), unsigned j)
     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);
     }
 
@@ -1489,20 +1491,18 @@ SetOppTime(char *s)
 }
 
 
-
-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);
     }
 
@@ -1524,24 +1524,19 @@ SetMachineTime(char *s)
 }
 
 
-
-
-
 /* 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;
@@ -1568,10 +1563,8 @@ InputCommand(char *command)
         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))
@@ -1579,7 +1572,7 @@ InputCommand(char *command)
             Sdepth = 0;
 
 #ifdef QUIETBACKGROUND
-            ShowPrompt();
+            dsp->ShowPrompt();
             have_shown_prompt = true;
 #endif /* QUIETBACKGROUND */
 
@@ -1626,7 +1619,7 @@ InputCommand(char *command)
         {
 #endif /* QUIETBACKGROUND */
 
-            ShowPrompt();
+            dsp->ShowPrompt();
 
 #ifdef QUIETBACKGROUND
         }
@@ -1635,21 +1628,16 @@ InputCommand(char *command)
 #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 */
@@ -1660,8 +1648,8 @@ InputCommand(char *command)
             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;
@@ -1672,27 +1660,21 @@ InputCommand(char *command)
         }
         else if (strcmp(s, "alg") == 0)
         {
-            /* noop */ ; /* alg */
+            /* noop */ ;
         }
         else if ((strcmp(s, "quit") == 0)
                  || (strcmp(s, "exit") == 0))
         {
             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))
+        else if (strcmp(s, "setup") == 0)
         {
-            SetupBoard();
+            dsp->SetupBoard();
         }
         else if (strcmp(s, "first") == 0)
         {
@@ -1716,7 +1698,7 @@ InputCommand(char *command)
         }
         else if (strcmp(s, "help") == 0)
         {
-            help();
+            dsp->help();
         }
         else if (strcmp(s, "material") == 0)
         {
@@ -1742,16 +1724,19 @@ InputCommand(char *command)
         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)
         {
@@ -1767,19 +1752,19 @@ InputCommand(char *command)
         }
         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)
         {
@@ -1787,7 +1772,7 @@ InputCommand(char *command)
         }
         else if (strcmp(s, "hint") == 0)
         {
-            GiveHint();
+            dsp->GiveHint();
         }
         else if (strcmp(s, "both") == 0)
         {
@@ -1801,8 +1786,8 @@ InputCommand(char *command)
         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)
         {
@@ -1880,11 +1865,15 @@ InputCommand(char *command)
         }
         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)
         {
@@ -1904,26 +1893,26 @@ InputCommand(char *command)
         }
         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)
         {
@@ -1941,44 +1930,44 @@ InputCommand(char *command)
 #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
         {
@@ -1994,7 +1983,7 @@ InputCommand(char *command)
                 if (rpt >= 3)
                 {
                     DRAW = DRAW_REPETITION;
-                    ShowMessage(DRAW);
+                    dsp->ShowMessage(DRAW);
                     GameList[GameCnt].flags |= draw;
 
                         flag.mate = true;
@@ -2027,8 +2016,6 @@ InputCommand(char *command)
         }
 
 #ifdef notdef /* optional pass best line to frontend with move */
-#  if !defined NOPOST
-
         if (flag.post && !flag.mate)
         {
             int i;
@@ -2041,15 +2028,12 @@ InputCommand(char *command)
                 printf("%5s ", mvstr[0]);
             }
         }
-#  endif
         printf("\n");
 #endif
     }
 }
 
 
-
-
 void
 SetTimeControl(void)
 {
@@ -2069,4 +2053,3 @@ SetTimeControl(void)
     et = 0;
     ElapsedTime(COMPUTE_AND_INIT_MODE);
 }
-