12 #include "move_legal.h"
18 static const bool Strict = FALSE; // FALSE
19 static const bool UseDebug = FALSE; // FALSE
25 bool line_is_ok(const move_t line[]) {
29 if (line == NULL) return FALSE;
31 while ((move = *line++) != MoveNone) {
32 if (!move_is_ok(move)) return FALSE;
40 void line_clear(move_t line[]) {
49 void line_copy(move_t dst[], const move_t src[]) {
56 while ((*dst++ = *src++) != MoveNone)
62 bool line_from_can (move_t line[], const board_t * board, const char string[], int size) {
65 char new_string[StringSize], *p;
70 ASSERT(board_is_ok(board));
72 ASSERT(size>=LineSize);
77 board_copy(new_board,board);
81 strcpy(new_string,string); // HACK
83 for (p = strtok(new_string," "); p != NULL; p = strtok(NULL," ")) {
85 move = move_from_can(p,new_board);
87 ASSERT(move!=MoveNone);
88 ASSERT(move_is_legal(move,new_board));
90 if (move == MoveNone || !move_is_legal(move,new_board)) break; // HACK: ignore illegal moves
92 if (pos >= size) return FALSE;
95 move_do(new_board,move);
98 if (pos >= size) return FALSE;
106 bool line_to_can(const move_t line[], const board_t * board, char string[], int size) {
108 board_t new_board[1];
112 ASSERT(line_is_ok(line));
113 ASSERT(board_is_ok(board));
114 ASSERT(string!=NULL);
115 ASSERT(size>=StringSize);
119 if (size < StringSize) return FALSE;
121 board_copy(new_board,board);
126 while ((move = *line++) != MoveNone) {
129 if (pos >= size) return FALSE;
133 if (!move_to_can(move,new_board,&string[pos],size-pos)) return FALSE;
134 pos += strlen(&string[pos]);
136 move_do(new_board,move);
139 if (pos >= size) return FALSE;
147 bool line_to_san(const move_t line[], const board_t * board, char string[], int size) {
149 board_t new_board[1];
152 char move_string[256];
154 ASSERT(line_is_ok(line));
155 ASSERT(board_is_ok(board));
156 ASSERT(string!=NULL);
157 ASSERT(size>=StringSize);
161 if (size < StringSize) return FALSE;
163 board_copy(new_board,board);
168 while ((move = *line++) != MoveNone) {
171 if (pos >= size) return FALSE;
175 if (!move_is_legal(move,new_board)
176 || !move_to_san(move,new_board,&string[pos],size-pos)) {
178 if (Strict || UseDebug) {
180 move_to_can(move,new_board,move_string,256);
181 my_log("POLYGLOT ILLEGAL MOVE IN LINE %s\n",move_string);
183 board_disp(new_board);
186 if (Strict) my_fatal("line_to_san(): illegal move\n");
191 pos += strlen(&string[pos]);
193 move_do(new_board,move);
196 if (pos >= size) return FALSE;