Add forgotten files 1.4.70b
[polyglot.git] / line.c
1
2 // line.c
3
4 // includes
5
6 #include <string.h>
7
8 #include "board.h"
9 #include "line.h"
10 #include "move.h"
11 #include "move_do.h"
12 #include "move_legal.h"
13 #include "san.h"
14 #include "util.h"
15
16 // constants
17
18 static const bool Strict = FALSE; // FALSE
19 static const bool UseDebug = FALSE; // FALSE
20
21 // functions
22
23 // line_is_ok()
24
25 bool line_is_ok(const move_t line[]) {
26
27    int move;
28
29    if (line == NULL) return FALSE;
30
31    while ((move = *line++) != MoveNone) {
32       if (!move_is_ok(move)) return FALSE;
33    }
34
35    return TRUE;
36 }
37
38 // line_clear()
39
40 void line_clear(move_t line[]) {
41
42    ASSERT(line!=NULL);
43
44    *line = MoveNone;
45 }
46
47 // line_copy()
48
49 void line_copy(move_t dst[], const move_t src[]) {
50
51    ASSERT(dst!=NULL);
52    ASSERT(src!=NULL);
53
54    ASSERT(dst!=src);
55
56    while ((*dst++ = *src++) != MoveNone)
57       ;
58 }
59
60 // line_from_can()
61
62 bool line_from_can (move_t line[], const board_t * board, const char string[], int size) {
63
64    int pos;
65    char new_string[StringSize], *p;
66    int move;
67    board_t new_board[1];
68
69    ASSERT(line!=NULL);
70    ASSERT(board_is_ok(board));
71    ASSERT(string!=NULL);
72    ASSERT(size>=LineSize);
73
74    // init
75
76    pos = 0;
77    board_copy(new_board,board);
78
79    // loop
80
81    strcpy(new_string,string); // HACK
82
83    for (p = strtok(new_string," "); p != NULL; p = strtok(NULL," ")) {
84
85       move = move_from_can(p,new_board);
86
87       ASSERT(move!=MoveNone);
88       ASSERT(move_is_legal(move,new_board));
89
90       if (move == MoveNone || !move_is_legal(move,new_board)) break; // HACK: ignore illegal moves
91
92       if (pos >= size) return FALSE;
93       line[pos++] = move;
94
95       move_do(new_board,move);
96    }
97
98    if (pos >= size) return FALSE;
99    line[pos] = MoveNone;
100
101    return TRUE;
102 }
103
104 // line_to_can()
105
106 bool line_to_can(const move_t line[], const board_t * board, char string[], int size) {
107
108    board_t new_board[1];
109    int pos;
110    int move;
111
112    ASSERT(line_is_ok(line));
113    ASSERT(board_is_ok(board));
114    ASSERT(string!=NULL);
115    ASSERT(size>=StringSize);
116
117    // init
118
119    if (size < StringSize) return FALSE;
120
121    board_copy(new_board,board);
122    pos = 0;
123
124    // loop
125
126    while ((move = *line++) != MoveNone) {
127
128       if (pos != 0) {
129          if (pos >= size) return FALSE;
130          string[pos++] = ' ';
131       }
132
133       if (!move_to_can(move,new_board,&string[pos],size-pos)) return FALSE;
134       pos += strlen(&string[pos]);
135
136       move_do(new_board,move);
137    }
138
139    if (pos >= size) return FALSE;
140    string[pos] = '\0';
141
142    return TRUE;
143 }
144
145 // line_to_san()
146
147 bool line_to_san(const move_t line[], const board_t * board, char string[], int size) {
148
149    board_t new_board[1];
150    int pos;
151    int move;
152    char move_string[256];
153
154    ASSERT(line_is_ok(line));
155    ASSERT(board_is_ok(board));
156    ASSERT(string!=NULL);
157    ASSERT(size>=StringSize);
158
159    // init
160
161    if (size < StringSize) return FALSE;
162
163    board_copy(new_board,board);
164    pos = 0;
165
166    // loop
167
168    while ((move = *line++) != MoveNone) {
169
170       if (pos != 0) {
171          if (pos >= size) return FALSE;
172          string[pos++] = ' ';
173       }
174
175       if (!move_is_legal(move,new_board)
176        || !move_to_san(move,new_board,&string[pos],size-pos)) {
177
178          if (Strict || UseDebug) {
179
180             move_to_can(move,new_board,move_string,256);
181             my_log("POLYGLOT ILLEGAL MOVE IN LINE %s\n",move_string);
182
183             board_disp(new_board);
184          }
185
186          if (Strict) my_fatal("line_to_san(): illegal move\n");
187
188          break;
189       }
190
191       pos += strlen(&string[pos]);
192
193       move_do(new_board,move);
194    }
195
196    if (pos >= size) return FALSE;
197    string[pos] = '\0';
198
199    return TRUE;
200 }
201
202 // end of line.cpp
203