Merge branch 'maint'
[gnushogi.git] / gnushogi / rawdsp.c
index fa121b0..4225799 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
  *
@@ -162,10 +163,17 @@ int
 Raw_GetString(char* sx)
 {
     int eof = 0;
+    char *nl;
     sx[0] = '\0';
 
     while(!eof && !sx[0])
         eof = (fgets(sx, 80, stdin) == NULL);
+
+    /* remove any trailing newline */
+    nl = strchr(sx, '\n');
+    if (nl)
+        nl[0] = '\0';
+
     return eof;
 }
 
@@ -234,13 +242,13 @@ Raw_Initialize(void)
         /* needed because of inconsistency between MSVC run-time system and gcc includes */
         setbuf(stdout, NULL);
 #else
-#ifdef HAVE_SETLINEBUF
-        setlinebuf(stdout);
-#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
 #endif
@@ -300,27 +308,45 @@ Raw_help(void)
 {
     Raw_ClearScreen();
     printf("GNU Shogi %s command summary\n", PACKAGE_VERSION);
-    printf("----------------------------------"
-           "------------------------------\n");
-    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");
-    fputs("random    randomize play          new       start new game\n", stdout);
-    printf("--------------------------------"
-           "--------------------------------\n");
+    printf("----------------------------------------------------------------\n");
+    printf("7g7f      move from 7g to 7f      quit      Exit Shogi\n");
+    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");
+    printf("bd        redraw board            reverse   board display\n");
+    printf("list      game to shogi.lst       book      turn %s used %d of %d\n",
+           (Book) ? "OFF" : "ON", bookcount, booksize);
+    printf("undo      undo last ply           remove    take back a move\n");
+    printf("edit      edit board              force     toggle manual move mode\n");
+    printf("switch    sides with computer     both      computer match\n");
+    printf("black     computer plays black    white     computer plays white\n");
+    printf("sd        set search depth        clock     set time control\n");
+    printf("post      principle variation     hint      suggest a move\n");
+    printf("save      game to file            get       game from file\n");
+    printf("xsave     pos. to xshogi file     xget      pos. from xshogi file\n");
+    printf("random    randomize play          new       start new game\n");
+    printf("setup                             first     \n");
+    printf("go        computer plays now      material  turn %s\n",
+           flag.material ? "OFF" : "ON");
+    printf("level     time control            gamein    \n");
+    printf("time      set engine clock        otime     set opponent clock\n");
+    printf("Awindow                           Bwindow     \n");
+    printf("rcptr     turn %3s                bsave     book save\n",
+           flag.rcptr ? "OFF" : "ON ");
+    printf("hashdepth                         hard      turn easy OFF\n");
+    printf("contempt                          xwndw                  \n");
+    printf("rv        turn %3s                coords    turn %s\n",
+           flag.rv ? "OFF" : "ON ", flag.coords ? "OFF" : "ON");
+    printf("stars     turn %3s                moves                  \n",
+           flag.stars ? "OFF" : "ON ");
+    printf("test                              p                      \n");
+    printf("debug                             depth     alias for 'sd'\n");
+    printf("----------------------------------------------------------------\n");
     printf("Computer: %-12s Opponent:            %s\n",
            ColorStr[computer], ColorStr[opponent]);
     printf("Depth:    %-12d Response time:       %ld sec\n",
@@ -698,28 +724,17 @@ Raw_GiveHint(void)
 void
 Raw_SelectLevel(char *sx)
 {
+    /* FIXME: NO_SQUARES is nonsense here */
+    char T[NO_SQUARES + 1], *p;
 
-    char T[NO_SQUARES + 1], *p, *q;
+    strncpy(T, sx, NO_SQUARES);
+    T[NO_SQUARES] = '\0';
 
-    if ((p = strstr(sx, "level")) != NULL)
-        p += strlen("level");
-    else if ((p = strstr(sx, "clock")) != NULL)
-        p += strlen("clock");
-
-    strcat(sx, "XX");
-    q = T;
-    *q = '\0';
-
-    for (; *p != 'X'; *q++ = *p++);
-
-    *q = '\0';
-
-    /* line empty ask for input */
+    /* if line empty, ask for input */
     if (!T[0])
     {
         fputs("Enter #moves #minutes: ", stdout);
         fgets(T, NO_SQUARES + 1, stdin);
-        strcat(T, "XX");
     }
 
     /* skip blackspace */
@@ -729,6 +744,7 @@ Raw_SelectLevel(char *sx)
     if (*p == 'f')
     {
         /* its a fischer clock game */
+        char *q;
         p++;
         TCminutes = (short)strtol(p, &q, 10);
         TCadd = (short)strtol(q, NULL, 10) *100;
@@ -738,6 +754,7 @@ Raw_SelectLevel(char *sx)
     else
     {
         /* regular game */
+        char *q;
         TCadd = 0;
         TCmoves = (short)strtol(p, &q, 10);
         TCminutes = (short)strtol(q, &q, 10);
@@ -778,10 +795,16 @@ Raw_SelectLevel(char *sx)
 
 
 void
-Raw_ChangeSearchDepth(void)
+Raw_ChangeSearchDepth(char *sx)
 {
-    printf("depth = ");
-    scanf("%hd", &MaxSearchDepth);
+    char buf[80+1];
+    strncpy(buf, sx, 80); buf[80] = '\0';
+    /* if line empty, ask for input */
+    if (!buf[0]) {
+        printf("depth = ");
+        fgets(buf, 80+1, stdin);
+    }
+    sscanf(buf, "%hd", &MaxSearchDepth);
     TCflag = !(MaxSearchDepth > 0);
 }