Fix Linux sigint problem
[bonanza.git] / ponder.c
1 #include <stdlib.h>
2 #include <limits.h>
3 #include "shogi.h"
4
5
6 int
7 ponder( tree_t * restrict ptree )
8 {
9   const char *str;
10   unsigned int move;
11   int iret;
12
13   if ( ( game_status & ( mask_game_end | flag_noponder | flag_nopeek ) )
14        || abs( last_root_value ) > score_max_eval
15        || ! record_game.moves
16        || sec_limit_up == UINT_MAX ) { return 1; }
17
18   ponder_nmove = gen_legal_moves( ptree, ponder_move_list );
19
20   if ( get_elapsed( &time_start ) < 0 ) { return -1; }
21
22   Out( "\nSearch a move to ponder\n\n" );
23   OutCsaShogi( "info ponder start\n" );
24
25   game_status |= flag_puzzling;
26   iret         = iterate( ptree, 0 );
27   game_status &= ~flag_puzzling;
28   if ( iret < 0 ) { return iret; }
29
30   if ( game_status & ( flag_quit | flag_quit_ponder | flag_suspend ) )
31     {
32       OutCsaShogi( "info ponder end\n" );
33       return 1;
34     }
35
36   if ( abs(last_root_value) > score_max_eval )
37     {
38       OutCsaShogi( "info ponder end\n" );
39       return 1;
40     }
41
42   ponder_move = move = last_pv.a[1];
43   str = str_CSA_move( move );
44   Out( "\nPonder on %c%s (%+.2f)\n\n",
45        ach_turn[root_turn], str, (double)last_root_value / 100.0 );
46
47   iret = make_move_root( ptree, move, ( flag_rep | flag_rejections ) );
48   if ( iret < 0 )
49     {
50       OutCsaShogi( "info ponder end\n" );
51       return iret;
52     }
53   
54   if ( game_status & mask_game_end )
55     {
56       OutCsaShogi( "info ponder end\n" );
57       unmake_move_root( ptree, move );
58       return 1;
59     }
60   
61   if ( get_elapsed( &time_start ) < 0 ) { return -1; }
62
63   game_status |= flag_pondering;
64
65   iret = iterate( ptree, 0 );
66   if ( game_status & flag_thinking )
67     {
68       game_status &= ~flag_thinking;
69       if ( iret < 0 ) { return iret; }
70
71       iret = com_turn_start( ptree, flag_from_ponder );
72       if ( iret < 0 ) { return iret; }
73       
74       return 2;
75     }
76   OutCsaShogi( "info ponder end\n" );
77   game_status &= ~flag_pondering;
78   unmake_move_root( ptree, move );
79
80   return iret;
81 }
82
83
84 #if defined(MNJ_LAN)
85 int
86 analyze( tree_t * restrict ptree )
87 {
88   int iret;
89
90   if ( game_status & mask_game_end ) { return 1; }
91
92   iret = get_elapsed( &time_start );
93   if ( iret < 0 ) { return iret; }
94
95   game_status |=  flag_pondering;
96   iret = iterate( ptree, 0 );
97   game_status &= ~flag_pondering;
98
99   if ( abs(last_root_value) > score_max_eval )
100     {
101       MnjOut( "pid=%d confident\n", mnj_posi_id );
102     }
103
104   return iret;
105 }
106 #endif