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;
うあー、やっぱりスクリプト言語は便利だなー (汗。
2009年 7月 28日 火曜日 16:56:07 JST – 追記
egtra 様、ご指摘感謝です。仰る通り、 string::getline()
を使った方がスマートなので、その通りに修正させて頂きました。