32 play->
search->
options.
header =
" depth|score| time | nodes (N) | N/s | principal variation";
33 play->
search->
options.
separator =
"------+-----+--------------+-------------+----------+----------------------";
103 else if (strcmp(ext,
".edx") == 0)
game_read(game, f);
105 sprintf(play->
error_message,
"Unknown game format extension: %s\n", ext);
113 for (i = 0; i < 60 && game->
move[i] !=
NOMOVE; ++i) {
142 for (i = j = 0; i < play->
n_game; ++i) {
148 f = fopen(file,
"w");
150 warn(
"Cannot open file %s\n", file);
158 else if (strcmp(ext,
".sgf") == 0)
game_save_sgf(game, f,
true);
162 else if (strcmp(ext,
".edx") == 0)
game_write(game, f);
163 else warn(
"Unknown game format extension: %s\n", ext);
257 info(
"\n[book move]\n");
266 printf(
"book %+02d ", move->
score);
277 info(
"\n[switch from pondering to thinking (id.%d)]\n", play->
search->
id);
288 fprintf(
xboard_log->
f,
"edax search> time: spent while pondering = %.2f mini = %.2f; maxi = %.2f; extra = %.2f\n",
290 fprintf(
xboard_log->
f,
"edax search> level: %d@%d%%\n",
329 fprintf(
xboard_log->
f,
"edax search> time: left = %.2f mini = %.2f; maxi = %.2f; extra = %.2f\n",
331 fprintf(
xboard_log->
f,
"edax search> level: %d@%d%%\n",
349 info(
"[cpu usage: %.2f%%]\n", 100.0 * t_cpu / t_real);
382 info(
"\n[start thinking]\n");
389 info(
"<hint %d moves>\n", n);
400 printf(
"book ");
line_print(pv, 10, NULL, stdout);
403 printf(
"book %+02d ", m->
score);
425 info(
"\n[stop thinking]\n");
573 if ( exclude_list ) {
674 *board = *play->
board;
693 printf(
"[ponder after %s id.%d: ",
move_to_string(move->
x, player, m), search->
id);
706 printf(
"[ponder (without move) id.%d: ", search->
id);
712 info(
"[ponderation finished]\n");
735 info(
"\n[start ponderation]\n");
752 info(
"[stop pondering]\n");
758 info(
"[joining thread]\n");
761 info(
"[thread joined]\n");
772 info(
"[stop on user demand]\n");
875 if (next)
string = next;
947 Board excluded[1], board[1], unique[1];
973 alternative->
x = result->
move;
975 *depth = result->
depth;
1000 fprintf(f,
"%3d ", 61 - n_empties);
1001 if (depth == -1) fputs(
" book ", f);
1003 fprintf(f,
" %3d", depth);
1004 if (percent < 100) fprintf(f,
"@%2d%%", percent);
1007 fprintf(f,
"%3d ", n_moves);
1011 else if (m->
score == a->
score) fputs(
" = ", f);
1012 else fputs(
" < ", f);
1015 if (depth == n_empties) {
1016 if (percent == 100) fputs(
"<- Mistake", f);
1017 else fputs(
"<- Possible mistake", f);
1019 fputs(
"<- Edax disagrees", f);
1020 if (a->
score - m->
score > 4) fputs(
" strongly", f);
1035 int i, score, n_alternatives;
1036 int depth = 0, percent = 0, n_empties;
1037 Move *move, alternative[1];
1038 int n_exact[2] = {0, 0}, n_eval[2] = {0, 0};
1039 int n_error[2] = {0, 0}, n_rejection[2] = {0, 0};
1040 int disc_error[2] = {0, 0}, disc_rejection[2] = {0, 0};
1041 const char *clr =
" \r";
1046 puts(
"\n N played alternative");
1047 puts(
"ply level alt. move score score move");
1048 puts(
"---+-------+-----+-----------+--+---------------");
1054 score = alternative->
score;
1056 for (i = play->
i_game - 1; i >= 0 && i >= play->
i_game - n; --i) {
1057 move = play->
game + i;
1058 move->
score = -score;
1061 if (move->
x ==
PASS) ++n;
1064 n_alternatives =
play_alternative(play, move, alternative, &depth, &percent);
1068 score = move->
score;
1069 if (n_alternatives > 0) {
1070 if (depth == n_empties && percent == 100) ++n_exact[play->
player];
else ++n_eval[play->
player];
1071 if (alternative->
score > score) {
1072 if (depth == n_empties && percent == 100) {
1074 disc_error[play->
player] += alternative->
score - score;
1076 ++n_rejection[play->
player];
1077 disc_rejection[play->
player] += alternative->
score - score;
1079 score = alternative->
score;
1084 puts(
"\n | rejections : discs | errors : discs | error rate |");
1085 printf(
"Black | %3d / %3d : %+4d | %3d / %3d : %+4d | %5.3f |\n",
1087 printf(
"White | %3d / %3d : %+4d | %3d / %3d : %+4d | %5.3f |\n",
1090 if (i < 0 || i < play->i_game - n) ++i;
1091 for (; i < play->
i_game; ++i) {
1108 Move *exclude, *best;
1109 Board excluded[1], board[1], unique[1];
1115 if (exclude && exclude->
x == played->
x) {
1127 *alternative = *best;
1142 int i, n_alternatives;
1143 Move *move, alternative[1];
1147 puts(
"\n N played alternative");
1148 puts(
"ply level alt. move score score move");
1149 puts(
"---+-------+-----+-----------+--+---------------");
1151 for (i = play->
i_game - 1; i >= 0 && i >= play->
i_game - n; --i) {
1152 move = play->
game + i;
1155 if (move->
x ==
PASS) ++n;
1163 if (i < 0 || i < play->i_game - n) ++i;
1164 for (; i < play->
i_game; ++i) {
1179 char file[FILENAME_MAX + 1];
1190 for (--i; i >= 0; --i) {
1227 int i, j, x, discs[2], mobility[2], square;
1229 const char *color =
"?*O-." + 1;
1230 const char big_color[3][4] = {
"|##",
"|()",
"| "};
1231 const char player[2][6] = {
"Black",
"White"};
1233 const int p = play->
player;
1236 unsigned long long moves;
1243 memset(history, 0, 64);
1244 for (i = j = 0; i < play->
i_game; i++) {
1245 x = play->
game[i].
x;
1246 if (
A1 <= x && x <=
H8) history[x] = ++j;
1249 fputs(
" A B C D E F G H BLACK A B C D E F G H\n", f);
1250 for (i = 0; i < 8; i++) {
1253 for (j = 0; j < 8; j++) {
1255 if (p ==
BLACK) square = 2 - ((board->
opponent >> x) & 1) - 2 * ((board->
player >> x) & 1);
1256 else square = 2 - ((board->
player >> x) & 1) - 2 * ((board->
opponent >> x) & 1);
1258 fputc(color[square], f);
1268 fprintf(f,
" %2d discs %2d moves ", discs[
BLACK], mobility[
BLACK]);
1271 if (mobility[
BLACK] + mobility[
WHITE] == 0) fprintf(f,
" Game over ");
1275 if (mobility[
BLACK] + mobility[
WHITE] == 0) {
1276 if (discs[
BLACK] > discs[
WHITE]) fprintf(f,
" %s won ", player[
BLACK]);
1277 else if (discs[
BLACK] < discs[
WHITE]) fprintf(f,
" %s won ", player[
WHITE]);
1278 else fprintf(f,
" draw ");
1279 }
else fprintf(f,
" %s's turn (%c) ",player[p], color[p]);
1282 fprintf(f,
" %2d discs %2d moves ",discs[
WHITE], mobility[
WHITE]);
1291 fputc(i +
'1', f); fputc(
' ', f);
1292 for (j = 0; j < 8; j++){
1294 if (history[x]) fprintf(f,
"|%2d",history[x]);
1298 fputs(big_color[square], f);
1301 fprintf(f,
"| %1d\n", i + 1);
1303 fputs(
" A B C D E F G H WHITE A B C D E F G H\n", f);
1325 if (next)
string = next;
1327 while ((next =
parse_move(
string, board, move)) !=
string || move->
x ==
PASS) {
1398 for (s = 1; s < 8; ++s) {
1427 for (i = 0; i < play->
n_game; ++i) {
1431 play->
game[i] = move;
1443 const char *last = NULL;
1446 for (i = 0; i < play->
i_game; ++i) {
1448 name = opening_get_name(board);
1449 if (name != NULL) last = name;
DLL_API int bit_count(unsigned long long b)
Count the number of bits set to one in an unsigned long long.
Definition bit.c:72
#define x_to_bit(x)
Definition bit.h:43
bool board_check_move(const Board *board, Move *move)
Check if a move is legal.
Definition board.c:452
unsigned long long board_get_hash_code(const Board *board)
Compute a hash code.
Definition board.c:1134
void board_restore(Board *board, const Move *move)
Restore a board.
Definition board.c:487
void board_update(Board *board, const Move *move)
Update a board.
Definition board.c:469
int board_count_empties(const Board *board)
Check if the game is over.
Definition board.c:1216
unsigned long long board_get_move(const Board *board, const int x, Move *move)
Compute a move.
Definition board.c:438
void board_swap_players(Board *board)
Swap players.
Definition board.c:137
int board_from_obj(Board *board, const Board *obj, const int turn)
Set a board from a Board object.
Definition board.c:258
int board_unique(const Board *board, Board *unique)
unique board
Definition board.c:379
void board_init(Board *board)
Set a board to the starting position.
Definition board.c:280
int get_mobility(const unsigned long long P, const unsigned long long O)
Count legal moves.
Definition board.c:833
bool board_equal(const Board *b1, const Board *b2)
Compare two board for equality.
Definition board.c:335
DLL_API unsigned long long get_moves(const unsigned long long P, const unsigned long long O)
Get legal moves.
Definition board.c:621
DLL_API bool can_move(const unsigned long long P, const unsigned long long O)
Check if a player can move.
Definition board.c:797
unsigned long long board_next(const Board *board, const int x, Board *next)
Compute a board resulting of a move played on a previous board.
Definition board.c:517
int board_set(Board *board, const char *string)
Set a board from a string description.
Definition board.c:154
void board_symetry(const Board *board, const int s, Board *sym)
symetric board
Definition board.c:347
int board_from_FEN(Board *board, const char *string)
Set a board from a string description.
Definition board.c:212
void book_show(Book *book, Board *board)
Display a position from the book.
Definition book.c:2155
void book_add_board(Book *book, const Board *board)
Add a position.
Definition book.c:2485
void book_get_line(Book *book, const Board *board, const Move *move, Line *line)
Get a variation from the book.
Definition book.c:2401
void book_negamax(Book *book)
Negamax a book.
Definition book.c:1684
bool book_get_random_move(Book *book, const Board *board, Move *move, const int randomness)
Get a move at random from the opening book.
Definition book.c:2426
int book_get_moves_with_position(Book *book, const Board *board, MoveList *movelist, Position *position)
Get a list of moves from the book.
Definition book.c:2380
void book_save(Book *book, const char *file)
Save an opening book.
Definition book.c:1622
bool book_get_moves(Book *book, const Board *board, MoveList *movelist)
Get a list of moves from the book.
Definition book.c:2360
void book_link(Book *book)
Link a book.
Definition book.c:1701
void book_get_game_stats(Book *book, const Board *board, GameStats *stat)
Get game statistics from a position.
Definition book.c:2444
@ UI_NBOARD
Definition const.h:113
@ UI_XBOARD
Definition const.h:114
#define TIME_MAX
Definition const.h:61
@ PASS
Definition const.h:37
@ NOMOVE
Definition const.h:37
@ A1
Definition const.h:29
@ H8
Definition const.h:36
@ WHITE
Definition const.h:43
@ EMPTY
Definition const.h:44
@ BLACK
Definition const.h:42
@ STOP_ON_DEMAND
Definition const.h:75
@ STOP_END
Definition const.h:76
@ STOP_PONDERING
Definition const.h:73
@ IS_THINKING
Definition const.h:103
@ IS_PONDERING
Definition const.h:101
@ IS_WAITING
Definition const.h:100
@ IS_ANALYZING
Definition const.h:102
void game_export_ggf(const Game *game, FILE *f)
Write a game to the Generic Game Format (ggf) file.
Definition game.c:713
void game_import_text(Game *game, FILE *f)
Read a game from a text file.
Definition game.c:451
void game_read(Game *game, FILE *f)
Read a game from a binary file.
Definition game.c:429
void game_import_ggf(Game *game, FILE *f)
Read a game from the Generic Game Format (ggf) file.
Definition game.c:582
void game_save_sgf(const Game *game, FILE *f, const bool multiline)
Write a game to the Generic Game Format (ggf) file.
Definition game.c:870
void game_export_text(const Game *game, FILE *f)
Write a game to a text file.
Definition game.c:467
void game_export_svg(const Game *game, FILE *f)
Definition game.c:1409
void game_init(Game *game)
Create an empty game.
Definition game.c:83
void game_import_pgn(Game *game, FILE *f)
Read a game from a pgn file.
Definition game.c:955
void game_import_sgf(Game *game, FILE *f)
Read a game from a sgf file.
Definition game.c:823
void game_export_eps(const Game *game, FILE *f)
Write a game to an eps file.
Definition game.c:1264
void game_write(const Game *game, FILE *f)
Write a game to a binary file.
Definition game.c:440
void game_export_pgn(const Game *game, FILE *f)
Write a game to a pgn file.
Definition game.c:1203
void hash_exclude_move(HashTable *hash_table, const unsigned long long hash_code, const int move)
Erase an hash table entry.
Definition hash-lock-free.c:629
Move * movelist_best(MoveList *movelist)
Return the best move of the list.
Definition move.c:411
void line_print(const Line *line, int width, const char *separator, FILE *f)
Print a move sequence.
Definition move.c:610
bool movelist_is_empty(const MoveList *movelist)
Check if the list is empty.
Definition move.c:537
void line_push(Line *line, const int x)
Add a move to the sequence.
Definition move.c:561
void line_init(Line *line, const int player)
Initialize a sequence of moves.
Definition move.c:549
Move * movelist_exclude(MoveList *movelist, const int move)
Exclude a move.
Definition move.c:516
const Move MOVE_INIT
Definition move.c:25
char * move_to_string(const int x, const int player, char *s)
Print out a move.
Definition move.c:76
int symetry(int x, const int sym)
Get a symetric square coordinate.
Definition move.c:47
void line_copy(Line *dest, const Line *src, const int from)
Copy part of a sequence to another sequence.
Definition move.c:591
#define foreach_move(iter, movelist)
Definition move.h:78
const char * opening_get_line(const char *opening_name)
Translate an opening name into its move sequence.
Definition opening.c:1305
Options options
Definition options.c:22
@ EDAX_TIME_PER_MOVE
Definition options.h:20
void play_hint_prepare(Play *play, MoveList *exclude_list)
prepare hint for libEdax
Definition play.c:556
bool play_must_pass(Play *play)
Check if player must pass.
Definition play.c:202
void play_store(Play *play)
store the game into the opening book
Definition play.c:1175
static int play_book_alternative(Play *play, Move *played, Move *alternative)
Seek for the best alternative move from the opening book.
Definition play.c:1105
void play_force_restore(Play *play)
Restore a forced line.
Definition play.c:1364
bool play_force_go(Play *play, Move *move)
Play a forced move.
Definition play.c:1384
void play_get_bookmove(Play *play, MoveList *book_moves)
get book move for libEdax
Definition play.c:513
void play_set_board(Play *play, const char *board)
Set a new board.
Definition play.c:810
void play_print(Play *play, FILE *f)
Print the game state.
Definition play.c:1225
void play_analyze(Play *play, int n)
Analyze a played game.
Definition play.c:1033
void play_hint(Play *play, int n)
Start thinking.
Definition play.c:365
void play_set_board_from_FEN(Play *play, const char *board)
Set a new board.
Definition play.c:828
void play_ponder(Play *play)
Ponder.
Definition play.c:729
void play_hint_for_lib(Play *play, int n, HintList *hintlist)
hint for libEdax
Definition play.c:439
void play_stop_pondering(Play *play)
Stop pondering.
Definition play.c:749
bool play_move(Play *play, int x)
Play a move.
Definition play.c:889
void play_update(Play *play, Move *move)
Update the game.
Definition play.c:174
void play_book_analyze(Play *play, int n)
Analyze a played game.
Definition play.c:1140
void play_new(Play *play)
Start a new game.
Definition play.c:62
void play_save(Play *play, const char *file)
Save a played game.
Definition play.c:131
void play_init(Play *play, Book *book)
Initialization.
Definition play.c:27
const char * play_show_opening_name(Play *play, const char *(*opening_get_name)(const Board *))
Print the opening name.
Definition play.c:1438
bool play_user_move(Play *play, const char *string)
Play a user move.
Definition play.c:909
Move * play_get_last_move(Play *play)
Get the last played move.
Definition play.c:927
void play_hint_next(Play *play, Hint *hint, bool multiPvDepthMax)
get next hint
Definition play.c:589
void play_force_init(Play *play, const char *string)
Initialize a forced line.
Definition play.c:1313
void play_game(Play *play, const char *string)
Play a move sequence.
Definition play.c:866
void play_force_update(Play *play)
Update a forced line.
Definition play.c:1345
void play_adjust_time(Play *play, const int left, const int extra)
adjust time.
Definition play.c:1211
static int play_alternative(Play *play, Move *played, Move *alternative, int *depth, int *percent)
Seek for the best alternative move.
Definition play.c:943
void * play_ponder_run(void *v)
do ponderation.
Definition play.c:662
void play_symetry(Play *play, const int sym)
Get the symetry of the actual position.
Definition play.c:1418
int play_get_bookmove_with_position(Play *play, MoveList *book_moves, Position *position)
get book move for libEdax
Definition play.c:535
bool play_load(Play *play, const char *file)
Load a saved game.
Definition play.c:84
void play_undo(Play *play)
Undo a move.
Definition play.c:779
bool play_is_game_over(Play *play)
Check if game is over.
Definition play.c:190
void play_redo(Play *play)
Redo a move.
Definition play.c:795
void play_go(Play *play, const bool update)
Start thinking.
Definition play.c:214
void play_stop(Play *play)
Stop thinking.
Definition play.c:769
void play_set_board_from_obj(Play *play, const Board *board, const int turn)
Set a new board.
Definition play.c:846
void play_free(Play *play)
Free resources.
Definition play.c:52
static void play_write_analysis(Play *play, const Move *m, const Move *a, const int n_moves, const int depth, const int percent, FILE *f)
Write a line if an analysis.
Definition play.c:994
Edax play control - header file.
#define PLAY_MESSAGE_MAX_LENGTH
Definition play.h:22
void * search_run(void *v)
Search the bestmove of a given board.
Definition root.c:810
void search_time_init(Search *search)
Initialize the alloted time.
Definition search.c:697
void search_set_level(Search *search, const int level, const int n_empties)
Set the search level.
Definition search.c:609
void search_init(Search *search)
Init the main search.
Definition search.c:351
void search_time_reset(Search *search, const Board *initial_board)
Reset the alloted time.
Definition search.c:732
void search_free(Search *search)
Free the search allocated ressource.
Definition search.c:441
const Selectivity selectivity_table[]
Definition search.c:97
void result_print(Result *result, FILE *f)
Print the current search result.
Definition search.c:1106
void search_cleanup(Search *search)
Clean-up some search data.
Definition search.c:578
void search_set_board(Search *search, const Board *board, const int player)
Set the board to analyze.
Definition search.c:593
int search_guess(Search *search, const Board *board)
Guess the bestmove of a given board.
Definition search.c:1369
void search_stop_all(Search *search, const Stop stop)
Stop the search.
Definition search.c:1335
void search_set_move_time(Search *search, const long long t)
set time to search.
Definition search.c:686
void search_set_ponder_level(Search *search, const int level, const int n_empties)
Set the search level while pondering.
Definition search.c:629
long long search_time(Search *search)
Return the time spent by the search.
Definition search.c:1061
void search_set_game_time(Search *search, const long long t)
set time to search.
Definition search.c:671
#define MULTIPV_DEPTH
Definition settings.h:122
unsigned long long player
Definition board.h:27
unsigned long long opponent
Definition board.h:27
The opening book.
Definition book.h:25
int n_links
Definition book.h:40
int level
Definition book.h:32
int n_nodes
Definition book.h:39
int lower
Definition search.h:36
int upper
Definition search.h:37
Game statistics.
Definition book.h:57
unsigned long long n_lines
Definition book.h:61
char move[60]
Definition game.h:33
Board initial_board[1]
Definition game.h:23
char player
Definition game.h:34
unsigned char date
Definition hash.h:55
Hint hint[MAX_MOVE+2]
Definition search.h:82
int n_hints
Definition search.h:83
int move
Definition search.h:65
int depth
Definition search.h:63
bool book_move
Definition search.h:72
int score
Definition search.h:66
Line pv[1]
Definition search.h:69
int upper
Definition search.h:67
int selectivity
Definition search.h:64
unsigned long long n_nodes
Definition search.h:71
int lower
Definition search.h:68
long long time
Definition search.h:70
LogFile.
Definition util.h:423
FILE * f
Definition util.h:424
int n_moves
Definition move.h:31
int score
Definition move.h:23
int x
Definition move.h:22
PlayType play_type
Definition options.h:42
bool book_allowed
Definition options.h:60
bool can_ponder
Definition options.h:43
int n_task
Definition options.h:29
int level
Definition options.h:40
int depth
Definition options.h:44
int width
Definition options.h:34
int book_randomness
Definition options.h:61
long long time
Definition options.h:41
bool info
Definition options.h:36
char * book_file
Definition options.h:59
int selectivity
Definition options.h:45
int verbosity
Definition options.h:32
int player
Definition play.h:32
long long clock
Definition play.h:39
bool verbose
Definition play.h:57
Board board[1]
Definition play.h:26
int n_move
Definition play.h:49
long long spent
Definition play.h:41
Move game[80]
Definition play.h:34
Board unique[80]
Definition play.h:47
Result result[1]
Definition play.h:29
long long left
Definition play.h:42
int initial_player
Definition play.h:33
Board initial_board[1]
Definition play.h:27
Thread thread
Definition play.h:53
bool launched
Definition play.h:56
int n_game
Definition play.h:36
Move move[80]
Definition play.h:48
Search search[1]
Definition play.h:28
volatile PlayState state
Definition play.h:37
struct Play::@23 ponder[1]
int type
Definition play.h:31
char error_message[PLAY_MESSAGE_MAX_LENGTH]
Definition play.h:59
Book * book
Definition play.h:30
int i_game
Definition play.h:35
Board real[80]
Definition play.h:46
int i_move
Definition play.h:50
long long extra
Definition play.h:43
A position stored in the book.
Definition book.h:77
bool book_move
Definition search.h:50
int move
Definition search.h:44
unsigned long long n_nodes
Definition search.h:49
int score
Definition search.h:45
long long time
Definition search.h:48
int selectivity
Definition search.h:43
Line pv[1]
Definition search.h:47
int depth
Definition search.h:42
Bound bound[BOARD_SIZE+2]
Definition search.h:46
long long maxi
Definition search.h:130
const char * separator
Definition search.h:145
int n_empties
Definition search.h:99
bool keep_date
Definition search.h:143
void(* observer)(Result *)
Definition search.h:153
long long extra
Definition search.h:125
MoveList movelist[1]
Definition search.h:132
Result * result
Definition search.h:151
const char * header
Definition search.h:144
int id
Definition search.h:101
struct Search::@25 options
int verbosity
Definition search.h:142
int depth
Definition search.h:117
long long mini
Definition search.h:129
HashTable pv_table[1]
Definition search.h:104
HashTable hash_table[1]
Definition search.h:103
volatile Stop stop
Definition search.h:122
int selectivity
Definition search.h:118
Board board[1]
Definition search.h:96
int multipv_depth
Definition search.h:147
int percent
Definition search.h:28
void time_print(long long t, bool justified, FILE *f)
Print time as "D:HH:MM:SS.CC".
Definition util.c:131
char * parse_move(const char *string, const Board *board, Move *move)
Parse a move.
Definition util.c:627
char * file_add_ext(const char *base, const char *ext, char *file)
Add an extension to a string.
Definition util.c:907
void thread_create2(Thread *thread, void *(*function)(void *), void *data)
Create a thread.
Definition util.c:922
void thread_join(Thread thread)
Join a thread.
Definition util.c:940
void string_to_lowercase(char *s)
Change all char of a string to lowercase.
Definition util.c:355
void relax(int t)
sleep for t ms.
Definition util.c:203
long long real_clock(void)
#define MIN(a, b)
Definition util.h:101
long long cpu_clock(void)
#define log_print(l,...)
Print into the log file.
Definition util.h:442
#define fatal_error(...)
Display an error message as "FATAL_ERROR : file name : function name : line number : ....
Definition util.h:349
#define info(...)
Display a message.
Definition util.h:382
#define warn(...)
Display a warning message as "WARNING : ... ".
Definition util.h:373
#define log_is_open(l)
Check if the log stream can be used.
Definition util.h:448
Log xboard_log[1]
Definition xboard.c:26