!!最初に 考えるべきは、どうやって入力が足りないことを呼び出し元に伝えるか。BREGEXPのインターフェイスや構造体にはもちろんそんな場所はない。bregonigの(BREGEXPを拡張した)内部構造体に場所を用意して、追加 API経由で伝えるのが良さそう。(マッチしなかったときにその情報が欲しいのに、マッチしなかったときはメモリが確保されない気がしてそうはしなかったんだけど、そのときでもパターン用の領域が存在してるんだった。勘違い) !!bregonig 既存アプリに影響があるので良くないけど、bregonigへの暫定的な変更はこう。 !!!regexec_onig(bregonig.cpp) <<>> 入力が足りなくてマッチしなかったときは、エラーメッセージをセットするけど戻り値は負数(エラー)ではなく 0(マッチなし)。 !!鬼車 鬼車(5.9.2)に「[[K.Takata's software : bregonig.dll|http://homepage3.nifty.com/k-takata/mysoft/bregonig.html]]」で手に入る onig-5.9.2-mod.diffを適用したものに対する差分がこれ。{{file 'onig-5.9.2-mod-hitend.diff'}}(3.7KiB, 2010-07-09) ちゃんと動くのか非常にあやしい代物。修正箇所を減らすために onig_searchの最適化も無効にしてるし、backward searchも無視してる。 !!サクラエディタ なんのことはない、影響を受ける既存アプリにはサクラエディタが含まれている。正規表現パターンのコンパイルエラーと入力不足によるマッチなしを区別するためにちょっと変更した。 <<MakePatternAlternate( szSearch, szReplace, option ); const wchar_t szDummyTarget[] = L""; this->szErrMsg[0] = L'\0'; - if( ! szReplace ) { - this->BMatch( szPattern, szDummyTarget, szDummyTarget + 1, &(this->pCompileBlock), this->szErrMsg ); - } else { + const int retval = (! szReplace) ? + this->BMatch( szPattern, szDummyTarget, szDummyTarget + 1, &(this->pCompileBlock), this->szErrMsg ): this->BSubst( szPattern, szDummyTarget, szDummyTarget + 1, &(this->pCompileBlock), this->szErrMsg ); - } delete [] szPattern; - // メッセージが空文字列でなければ何らかのエラー発生。 - // サンプルソース参照 - if( this->szErrMsg[0] ){ + if( retval < 0 ){ this->ReleaseCompileBuffer(); return false; } >>> それと、下検索で入力不足によりマッチが見つからなかったことをステータスバーに表示する変更。 <<SendStatusMessage(_T("▽見つかりませんでした")); + m_pCommanderView->SendStatusMessage( + this->m_pCommanderView->m_sCurSearchOption.bRegularExp && this->m_pCommanderView->m_CurRegexp.GetLastMessage()[0] + ? this->m_pCommanderView->m_CurRegexp.GetLastMessage() + : _T("▽見つかりませんでした") + ); ErrorBeep(); if( bRedraw && GetDllShareData().m_Common.m_sSearch.m_bNOTIFYNOTFOUND ) { InfoMessage( >>> !!あとは、 こんなふうにステータスバーに「mismatch because of input shortage」表示するかわりに複数行検索モードに移行すればいい。/.*/s みたいな簡単なパターンでファイル全体にマッチしてしまうから「複数行検索モード」をどうすればいいのかはよくわかりませんが……。ちょっとずつ行文字列連結バッファをのばしていって最悪の場合はファイル全体が一つのバッファにおさまります、なんていうのであれば最初の一回でファイル全体をメモリにのっけた方がマシだろうし、最大長を 10MiBくらいに固定したバッファで不完全複数行検索というのが現実的? でもま、内部実装からくる「現実的な」折り返しなし=10240桁で折り返し、はずいぶん嫌がられていて自分もそのクチだったので妥協案には懐疑的。制限を明示せずにおいて、超えたときに「検索結果が長すぎたので途中で切り上げました。」と表示するようにしておくと、実際に不自由した人からしか不満が出なくて(一部を除いて)みんなハッピー(知らぬが仏)。