Warnings: be explicit about values we are using.
[gnushogi.git] / gnushogi / rawdsp.c
index ba700db..033d93b 100644 (file)
  * forward declarations
  ****************************************/
 
-void Raw_UpdateDisplay(short f, short t, short redraw, short isspec);
+static void Raw_UpdateDisplay(short f, short t, short redraw, short isspec);
 
 /****************************************
  * Trivial output functions.
  ****************************************/
 
-void
+static void
 Raw_ClearScreen(void)
 {
     if (!XSHOGI)
@@ -62,7 +62,7 @@ Raw_ClearScreen(void)
 }
 
 
-void
+static void
 Raw_ShowPrompt(void)
 {
     if (!XSHOGI)
@@ -70,13 +70,13 @@ Raw_ShowPrompt(void)
 }
 
 
-void
+static void
 Raw_ShowCurrentMove(short pnt, short f, short t)
 {
 }
 
 
-void
+static void
 Raw_ShowDepth(char ch)
 {
     if (!XSHOGI)
@@ -84,7 +84,7 @@ Raw_ShowDepth(char ch)
 }
 
 
-void
+static void
 Raw_ShowGameType(void)
 {
     if (flag.post)
@@ -92,7 +92,7 @@ Raw_ShowGameType(void)
 }
 
 
-void
+static void
 Raw_ShowLine(unsigned short *bstline)
 {
     int i;
@@ -110,15 +110,20 @@ Raw_ShowLine(unsigned short *bstline)
 }
 
 
-void
-Raw_ShowMessage(char *s)
+static void
+Raw_ShowMessage(char *format, ...)
 {
-    if (!XSHOGI)
-        printf("%s\n", s);
+    if (XSHOGI)
+        return;
+    va_list ap;
+    va_start(ap, format);
+    vprintf(format, ap);
+    printf("\n");
+    va_end(ap);
 }
 
 
-void
+static void
 Raw_AlwaysShowMessage(const char *format, ...)
 {
     va_list ap;
@@ -129,7 +134,7 @@ Raw_AlwaysShowMessage(const char *format, ...)
 }
 
 
-void
+static void
 Raw_Printf(const char *format, ...)
 {
     va_list ap;
@@ -139,14 +144,14 @@ Raw_Printf(const char *format, ...)
 }
 
 
-void
+static void
 Raw_doRequestInputString(const char* fmt, char* buffer)
 {
     scanf(fmt, buffer);
 }
 
 
-int
+static int
 Raw_GetString(char* sx)
 {
     int eof = 0;
@@ -165,7 +170,7 @@ Raw_GetString(char* sx)
 }
 
 
