Merge branch 'maint'
authorYann Dirson <ydirson@free.fr>
Thu, 16 Jan 2014 21:43:06 +0000 (22:43 +0100)
committerYann Dirson <ydirson@free.fr>
Thu, 16 Jan 2014 21:43:06 +0000 (22:43 +0100)
Conflicts:
configure.ac
gnushogi/cursesdsp.h
gnushogi/dspwrappers.c
gnushogi/dspwrappers.h
gnushogi/pattern.c
gnushogi/rawdsp.h

18 files changed:
1  2 
configure.ac
gnushogi/Makefile.in
gnushogi/book.c
gnushogi/commondsp.c
gnushogi/cursesdsp.c
gnushogi/eval.c
gnushogi/genmove.c
gnushogi/gnushogi.h
gnushogi/init-common.c
gnushogi/init.c
gnushogi/main.c
gnushogi/makepattern.c
gnushogi/pat2inc.c
gnushogi/pattern.c
gnushogi/rawdsp.c
gnushogi/search.c
gnushogi/tcontrl.c
gnushogi/util.c

diff --combined configure.ac
@@@ -5,8 -5,7 +5,8 @@@
  dnl Process this file with autoconf to produce a configure script.
  
  AC_PREREQ(2.57)
- AC_INIT([gnushogi],[1.4.1-rc1+],[https://savannah.gnu.org/bugs/?group=gnushogi])
+ AC_INIT([gnushogi],[1.4.1+],[https://savannah.gnu.org/bugs/?group=gnushogi])
 +AM_INIT_AUTOMAKE
  AC_CONFIG_SRCDIR([gnushogi/gnushogi.h])
  AC_CONFIG_HEADER(config.h)
  
@@@ -38,8 -37,7 +38,8 @@@ LIBCURSES
  AS_IF([test "x$with_curses" != xno],
    [AC_CHECK_LIB([curses], [clrtoeol],
      [AC_SUBST([LIBCURSES], [-lcurses])
 -     AC_SUBST([CURSESDSP], [cursesdsp.o])
 +     AC_SUBST([CURSESDSP], [gnushogi-cursesdsp.o])
 +     AC_SUBST([CURSESDSPMINI], [gnuminishogi-cursesdsp.o])
       AC_DEFINE([HAVE_LIBCURSES], [1],
                 [Define if you have lib])
      ],
@@@ -59,7 -57,7 +59,7 @@@ AC_CHECK_LIB([termcap], [tgoto]
  
  if [[ $ac_cv_c_compiler_gnu = yes ]]
  then
 -WARNINGS="-Wall -Wno-implicit-int -Wstrict-prototypes -ansi -pedantic"
 +WARNINGS="-Wall -Wno-implicit-int -Wstrict-prototypes -ansi"
  CEXTRAFLAGS="-fsigned-char -funroll-loops"
  else
  # Who knows what warnings your compiler uses?
@@@ -113,6 -111,15 +113,6 @@@ AC_CHECK_FUNCS([setvbuf setlinebuf]
  # Set various user-definable options.
  #
  
 -AC_ARG_ENABLE([minishogi],
 -[  --enable-minishogi
 -        Build gnuminishogi instead of gnushogi (default: no)],
 -[AC_DEFINE([MINISHOGI], [], [Define to build gnuminishogi instead of gnushogi])
 -AC_SUBST([PROGNAME], [gnuminishogi])
 -],
 -[AC_SUBST([PROGNAME], [gnushogi])
 -])
 -
  OPT=
  FIRST_SHOGI_PROGRAM=gnushogi
  SECOND_SHOGI_PROGRAM=gnushogi
@@@ -158,18 -165,18 +158,18 @@@ AC_SUBST(SECOND_HOST
  
  if [[ $enable_xshogi = yes ]]
  then
 -XSHOGI=xshogi_compile
 -XSHOGIINSTALL=xshogi_install
 -XSHOGICLEAN=xshogi_clean
 +XSHOGI=xshogi
 +XSHOGIMAN=xshogi.6
 +XDOCS='$(XDOCS)'
  else
  XSHOGI=
 -XSHOGIINSTALL=
 -XSHOGICLEAN=
 +XSHOGIMAN=
 +XDOCS=
  fi
  
  AC_SUBST(XSHOGI)
 -AC_SUBST(XSHOGIINSTALL)
 -AC_SUBST(XSHOGICLEAN)
 +AC_SUBST(XSHOGIMAN)
 +AC_SUBST(XDOCS)
  
  ##########
  AC_CONFIG_FILES([Makefile
diff --combined gnushogi/Makefile.in
@@@ -3,6 -3,7 +3,7 @@@
  #
  # Copyright (c) 1993, 1994 Matthias Mutz
  # Copyright (c) 1998, 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
  # Copyright (c) 1992 Free Software Foundation
@@@ -94,6 -95,7 +95,6 @@@ BINBOOK    = -DBINBOOK=\"$(LIBDIR)/$(PR
  # patterns may be described in order to support the correct order of moves.
  
  PATTERNFILE=$(ROOT)/misc/$(PROGNAME).pat
 -PATTERN    = -DPATTERNFILE=\"$(PATTERNFILE)\"
  
  
  all:
@@@ -114,6 -116,7 +115,6 @@@ NOTCOMMONFILES = 
                  book.o         \
                  commondsp.o    \
                  @CURSESDSP@    \
 -                dspwrappers.o  \
                  eval.o         \
                  genmove.o      \
                  init.o         \
@@@ -163,6 -166,9 +164,6 @@@ commondsp.o: commondsp.
  cursesdsp.o: cursesdsp.c
        $(CC) $(CFLAGS) -c $<
  
 -dspwrappers.o: dspwrappers.c
 -      $(CC) $(CFLAGS) -c $<
 -
  genmove.o: genmove.c
        $(CC) $(CFLAGS) -c $<
  
@@@ -185,7 -191,7 +186,7 @@@ main.o: main.
  # pattern textfile must be used.
  
  makepattern.o: makepattern.c
 -      $(CC) $(CFLAGS) $(PATTERN) -c $<
 +      $(CC) $(CFLAGS) -c $<
  
  pattern.o: pattern.c
        $(CC)  $(CFLAGS) -c $<
@@@ -215,7 -221,7 +216,7 @@@ sizetest.o: sizetest.
        $(CC) $(CFLAGS) -c $<
  
  pattern.inc: $(PATTERNFILE) pat2inc
 -      ./pat2inc
 +      ./pat2inc $< $@
  
  #
  # Other targets.
@@@ -269,11 -275,11 +270,11 @@@ attacks.o:     attacks.c gnushogi.
  book.o:        book.c gnushogi.h
  commondsp.o:   commondsp.c gnushogi.h
  cursesdsp.o:   cursesdsp.c gnushogi.h
 -dspwrappers.o: dspwrappers.c gnushogi.h
  genmove.o:     genmove.c gnushogi.h
  globals.o:     globals.c gnushogi.h
  eval.o:        eval.c eval.h gnushogi.h $(SRCDIR)/pattern.h
  init.o:        init.c gnushogi.h $(SRCDIR)/pattern.h
 +init-common.o: init-common.c gnushogi.h
  main.o:        main.c gnushogi.h
  makepattern.o: pattern.c gnushogi.h $(SRCDIR)/pattern.h
  pattern.o:     pattern.c gnushogi.h $(SRCDIR)/pattern.h pattern.inc
diff --combined gnushogi/book.c
@@@ -4,6 -4,7 +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
   *
@@@ -365,7 -366,7 +366,7 @@@ RESET(void
  
  static
  int
 -Vparse (FILE * fd, USHORT *mv, USHORT *flags, USHORT side, int moveno)
 +Vparse (FILE * fd, USHORT *mv, USHORT *flags, int moveno)
  {
      int c, i;
      char s[255];
@@@ -646,7 -647,7 +647,7 @@@ GetOpenings(void
  {
      short i;
      int mustwrite = false, first;
 -    unsigned short xside, side;
 +    unsigned short side;
      short c;
      USHORT mv, flags;
      unsigned int x;
          {
              /* setvbuf(fd, buffr, _IOFBF, 2048); */
              side = black;
              hashbd = hashkey = 0;
              i = 0;
  
 -            while ((c = Vparse(fd, &mv, &flags, side, i)) >= 0)
 +            while ((c = Vparse(fd, &mv, &flags, i)) >= 0)
              {
                  if (c == 1)
                  {
                      computer = opponent;
                      opponent = computer ^ 1;
  
 -                    xside = side;
                      side = side ^ 1;
                  }
                  else if (i > 0)
                      RESET();
                      i = 0;
                      side = black;
 -                    xside = white;
 -
                  }
              }
  
  
          }
  
 -        sprintf(msg, "Book used %d(%d).", B.bookcount, B.booksize);
 -        ShowMessage(msg);
 +        sprintf(msg, "Book used %lu(%lu).", B.bookcount, B.booksize);
 +        dsp->ShowMessage(msg);
      }
  
      /* Set everything back to start the game. */
      /* Now get ready to play .*/
      if (!B.bookcount)
      {
 -        ShowMessage("Can't find book.");
 +        dsp->ShowMessage("Can't find book.");
          Book = 0;
      }
  }
  
  
  /*
 - * OpeningBook(hint, side)
 + * OpeningBook(hint)
   *
   * Go through each of the opening lines of play and check for a match with
   * the current game listing. If a match occurs, generate a random
   */
  
  int
 -OpeningBook(unsigned short *hint, short side)
 +OpeningBook(unsigned short *hint)
  {
      unsigned short r, m;
      int possibles = TrPnt[2] - TrPnt[1];
diff --combined gnushogi/commondsp.c
@@@ -6,6 -6,7 +6,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
   *
@@@ -51,7 -52,6 +52,7 @@@
  char mvstr[4][6];
  char *InPtr;
  int InBackground = false;
 +struct display *dsp = &raw_display;
  
  
  #if defined(BOOKTEST)
@@@ -128,6 -128,8 +129,6 @@@ movealgbr(short m, char *s
  #endif /* BOOKTEST */
  
  
 -
 -
  /*
   * Generate move strings in different formats.
   *
@@@ -167,7 -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';
  }
  
  
 -
  /*
   * 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.
@@@ -299,7 -302,7 +300,7 @@@ VerifyMove(char *s, VerifyMove_mode iop
          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
              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);
                      char buf[20];
  
                      sprintf(buf, "%s mates!\n", ColorStr[opponent]);
 -                    ShowMessage(buf);
 +                    dsp->ShowMessage(buf);
                      flag.mate = true;
                  }
              }
          }
      }
  
 -    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;
@@@ -402,6 -406,7 +403,6 @@@ skip(
  }
  
  
 -
  void
  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;
      if (savefile[0]) {
          strcpy(fname, savefile);
      } else {
 -        ShowMessage("Enter file name: ");
 +        dsp->ShowMessage("Enter file name: ");
          RequestInputString(fname, sizeof(fname)-1);
      }
  
              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();
  
      ZeroRPT();
      InitializeStats();
 -    UpdateDisplay(0, 0, 1, 0);
 +    dsp->UpdateDisplay(0, 0, 1, 0);
      Sdepth = 0;
      hint = 0;
  }
  
  
 -
 -void
 +static void
  SaveGame(void)
  {
      FILE *fd;
      if (savefile[0]) {
          strcpy(fname, savefile);
      } else {
 -        ShowMessage("Enter file name: ");
 +        dsp->ShowMessage("Enter file name: ");
          RequestInputString(fname, sizeof(fname)-1);
      }
  
  
          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;
      short sq;
      short side, isp;
  
 -    ShowMessage("Enter file name: ");
 +    dsp->ShowMessage("Enter file name: ");
      RequestInputString(fname, sizeof(fname)-1);
  
      if (fname[0] == '\0')
      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;
      short sq, piece;
      short side, isp;
  
 -    ShowMessage("Enter file name: ");
 +    dsp->ShowMessage("Enter file name: ");
      RequestInputString(fname, sizeof(fname)-1);
  
      if (fname[0] == '\0')
  }
  
  
 -void
 +static void
  BookSave(void)
  {
      FILE *fd;
          strcpy(fname, savefile);
      } else {
          /* Enter file name */
 -        ShowMessage("Enter file name: ");
 +        dsp->ShowMessage("Enter file name: ");
          RequestInputString(fname, sizeof(fname)-1);
      }
  
  
          fclose(fd);
  
 -        ShowMessage("Game saved");
 +        dsp->ShowMessage("Game saved");
      }
      else
      {
 -        ShowMessage("Could not open file");
 +        dsp->ShowMessage("Could not open file");
      }
  }
  
  
 -
  void
  ListGame(void)
  {
  }
  
  
 -
 -void
 +static void
  FlagMove(char c)
  {
      switch(c)
  }
  
  
 -
 -
  /*
   * Undo the most recent half-move.
   */
  
 -void
 +static void
  Undo(void)
  {
      short f, t;
      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)
  {
  }
  
  
 -
 -void
 +static void
  TestSpeed(void(*f)(short side, short ply,
                     short in_check, short blockable),
            unsigned j)
      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;
      else
          et = 1;
  
 -    ShowNodeCnt(cnt);
 +    dsp->ShowNodeCnt(cnt);
  }
  
  
 -
 -void
 -SetOppTime(char *s)
 +static void
 +SetOppTime(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);
      }
  
  }
  
  
 -
 -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);
      }
  
  }
  
  
 -
 -
 -
  /* 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;
          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))
              Sdepth = 0;
  
  #ifdef QUIETBACKGROUND
 -            ShowPrompt();
 +            dsp->ShowPrompt();
              have_shown_prompt = true;
  #endif /* QUIETBACKGROUND */
  
          {
  #endif /* QUIETBACKGROUND */
  
 -            ShowPrompt();
 +            dsp->ShowPrompt();
  
  #ifdef QUIETBACKGROUND
          }
  #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 */
              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;
          }
          else if (strcmp(s, "alg") == 0)
          {
 -            /* noop */ ; /* alg */
 +            /* noop */ ;
          }
          else if ((strcmp(s, "quit") == 0)
                   || (strcmp(s, "exit") == 0))
          {
              flag.quit = true;
          }
          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)
          {
          }
          else if (strcmp(s, "help") == 0)
          {
 -            help();
 +            dsp->help();
          }
          else if (strcmp(s, "material") == 0)
          {
          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)
          {
          }
          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)
          {
          }
          else if (strcmp(s, "hint") == 0)
          {
 -            GiveHint();
 +            dsp->GiveHint();
          }
          else if (strcmp(s, "both") == 0)
          {
          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)
          {
          }
          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)
          {
          }
          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)
          {
  #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
          {
                  if (rpt >= 3)
                  {
                      DRAW = DRAW_REPETITION;
 -                    ShowMessage(DRAW);
 +                    dsp->ShowMessage(DRAW);
                      GameList[GameCnt].flags |= draw;
  
                          flag.mate = true;
          }
  
  #ifdef notdef /* optional pass best line to frontend with move */
 -#  if !defined NOPOST
 -
          if (flag.post && !flag.mate)
          {
              int i;
                  printf("%5s ", mvstr[0]);
              }
          }
 -#  endif
          printf("\n");
  #endif
      }
  }
  
  
 -
 -
  void
  SetTimeControl(void)
  {
      et = 0;
      ElapsedTime(COMPUTE_AND_INIT_MODE);
  }
 -
