X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Finit-common.c;h=0d89daece07e1b0dd6e1407cd6c495f79eabd91c;hb=refs%2Fheads%2Fmini;hp=bd571ceb10b5e4d467b4b903c2df5bc6a64df3f4;hpb=fd2d3b3b66801eba904e700842604033c9af8c23;p=gnushogi.git diff --git a/gnushogi/init-common.c b/gnushogi/init-common.c index bd571ce..0d89dae 100644 --- a/gnushogi/init-common.c +++ b/gnushogi/init-common.c @@ -1,3 +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 + * . + * ---------------------------------------------------------------------- + * + */ #include "gnushogi.h" #include "pattern.h" @@ -105,6 +136,59 @@ const small_short side_of_ptype[NO_PTYPE_PIECES] = white, white }; +int +AllocateTT(int size) +{ + int n = sizeof(struct hashentry)*(size + rehash); + static int oldSize; + int doit = true; + + if(oldSize == size) return use_ttable; + oldSize = ttblsize = size; + + if(ttable[0]) free(ttable[0]); + if(ttable[1]) free(ttable[1]); + + while (doit && ttblsize > MINTTABLE) + { + ttable[0] = malloc(n); /* FIXME: cast to the correct type. */ + ttable[1] = ttable[0] ? malloc(n) : NULL; + + if (!ttable[0] || !ttable[1]) + { + if (!ttable[0]) + free(ttable[0]); + + if (!ttable[1]) + free(ttable[1]); + + ttblsize = ttblsize >> 1; + n = sizeof(struct hashentry) * (ttblsize + rehash); + } + else + { + doit = false; + } + } + + if (ttblsize <= MINTTABLE) + { + use_ttable = false; + } + + if (use_ttable) + { + /* CHECKME: is the precedence here correct? */ + /* ttbllimit = ttblsize << 1 - ttblsize >> 2; */ + ttbllimit = (ttblsize << 1) - (ttblsize >> 2); + } + else + { + ttable[0] = ttable[1] = NULL; + } + + return use_ttable; +} int Initialize_data(void) @@ -112,14 +196,13 @@ Initialize_data(void) size_t n; int i; char buffer[60]; - int doit = true; { small_short x = -1; if (x >= 0) { - ShowMessage("datatype 'small_short' is unsigned; " + dsp->ShowMessage("datatype 'small_short' is unsigned; " "check gnushogi.h\n"); return 1; } @@ -132,7 +215,7 @@ Initialize_data(void) { sprintf(buffer, "Cannot allocate %ld bytes for search tree", (long)n); - ShowMessage(buffer); + dsp->ShowMessage(buffer); return 1; } @@ -142,7 +225,7 @@ Initialize_data(void) if (!hashcode) { sprintf(buffer, "Cannot allocate %ld bytes for hashcode", (long)n); - ShowMessage(buffer); + dsp->ShowMessage(buffer); return 1; } @@ -154,7 +237,7 @@ Initialize_data(void) sprintf(buffer, "Cannot allocate %ld bytes for drop_hashcode", (long)n); - ShowMessage(buffer); + dsp->ShowMessage(buffer); return 1; } @@ -166,7 +249,7 @@ Initialize_data(void) sprintf(buffer, "Cannot allocate %ld bytes for game record", (long)n); - ShowMessage(buffer); + dsp->ShowMessage(buffer); return 1; } @@ -183,7 +266,7 @@ Initialize_data(void) { sprintf(buffer, "cannot allocate %ld space for nextdir %d", (long)(n), i); - ShowMessage(buffer); + dsp->ShowMessage(buffer); } nextdir[i] = NULL; @@ -198,7 +281,7 @@ Initialize_data(void) { sprintf(buffer, "cannot allocate %ld space for nextpos %d", (long)(n), i); - ShowMessage(buffer); + dsp->ShowMessage(buffer); } use_nextpos = false; @@ -216,7 +299,7 @@ Initialize_data(void) if (!value) { - ShowMessage("cannot allocate value space"); + dsp->ShowMessage("cannot allocate value space"); return 1; } @@ -225,7 +308,7 @@ Initialize_data(void) if (!fscore) { - ShowMessage("cannot allocate fscore space"); + dsp->ShowMessage("cannot allocate fscore space"); return 1; } @@ -237,7 +320,7 @@ Initialize_data(void) { sprintf(buffer, "Cannot allocate %ld bytes for history table", (long)sizeof_history); - ShowMessage(buffer); + dsp->ShowMessage(buffer); use_history = false; } #endif @@ -253,7 +336,7 @@ Initialize_data(void) { sprintf(buffer, "Cannot allocate %ld bytes for cache table %ld", (long)n, (long)i); - ShowMessage(buffer); + dsp->ShowMessage(buffer); use_etable = false; } } @@ -264,47 +347,11 @@ Initialize_data(void) if (rehash < 0) rehash = MAXrehash; - n = sizeof(struct hashentry)*(ttblsize + rehash); - - while (doit && ttblsize > MINTTABLE) - { - ttable[0] = malloc(n); /* FIXME: cast to the correct type. */ - ttable[1] = ttable[0] ? malloc(n) : NULL; - - if (!ttable[0] || !ttable[1]) - { - if (!ttable[0]) - free(ttable[0]); - - if (!ttable[1]) - free(ttable[1]); - - ttblsize = ttblsize >> 1; - n = sizeof(struct hashentry) * (ttblsize + rehash); - } - else - { - doit = false; - } - } - - if (ttblsize <= MINTTABLE) - { - use_ttable = false; - } - - if (use_ttable) - { - /* CHECKME: is the precedence here correct? */ - /* ttbllimit = ttblsize << 1 - ttblsize >> 2; */ - ttbllimit = (ttblsize << 1) - (ttblsize >> 2); - } - else + if (!AllocateTT(ttblsize)) { sprintf(buffer, "Cannot allocate %ld bytes for transposition table", (long)(2 * n)); - ShowMessage(buffer); - ttable[0] = ttable[1] = NULL; + dsp->ShowMessage(buffer); } #endif /* ttblsz */ @@ -314,7 +361,7 @@ Initialize_data(void) if (!distdata) { - ShowMessage("cannot allocate distdata space..."); + dsp->ShowMessage("cannot allocate distdata space..."); use_distdata = false; } #endif