Warnings: be explicit about values we are using.
[gnushogi.git] / gnushogi / rawdsp.c
index 1a1035b..033d93b 100644 (file)
@@ -111,10 +111,15 @@ Raw_ShowLine(unsigned short *bstline)
 
 
 static void
-Raw_ShowMessage(char *s)
+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);
 }
 
 
@@ -190,7 +195,7 @@ Raw_ShowResponseTime(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  ",
@@ -521,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))
@@ -694,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;