diff --combined gnushogi/cursesdsp.c
@@@ -6,6 -6,7 +6,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
   *
@@@ -36,7 -37,6 +37,7 @@@
  #include <ctype.h>
  #include <signal.h>
  #include <stdio.h>
 +#include <stdarg.h>
  
  #include <sys/param.h>
  #include <sys/types.h>
@@@ -44,6 -44,7 +45,6 @@@
  #include <curses.h>
  
  #include "gnushogi.h"
 -#include "cursesdsp.h"
  
  #if HAVE_UNISTD_H
  #include <unistd.h>
@@@ -72,17 -73,12 +73,17 @@@ unsigned short MV[MAXDEPTH]
  int MSCORE;
  char *DRAW;
  
 -/* Forward declarations. */
 -/* FIXME: change this name, puh-leeze! */
 +/****************************************
 + * forward declarations
 + ****************************************/
  
 +/* FIXME: change this name, puh-leeze! */
  static void UpdateCatched(void);
  static void DrawPiece(short sq);
  static void ShowScore(short score);
 +void Curses_UpdateDisplay(short f, short t, short redraw, short isspec);
 +void Curses_Die(int sig);
 +void Curses_ShowSidetoMove(void);
  
  /****************************************
   * Trivial output functions.
@@@ -111,6 -107,14 +112,6 @@@ gotoXY(short x, short y
  }
  
  
 -static void
 -ClearMessage(void)
 -{
 -    gotoXY(TAB, 6);
 -    ClearEoln();
 -}
 -
 -
  void
  Curses_ShowCurrentMove(short pnt, short f, short t)
  {
@@@ -164,26 -168,20 +165,26 @@@ Curses_ShowMessage(char *s
  
  
  void
 -Curses_AlwaysShowMessage(const char *format, va_list ap)
 +Curses_AlwaysShowMessage(const char *format, ...)
  {
      static char buffer[60];
 +    va_list ap;
 +    va_start(ap, format);
      vsnprintf(buffer, sizeof(buffer), format, ap);
      Curses_ShowMessage(buffer);
 +    va_end(ap);
  }
  
  
  void
 -Curses_Printf(const char *format, va_list ap)
 +Curses_Printf(const char *format, ...)
  {
      static char buffer[60];
 +    va_list ap;
 +    va_start(ap, format);
      vsnprintf(buffer, sizeof(buffer), format, ap);
      printw("%s", buffer);
 +    va_end(ap);
  }
  
  
@@@ -677,7 -675,7 +678,7 @@@ Curses_OutputMove(void
              t = (l + h) >> 1;
          }
  
 -        ShowNodeCnt(NodeCnt);
 +        Curses_ShowNodeCnt(NodeCnt);
          gotoXY(TAB, 23);
          printw("Max Tree = %5d", t);
          ClearEoln();
@@@ -719,7 -717,7 +720,7 @@@ Curses_UpdateClocks(void
      printw("%d:%02d  ", m, s); 
  
      if (flag.post)
 -        ShowNodeCnt(NodeCnt);
 +        Curses_ShowNodeCnt(NodeCnt);
  
      refresh();
  }
@@@ -769,8 -767,10 +770,8 @@@ DrawPiece(short sq
  void
  Curses_ShowPostnValue(short sq)
  {
 -    short score;
 -
      gotoXY(4 + 5 * VIR_C(sq), 5 + 2 * (7 - VIR_R(sq)));       /* CHECKME */
 -    score = ScorePosition(color[sq]);
 +    (void) ScorePosition(color[sq]);
  
      if (color[sq] != neutral)
  #if defined SAVE_SVALUE
