/*	
 *	clipmatc.h
 *
 *	ユーティリティ：検索
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015 Naoyuki Sawa
 *
 *	* Tue Jan 06 21:26:41 JST 2015 Naoyuki Sawa
 *	- 新規作成。
 *	- 「ユーティリティ：検索」を、clipmisc.*⇒clipmatc.*へ分離しました。
 *	  使用頻度が低いので、無駄にリンクして容量が増加する事を防ぐためです。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_MATC_H__
#define __CLIP_MATC_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/*****************************************************************************
 *	ユーティリティ：検索
 *****************************************************************************/

/* クイックサーチ法を使って、バイナリパターン検索を行います。
 * [in]
 *	mem1		検索されるバイナリデータ
 *	len1		検索されるバイナリデータのバイト数
 *	mem2		検索するバイナリパターン
 *	len2		検索するバイナリパターンのバイト数
 * [out]
 *	戻り値		mem2がmem1内に最初に現れた位置へのポインタを返します。
 *			mem2がmem1内に見つからない場合は、NULLポインタを返します。
 *			len2が0の場合は、mem1を返します。
 * [note]
 * - ★重要!! 本関数は、スタックを1KB消費します。
 *   ★スタックオーバーフローに注意してください。
 * - 戻り値の仕様は、strstr()と互換性があります。
 *   strstr()の代わりに使う場合は、以下のように呼び出してください。
 *      ptr = strstr(str1, str2);
 *   → ptr = quick_search(str1, strlen(str1), str2, strlen(str2));
 * - クイックサーチ法は、Sunday法、BMS法とも呼ばれます。
 *   解説 http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/sundayen.htm
 */
void* quick_search(const void* _mem1/*[len1]*/, int len1, const void* _mem2/*[len2]*/, int len2);

/* O'Reilly Japan「ビューティフルコード」に掲載されている、シンプルな正規表現マッチャです。
 * [in]
 *	regexp		正規表現。
 *	text		テキスト。
 * [out]
 *	戻り値		テキストの中に正規表現が"部分一致"したら1、そうでなければ0を返します。
 *			マッチ条件が、"部分一致"であることに要注意です。
 *			"完全一致"で判断する場合は、'^'と'$'を使います。
 * [note]
 * 	* 僕はこの本を持っていなくて、以下のサイトの記事に引用されていたソースコードを参照しました。
 *
 *	  http://weblogs.asp.net/meligy/archive/2008/04/27/beautiful-code-back-to-basics-please-read-this-c-code-quickly.aspx
 *
 *	  The code is a VERY simple RegEx (Regular Expression) matching.
 *	  Some code that you send a pattern and text to match.
 *	  It returns 1 if the text matches the pattern and 0 otherwise.
 *	  The pattern domain is a very stripped version of RegEx than only includes:
 *
 *	  c => (Any character) matches any literal character c
 *	  . => (Period) matches any single character
 *	  ^ => matches the beginning of the string (meaning there must be beginning, not empty string)
 *	  $ => matches the end of the string (meaning when tested, there should be no more characters in the string)
 *	  * => (appearing after a character) matches zero or more occurrences of the previous character in the string
 */
//int match(const char* regexp, const char* text);
//↓ * Mon Jan 03 22:48:46 JST 2011 Naoyuki Sawa
//↓ - match()→VERY_simple_RegEx_matching()に名前変更しました。
//↓   「match」では単純すぎて、オープンソースソフトのコンパイル時に、名前が衝突することがあるためです。
//↓   具体的には、「Lua 5.1.4」をコンパイルしようとすると、同名のローカル関数があり、名前衝突しました。
//↓ - 本関数は、シンプルな正規表現マッチャの実装方法を覚えておく程度の役割であり、実際に使うことはほとんど無いと思います。
//↓   従って、極端に長い名前で、使いづらくても、さほど問題にはならないと思います。
//↓   上記サイトの説明文から取って、「VERY_simple_RegEx_matching」という極端に長い関数名にすることにしました。
int VERY_simple_RegEx_matching(const char* regexp, const char* text);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif//__CLIP_MATC_H__
