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

さて、今回は、csa.cのそれぞれの関数の意味を書いておきます。


今回の解説と併せてBonanzaソースコードを読めば、CSA読み込みルーチンを自作ようという人の参考にもなるはずです。

static int str2piece( const char *str );
// CSAの駒を意味する文字列(2文字)に対応する駒の値を求めます。
// 不正な文字列の場合-2が返ります。
// また駒の値は以下のenumにあります。
// enum { promote = 8, empty = 0,
//       pawn, lance, knight, silver, gold, bishop, rook, king, pro_pawn,
//       pro_lance, pro_knight, pro_silver, piece_null, horse, dragon };

static int read_char( record_t *pr );
// ファイルから一文字読み込んでそれを返します。
// record_tは、CSA読み込みをクラス化すれば内部状態としてメンバに持つべき内容で、
// ファイルポインタやら読み込み中の行数などが入っています。

static int skip_comment( record_t *pr );
// コメント( アポストロフィ(')以降を読み飛ばしながら1文字読み込みます。

static int read_CSA_line( record_t *pr, char *str );
// ファイルから一行読み込みます。下請けにskip_commentを呼び出すので
// コメント以降は無視されます。また処理の最後で末尾の空白はtrimする(切り詰める)ので
// '\0'の直前は有効な文字であることが保証されます。
// strの指す文字列バッファに読み込んだ内容が返ります。
// 返し値は 0 ならEOF、1なら正常終了、-2なら読み込みバッファがあふれたことを意味します。

static int read_board_rep1( const char *str_line, min_posi_t *pmin_posi );
// CSAファイルで駒落ちが指定されているとき、落とす駒をparseします。

static int read_board_rep2( const char *str_line, min_posi_t *pmin_posi );
// CSAファイルから1段読み込みます。1段とは
// "P3-FU-FU-FU-FU-FU-FU-FU-FU-FU"
// のようなデータです。
// 先頭2文字が段を意味して、そのあとに27文字が続きます。

static int read_board_rep3( const char *str_line, min_posi_t *pmin_posi );
// CSAファイルの「駒別単独表現」(CSAフォーマットの仕様書を見るべし) or 持ち駒のparse。
// '+','-'のあとをparseします。
// 持ち駒の表現が次の行でも継続している可能性があるときは0を返します。
// また、"00AL"(残りの駒すべて手駒の意味)が書かれていたなら(このとき次の行に持ち駒の表現が継続している可能性はない)1を返します。
// エラーのときは負の値を返します。

int interpret_CSA_move( tree_t * restrict ptree, unsigned int *pmove,
		    const char *str )
// strの指す文字列がCSA形式の指し手の表現だと仮定して、それを解釈して、
// *pmove にその指し手を返します。このとき返される指し手はBonanzaの内部で使われている
// 指し手の表現です。(32bit無符号整数)
// 返し値は、成功すれば1。指し手が非合法手であるか解釈上のエラーであれば-2。


個人的な感想ですが、指し手はせめてtypedefしてあって欲しいです。(これって、以前にも書いたような気がしますが…)


例えば次のようにtypedefしてあるとします。

typedef unsigned int Move;


int interpret_CSA_move( tree_t * restrict ptree, <b>Move</b> &move,
		    const char *str )

こうなっているだけでこのMoveという表記がマーカーのような役割を果たすのでソースコードの読みやすさはまったく違ってきます。


長くなってきたので今回はここまで。