8 #include <boost/program_options.hpp> 
   14 namespace po = boost::program_options;
 
   17 void analyze_root(
const NumEffectState& state, 
const vector<Move>& 
moves, 
int move_number);
 
   18 int main(
int argc, 
char **argv)
 
   20   po::options_description options;
 
   24     (
"filename,f", po::value<std::string>(&filename),
 
   25      "specify .kif or .ki2 file to be analyzed")
 
   26     (
"start,s", po::value<size_t>(&start)->default_value(35),
 
   28     (
"end,e", po::value<size_t>(&end)->default_value(350),
 
   30     (
"help,h", 
"Show help message");
 
   34     po::store(po::parse_command_line(argc, argv, options), vm);
 
   36     if (vm.count(
"help")) {
 
   37       std::cerr << 
"Usage: " << argv[0] << 
" [options] files" << std::endl;
 
   38       std::cout << options << std::endl;
 
   42   catch (std::exception& e)
 
   44     std::cerr << 
"error in parsing options" << std::endl
 
   45               << e.what() << std::endl;
 
   46     std::cerr << options << std::endl;
 
   55     if (filename.find(
".kif") == filename.size()-4) 
 
   57       KakinokiFile file(filename);
 
   58       moves = file.getRecord().getMoves();
 
   59       state = file.getRecord().getInitialState();
 
   61     else if (filename.find(
".ki2") == filename.size()-4) 
 
   63       Ki2File file(filename);
 
   64       moves = file.getRecord().getMoves();
 
   65       state = file.getRecord().getInitialState();
 
   68   catch (KakinokiIOError&) 
 
   73   for (
size_t i=0; i<moves.size(); ++i) 
 
   75     state.makeMove(moves[i]);
 
   78     std::cerr << i+1 << 
"\n";
 
   87   std::ostringstream ret;
 
   88   ret << 
"[(" << move_number << 
") ";
 
   92     for (
int i=0; i<move_number-1; ++i)
 
   95     s.makeMove(moves[move_number-1]);
 
  103   std::cout << ret.str() << std::endl;