-void
+static void
 Raw_ShowNodeCnt(long NodeCnt)
 {
     printf("Nodes = %ld Nodes/sec = %ld\n",
@@ -173,24 +178,24 @@ Raw_ShowNodeCnt(long NodeCnt)
 }
 
 
-void
+static void
 Raw_ShowPatternCount(short side, short n)
 {
     if (flag.post)
-        printf("%s matches %d pattern(s)\n", ColorStr[side], n);
+        printf("%s%s matches %d pattern(s)\n", xboard ? "# " : "" , ColorStr[side], n);
 }
 
 
-void
+static void
 Raw_ShowResponseTime(void)
 {
 }
 
 
-void
+static void
 Raw_ShowResults(short score, unsigned short *bstline, char ch)
 {
-    if (flag.post  && !XSHOGI)
+    if (flag.post && (xboard || !XSHOGI))
     {
         ElapsedTime(2);
         printf("%2d%c %6d %4ld %8ld  ",
@@ -200,13 +205,13 @@ Raw_ShowResults(short score, unsigned short *bstline, char ch)
 }
 
 
-void
+static void
 Raw_ShowSidetoMove(void)
 {
 }
 
 
-void
+static void
 Raw_ShowStage(void)
 {
     printf("stage = %d\n", stage);
@@ -218,7 +223,7 @@ Raw_ShowStage(void)
  * End of trivial output routines.
  ****************************************/
 
-void
+static void
 Raw_Initialize(void)
 {
     mycnt1 = mycnt2 = 0;
@@ -250,7 +255,7 @@ Raw_Initialize(void)
 }
 
 
-void
+static void
 Raw_ExitShogi(void)
 {
     /* CHECKME: what purpose does this next statement serve? */
@@ -263,7 +268,7 @@ Raw_ExitShogi(void)
 }
 
 
-void
+static void
 Raw_TerminateSearch(int sig)
 {
 #ifdef INTERRUPT_TEST
@@ -277,7 +282,7 @@ Raw_TerminateSearch(int sig)
 }
 
 
-void
+static void
 Raw_help(void)
 {
     Raw_ClearScreen();
@@ -342,7 +347,7 @@ Raw_help(void)
  * 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
+static void
 Raw_EditBoard(void)
 {
     short a, r, c, sq, i, found;
@@ -352,18 +357,21 @@ Raw_EditBoard(void)
     Book = BOOKFAIL;
     Raw_ClearScreen();
     Raw_UpdateDisplay(0, 0, 1, 0);
-    fputs(".   Exit to main\n", stdout);
-    fputs("#   Clear board\n", stdout);
-    fputs("c   Change sides\n", stdout);
-    fputs("enter piece & location: \n", stdout);
+    printf(".   Exit to main\n");
+    printf("#   Clear board\n");
+    printf("c   Change sides\n");
+    printf("enter piece & location:\n");
 
     a = black;
 
-    do
+    while(1)
     {
         scanf("%s", s);
         found = 0;
 
+        if (s[0] == '.')
+            break;
+
         if (s[0] == '#')
         {
             for (sq = 0; sq < NO_SQUARES; sq++)
@@ -373,10 +381,13 @@ Raw_EditBoard(void)
             }
 
             ClearCaptured();
+            continue;
         }
 
-        if (s[0] == 'c')
+        if (s[0] == 'c') {
             a = otherside[a];
+            continue;
+        }
 
         if (s[1] == '*')
         {
@@ -389,41 +400,39 @@ Raw_EditBoard(void)
                     break;
                 }
             }
-
-            c = -1;
-            r = -1;
+            if (!found)
+                printf("# Invalid piece type '%c'\n", s[0]);
+            continue;
         }
-        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)) {
+            printf("# Out-of-board position '%c%c'\n", s[1], s[2]);
+            continue;
         }
 
-        if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS))
-        {
-            sq = locn(r, c);
-            color[sq] = a;
-            board[sq] = no_piece;
+        sq = locn(r, c);
 
-            for (i = no_piece; i <= king; i++)
+        for (i = no_piece; i <= king; i++)
+        {
+            if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
             {
-                if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
-                {
-                    if (s[3] == '+')
-                        board[sq] = promoted[i];
-                    else
-                        board[sq] = i;
+                color[sq] = a;
+                if (s[3] == '+')
+                    board[sq] = promoted[i];
+                else
+                    board[sq] = i;
 
-                    found = 1;
-                    break;
-                }
+                found = 1;
+                break;
             }
-
-            if (found == 0)
-                color[sq] = neutral;
         }
+
+        if (!found)
+            printf("# Invalid piece type '%c'\n", s[0]);
     }
-    while (s[0] != '.');
 
     for (sq = 0; sq < NO_SQUARES; sq++)
         Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
@@ -443,7 +452,7 @@ Raw_EditBoard(void)
  * 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
+static void
 Raw_SetupBoard(void)
 {
     short r, c, sq, i;
@@ -493,7 +502,7 @@ Raw_SetupBoard(void)
 }
 
 
-void
+static void
 Raw_SearchStartStuff(short side)
 {
     if (flag.post)
@@ -505,7 +514,7 @@ Raw_SearchStartStuff(short side)
 }
 
 
