Finish the --without-curses support.
[gnushogi.git] / gnushogi / rawdsp.c
index 8d195ce..15f581f 100644 (file)
@@ -2,11 +2,14 @@
  * FILE: rawdsp.c
  *
  * ----------------------------------------------------------------------
- *
- * Copyright (c) 2012 Free Software Foundation
+ * Copyright (c) 1993, 1994, 1995 Matthias Mutz
+ * Copyright (c) 1999 Michael Vanier 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
@@ -28,6 +31,7 @@
 
 #include <ctype.h>
 #include <signal.h>
+#include <stdarg.h>
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/file.h>
@@ -56,14 +60,13 @@ Raw_ClearScreen(void)
 }
 
 
-/* FIXME: change to ShowPrompt? */
 void
-PromptForMove(void)
+Raw_ShowPrompt(void)
 {
     if (!barebones && !XSHOGI)
     {
         /* printf("\nYour move is? "); */
-        printf(CP[124]);
+        fputs(CP[124], stdout);
     }
 }
 
@@ -120,6 +123,54 @@ Raw_ShowMessage(char *s)
 
 
 void
+Raw_AlwaysShowMessage(const char *format, ...)
+{
+    va_list ap;
+    va_start(ap, format);
+    vprintf(format, ap);
+    va_end(ap);
+    printf("\n");
+}
+
+
+void
+Raw_Printf(const char *format, ...)
+{
+    va_list ap;
+    va_start(ap, format);
+    vprintf(format, ap);
+    va_end(ap);
+}
+
+
+void
+Raw_doRequestInputString(const char* fmt, char* buffer)
+{
+    scanf(fmt, 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(CP[91],
+           NodeCnt, (((et) ? ((NodeCnt * 100) / et) : 0)));
+}
+
+
+void
 Raw_ShowPatternCount(short side, short n)
 {
     if (flag.post)
@@ -164,7 +215,6 @@ Raw_ShowStage(void)
  * End of trivial output routines.
  ****************************************/
 
-
 void
 Raw_Initialize(void)
 {
@@ -192,7 +242,6 @@ Raw_Initialize(void)
 }
 
 
-
 void
 Raw_ExitShogi(void)
 {
@@ -201,6 +250,8 @@ Raw_ExitShogi(void)
 
     if (!nolist)
         ListGame();
+
+    exit(0);
 }
 
 
@@ -217,7 +268,6 @@ Raw_Die(int sig)
 }
 
 
-
 void
 Raw_TerminateSearch(int sig)
 {
@@ -232,7 +282,6 @@ Raw_TerminateSearch(int sig)
 }
 
 
-
 void
 Raw_help(void)
 {
@@ -243,7 +292,7 @@ Raw_help(void)
            "------------------------------\n");
     /* printf("7g7f      move from 7g to 7f      quit
      * Exit Shogi\n"); */
-    printf(CP[158]);
+    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]);
@@ -257,36 +306,36 @@ Raw_help(void)
     printf(CP[174], (flag.hash) ? CP[92] : CP[93]);
     /* printf("bd        redraw board            reverse
      * board display\n"); */
-    printf(CP[130]);
+    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"); */
-    printf(CP[200]);
+    fputs(CP[200], stdout);
     /* printf("edit      edit board              force
      * enter game moves\n"); */
-    printf(CP[153]);
+    fputs(CP[153], stdout);
     /* printf("switch    sides with computer     both
      * computer match\n"); */
-    printf(CP[194]);
+    fputs(CP[194], stdout);
     /* printf("black     computer plays black    white
      * computer plays white\n"); */
-    printf(CP[202]);
+    fputs(CP[202], stdout);
     /* printf("depth     set search depth        clock
      * set time control\n"); */
-    printf(CP[149]);
+    fputs(CP[149], stdout);
     /* printf("post      principle variation     hint
      * suggest a move\n"); */
-    printf(CP[177]);
+    fputs(CP[177], stdout);
     /* printf("save      game to file            get
      * game from file\n"); */
-    printf(CP[188]);
+    fputs(CP[188], stdout);
     printf("xsave     pos. to xshogi file     xget"
            "      pos. from xshogi file\n");
     /* printf("random    randomize play          new
      * start new game\n"); */
-    printf(CP[181]);
+    fputs(CP[181], stdout);
     printf("--------------------------------"
            "--------------------------------\n");
     /* printf("Computer: %-12s Opponent:            %s\n", */
@@ -310,17 +359,13 @@ Raw_help(void)
            (TCflag) ? CP[93] : CP[92],
            TimeControl.moves[black], TimeControl.clock[black] / 100,
            TCadd/100, MaxSearchDepth);
-
-    signal(SIGUSR1, Raw_TerminateSearch);
 }
 
 
-
 /*
  * 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)
 {
@@ -332,13 +377,13 @@ Raw_EditBoard(void)
     Raw_ClearScreen();
     Raw_UpdateDisplay(0, 0, 1, 0);
     /* printf(".   exit to main\n"); */
-    printf(CP[29]);
+    fputs(CP[29], stdout);
     /* printf("#   clear board\n"); */
-    printf(CP[28]);
+    fputs(CP[28], stdout);
     /* printf("c   change sides\n"); */
-    printf(CP[136]);
+    fputs(CP[136], stdout);
     /* printf("enter piece & location: \n"); */
-    printf(CP[155]);
+    fputs(CP[155], stdout);
 
     a = black;
 
@@ -378,8 +423,8 @@ Raw_EditBoard(void)
         }
         else
         {
-            c = '9' - s[1];
-            r = 'i' - s[2];
+            c = COL_NAME(s[1]);
+            r = ROW_NAME(s[2]);
         }
 
         if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS))