@@@ -967,7 -967,7 +968,7 @@@ Curses_GiveHint(void
  
  
  void
 -Curses_ChangeSearchDepth(void)
 +Curses_ChangeSearchDepth(char* sx)
  {
      Curses_ShowMessage("depth = ");
      FLUSH_SCANW("%hd", &MaxSearchDepth);
@@@ -1203,48 -1203,3 +1204,48 @@@ Curses_SetupBoard(void
  {
      Curses_ShowMessage("'setup' command is not supported in Cursesmode");
  }
 +
 +
 +struct display curses_display =
 +{
 +    .ChangeAlphaWindow    = Curses_ChangeAlphaWindow,
 +    .ChangeBetaWindow     = Curses_ChangeBetaWindow,
 +    .ChangeHashDepth      = Curses_ChangeHashDepth,
 +    .ChangeSearchDepth    = Curses_ChangeSearchDepth,
 +    .ChangeXwindow        = Curses_ChangeXwindow,
 +    .ClearScreen          = Curses_ClearScreen,
 +    .DoDebug              = Curses_DoDebug,
 +    .DoTable              = Curses_DoTable,
 +    .EditBoard            = Curses_EditBoard,
 +    .ExitShogi            = Curses_ExitShogi,
 +    .GiveHint             = Curses_GiveHint,
 +    .Initialize           = Curses_Initialize,
 +    .ShowNodeCnt          = Curses_ShowNodeCnt,
 +    .OutputMove           = Curses_OutputMove,
 +    .PollForInput         = Curses_PollForInput,
 +    .SetContempt          = Curses_SetContempt,
 +    .SearchStartStuff     = Curses_SearchStartStuff,
 +    .SelectLevel          = Curses_SelectLevel,
 +    .ShowCurrentMove      = Curses_ShowCurrentMove,
 +    .ShowDepth            = Curses_ShowDepth,
 +    .ShowGameType         = Curses_ShowGameType,
 +    .ShowLine             = Curses_ShowLine,
 +    .ShowMessage          = Curses_ShowMessage,
 +    .AlwaysShowMessage    = Curses_AlwaysShowMessage,
 +    .Printf               = Curses_Printf,
 +    .doRequestInputString = Curses_doRequestInputString,
 +    .GetString            = Curses_GetString,
 +    .SetupBoard           = Curses_SetupBoard,
 +    .ShowPatternCount     = Curses_ShowPatternCount,
 +    .ShowPostnValue       = Curses_ShowPostnValue,
 +    .ShowPostnValues      = Curses_ShowPostnValues,
 +    .ShowPrompt           = Curses_ShowPrompt,
 +    .ShowResponseTime     = Curses_ShowResponseTime,
 +    .ShowResults          = Curses_ShowResults,
 +    .ShowSidetoMove       = Curses_ShowSidetoMove,
 +    .ShowStage            = Curses_ShowStage,
 +    .TerminateSearch      = Curses_TerminateSearch,
 +    .UpdateClocks         = Curses_UpdateClocks,
 +    .UpdateDisplay        = Curses_UpdateDisplay,
 +    .help                 = Curses_help,
 +};
diff --combined gnushogi/eval.c
@@@ -4,6 -4,7 +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
   *
@@@ -32,6 -33,9 +33,6 @@@
  #include "gnushogi.h"
  #include "pattern.h"
  
 -extern void
 -ShowStage(void);
 -
  /* Hash table for preventing multiple scoring of the same position */
  
  int EADD = 0;       /* number of writes to the cache table */
@@@ -1259,12 -1263,13 +1260,12 @@@ trapped(short sq
  
  
  static int
 -AttackedPieceValue(short sq, short side)
 +AttackedPieceValue(short sq)
  {
 -    short s, ds;
 +    short s;
  
      s = 0;
  
 -      ds = -fv1[HUNGP] * 2;
      hung[c1]++;
      shung[sq]++;
  
@@@ -1422,7 -1427,7 +1423,7 @@@ PawnValue(short sq, short side
   */
  
  static inline int
 -LanceValue(short sq, short side)
 +LanceValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -KnightValue(short sq, short side)
 +KnightValue(short sq)
  {
      short s = 0, ad;
      short ds, checked_trapped = false;
   */
  
  static inline int
 -SilverValue(short sq, short side)
 +SilverValue(short sq)
  {
      short s= 0, ds, ad;
  
   */
  
  static inline int
 -GoldValue(short sq, short side)
 +GoldValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -BishopValue(short sq, short side)
 +BishopValue(short sq)
  {
      short s = 0, ds, ad;
  
@@@ -1714,7 -1719,7 +1715,7 @@@ RookValue(short sq, short side
   */
  
  static inline int
 -PPawnValue(short sq, short side)
 +PPawnValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -PLanceValue(short sq, short side)
 +PLanceValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -PKnightValue(short sq, short side)
 +PKnightValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -PSilverValue(short sq, short side)
 +PSilverValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -PBishopValue(short sq, short side)
 +PBishopValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -PRookValue(short sq, short side)
 +PRookValue(short sq)
  {
      short s = 0, ds, ad;
  
   */
  
  static inline int
 -KingValue(short sq, short side)
 +KingValue(short sq)
  {
      short s = 0, ds;
  
@@@ -1900,7 -1905,7 +1901,7 @@@ PieceValue(short sq, short side
          if (a1 == 0)
          {
              /* undefended piece */
 -            s += AttackedPieceValue(sq, side);
 +            s += AttackedPieceValue(sq);
          }
          else
          {
              if (attack_value < piece_value)
              {
                  /* attacked by a weaker piece */
 -                s += AttackedPieceValue(sq, side) / 2;
 +                s += AttackedPieceValue(sq) / 2;
              }
              else if (abs(attack_value - piece_value) < 10)
              {
  
  #ifndef MINISHOGI
      case lance:
 -        s += LanceValue(sq, side);
 +        s += LanceValue(sq);
          break;
  
      case knight:
 -        s += KnightValue(sq, side);
 +        s += KnightValue(sq);
          break;
  #endif
  
      case silver:
 -        s += SilverValue(sq, side);
 +        s += SilverValue(sq);
          break;
  
      case gold:
 -        s += GoldValue(sq, side);
 +        s += GoldValue(sq);
          break;
  
      case bishop:
 -        s += BishopValue(sq, side);
 +        s += BishopValue(sq);
          break;
  
      case rook:
          break;
  
      case king:
 -        s += KingValue(sq, side);
 +        s += KingValue(sq);
          break;
  
      case ppawn:
 -        s += PPawnValue(sq, side);
 +        s += PPawnValue(sq);
          break;
  
  #ifndef MINISHOGI
      case plance:
 -        s += PLanceValue(sq, side);
 +        s += PLanceValue(sq);
          break;
  
      case pknight:
 -        s += PKnightValue(sq, side);
 +        s += PKnightValue(sq);
          break;
  #endif
  
      case psilver:
 -        s += PSilverValue(sq, side);
 +        s += PSilverValue(sq);
          break;
  
      case pbishop:
 -        s += PBishopValue(sq, side);
 +        s += PBishopValue(sq);
          break;
  
      case prook:
 -        s += PRookValue(sq, side);
 +        s += PRookValue(sq);
          break;
      }
  
@@@ -2134,7 -2139,7 +2135,7 @@@ UpdatePatterns(short side, short GameCn
      }
  
      if (flag.post)
 -        ShowPatternCount(side, n);
 +        dsp->ShowPatternCount(side, n);
  
      if (os != END_OF_SEQUENCES)
          update_advance_bonus(side, os);
@@@ -2526,8 -2531,8 +2527,8 @@@ DetermineGameType(short side_to_move
      }
      else
      {
 -        ShowPatternCount(black, -1);
 -        ShowPatternCount(white, -1);
 +        dsp->ShowPatternCount(black, -1);
 +        dsp->ShowPatternCount(white, -1);
      }
  }
  
@@@ -2704,7 -2709,7 +2705,7 @@@ DetermineStage(short side
          stage = 0;
  
      if (flag.post)
 -        ShowStage();
 +        dsp->ShowStage();
  
      /* Determine stage dependant weights */
  
  void
  UpdateWeights(short stage)
  {
 +  /* FIXME: this was emptied between 1.1p02 ans 1.2p03, do we keep it ? */
  }
  
  
diff --combined gnushogi/genmove.c
@@@ -4,6 -4,7 +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
   *
@@@ -245,12 -246,12 +246,12 @@@ gives_check_flag(unsigned short *flags
  
  
  inline static void
 -Link(short side, short piece,
 +Link(short side,
       short from, short to, unsigned short local_flag, short s)
  {
      if (*TrP == TREE)
      {
 -        ShowMessage("TREE overflow\n");
 +        dsp->ShowMessage("TREE overflow\n");
      }
      else
      {
@@@ -340,8 -341,8 +341,8 @@@ PromotionPossible(short color, short f
  }
  
  
 -inline int
 -NonPromotionPossible(short color, short f,
 +static inline int
 +NonPromotionPossible(short color,
                       short t, short p)
  {
      switch (p)
  /* bonus for possible next moves */
  
  inline static short
 -field_bonus(short ply, short side, short piece,
 +field_bonus(short side, short piece,
              short f, short t, unsigned short *local_flag)
  {
      short s, u, ptyp;
@@@ -620,7 -621,7 +621,7 @@@ LinkMove(short ply, short f
      if (score_if_impossible < 0)
      {
          /* The move is flagged as illegal. */
 -        Link(side, piece,
 +        Link(side,
               f, t, local_flag, score_if_impossible);
  
          return;
              s -= 16 / Captured[side][silver];
  
  #if defined DROPBONUS
 -        s += field_bonus(ply, side, piece, f, t, &local_flag);
 +        s += field_bonus(side, piece, f, t, &local_flag);
  
          if (s == 10 && piece != pawn)
              local_flag |= questionable;
          else
          {
  #if defined FIELDBONUS
 -            s += field_bonus(ply, side, piece, f, t, &local_flag);
 +            s += field_bonus(side, piece, f, t, &local_flag);
  #endif
          }
      }
  
      if (try_link || GenerateAllMoves)
      {
 -        Link(side, piece, f, t, local_flag,
 +        Link(side, f, t, local_flag,
               s - ((SCORE_LIMIT + 1000) * 2));
      }
  
@@@ -1040,7 -1041,7 +1041,7 @@@ GenMoves(short ply, short sq, short sid
                  LinkMove(ply, sq, u, local_flag | promote, xside, true);
  
                  if ((possible
 -                     = NonPromotionPossible(color[sq], sq, u, piece)))
 +                     = NonPromotionPossible(color[sq], u, piece)))
                  {
                      LinkMove(ply, sq, u, local_flag, xside, possible);
                  }
@@@ -1496,7 -1497,7 +1497,7 @@@ CaptureList(short side, short ply
  
                      if ((PP = PromotionPossible(color[sq], sq, u, piece)))
                      {
 -                        Link(side, piece,
 +                        Link(side,
                               sq, u, capture | promote,
                               (*value)[stage][board[u]]
  #if !defined SAVE_SVALUE
  
                      if (!PP || flag.tsume)
                      {
 -                        Link(side, piece,
 +                        Link(side,
                               sq, u, capture,
                               (*value)[stage][board[u]]
  #if !defined SAVE_SVALUE
diff --combined gnushogi/gnushogi.h
@@@ -6,6 -6,7 +6,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
   *
@@@ -43,8 -44,6 +44,8 @@@
  #include "debug.h"
  #include "opts.h"          /* Various option-setting #defines.  */
  
 +#include <stdarg.h>
 +
  /*
   * Display options.
   */
@@@ -59,6 -58,8 +60,6 @@@ typedef enum 
  extern display_t display_type;
  
  #define XSHOGI     (display_type == DISPLAY_X)
 -#define NOT_CURSES ((display_type == DISPLAY_X) \
 -  || (display_type == DISPLAY_RAW))
  
  
  /* Miscellaneous globals. */
@@@ -914,8 -915,10 +915,8 @@@ extern void Unlock_data(void);     /* i
  extern void Initialize_dist(void); /* init.c */
  extern void Initialize_eval(void); /* eval.c */
  extern void NewGame(void);
 -extern int  parse(FILE * fd, unsigned short *mv,
 -                  short side, char *opening);
  extern void GetOpenings(void);
 -extern int  OpeningBook(unsigned short *hint, short side);
 +extern int  OpeningBook(unsigned short *hint);
  
  typedef enum
  {
@@@ -962,6 -965,7 +963,6 @@@ PutInTTable(short side
              short score,
              short depth,
              short ply,
 -            short alpha,
              short beta,
              unsigned short mv);
  
@@@ -1121,55 -1125,6 +1122,55 @@@ typedef enu
  extern int VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv);
  extern unsigned short TTage;
  
 -#include "dspwrappers.h"   /* Display functions. */
 +/* display driver framework */
 +
 +struct display
 +{
 +    void (*ChangeAlphaWindow)(void);
 +    void (*ChangeBetaWindow)(void);
 +    void (*ChangeHashDepth)(void);
 +    void (*ChangeSearchDepth)(char *sx);
 +    void (*ChangeXwindow)(void);
 +    void (*ClearScreen)(void);
 +    void (*DoDebug)(void);
 +    void (*DoTable)(short table[NO_SQUARES]);
 +    void (*EditBoard)(void);
 +    void (*ExitShogi)(void);
 +    void (*GiveHint)(void);
 +    void (*Initialize)(void);
 +    void (*ShowNodeCnt)(long NodeCnt);
 +    void (*OutputMove)(void);
 +    void (*PollForInput)(void);
 +    void (*SetContempt)(void);
 +    void (*SearchStartStuff)(short side);
 +    void (*SelectLevel)(char *sx);
 +    void (*ShowCurrentMove)(short pnt, short f, short t);
 +    void (*ShowDepth)(char ch);
 +    void (*ShowGameType)(void);
 +    void (*ShowLine)(unsigned short *bstline);
 +    void (*ShowMessage)(char *s);
 +    void (*AlwaysShowMessage)(const char *format, ...);
 +    void (*Printf)(const char *format, ...);
 +    void (*doRequestInputString)(const char* fmt, char* buffer);
 +    int  (*GetString)(char* sx);
 +    void (*SetupBoard)(void);
 +    void (*ShowPatternCount)(short side, short n);
 +    void (*ShowPostnValue)(short sq);
 +    void (*ShowPostnValues)(void);
 +    void (*ShowPrompt)(void);
 +    void (*ShowResponseTime)(void);
 +    void (*ShowResults)(short score, unsigned short *bstline, char ch);
 +    void (*ShowSidetoMove)(void);
 +    void (*ShowStage)(void);
 +    void (*TerminateSearch)(int sig);
 +    void (*UpdateClocks)(void);
 +    void (*UpdateDisplay)(short f, short t, short redraw, short isspec);
 +    void (*help)(void);
 +};
 +
 +extern struct display *dsp;
 +
 +extern struct display raw_display;
 +extern struct display curses_display;
  
  #endif /* _GNUSHOGI_H_ */
diff --combined gnushogi/init-common.c
@@@ -1,3 -1,34 +1,34 @@@
+ /*
+  * FILE: init-common.c
+  *
+  * ----------------------------------------------------------------------
+  * 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
+  *
+  * 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
+  * under the terms of the GNU General Public License as published by the
+  * Free Software Foundation; either version 3 of the License,
+  * or (at your option) any later version.
+  *
+  * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT
+  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  * for more details.
+  *
+  * You should have received a copy of the GNU General Public License along
+  * with GNU Shogi; see the file COPYING. If not, see
+  * <http://www.gnu.org/licenses/>.
+  * ----------------------------------------------------------------------
+  *
+  */
  #include "gnushogi.h"
  #include "pattern.h"
  
@@@ -119,7 -150,7 +150,7 @@@ Initialize_data(void
  
          if (x >= 0)
          {
 -            ShowMessage("datatype 'small_short' is unsigned; "
 +            dsp->ShowMessage("datatype 'small_short' is unsigned; "
                          "check gnushogi.h\n");
              return 1;
          }
      {
          sprintf(buffer, "Cannot allocate %ld bytes for search tree",
                  (long)n);
 -        ShowMessage(buffer);
 +        dsp->ShowMessage(buffer);
          return 1;
      }
  
      if (!hashcode)
      {
          sprintf(buffer, "Cannot allocate %ld bytes for hashcode", (long)n);
 -        ShowMessage(buffer);
 +        dsp->ShowMessage(buffer);
          return 1;
      }
  
          sprintf(buffer,
                  "Cannot allocate %ld bytes for drop_hashcode",
                  (long)n);
 -        ShowMessage(buffer);
 +        dsp->ShowMessage(buffer);
          return 1;
      }
  
          sprintf(buffer,
                  "Cannot allocate %ld bytes for game record",
                  (long)n);
 -        ShowMessage(buffer);
 +        dsp->ShowMessage(buffer);
          return 1;
      }
  
              {
                  sprintf(buffer, "cannot allocate %ld space for nextdir %d",
                          (long)(n), i);
 -                ShowMessage(buffer);
 +                dsp->ShowMessage(buffer);
              }
  
              nextdir[i] = NULL;
              {
                  sprintf(buffer, "cannot allocate %ld space for nextpos %d",
                          (long)(n), i);
 -                ShowMessage(buffer);
 +                dsp->ShowMessage(buffer);
              }
  
              use_nextpos = false;
  
      if (!value)
      {
 -        ShowMessage("cannot allocate value space");
 +        dsp->ShowMessage("cannot allocate value space");
          return 1;
      }
  
  
      if (!fscore)
      {
 -        ShowMessage("cannot allocate fscore space");
 +        dsp->ShowMessage("cannot allocate fscore space");
          return 1;
      }
  
      {
          sprintf(buffer, "Cannot allocate %ld bytes for history table",
                  (long)sizeof_history);
 -        ShowMessage(buffer);
 +        dsp->ShowMessage(buffer);
          use_history = false;
      }
  #endif
          {
              sprintf(buffer, "Cannot allocate %ld bytes for cache table %ld",
                      (long)n, (long)i);
 -            ShowMessage(buffer);
 +            dsp->ShowMessage(buffer);
              use_etable = false;
          }
      }
      {
          sprintf(buffer, "Cannot allocate %ld bytes for transposition table",
                  (long)(2 * n));
 -        ShowMessage(buffer);
 +        dsp->ShowMessage(buffer);
          ttable[0] = ttable[1] = NULL;
      }
  #endif /* ttblsz */
  
      if (!distdata)
      {
 -        ShowMessage("cannot allocate distdata space...");
 +        dsp->ShowMessage("cannot allocate distdata space...");
          use_distdata = false;
      }
  #endif
diff --combined gnushogi/init.c
@@@ -4,6 -4,7 +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
   *
@@@ -591,7 -592,7 +592,7 @@@ NewGame(void
      }
  
      ClearCaptured();
 -    ClearScreen();
 +    dsp->ClearScreen();
      InitializeStats();
  
  #ifdef HAVE_GETTIMEOFDAY
          if (TCflag)
              SetTimeControl();
          else if (MaxResponseTime == 0)
 -            SelectLevel(sx);
 +            dsp->SelectLevel(sx);
  
 -        UpdateDisplay(0, 0, 1, 0);
 +        dsp->UpdateDisplay(0, 0, 1, 0);
          GetOpenings();
          GetOpeningPatterns(&max_opening_sequence);
  
@@@ -675,7 -676,7 +676,7 @@@ InitMain(void
          barebones    = 0;
      }
  
 -    Initialize();
 +    dsp->Initialize();
      Initialize_dist();
      Initialize_eval();
  #if !defined SAVE_NEXTPOS
@@@ -725,6 -726,6 +726,6 @@@ ExitMain(void
  #endif /* HASHFILE */
  #endif /* ttblsz */
  
 -    ExitShogi();
 +    dsp->ExitShogi();
  }
  
diff --combined gnushogi/main.c
@@@ -4,6 -4,7 +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
   *
@@@ -80,14 -81,17 +81,14 @@@ main (int argc, char **argv
                  binbookfile = NULL;
  #endif
              }
 -
              break;
  
  #ifdef BINBOOK
          case 'B':
              argc--;
              argv++;
 -
              if (argc > 0)
                  binbookfile = argv[0];
 -
              break;
  #endif
  
@@@ -95,7 -99,7 +96,7 @@@
          case 'C':
              /* Curses interface. */
              display_type = DISPLAY_CURSES;
 -
 +            dsp = &curses_display;
              break;
  #endif
  
              hash = ((argv[0][0] == '-') ? false : true);
              break;
  
 -
          case 'l':
              argc--;
              argv++;
  
              if (argc > 0)
                  Lang = argv[0];
 -
              break;
  
 -
          case 'L':
              argc--;
              argv++;
                  strcpy(listfile, argv[0]);
              break;
  
 -
          case 's':
              argc--;
              argv++;
  
              if (argc > 0)
                  strcpy(savefile, argv[0]);
 -
              break;
  
 -
          case 'P':
              argc--;
              argv++;
  
              if (argc > 0)
                  bookmaxply = atoi(argv[0]);
 -
              break;
  
          case 'R':
              /* Raw text interface. */
              display_type = DISPLAY_RAW;
 -
 +            dsp = &raw_display;
              break;
  
 -
          case 'S':
              argc--;
              argv++;
  
              if (argc > 0)
                  rehash = atoi(argv[0]);
 -
              if (rehash > MAXrehash)
                  rehash = MAXrehash;
 -
              break;
  
 -
          case 'T':
              argc--;
              argv++;
  
              if (argc > 0)
                  ttblsize = atoi(argv[0]);
 -
 -            if ((ttblsize <= MINTTABLE))
 +            if (ttblsize <= MINTTABLE)
                  ttblsize = (MINTTABLE) + 1;
 -
              break;
  
  #ifdef HASHFILE
  
              return 0;
  
 -
          case 't':   /* Create or test persistent transposition table. */
              hashfile = fopen(HASHFILE, RWA_ACC);
  
                      }
                  }
  
 -                printf("The file contains %d entries out of max %d\n", nr[0], i);
 +                printf("The file contains %d entries out of max %ld\n", nr[0], i);
  
                  for (j = 1; j < MAXDEPTH; j++)
                      printf("%d ", nr[j]);
  
              return 0;
  
 -
  #endif /* HASHFILE */
  #endif /* ttblsz */
  
          case 'X':
              /* X interface. */
              display_type = DISPLAY_X;
 -
 +            dsp = &raw_display;
              break;
  
 -
          case 'x':
              argc--;
              argv++;
  
              if (argc > 0)
                  xwin = argv[0];
 -
              break;
  
 -
          default:
              fputs("Usage: gnushogi [-a] [-t] [-c size] [-s savefile][-l listfile] [-x xwndw]\n", stderr);
              exit(1);
diff --combined gnushogi/makepattern.c
@@@ -4,6 -4,7 +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
   *
  #define MAX_OPENING_SEQUENCE 20
  #define MAX_PATTERN          200
  
  small_short pattern_data[MAX_PATTERN_DATA];
  
  /* minimal ShowMessage to avoid dependency on extraneous display code */
 -void
 -ShowMessage(char *s)
 +static void
 +Dummy_ShowMessage(char *s)
  {
      printf("%s\n", s);
  }
 +static struct display dummydsp = {
 +  .ShowMessage = Dummy_ShowMessage,
 +};
 +struct display *dsp = &dummydsp;
  
  #define is_digit(c) (((c) >= '0') && ((c) <= '9'))
  #define is_alpha(c) ((((c) >= 'a') && ((c) <= 'z')) \
@@@ -190,73 -188,74 +191,73 @@@ ScanPattern (char *s, short *pindex
  
  
  void
 -ReadOpeningSequences (short *pindex)
 +ReadOpeningSequences (short *pindex, const char* patternfile)
  {
      FILE *fd;
      char s[256];
      short max_pattern = 0;
      short max_opening_sequence = 0;
  
 -    if ((fd = fopen (patternfile, "r")) == NULL)
 -        fd = fopen ("gnushogi.pat", "r");
 +    fd = fopen (patternfile, "r");
  
 -    if (fd != NULL)
 -    {
 -        *pindex = 0;
 +    if (fd == NULL) {
 +        sprintf(s, "no pattern file '%s'", patternfile);
 +        dsp->ShowMessage(s);
 +        return;
 +    }
  
 -        while (fgets (s, 256, fd) != NULL)
 +    *pindex = 0;
 +
 +    while (fgets (s, 256, fd) != NULL)
 +    {
 +        if (*s == '#')
 +        {
 +            /* comment, skip line */
 +        }
 +        else if (is_alpha(*s))
          {
 -            if (*s == '#')
 +            if (max_opening_sequence++ > 0)
              {
 -                /* comment, skip line */
 +                pattern_data[(*pindex)++] = END_OF_PATTERNS;
              }
 -            else if (is_alpha(*s))
 -            {
 -                if (max_opening_sequence++ > 0)
 -                {
 -                    pattern_data[(*pindex)++] = END_OF_PATTERNS;
 -                }
  
 -                pattern_data[(*pindex)++] = ValueOfOpeningName(s);
 +            pattern_data[(*pindex)++] = ValueOfOpeningName(s);
 +        }
 +        else
 +        {
 +            if (ScanPattern(s, pindex))
 +            {
 +                dsp->ShowMessage("error in pattern sequence...");
 +                exit(1);
              }
              else
              {
 -                if (ScanPattern(s, pindex))
 -                {
 -                    ShowMessage("error in pattern sequence...");
 -                    exit(1);
 -                }
 -                else
 -                {
 -                    max_pattern++;
 -                }
 +                max_pattern++;
              }
          }
 +    }
  
 -        pattern_data[(*pindex)++] = END_OF_PATTERNS;
 -        pattern_data[(*pindex)++] = END_OF_SEQUENCES;
 +    pattern_data[(*pindex)++] = END_OF_PATTERNS;
 +    pattern_data[(*pindex)++] = END_OF_SEQUENCES;
  
 -        sprintf(s,
 -                "Pattern: %d bytes for %d sequences with %d patterns.\n",
 -                *pindex, max_opening_sequence, max_pattern);
 -        ShowMessage(s);
 +    sprintf(s,
 +            "Pattern: %d bytes for %d sequences with %d patterns.\n",
 +            *pindex, max_opening_sequence, max_pattern);
 +    dsp->ShowMessage(s);
  
 -        fclose(fd);
 -    } else {
 -        sprintf(s, "no pattern file '%s'", patternfile);
 -        ShowMessage(s);
 -    }
 +    fclose(fd);
  }
  
  
  void
 -WriteOpeningSequences (short pindex)
 +WriteOpeningSequences (short pindex, const char* patternincfile)
  {
      FILE *fd;
      short n = 0;
      short max_pattern = 0;
      short max_opening_sequence = 0;
  
 -    fd = fopen ("pattern.inc", "w");
 +    fd = fopen (patternincfile, "w");
      fprintf(fd, "#define MAX_PATTERN_DATA %d\n\n", pindex);
      fprintf(fd, "small_short pattern_data[MAX_PATTERN_DATA] =\n{\n");
  
diff --combined gnushogi/pat2inc.c
@@@ -6,6 -6,7 +6,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
   *
@@@ -35,8 -36,8 +36,8 @@@
  #include "pattern.h"
  
  
 -extern void ReadOpeningSequences(short *pindex);
 -extern void WriteOpeningSequences(short pindex);
 +extern void ReadOpeningSequences(short *pindex, const char* patternfile);
 +extern void WriteOpeningSequences(short pindex, const char* patternincfile);
  
  small_short board[NO_SQUARES];
  small_short color[NO_SQUARES];
@@@ -46,13 -47,6 +47,13 @@@ main(int argc, char **argv
  {
      short sq, side, max_pattern_data;
  
 +    if (argc != 3) {
 +        fprintf(stderr, "Usage: %s gnushogi.pat pattern.inc\n", argv[0]);
 +        exit(1);
 +    }
 +    char* patternfile = argv[1];
 +    char* patternincfile = argv[2];
 +
  #ifdef TEST_DISTANCE
      short d;
      char  s[80];
@@@ -90,8 -84,8 +91,8 @@@
  
  #endif
  
 -    ReadOpeningSequences(&max_pattern_data);
 -    WriteOpeningSequences(max_pattern_data);
 +    ReadOpeningSequences(&max_pattern_data, patternfile);
 +    WriteOpeningSequences(max_pattern_data, patternincfile);
  
      return 0;
  }
diff --combined gnushogi/pattern.c
@@@ -4,6 -4,7 +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
   *
  #include "gnushogi.h"
  #include "pattern.h"
  
- /* constants and pattern_data are generated by "pat2inc" */
+ /* "pat2inc" generates constants and pattern_data */
 -#include "pattern.inc"
 +#ifndef MINISHOGI
 +# include "gnushogi-pattern.inc"
 +#else
 +# include "gnuminishogi-pattern.inc"
 +#endif
  
  struct Pattern_rec Pattern[MAX_PATTERN];
  struct OpeningSequence_rec OpeningSequence[MAX_OPENING_SEQUENCE];
diff --combined gnushogi/rawdsp.c
@@@ -4,6 -4,7 +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
   *
@@@ -32,7 -33,6 +33,7 @@@
  #include <ctype.h>
  #include <signal.h>
  #include <stdarg.h>
 +#include <stdio.h>
  #include <sys/param.h>
  #include <sys/types.h>
  #include <sys/file.h>
@@@ -42,6 -42,7 +43,6 @@@
  #endif
  
  #include "gnushogi.h"
 -#include "rawdsp.h"
  
  unsigned short MV[MAXDEPTH];
  int MSCORE;
@@@ -51,11 -52,6 +52,11 @@@ char *DRAW
  extern char *InPtr;
  extern short pscore[];
  
 +/****************************************
 + * forward declarations
 + ****************************************/
 +
 +void Raw_UpdateDisplay(short f, short t, short redraw, short isspec);
  
  /****************************************
   * Trivial output functions.
@@@ -131,23 -127,17 +132,23 @@@ Raw_ShowMessage(char *s
  
  
  void
 -Raw_AlwaysShowMessage(const char *format, va_list ap)
 +Raw_AlwaysShowMessage(const char *format, ...)
  {
 +    va_list ap;
 +    va_start(ap, format);
      vprintf(format, ap);
      printf("\n");
 +    va_end(ap);
  }
  
  
  void
 -Raw_Printf(const char *format, va_list ap)
 +Raw_Printf(const char *format, ...)
  {
 +    va_list ap;
 +    va_start(ap, format);
      vprintf(format, ap);
 +    va_end(ap);
  }
  
  
@@@ -162,17 -152,10 +163,17 @@@ in
  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;
  }
  
@@@ -307,48 -290,30 +308,48 @@@ 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:       %d sec\n",
 +    printf("Depth:    %-12d Response time:       %ld sec\n",
             MaxSearchDepth, MaxResponseTime/100);
      printf("Random:   %-12s Easy mode:           %s\n",
             (dither) ? "ON" : "OFF", (flag.easy) ? "ON" : "OFF");
             (flag.beep) ? "ON" : "OFF", (flag.hash) ? "ON" : "OFF");
      printf("Tsume:    %-12s Force:               %s\n",
             (flag.tsume) ? "ON" : "OFF", (flag.force) ? "ON" : "OFF");
 -    printf("Time Control %s %d moves %d sec %d add %d depth\n",
 +    printf("Time Control %s %d moves %ld sec %d add %d depth\n",
             (TCflag) ? "ON" : "OFF",
             TimeControl.moves[black], TimeControl.clock[black] / 100,
             TCadd/100, MaxSearchDepth);
@@@ -723,17 -688,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;
 -
 -    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';
 +    strncpy(T, sx, NO_SQUARES);
 +    T[NO_SQUARES] = '\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 */
      if (*p == 'f')
      {
          /* its a fischer clock game */
 +        char *q;
          p++;
          TCminutes = (short)strtol(p, &q, 10);
          TCadd = (short)strtol(q, NULL, 10) *100;
      else
      {
          /* regular game */
 +        char *q;
          TCadd = 0;
          TCmoves = (short)strtol(p, &q, 10);
          TCminutes = (short)strtol(q, &q, 10);
  
  
  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);
  }
  
@@@ -841,7 -809,8 +842,7 @@@ Raw_ChangeXwindow(void
  void
  Raw_ShowPostnValue(short sq)
  {
 -    short score;
 -    score = ScorePosition(color[sq]);
 +    (void) ScorePosition(color[sq]);
  
      if (color[sq] != neutral)
      {
@@@ -988,12 -957,12 +989,12 @@@ Raw_PollForInput(void
      if (!PeekNamedPipe(GetStdHandle(STD_INPUT_HANDLE), NULL, 0, NULL, &cnt, NULL))
          cnt = 1;
  #else
 -    static struct pollfd pollfds[1] = { /* [0] = */ { /* .fd = */ STDIN_FILENO,
 -                                                      /* .events = */ POLLIN } };
 +    static struct pollfd pollfds[1] = { [0] = { .fd = STDIN_FILENO,
 +                                                .events = POLLIN } };
      int cnt = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 0);
      if (cnt < 0) {
          perror("polling standard input");
 -        ExitShogi();
 +        Raw_ExitShogi();
      }
  #endif
      if (cnt) { /* if anything to read, or error occured */
          flag.bothsides = false;
      }
  }
 +
 +struct display raw_display =
 +{
 +    .ChangeAlphaWindow    = Raw_ChangeAlphaWindow,
 +    .ChangeBetaWindow     = Raw_ChangeBetaWindow,
 +    .ChangeHashDepth      = Raw_ChangeHashDepth,
 +    .ChangeSearchDepth    = Raw_ChangeSearchDepth,
 +    .ChangeXwindow        = Raw_ChangeXwindow,
 +    .ClearScreen          = Raw_ClearScreen,
 +    .DoDebug              = Raw_DoDebug,
 +    .DoTable              = Raw_DoTable,
 +    .EditBoard            = Raw_EditBoard,
 +    .ExitShogi            = Raw_ExitShogi,
 +    .GiveHint             = Raw_GiveHint,
 +    .Initialize           = Raw_Initialize,
 +    .ShowNodeCnt          = Raw_ShowNodeCnt,
 +    .OutputMove           = Raw_OutputMove,
 +    .PollForInput         = Raw_PollForInput,
 +    .SetContempt          = Raw_SetContempt,
 +    .SearchStartStuff     = Raw_SearchStartStuff,
 +    .SelectLevel          = Raw_SelectLevel,
 +    .ShowCurrentMove      = Raw_ShowCurrentMove,
 +    .ShowDepth            = Raw_ShowDepth,
 +    .ShowGameType         = Raw_ShowGameType,
 +    .ShowLine             = Raw_ShowLine,
 +    .ShowMessage          = Raw_ShowMessage,
 +    .AlwaysShowMessage    = Raw_AlwaysShowMessage,
 +    .Printf               = Raw_Printf,
 +    .doRequestInputString = Raw_doRequestInputString,
 +    .GetString            = Raw_GetString,
 +    .SetupBoard           = Raw_SetupBoard,
 +    .ShowPatternCount     = Raw_ShowPatternCount,
 +    .ShowPostnValue       = Raw_ShowPostnValue,
 +    .ShowPostnValues      = Raw_ShowPostnValues,
 +    .ShowPrompt           = Raw_ShowPrompt,
 +    .ShowResponseTime     = Raw_ShowResponseTime,
 +    .ShowResults          = Raw_ShowResults,
 +    .ShowSidetoMove       = Raw_ShowSidetoMove,
 +    .ShowStage            = Raw_ShowStage,
 +    .TerminateSearch      = Raw_TerminateSearch,
 +    .UpdateClocks         = Raw_UpdateClocks,
 +    .UpdateDisplay        = Raw_UpdateDisplay,
 +    .help                 = Raw_help,
 +};
diff --combined gnushogi/search.c
@@@ -4,6 -4,7 +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
   *
@@@ -180,7 -181,7 +181,7 @@@ SelectMove(short side, SelectMove_mode 
  #ifdef QUIETBACKGROUND
      if (!background)
  #endif /* QUIETBACKGROUND */
 -        ShowResponseTime();
 +        dsp->ShowResponseTime();
  
      ExtraTime = 0;
  
  #ifdef QUIETBACKGROUND
      if (!background)
  #endif /* QUIETBACKGROUND */
 -        ShowSidetoMove();
 +        dsp->ShowSidetoMove();
  
  #ifdef QUIETBACKGROUND
      if (!background)
  #endif /* QUIETBACKGROUND */
 -        SearchStartStuff(side);
 +        dsp->SearchStartStuff(side);
  
  #ifdef HISTORY
      array_zero(history, sizeof_history);
  
      if (flag.regularstart && Book)
      {
 -        flag.timeout = bookflag = OpeningBook(&hint, side);
 +        flag.timeout = bookflag = OpeningBook(&hint);
  
          if (TCflag)
              ResponseTime += ResponseTime;
  # ifdef QUIETBACKGROUND
          if (!background)
  #endif /* QUIETBACKGROUND */
 -            ShowDepth(' ');
 +            dsp->ShowDepth(' ');
  
          /* search at this level returns score of PV */
          score = search(side, 1, Sdepth, alpha, beta, PrVar, &rpt);
  #ifdef QUIETBACKGROUND
              if (!background)
  #endif /* QUIETBACKGROUND */
 -                ShowDepth('-');
 +                dsp->ShowDepth('-');
  
              if (TCflag && TCcount < MAXTCCOUNTR)
              {
  #ifdef QUIETBACKGROUND
              if (!background)
  #endif /* QUIETBACKGROUND */
 -                ShowDepth('+');
 +                dsp->ShowDepth('+');
  
              score = search(side, 1, Sdepth, -(SCORE_LIMIT + 999),
                             (SCORE_LIMIT + 999), PrVar, &rpt);
  #ifdef QUIETBACKGROUND
          if (!background)
  #endif /* QUIETBACKGROUND */
 -            ShowResults(score, PrVar, '.');
 +            dsp->ShowResults(score, PrVar, '.');
      }
  
      /********************** end of main loop ***************************/
          ElapsedTime(COMPUTE_AND_INIT_MODE);
  
      /* update time control info */
 -    OutputMove();
 +    dsp->OutputMove();
  
      /* if mate set flag */
      if ((score == -(SCORE_LIMIT + 999) || score == (SCORE_LIMIT + 998)))
@@@ -580,7 -581,7 +581,7 @@@ search(short side
  #ifdef QUIETBACKGROUND
              if (!background)
  #endif
 -                ShowResponseTime();
 +                dsp->ShowResponseTime();
          }
          else if (!TCflag && flag.musttimeout && Sdepth > MINDEPTH)
          {
                   && (ProbeFTable(side, depth, ply, &alpha, &beta, &score)
                       == true))
          {
 -            PutInTTable(side, score, depth, ply, alpha, beta, PV);
 +            PutInTTable(side, score, depth, ply, beta, PV);
              bstline[ply] = PV;
              bstline[ply + 1] = 0;
  
          nxtline[ply + 1] = 0;
  
          /* if at top level */
 -#if !defined NOPOST
          if (ply == 1)
          {
  /* at the top update search status */
  #ifdef QUIETBACKGROUND
                  if (!background)
  #endif /* QUIETBACKGROUND */
 -                    ShowCurrentMove(pnt, node->f, node->t);
 +                    dsp->ShowCurrentMove(pnt, node->f, node->t);
              }
          }
 -#endif
  
          if (!(node->flags & exact))
          {
                      {
                          if (best > beta)
                          {
 -                            ShowResults(best, bstline, '+');
 +                            dsp->ShowResults(best, bstline, '+');
                          }
                          else if (best < alpha)
                          {
 -                            ShowResults(best, bstline, '-');
 +                            dsp->ShowResults(best, bstline, '-');
                          }
                          else
                          {
 -                            ShowResults (best, bstline, '&');
 +                            dsp->ShowResults(best, bstline, '&');
                          }
                      }
  #ifdef QUIETBACKGROUND
      {
  #  ifdef HASHFILE /* MCV: warning: this confuses the formatter. */
          if (use_ttable
 -            && PutInTTable(side, best, depth, ply, alpha, beta, mv)
 +            && PutInTTable(side, best, depth, ply, beta, mv)
              && hashfile
              && (depth > HashDepth)
              && (GameCnt < HashMoveLimit))
  #  else
          if (use_ttable
 -            && PutInTTable(side, best, depth, ply, alpha, beta, mv))
 +            && PutInTTable(side, best, depth, ply, beta, mv))
  #  endif
          {
              PutInFTable(side, best, depth, ply,
@@@ -1114,8 -1117,8 +1115,8 @@@ UpdatePieceList(short side, short sq, U
  
  /* Make or Unmake drop move. */
  
 -void
 -drop(short side, short piece, short f, short t, short iop)
 +static void
 +drop(short side, short piece, short t, short iop)
  {
      if (iop == 1)
      {
@@@ -1283,7 -1286,7 +1284,7 @@@ MakeMove(short side
          *tempst = svalue[t];
  #endif
  
 -        (void)drop(side, g->fpiece, f, t, 1);
 +        (void)drop(side, g->fpiece, t, 1);
      }
      else
      {
@@@ -1411,7 -1414,7 +1412,7 @@@ UnmakeMove(short side
  
      if (node->flags & dropmask)
      {
 -        (void)drop(side, (node->flags & pmask), f, t, 2);
 +        (void)drop(side, (node->flags & pmask), t, 2);
  
  #if !defined SAVE_SVALUE
          svalue[t] = *tempst;
diff --combined gnushogi/tcontrl.c
@@@ -4,6 -4,7 +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
   *
@@@ -345,7 -346,7 +346,7 @@@ CheckForTimeout(int score, int globalsc
  #endif
  
      if (flag.timeout)
 -        ShowMessage("timeout");
 +        dsp->ShowMessage("timeout");
  }
  
  
@@@ -365,7 -366,7 +366,7 @@@ ElapsedTime(ElapsedTime_mode iop
      struct timeval tv;
  #endif
  
 -    PollForInput();
 +    dsp->PollForInput();
  
  #ifdef HAVE_GETTIMEOFDAY
      gettimeofday(&tv, NULL);
  #ifdef QUIETBACKGROUND
          if (!background)
  #endif
 -            UpdateClocks();
 +            dsp->UpdateClocks();
      }
  }
diff --combined gnushogi/util.c
@@@ -4,6 -4,7 +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
   *
@@@ -35,9 -36,9 +36,9 @@@ unsigned int TTadd = 0
  short recycle;
  short ISZERO = 1;
  
 -
 +#if 0
  int
 -parse(FILE * fd, unsigned short *mv, short side, char *opening)
 +parse(FILE * fd, unsigned short *mv, char *opening)
  {
      int c, i, r1, r2, c1, c2;
      char s[128];
  
      return 1;
  }
 -
 +#endif
  
  /*
   * The field of a hashtable is computed as follows:
@@@ -226,6 -227,7 +227,6 @@@ PutInTTable(short side
              short score,
              short depth,
              short ply,
 -            short alpha,
              short beta,
              unsigned short mv)
  {