-void
+static void
 Raw_OutputMove(void)
 {
     if (flag.illegal)
@@ -517,12 +526,15 @@ Raw_OutputMove(void)
     if (mvstr[0][0] == '\0')
         goto nomove;
 
-    if (XSHOGI)
+    mycnt1++;
+    if (XSHOGI && xboard) /* xboard: print move in XBoard format, with 'move' prefix */
+        printf("move %s\n", mvstr[0]);
+    else if (XSHOGI)
         /* add remaining time in milliseconds to xshogi */
-        printf("%d. ... %s %ld\n", ++mycnt1, mvstr[0],
+        printf("%d. ... %s %ld\n", mycnt1, mvstr[0],
                (TimeControl.clock[player] - et) * 10);
     else
-        printf("%d. ... %s\n", ++mycnt1, mvstr[0]);
+        printf("%d. ... %s\n", mycnt1, mvstr[0]);
 
  nomove:
     if ((root->flags & draw) || (root->score == -(SCORE_LIMIT + 999))
@@ -574,22 +586,22 @@ Raw_OutputMove(void)
         printf("%s mates!\n", ColorStr[computer]);
 #ifdef VERYBUGGY
     else if (!XSHOGI && (root->score < -SCORE_LIMIT))
-        printf("%s has a forced mate in %d moves!\n",
+        printf("%s%s has a forced mate in %d moves!\n", xboard ? "# " : "",
                ColorStr[opponent], SCORE_LIMIT + 999 + root->score - 1);
     else if (!XSHOGI && (root->score > SCORE_LIMIT))
-        printf("%s has a forced mate in %d moves!\n",
+        printf("%s%s has a forced mate in %d moves!\n", xboard ? "# " : "",
                ColorStr[computer], SCORE_LIMIT + 998 - root->score - 1);
 #endif /* VERYBUGGY */
 }
 
 
-void
+static void
 Raw_UpdateClocks(void)
 {
 }
 
 
-void
+static void
 Raw_UpdateDisplay(short f, short t, short redraw, short isspec)
 {
 
@@ -648,7 +660,7 @@ Raw_UpdateDisplay(short f, short t, short redraw, short isspec)
 }
 
 
-void
+static void
 Raw_ChangeAlphaWindow(void)
 {
     printf("WAwindow: ");
@@ -658,7 +670,7 @@ Raw_ChangeAlphaWindow(void)
 }
 
 
-void
+static void
 Raw_ChangeBetaWindow(void)
 {
     printf("WBwindow: ");
@@ -668,7 +680,7 @@ Raw_ChangeBetaWindow(void)
 }
 
 
-void
+static void
 Raw_GiveHint(void)
 {
     if (hint)
@@ -681,7 +693,7 @@ Raw_GiveHint(void)
 }
 
 
-void
+static void
 Raw_SelectLevel(char *sx)
 {
     /* FIXME: NO_SQUARES is nonsense here */
@@ -690,56 +702,67 @@ Raw_SelectLevel(char *sx)
     strncpy(T, sx, NO_SQUARES);
     T[NO_SQUARES] = '\0';
 
-    /* if line empty, ask for input */
-    if (!T[0])
-    {
-        fputs("Enter #moves #minutes: ", stdout);
-        fgets(T, NO_SQUARES + 1, stdin);
-    }
-
-    /* skip blackspace */
-    for (p = T; *p == ' '; p++) ;
 
-    /* could be moves or a fischer clock */
-    if (*p == 'f')
-    {
-        /* its a fischer clock game */
-        char *q;
-        p++;
-        TCminutes = (short)strtol(p, &q, 10);
-        TCadd = (short)strtol(q, NULL, 10) *100;
-        TCseconds = 0;
-        TCmoves = 50;
-    }
-    else
-    {
-        /* regular game */
-        char *q;
-        TCadd = 0;
-        TCmoves = (short)strtol(p, &q, 10);
-        TCminutes = (short)strtol(q, &q, 10);
-
-        if (*q == ':')
-            TCseconds = (short)strtol(q + 1, (char **) NULL, 10);
-        else
-            TCseconds = 0;
-
-#ifdef OPERATORTIME
-        fputs("Operator time (hundredths) = ", stdout);
-        scanf("%hd", &OperatorTime);
-#endif
-
-        if (TCmoves == 0)
+    if (!xboard) {
+        /* if line empty, ask for input */
+        if (!T[0])
         {
-            TCflag = false;
-            MaxResponseTime = TCminutes*60L * 100L + TCseconds * 100L;
-            TCminutes = TCseconds = 0;
+            fputs("Enter #moves #minutes: ", stdout);
+            fgets(T, NO_SQUARES + 1, stdin);
+        }
+    
+        /* skip blackspace */
+        for (p = T; *p == ' '; p++) ;
+    
+        /* could be moves or a fischer clock */
+        if (*p == 'f')
+        {
+            /* its a fischer clock game */
+            char *q;
+            p++;
+            TCminutes = (short)strtol(p, &q, 10);
+            TCadd = (short)strtol(q, NULL, 10) *100;
+            TCseconds = 0;
+            TCmoves = 50;
         }
         else
         {
-            TCflag = true;
-            MaxResponseTime = 0;
+            /* regular game */
+            char *q;
+            TCadd = 0;
+            TCmoves = (short)strtol(p, &q, 10);
+            TCminutes = (short)strtol(q, &q, 10);
+    
+            if (*q == ':')
+                TCseconds = (short)strtol(q + 1, (char **) NULL, 10);
+            else
+                TCseconds = 0;
+    
+    #ifdef OPERATORTIME
+            fputs("Operator time (hundredths) = ", stdout);
+            scanf("%hd", &OperatorTime);
+    #endif
+    
+            if (TCmoves == 0)
+            {
+                TCflag = false;
+                MaxResponseTime = TCminutes*60L * 100L + TCseconds * 100L;
+                TCminutes = TCseconds = 0;
+            }
+            else
+            {
+                TCflag = true;
+                MaxResponseTime = 0;
+            }
         }
+    } else {
+        int min, sec=0, inc, mps;
+        /* parse regular "level MPS TC INC" command of WB protocol */
+        if (sscanf(sx, "%d %d %d", &mps, &min, &inc) != 3)
+            sscanf(sx, "%d %d:%d %d", &mps, &min, &sec, &inc);
+        TCminutes = min; TCseconds = sec;
+        TCadd = inc*100; TCmoves = mps ? mps : 50;
+        MaxResponseTime = 0; TCflag = true;
     }
 
     TimeControl.clock[black] = TimeControl.clock[white] = 0;
@@ -754,7 +777,7 @@ Raw_SelectLevel(char *sx)
 }
 
 
-void
+static void
 Raw_ChangeSearchDepth(char *sx)
 {
     char buf[80+1];
@@ -769,7 +792,7 @@ Raw_ChangeSearchDepth(char *sx)
 }
 
 
-void
+static void
 Raw_ChangeHashDepth(void)
 {
     printf("hashdepth = ");
@@ -779,7 +802,7 @@ Raw_ChangeHashDepth(void)
 }
 
 
-void
+static void
 Raw_SetContempt(void)
 {
     printf("contempt = ");
@@ -787,7 +810,7 @@ Raw_SetContempt(void)
 }
 
 
-void
+static void
 Raw_ChangeXwindow(void)
 {
     printf("xwndw = ");
@@ -799,7 +822,7 @@ Raw_ChangeXwindow(void)
  * Raw_ShowPostnValue(short sq)
  * must have called ExaminePosition() first
  */
-void
+static void
 Raw_ShowPostnValue(short sq)
 {
     (void) ScorePosition(color[sq]);
@@ -819,7 +842,7 @@ Raw_ShowPostnValue(short sq)
 }
 
 
-void
+static void
 Raw_DoDebug(void)
 {
     short c, p, sq, tp, tc, tsq, score, j, k;
@@ -897,7 +920,7 @@ Raw_DoDebug(void)
 }
 
 
-void
+static void
 Raw_DoTable(short table[NO_SQUARES])
 {
     short  sq, j, k;
@@ -916,7 +939,7 @@ Raw_DoTable(short table[NO_SQUARES])
 }
 
 
-void
+static void
 Raw_ShowPostnValues(void)
 {
     short sq, score, j, k;
@@ -941,7 +964,7 @@ Raw_ShowPostnValues(void)
 }
 
 
-void
+static void
 Raw_PollForInput(void)
 {
 #ifdef WIN32