OnigPP
提供:やる気向上作戦
※ここは、Windows用のpthreadについて解説したページではありません。Windows用のpthreadをお求めの方は、POSIX Threads for Win32へどうぞ。
目次 |
概要
Kosako様作マルチバイトエンコーディング対応正規表現ライブラリ「Oniguruma」のC++ラッパー
特長?
java.util.regex.Pattern java.util.regex.Matcher のぱくり。
使い方
#include <onigpp/onigpp.h>
#include <string>
#include <iostream>
using namespace onigpp;
int main(int argc, char** argv)
{
OnigInitializer onit; // ライブラリ初期化
{
std::string pattern = "foo"; // パターン
std::string target = "foobarbaz foolish junkfood"; // 対象文字列
// パターンオブジェクトを構築
OnigPattern pat(pattern.c_str(), pattern.c_str()+pattern.length());
// マッチャーオブジェクトを構築
OnigMatcher* m = pat.matcher(target.c_str(), target.c_str()+target.length());
// マッチする部位を検索し、表示する。
while (m->find()) {
std::cout << m->group() << std::endl;
}
// マッチャーを削除
delete m;
}
return 0;
}
ダウンロード
おまけ
同梱のonig.dllは、OnigurumaのFAQに従い、スレッドセーフになるようコンパイルしたDLL。
変更点は以下のとおり。
regint.h
#include <windows.h>
#define USE_MULTI_THREAD_SYSTEM
extern CRITICAL_SECTION gOnigMutex;
#define THREAD_SYSTEM_INIT InitializeCriticalSection(&gOnigMutex)
#define THREAD_SYSTEM_END DeleteCriticalSection(&gOnigMutex)
#define THREAD_ATOMIC_START EnterCriticalSection(&gOnigMutex)
#define THREAD_ATOMIC_END LeaveCriticalSection(&gOnigMutex)
#define THREAD_PASS Sleep(0)
regcomp.c
CRITICAL_SECTION gOnigMutex; //これ追加
おまけ2
前項はWindowsにおける実装だが、Posix準拠のプラットフォームでは以下のようにすればスレッドセーフになると思われる(未確認)。
regint.h
#include <pthread.h>
#include <sched.h>
#define USE_MULTI_THREAD_SYSTEM
extern pthread_mutex_t gOnigMutex;
#define THREAD_SYSTEM_INIT pthread_mutex_init(&gOnigMutex, NULL)
#define THREAD_SYSTEM_END pthread_mutex_destroy(&gOnigMutex)
#define THREAD_ATOMIC_START pthread_mutex_lock(&gOnigMutex)
#define THREAD_ATOMIC_END pthread_mutex_unlock(&gOnigMutex)
#define THREAD_PASS sched_yield()
regcomp.c
pthread_mutex_t gOnigMutex;