glob()

インタプリタ自体の実装になかなか取り掛かる気になれず、現実逃避的にGLOBルール相当のglob()関数を作りました。

std::vector<std::string> glob(
    const boost::filesystem::path& work,    // 作業ディレクトリ(フルパス)
    const std::string& dir,                 // 調べるディレクトリ(相対パス可)
    const std::string& pattern              // ファイル名のパターン
);

実際にはGLOBルールはディレクトリとパターンを複数指定可能なので、この関数を(ディレクトリ数×パターン数)回呼び出すことになります。


作業ディレクトリworkはdirが相対パスの場合に使用されます。
引数がworkとdirに分かれているのは、

ECHO [ GLOB .. : *.txt ] ;

..\abc.txt ..\hoge.txt

のように指定したディレクトリの文字列がくっついた状態で返されるためです。
dirがpathでなくstringなのも同じ理由からです。


GLOBの結果、パスの区切り文字は「\」に置き換わるのですが、例外があって、

GLOB c:/ : *.txt

のような場合は区切り文字は「/」になります。
多分バグなんでしょうが、bjamの振る舞いを模倣する必要があるため(文字列として等値でなければいけない)、これに対処するコードも入れてあります。
今日の成果物