|
秀まるお2さん、回答ありがとうございます。
なんとなく雰囲気がわかりました。オリジナルの検索対象文字列のバイト位置を返す
こともわかりました。
以下は実験用に自作したサンプルです。実行すると“検索文字列を位置54に発見した。
”となります。
----------------------------------------------------------------
// コンパイラ VC++ 6.0
#include <afx.h>
#include <stdio.h>
#include "Jreusr.h"
#include "JreFuzzy.h"
BOOL GetHmJreModule( void );
BOOL FuzzyFind( char* FindString, char* TargetString, int *FindPos );
int main( void );
// JRE2関数ポインタ
typedef BOOL (EXTAPI * FPJ2_OPEN)( LPJRE2 );
typedef BOOL (EXTAPI * FPJ2_COMPILE)( LPJRE2, LPSTR );
typedef BOOL (EXTAPI * FPJ2_GETMATCHINFO)( LPJRE2, LPSTR );
typedef BOOL (EXTAPI * FPJ2_CLOSE)( LPJRE2 );
FPJ2_OPEN J2Open;
FPJ2_COMPILE J2Compile;
FPJ2_GETMATCHINFO J2GetMatchInfo;
FPJ2_CLOSE J2Close;
//あいまい検索関数ポインタ宣言
typedef BOOL (WINAPI * FPFZ_OPEN)( JREFUZZYDATA*, BOOL );
typedef BOOL (WINAPI * FPFZ_CONVERTFINDSTRING)( JREFUZZYDATA*, const char*,
BOOL );
typedef BOOL (WINAPI * FPFZ_CONVERTTARGET)( JREFUZZYDATA*, const char* );
typedef BOOL (WINAPI * FPFZ_FINDPOS2REALPOS)( JREFUZZYDATA*, int );
typedef BOOL (WINAPI * FPFZ_CLOSE)( JREFUZZYDATA* );
FPFZ_OPEN FuzzyOpen;
FPFZ_CLOSE FuzzyClose;
FPFZ_CONVERTFINDSTRING FuzzyConvertFindString;
FPFZ_CONVERTTARGET FuzzyConvertTarget;
FPFZ_FINDPOS2REALPOS FuzzyFindPos2RealPos;
HINSTANCE HmJreHandle; // HmJreモジュールへのハンドル
JREFUZZYDATA FuzzyData; // JREFUZZYDATA構造体のインスタンス宣言
JRE2 Jre2Data; // JRE構造体のインスタンス宣言
BOOL GetHmJreModule(void)
{
// HmJre.dllをロードする
HmJreHandle = LoadLibrary( "HmJre.dll" );
if( HmJreHandle == NULL )
{
fprintf( stderr, "“HmJre.dll”のロードに失敗しました。\n" );
return( FALSE );
}
//BOOL WINAPI FuzzyOpen( JREFUZZYDATA* pData, BOOL fDummy = FALSE ) への
関数ポインタを取得する
FuzzyOpen = (FPFZ_OPEN)GetProcAddress( HmJreHandle, "Fuzzy_Open" );
if( NULL == FuzzyOpen )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
//BOOL WINAPI FuzzyClose( JREFUZZYDATA* pData ) への関数ポインタを取得す
る。
FuzzyClose = (FPFZ_CLOSE)GetProcAddress( HmJreHandle, "Fuzzy_Close" );
if( NULL == FuzzyClose )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
//BOOL WINAPI FuzzyConvertFindString( JREFUZZYDATA* pData, const char* p
szSrc, BOOL fRegular ) への関数ポインタを取得する。
FuzzyConvertFindString = (FPFZ_CONVERTFINDSTRING)GetProcAddress( HmJreHa
ndle, "Fuzzy_ConvertFindString" );
if( NULL == FuzzyConvertFindString )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
//BOOL WINAPI FuzzyConvertTarget( JREFUZZYDATA* pData, const char* pszSr
c ) への関数ポインタを取得する。
FuzzyConvertTarget = (FPFZ_CONVERTTARGET)GetProcAddress( HmJreHandle, "F
uzzy_ConvertTarget" );
if( NULL == FuzzyConvertTarget)
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
//int WINAPI FuzzyFindPos2RealPos( JREFUZZYDATA* pData, int x ) への関数
ポインタを取得する。
FuzzyFindPos2RealPos = (FPFZ_FINDPOS2REALPOS)GetProcAddress( HmJreHandle,
"Fuzzy_FindPos2RealPos" );
if( NULL == FuzzyFindPos2RealPos )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
// BOOL EXTAPI J2Open(LPJRE2 lpjreJre);
J2Open = (FPJ2_OPEN)GetProcAddress( HmJreHandle, "Jre2Open" );
if( NULL == J2Open )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
// BOOL EXTAPI J2GetMatchInfo( LPJRE lpjreJre, LPSTR lpszStr ) への関数
ポインタを取得する。
J2GetMatchInfo = (FPJ2_GETMATCHINFO)GetProcAddress( HmJreHandle, "Jre2Ge
tMatchInfo" );
if( NULL == J2GetMatchInfo )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
// BOOL EXTAPI J2Compile(LPJRE2 lpjreJre, LPSTR lpszRe) への関数ポインタ
を取得する。
J2Compile = (FPJ2_COMPILE)GetProcAddress( HmJreHandle, "Jre2Compile" );
if( NULL == J2Compile )
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
// BOOL EXTAPI J2Close(LPJRE2 lpjreJre) への関数ポインタを取得する。
J2Close = (FPJ2_CLOSE)GetProcAddress( HmJreHandle, "Jre2Close" );
if ( NULL == J2Close)
{
FreeLibrary( HmJreHandle );
return( FALSE );
}
return( TRUE );
}
BOOL FuzzyFind( char* FindString, char* TargetString, int *FindPos )
{
BOOL FlagOk;
FuzzyData.dwSize = sizeof( JREFUZZYDATA );
Jre2Data.dwSize = sizeof( JRE2 );
// FuzzyData領域を初期化
FlagOk = FuzzyOpen( (JREFUZZYDATA*)&FuzzyData, FALSE );
if( FALSE == FlagOk )
{ // エラー
fprintf( stderr, "Fuzzy_Open関数がエラーを返しました。\n" );
return( FlagOk );
}
// Jre2Data領域を初期化
FlagOk = J2Open( (LPJRE2)&Jre2Data );
if( FALSE == FlagOk )
{ // エラー
fprintf( stderr, "J2Open関数がエラーを返しました。\n" );
return( FlagOk );
}
FlagOk = FuzzyConvertFindString( (JREFUZZYDATA*)&FuzzyData, (const char
*)FindString, 2 );
if( FALSE == FlagOk )
{ // エラー
fprintf( stderr, "Fuzzy_ConvertFindString関数がエラーを返しました。\
n" );
FuzzyClose( (JREFUZZYDATA*)&FuzzyData );
return( FlagOk );
}
FlagOk = FuzzyConvertTarget( (JREFUZZYDATA*)&FuzzyData, (const char *)Ta
rgetString );
if( FALSE == FlagOk )
{
fprintf( stderr, "Fuzzy_ConvertTarget関数がエラーを返しました。\n"
);
FuzzyClose( (JREFUZZYDATA*)&FuzzyData );
return( FALSE );
}
// 検索パターンのコンパイル
FlagOk = J2Compile( (LPJRE2)&Jre2Data, (LPSTR)FuzzyData.pszFindConved );
if ( FALSE == FlagOk){
fprintf( stderr, "J2Compile関数がエラーを返しました。\n" );
J2Close( (LPJRE2)&Jre2Data );
return( FALSE );
}
// 検索実行
FlagOk = J2GetMatchInfo( (LPJRE2)&Jre2Data, (LPSTR)FuzzyData.pszTargetCo
nved );
// あいまい検索実行
*FindPos = FuzzyFindPos2RealPos( (JREFUZZYDATA*)&FuzzyData, Jre2Data.nPo
sition );
// FuzzyData領域を開放
FuzzyClose( (JREFUZZYDATA*)&FuzzyData );
// Jre2Data領域を開放
J2Close( (LPJRE2)&Jre2Data );
// HmJre.dllを開放
FreeLibrary( HmJreHandle );
return( FlagOk );
}
// テスト用の検索文字列
char *TestFindString = "makoto";
// テスト用の検索対象の文字列
char *TestTargetString = "Hello! My name is Shishi
do Makoto. 4649ne.";
// 0123456789012345678901234567890123456789012345678
90123456789012345678901234567890123456789
// 1 2 3 4 5
int main( void )
{
BOOL FlagOk;
int Pos;
FlagOk = GetHmJreModule();
if( FlagOk == FALSE ) return( -1 ); // 失敗?
FlagOk = FuzzyFind( TestFindString, TestTargetString, &Pos );
if( TRUE == FlagOk ) fprintf( stderr, "検索文字列を位置%dに発見した。
\n", Pos ); // ヒット
else fprintf( stderr, "検索文字列は見当たらない。\n"
); // ミス
return( 0 );
}
|
|