CSA形式のデータ読み込み部 解説 その5

実際にN手目の局面をCSAファイルから読み出すコードとして、csa.cのread_recordという関数が非常に参考になるのでソースを引用して、ソースに私が注釈を入れておきますので読んでみてください。


ここまでの内容を理解していれば、すんなり読めるはずです。

int
read_record( tree_t * restrict ptree, const char *str_file,
	     unsigned int moves, int flag )
{
  record_t record;
  int iret;

  iret = record_open( &record, str_file, mode_read, NULL, NULL );
  // CSAファイルのopen

  if ( iret < 0 ) { return iret; }
  // 戻り値がマイナスの値だと読み込みエラー

  if ( ! moves )
  // movesは初期盤面からの手数。0が指定されていれば初期盤面
    {
      iret = in_CSA_header( ptree, &record, flag );
      // 初期盤面のみを読み込むときはin_CSA_header一発で終わり。
      if ( iret < 0 )
	{
       // 負の値ならば読み込みエラー。
	  record_close( &record );
	  return iret;
	}
    }
  else do {
    // 初期盤面からの手数が指定されているなら、その回数だけin_CSAを呼び出す。
    iret = in_CSA( ptree, &record, NULL, flag );
    if ( iret < 0 )
      {
      // 負の値ならば読み込みエラー
	record_close( &record );
	return iret;
      }
  } while ( iret != record_next
	    && iret != record_eof
	    && moves > record.moves );
   // record_next : 次の棋譜が始まっている(?)の意味
   // ( 指し手が続くときはrecord_miscが返ってくる。)
   // record_eof  : ファイルが終端まで達した の意味
   // record.moves : 現在の初期盤面からの手数
  
  return record_close( &record );
}


これでBonanzaのCSA読み込み部に関してはすべて解説が終わりました。


CSA読み込み部の解説だけで5回も記事を書いてしまいました。
本当にゆっくりの解説ですみません。


何か質問がありましたらコメント欄でお願いします。