Windows で Boost セットアップ
Windows 環境で Boost ライブラリをセットアップしてみました。明日は Linux 環境でもセットアップを行い、技術メモとしてまとめる予定です。
で、せっかくなので、試しに簡単なサンプルを作って動作確認をしてみました。
#include <iostream> #include <fstream> #include <string> #include <boost/regex.hpp> using namespace std; using namespace boost; void escapeHtml(const string &src, string &modified); int main(int argc, char* argv[]) { for (int i = 1; i < argc; i++) { ifstream fin(argv[i]); if (fin.bad() || fin.fail()) { cerr << argv[0] << ": Can't open " << argv[i] << "." << endl; continue; } while (!fin.eof()) { string line; getline(fin, line); string modified; escapeHtml(line, modified); cout << modified << endl; } } return 0; } void escapeHtml(const string &src, string &modified) { modified.clear(); sregex_iterator last_it; for (sregex_iterator it(src.begin(), src.end(), regex("[<>&\"]")); it != sregex_iterator(); it++) { modified += it->prefix().str(); string sub = (*it)[0].str(); switch (sub[0]) { case '<': modified += "<"; break; case '>': modified += ">"; break; case '&': modified += "&"; break; case '"': modified += """; break; default: assert(0); break; } last_it = it; } modified += last_it == sregex_iterator() ? src : last_it->suffix().str(); }
Boost.Regex の regex_iterator を用いたテストです。よーするに、コマンドに指定したファイルの HTML エスケープ処理を施してコンソールに書き出すプログラムです。
上記のプログラムを test.cpp などのファイル名で保存し、そのまま Visual Studio 2008 コマンドプロンプト上で
cl test.cpp
とやってみましたが、これだけではコンパイルできませんでした。どうやら、 Visual Studio のオプションダイアログでヘッダーファイルやライブラリの参照先ディレクトリを設定しても、その設定が参照されるのは Visual Studio の IDE からビルドを実行した場合のみのようです。あるいは、環境変数 INCLUDE や LIB を設定してあげればこれでコンパイルできるのかも知れません。その辺はまた追々調べてみますが、最終的には .configure
に --boost-prefix
といったようなオプションを設ける、といった形の対応になるのではないかとも思います。
ちなみに、これと同等の (しかもより確実に動作する) プログラムを Perl で記述すると、以下の通りになります (この書き方はしかし Unix 風環境限定ですが)。
#!/usr/bin/perl -p s/[<>&"]/'&'.{qw(< lt > gt & amp " quot)}->{$&}.';'/eg;
うあー、やっぱりスクリプト言語は便利だなー (汗。
egtra 様、ご指摘感謝です。仰る通り、 string::getline()
を使った方がスマートなので、その通りに修正させて頂きました。
2009 年 7 月 13 日 by 村山 俊之
2009 年 7 月 26 日 3:43 AM
はじめまして。本題とは全然関係ないことですが、std::stringに入力するほうの非メンバ関数のstd::getlineは使わないんですか?つい、そういう細かいことに気になるたちなので。