@@ -421,14 +466,11 @@ 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)
 {
@@ -476,15 +518,13 @@ SetupBoard(void)
     Raw_ClearScreen();
     Raw_UpdateDisplay(0, 0, 1, 0);
     /* printf("Setup successful\n"); */
-    printf(CP[106]);
+    fputs(CP[106], stdout);
 }
 
 
 void
 Raw_SearchStartStuff(short side)
 {
-    signal(SIGUSR1, Raw_TerminateSearch);
-
     if (flag.post)
     {
         printf(CP[123],
@@ -494,7 +534,6 @@ Raw_SearchStartStuff(short side)
 }
 
 
-
 void
 Raw_OutputMove(void)
 {
@@ -568,7 +607,7 @@ Raw_OutputMove(void)
     if (root->flags & draw)
     {
         /*  printf("Drawn game!\n"); */
-        printf(CP[57]);
+        fputs(CP[57], stdout);
     }
     else if (root->score == -(SCORE_LIMIT + 999))
     {
@@ -653,7 +692,6 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec)
 }
 
 
-
 void
 Raw_ChangeAlphaWindow(void)
 {
@@ -664,7 +702,6 @@ Raw_ChangeAlphaWindow(void)
 }
 
 
-
 void
 Raw_ChangeBetaWindow(void)
 {
@@ -675,7 +712,6 @@ Raw_ChangeBetaWindow(void)
 }
 
 
-
 void
 Raw_GiveHint(void)
 {
@@ -685,11 +721,10 @@ Raw_GiveHint(void)
         printf(CP[72], mvstr[0]);   /*hint*/
     }
     else
-        printf(CP[223]);
+        fputs(CP[223], stdout);
 }
 
 
-
 void
 Raw_SelectLevel(char *sx)
 {
@@ -712,7 +747,7 @@ Raw_SelectLevel(char *sx)
     /* line empty ask for input */
     if (!T[0])
     {
-        printf(CP[61]);
+        fputs(CP[61], stdout);
         fgets(T, NO_SQUARES + 1, stdin);
         strcat(T, "XX");
     }
@@ -743,7 +778,7 @@ Raw_SelectLevel(char *sx)
             TCseconds = 0;
 
 #ifdef OPERATORTIME
-        printf(CP[94]);
+        fputs(CP[94], stdout);
         scanf("%hd", &OperatorTime);
 #endif
 
@@ -772,8 +807,6 @@ Raw_SelectLevel(char *sx)
 }
 
 
-
-
 void
 Raw_ChangeSearchDepth(void)
 {
@@ -783,8 +816,6 @@ Raw_ChangeSearchDepth(void)
 }
 
 
-
-
 void
 Raw_ChangeHashDepth(void)
 {
@@ -795,7 +826,6 @@ Raw_ChangeHashDepth(void)
 }
 
 
-
 void
 Raw_SetContempt(void)
 {
@@ -804,7 +834,6 @@ Raw_SetContempt(void)
 }
 
 
-
 void
 Raw_ChangeXwindow(void)
 {
@@ -817,7 +846,6 @@ Raw_ChangeXwindow(void)
  * Raw_ShowPostnValue(short sq)
  * must have called ExaminePosition() first
  */
-
 void
 Raw_ShowPostnValue(short sq)
 {
@@ -839,7 +867,6 @@ Raw_ShowPostnValue(short sq)
 }
 
 
-
 void
 Raw_DoDebug(void)
 {
@@ -918,7 +945,6 @@ Raw_DoDebug(void)
 }
 
 
-
 void
 Raw_DoTable(short table[NO_SQUARES])
 {
@@ -938,7 +964,6 @@ Raw_DoTable(short table[NO_SQUARES])
 }
 
 
-
 void
 Raw_ShowPostnValues(void)
 {
@@ -963,3 +988,58 @@ Raw_ShowPostnValues(void)
     printf("\nhung black %d hung white %d\n", hung[black], hung[white]);
 }
 
+
+/*
+ * Determine the time that has passed since the search was started. If the
+ * elapsed time exceeds the target(ResponseTime + ExtraTime) then set timeout
+ * to true which will terminate the search.
+ * iop = COMPUTE_MODE calculate et, bump ETnodes
+ * iop = COMPUTE_AND_INIT_MODE calculate et, set timeout if time exceeded,
+ *     set reference time
+ */
+void
+Raw_ElapsedTime(ElapsedTime_mode iop)
+{
+    long current_time;
+#ifdef HAVE_GETTIMEOFDAY
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+    current_time = tv.tv_sec*100 + (tv.tv_usec/10000);
+#else
+    et = ((current_time = time((long *) 0)) - time0) * 100;
+#endif
+
+#ifdef INTERRUPT_TEST
+    if (iop == INIT_INTERRUPT_MODE)
+    {
+        itime0 = current_time;
+    }
+    else if (iop == COMPUTE_INTERRUPT_MODE)
+    {
+        it = current_time - itime0;
+    }
+    else
+#endif
+    {
+#ifdef HAVE_GETTIMEOFDAY
+        et = current_time - time0;
+#endif
+        ETnodes = NodeCnt + znodes;
+
+        if (et < 0)
+        {
+#ifdef INTERRUPT_TEST
+            printf("elapsed time %ld not positive\n", et);
+#endif
+            et = 0;
+        }
+
+        if (iop == COMPUTE_AND_INIT_MODE)
+        {
+            if ((et > (ResponseTime + ExtraTime)) && (Sdepth > MINDEPTH))
+                flag.timeout = true;
+
+            time0 = current_time;
+        }
+    }
+}