11 #include "move_do.h"
\r
12 #include "move_legal.h"
\r
18 static const bool Strict = false; // false
\r
19 static const bool UseDebug = false; // false
\r
21 static const int StringSize = 1024;
\r
27 bool line_is_ok(const move_t line[]) {
\r
31 if (line == NULL) return false;
\r
33 while ((move = *line++) != MoveNone) {
\r
34 if (!move_is_ok(move)) return false;
\r
42 void line_clear(move_t line[]) {
\r
51 void line_copy(move_t dst[], const move_t src[]) {
\r
58 while ((*dst++ = *src++) != MoveNone)
\r
64 bool line_from_can (move_t line[], const board_t * board, const char string[], int size) {
\r
67 char new_string[StringSize], *p;
\r
69 board_t new_board[1];
\r
72 ASSERT(board_is_ok(board));
\r
73 ASSERT(string!=NULL);
\r
74 ASSERT(size>=LineSize);
\r
79 board_copy(new_board,board);
\r
83 strcpy(new_string,string); // HACK
\r
85 for (p = strtok(new_string," "); p != NULL; p = strtok(NULL," ")) {
\r
87 move = move_from_can(p,new_board);
\r
89 ASSERT(move!=MoveNone);
\r
90 ASSERT(move_is_legal(move,new_board));
\r
92 if (move == MoveNone || !move_is_legal(move,new_board)) break; // HACK: ignore illegal moves
\r
94 if (pos >= size) return false;
\r
97 move_do(new_board,move);
\r
100 if (pos >= size) return false;
\r
101 line[pos] = MoveNone;
\r
108 bool line_to_can(const move_t line[], const board_t * board, char string[], int size) {
\r
110 board_t new_board[1];
\r
114 ASSERT(line_is_ok(line));
\r
115 ASSERT(board_is_ok(board));
\r
116 ASSERT(string!=NULL);
\r
117 ASSERT(size>=StringSize);
\r
121 if (size < StringSize) return false;
\r
123 board_copy(new_board,board);
\r
128 while ((move = *line++) != MoveNone) {
\r
131 if (pos >= size) return false;
\r
132 string[pos++] = ' ';
\r
135 if (!move_to_can(move,new_board,&string[pos],size-pos)) return false;
\r
136 pos += strlen(&string[pos]);
\r
138 move_do(new_board,move);
\r
141 if (pos >= size) return false;
\r
142 string[pos] = '\0';
\r
149 bool line_to_san(const move_t line[], const board_t * board, char string[], int size) {
\r
151 board_t new_board[1];
\r
154 char move_string[256];
\r
156 ASSERT(line_is_ok(line));
\r
157 ASSERT(board_is_ok(board));
\r
158 ASSERT(string!=NULL);
\r
159 ASSERT(size>=StringSize);
\r
163 if (size < StringSize) return false;
\r
165 board_copy(new_board,board);
\r
170 while ((move = *line++) != MoveNone) {
\r
173 if (pos >= size) return false;
\r
174 string[pos++] = ' ';
\r
177 if (!move_is_legal(move,new_board)
\r
178 || !move_to_san(move,new_board,&string[pos],size-pos)) {
\r
180 if (Strict || UseDebug) {
\r
182 move_to_can(move,new_board,move_string,256);
\r
183 my_log("POLYGLOT ILLEGAL MOVE IN LINE %s\n",move_string);
\r
185 board_disp(new_board);
\r
188 if (Strict) my_fatal("line_to_san(): illegal move\n");
\r
193 pos += strlen(&string[pos]);
\r
195 move_do(new_board,move);
\r
198 if (pos >= size) return false;
\r
199 string[pos] = '\0';
\r