]> git.sesse.net Git - pgn-extract/blob - typedef.h
Push through a computer/human flag to the binary output.
[pgn-extract] / typedef.h
1 /*
2  *  Program: pgn-extract: a Portable Game Notation (PGN) extractor.
3  *  Copyright (C) 1994-2014 David Barnes
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 1, or (at your option)
7  *  any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  *
18  *  David Barnes may be contacted as D.J.Barnes@kent.ac.uk
19  *  http://www.cs.kent.ac.uk/people/staff/djb/
20  *
21  */
22
23         /* Type definitions required by multiple files. */
24
25     /* Define a type to represent different output formats.
26      * Currently represented are:
27      *     SOURCE: the original source notation.
28      *           SAN: SAN.
29      *           CM: Chess Master input format.
30      *     LALG: Long-algebraic, e.g. e2e4.
31      *     HALG: Hyphenated long-algebraic, e.g. e2-e4.
32      *     ELALG: Enhanced long-algebraic. Includes piece names, e.g. Ng1f3,
33      *            and en-passant notation.
34      *     UCI: UCI-compatible format - actually LALG.
35      */
36 typedef enum { SOURCE, SAN, EPD, CM, LALG, HALG, ELALG, UCI, SESSE_BIN } OutputFormat;
37
38     /* Define a type to specify whether a move gives check, checkmate,
39      * or nocheck.
40      * checkmate implies check, but check does not imply that a move
41      * is not checkmate.
42      */
43 typedef enum { NOCHECK, CHECK, CHECKMATE } CheckStatus;
44
45         /* Permit lists of strings, e.g. lists of comments,
46          * list of NAGs, etc.
47          */
48 typedef struct string_list {
49     const char *str;
50     struct string_list *next;
51 } StringList;
52
53 /* The following function is used for linking list items together. */
54 StringList *save_string_list_item(StringList *list,const char *str);
55
56 typedef struct comment_list{
57     StringList *Comment;
58     struct comment_list *next;
59 } CommentList;
60
61 typedef struct variation{
62     CommentList *prefix_comment;
63     struct move *moves;
64     CommentList *suffix_comment;
65     struct variation *next;
66 } Variation;
67
68 /* Define a maximum length for the text of moves.
69  * This is generous.
70  */
71 #define MAX_MOVE_LEN 15
72
73 struct EcoLog;
74 typedef struct EcoLog EcoLog;
75
76         /* Retain the text of a move and any associated 
77          * NAGs and comments.
78          */
79 typedef struct move{
80     /* @@@ This array is of type unsigned char,
81      * in order to accommodate full 8-bit letters without
82      * sign extension.
83      */
84     unsigned char move[MAX_MOVE_LEN+1];
85     /* Class of move, e.g. PAWN_MOVE, PIECE_MOVE. */
86     MoveClass class;
87     Col from_col;
88     Rank from_rank;
89     Col to_col;
90     Rank to_rank;
91     Piece piece_to_move;
92     /* captured_piece is EMPTY if there is no capture. */
93     Piece captured_piece;
94     /* promoted_piece is EMPTY if class is not PAWN_MOVE_WITH_PROMOTION. */
95     Piece promoted_piece;
96     /* Whether this move gives check. */
97     CheckStatus check_status;
98     /* An EPD representation of the board immediately after this move
99      * has been played.
100      */
101     char *epd;
102     /* Same as epd, but in our special binary packed format.
103      * Not zero-terminated, since it is binary.
104      */
105     char *bpfen;
106     int bpfen_len;
107     StringList *Nags;
108     CommentList *Comment;
109     /* terminating_result hold the result of the current list of moves. */
110     char *terminating_result;
111     Variation *Variants;
112     EcoLog *eco;
113     /* Pointers to the previous and next move.
114      * The extraction program does not need the prev field, but my
115      * intention is to build other interfaces that might need it.
116      * For instance, a game viewer would need to be able to move backwards
117      * and forwards through a game.
118      */
119     struct move *prev, *next;
120 } Move;
121
122 typedef struct {
123     /* Tags for this game. */
124     char **tags;
125     /* The maximum number of strings in tags. */
126     int tags_length;
127     /* Any comment prefixing the game, between
128      * the tags and the moves.
129      */
130     CommentList *prefix_comment;
131     /* The hash value of the final position. */
132     HashCode final_hash_value;
133     /* An accumulated hash value, used to disambiguate false clashes
134      * of final_hash_value.
135      */
136     HashCode cumulative_hash_value;
137     /* Board hash value at fuzzy_move_depth, if required. */
138     HashCode fuzzy_duplicate_hash;
139     /* The move list of the game. */
140     Move *moves;
141     /* Whether the moves have been checked, or not. */
142     Boolean moves_checked;
143     /* Whether the moves are ok, or not. */
144     Boolean moves_ok;
145     /* if !moves_ok, the first ply at which an error was found.
146      * 0 => no error found.
147      */
148     int error_ply;
149     /* File number this game comes from. */
150     int file_number;
151     /* File position of the first byte of the game, or -1
152      * if unknown.
153      */
154     long start_position;
155 } Game;
156
157 /* Define a type to distinguish between CHECK files, NORMAL files,
158  * and ECO files.
159  * CHECKFILEs are those whose contents are not output.
160  * Their contents are used to check for duplicates in NORMALFILEs.
161  * An ECOFILE consists of ECO lines for classification.
162  */
163 typedef enum { NORMALFILE, CHECKFILE, ECOFILE } SourceFileType;
164
165 /*    0 = don't divide on ECO code.
166  *    1 = divide by letter.
167  *    2 = divide by letter and single digit.
168  *    N > 1 = divide by letter and N-1 digits.
169  *    In principle, it should be possible to expand the ECO classification
170  *    with an arbitrary number of digits.
171  */
172 typedef enum {
173     DONT_DIVIDE = 0, MIN_ECO_LEVEL = 1, MAX_ECO_LEVEL = 10
174 } EcoDivision;
175
176 /* Define a type to describe which tags are to be output.
177  * This used to be handled by the Boolean seven_tag_roster field
178  * in GlobalState but there are now different forms of output
179  * available.
180  */
181 typedef enum {
182     ALL_TAGS = 0, SEVEN_TAG_ROSTER = 1, NO_TAGS = 2
183 } TagOutputForm;
184
185 /* This structure holds details of the program state.
186  * Most of these fields are set from the program's arguments.
187  */
188 typedef struct {
189     /* Whether we are skipping the current game - typically because
190      * of an error in its text.
191      */
192     Boolean skipping_current_game;
193     /* Whether to check, but not write the converted output. */
194     Boolean check_only;
195     /* Whether to print a running commentary to logfile. */
196     Boolean verbose;
197     /* Whether to keep NAGs along with moves. */
198     Boolean keep_NAGs;
199     /* Whether to keep comments along with moves. */
200     Boolean keep_comments;
201     /* Whether to keep variations along with moves. */
202     Boolean keep_variations;
203     /* Which tags are to be output. */
204     TagOutputForm tag_output_format;
205     /* Whether to match permutations of textual variations or not. */
206     Boolean match_permutations;
207     /* Whether we are matching positional variations or not. */
208     Boolean positional_variations;
209     /* Whether we are using Soundex matching or not. */
210     Boolean use_soundex;
211     /* Whether to suppress duplicate game scores. */
212     Boolean suppress_duplicates;
213     /* Whether to suppress unique game scores. */
214     Boolean suppress_originals;
215     /* Whether to use fuzzy matching for duplicates. */
216     Boolean fuzzy_match_duplicates;
217     /* At what depth to use fuzzy matching. */
218     int fuzzy_match_depth;
219     /* Whether to check the tags for matches. */
220     Boolean check_tags;
221     /* Whether to add ECO codes. */
222     Boolean add_ECO;
223     /* Whether an ECO file is currently being parsed. */
224     Boolean parsing_ECO_file;
225     /* Which level to divide the output. */
226     EcoDivision ECO_level;
227     /* What form to write the output in. */
228     OutputFormat output_format;
229     /* Maximum output line length. */
230     unsigned max_line_length;
231     /* Whether to use a virtual hash table or not. */
232     Boolean use_virtual_hash_table;
233     /* Whether to match on the number of moves in a game. */
234     Boolean check_move_bounds;
235     /* Whether to match only games ending in checkmate. */
236     Boolean match_only_checkmate;
237     /* Whether to match only games ending in stalemate. */
238     Boolean match_only_stalemate;
239     /* Whether to output move numbers in the output. */
240     Boolean keep_move_numbers;
241     /* Whether to output results in the output. */
242     Boolean keep_results;
243     /* Whether to keep check and mate characters in the output. */
244     Boolean keep_checks;
245     /* Whether to output an evaluation value after each move. */
246     Boolean output_evaluation;
247     /* Whether to keep games which have incorrect moves. */
248     Boolean keep_broken_games;
249     /* Maximum depth to which to search for positional variations.
250      * This is picked up from the length of variations in the positional
251      * variations file.
252      */
253     unsigned depth_of_positional_search;
254     unsigned long num_games_processed;
255     unsigned long num_games_matched;
256     /* How many games to store in each file. */
257     unsigned games_per_file;
258     /* Which is the next file number. */
259     unsigned next_file_number;
260     /* Lower and upper bounds for moves if check_move_bounds. */
261     unsigned lower_move_bound, upper_move_bound;
262     /* Limit to the number of plies to appear in the output. */
263     int output_ply_limit;
264     /* Which single game to output (matching_game_number > 0) */
265     unsigned long matching_game_number;
266     /* Whether to output a FEN string at the end of the game. */
267     Boolean output_FEN_string;
268     /* Whether to add a FEN comment after every move. */
269     Boolean add_FEN_comments;
270     /* Whether to add a 'matching position' comment. */
271     Boolean add_position_match_comments;
272     /* Whether to include a tag with the total ply count of the game. */
273     Boolean output_total_plycount;
274     /* Whether to add a HashCode tag. */
275     Boolean add_hashcode_tag;
276     /* Whether to dump ECO data to stdout after loading.*/
277     Boolean dump_eco;
278     /* The comment to use for position matches, if required. */
279     const char *position_match_comment;
280     /* Current input file name. */
281     const char *current_input_file;
282     /* Whether this is a CHECKFILE or a NORMALFILE. */
283     SourceFileType current_file_type;
284     /* Current file number. Used to disambiguate PGN file positions. */
285     int current_file_number;
286     int start_file_number;
287     /* Byte positions to scan to and from in the PGN file.
288      * Starting in the middle of a game will yield unexpected
289      * results.
290      */
291     long start_position;
292     long end_position;
293     /* Whether the games are assumed played by computers.
294      * Passed through verbatim to the binary format. */
295     int computer_flag;
296     /* File of ECO lines. */
297     const char *eco_file;
298     /* Where to write the extracted games. */
299     FILE *outputfile;
300     /* Output file name. */
301     const char *output_filename;
302     /* Where to write errors and running commentary. */
303     FILE *logfile;
304     /* Where to write duplicate games. */
305     FILE *duplicate_file;
306     /* Where to write games that don't match the criteria. */
307     FILE *non_matching_file;
308 } StateInfo;
309
310 /* Provide access to the global state that has been set
311  * through command line arguments.
312  */
313 extern StateInfo GlobalState;
314 FILE *must_open_file(const char *filename,const char *mode);