4 * ----------------------------------------------------------------------
5 * Copyright (c) 1993, 1994, 1995 Matthias Mutz
6 * Copyright (c) 1999 Michael Vanier and the Free Software Foundation
7 * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation
9 * GNU SHOGI is based on GNU CHESS
11 * Copyright (c) 1988, 1989, 1990 John Stanback
12 * Copyright (c) 1992 Free Software Foundation
14 * This file is part of GNU SHOGI.
16 * GNU Shogi is free software; you can redistribute it and/or modify it
17 * under the terms of the GNU General Public License as published by the
18 * Free Software Foundation; either version 3 of the License,
19 * or (at your option) any later version.
21 * GNU Shogi is distributed in the hope that it will be useful, but WITHOUT
22 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 * You should have received a copy of the GNU General Public License along
27 * with GNU Shogi; see the file COPYING. If not, see
28 * <http://www.gnu.org/licenses/>.
29 * ----------------------------------------------------------------------
36 #define MAX_PATTERN_DATA 5000
37 #define MAX_OPENING_SEQUENCE 20
38 #define MAX_PATTERN 200
42 small_short pattern_data
[MAX_PATTERN_DATA
];
44 /* minimal ShowMessage to avoid dependency on extraneous display code */
46 Dummy_ShowMessage(char *format
, ...)
53 static struct display dummydsp
= {
54 .ShowMessage
= Dummy_ShowMessage
,
56 struct display
*dsp
= &dummydsp
;
58 #define is_digit(c) (((c) >= '0') && ((c) <= '9'))
59 #define is_alpha(c) ((((c) >= 'a') && ((c) <= 'z')) \
60 || (((c) >= 'A') && ((c) <= 'Z')))
61 #define eos(s) ((*s == '\0') || (*s == '\n'))
64 /* skip blanks and comments in brackets */
69 while ((**s
== ' ') || (**s
== '|') || (**s
== '['))
82 /* skip unsigned numbers */
95 ScanPiece(char **s
, small_short
*side
,
96 small_short
*piece
, small_short
*square
)
101 /* determine promotion status */
103 isp
= true, (*s
)++; /* FIXME: split into two lines. */
107 /* determine side and piece */
108 for (c
= 0; c
< NO_PIECES
; c
++)
110 if ((isw
= (**s
== pxx
[c
])) || (**s
== qxx
[c
]))
112 *piece
= isp
? promoted
[c
] : unpromoted
[c
];
124 /* piece is captured */
126 *square
= NO_SQUARES
+ *piece
;
130 /* determine column */
131 for (c
= 0; c
< NO_COLS
; c
++)
133 if (**s
== COL_NAME(c
))
144 for (r
= 0; r
< NO_ROWS
; r
++)
146 if (**s
== ROW_NAME(r
))
156 /* determine square */
157 *square
= r
* NO_COLS
+ c
;
166 ScanPattern (char *s
, short *pindex
)
168 small_short side
, piece
, square
;
169 skipbb(&s
); /* skip blanks and comments */
173 pattern_data
[(*pindex
)++] = atoi(s
);
177 pattern_data
[(*pindex
)++] = END_OF_LINKS
;
182 if (ScanPiece(&s
, &side
, &piece
, &square
))
188 pattern_data
[(*pindex
)++] = piece
;
189 pattern_data
[(*pindex
)++] = (side
? -square
: square
);
194 pattern_data
[(*pindex
)++] = END_OF_FIELDS
;
200 ReadOpeningSequences (short *pindex
, const char* patternfile
)
204 short max_pattern
= 0;
205 short max_opening_sequence
= 0;
207 fd
= fopen (patternfile
, "r");
210 sprintf(s
, "no pattern file '%s'", patternfile
);
217 while (fgets (s
, 256, fd
) != NULL
)
221 /* comment, skip line */
223 else if (is_alpha(*s
))
225 if (max_opening_sequence
++ > 0)
227 pattern_data
[(*pindex
)++] = END_OF_PATTERNS
;
230 pattern_data
[(*pindex
)++] = ValueOfOpeningName(s
);
234 if (ScanPattern(s
, pindex
))
236 dsp
->ShowMessage("error in pattern sequence...");
246 pattern_data
[(*pindex
)++] = END_OF_PATTERNS
;
247 pattern_data
[(*pindex
)++] = END_OF_SEQUENCES
;
250 "Pattern: %d bytes for %d sequences with %d patterns.\n",
251 *pindex
, max_opening_sequence
, max_pattern
);
259 WriteOpeningSequences (short pindex
, const char* patternincfile
)
263 short max_pattern
= 0;
264 short max_opening_sequence
= 0;
266 fd
= fopen (patternincfile
, "w");
267 fprintf(fd
, "#define MAX_PATTERN_DATA %d\n\n", pindex
);
268 fprintf(fd
, "small_short pattern_data[MAX_PATTERN_DATA] =\n{\n");
272 fprintf(fd
, " %d,\n", pattern_data
[n
++]);
279 while (pattern_data
[n
] != END_OF_LINKS
)
281 fprintf(fd
, "%d, ", pattern_data
[n
++]);
284 fprintf(fd
, "%d, ", pattern_data
[n
++]);
289 fprintf(fd
, "%d,", pattern_data
[n
++]);
291 while (pattern_data
[n
] != END_OF_FIELDS
);
293 fprintf(fd
, "%d,\n", pattern_data
[n
++]);
296 while (pattern_data
[n
] != END_OF_PATTERNS
);
298 fprintf(fd
, " %d,\n", pattern_data
[n
++]);
299 max_opening_sequence
++;
301 while (pattern_data
[n
] != END_OF_SEQUENCES
);
303 fprintf(fd
, " %d\n}; \n", pattern_data
[n
++]);
304 fprintf(fd
, "\n#define MAX_OPENING_SEQUENCE %d\n", max_opening_sequence
);
305 fprintf(fd
, "\n#define MAX_PATTERN %d\n", max_pattern
);