hmjre169.lzh 付属のCソースの使い方教えNo.24816
makotosh さん 08/04/22 09:56
 
hmjreを使って、あいまい検索するCプログラムを作成したいと思います。hmjre169.
lzhには、以下のようなファイルがあります。

HmJre.dll
HMJRE.HLP
HelpId.h
config.h
resource.h
JreFuzzy.h
HmJre.def
global.h
HmJre.rc

これらのファイルを使った簡単なCのサンプルプログラムがあれば教えてください。

どうやって、hmjre.dll のあいまい検索機能をCソースで呼び出すように記述するの
かがわかればよいです。

よろしくお願いします。

追伸:
上記.hファイルの冒頭に記述されている 参考URL  http://www.labyrinth.net.au/~dbareis/3rdpsrc.htm#HENRY_SPENCER_REGEXP_SOURCE
 にアクセスすると、なぜか http://w3.eftel.com/home.cms に飛ばされてしまい、
内容を確認できない状況です。

[ ]
RE:24816 hmjre169.lzh 付属のCソースの使No.24817
秀まるお2 さん 08/04/22 11:10
 
 あいまい検索を使う呼び出しインタフェースは、元々の正規表現DLLである
「JRE32.DLL」用のヘッダファイルである「JREUSR.H」というファイルが必要で
す。それは山田和夫さんの著作物なので、HmJre.dllのlzhファイルの中には入っ
てないです。

 以下の所からダウンロードできると思います。

    http://www.yamada-labs.com/software/spec/jre/

> これらのファイルを使った簡単なCのサンプルプログラムがあれば教えてください。

 サンプルプログラムは無いです。すみせん。

> 上記.hファイルの冒頭に記述されている 参考URL  http://www.labyrinth.net.au/~
> dbareis/3rdpsrc.htm#HENRY_SPENCER_REGEXP_SOURCE
>  にアクセスすると、なぜか http://w3.eftel.com/home.cms に飛ばされてしま
>い、
> 内容を確認できない状況です。

 それは知りませんでした。

 正規表現を処理するプログラムのソースコードの例は、他にも探せば出てくる
のではないかと思います。たとえばgoogleで「regular expression source」と
かで検索するといろいろヒットするようです。

[ ]
RE:24817 hmjre169.lzh 付属のCソースの使No.24818
Iranoan さん 08/04/22 12:49
 
 makotosh さん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
> これらのファイルを使った簡単なCのサンプルプログラムがあれば教えてください。
>
> どうやって、hmjre.dll のあいまい検索機能をCソースで呼び出すように記述するの
> かがわかればよいです。
 HMJRE.HLP は御覧になりましたか? こちらに API が載っています。

[ ]
RE:24818 hmjre169.lzh 付属のCソースの使No.24819
makotosh さん 08/04/22 14:10
 
秀まるお2 さん、Iranoan さん

回答ありがとうございます。

ヘルプ記述されているAPIについて教えてください。

int WINAPI Fuzzy_FindPos2RealPos( JREFUZZYDATA* pData, int x );

Q1.この関数の第2引数 int x の意味を教えてください。
Q2.ヒットした場合、戻り値のintは変換前の文字列でのヒットした文字位置とい
う解釈であっていますか?
Q3.ヒットしなかった場合、戻り値のintにはどういう値がセットされるのでしょ
うか?

[ ]
RE:24819 hmjre169.lzh 付属のCソースの使No.24820
秀まるお2 さん 08/04/22 15:46
 
 これは、Fuzzy_ConvertTargetする前の位置を計算する用の関数です。

 たとえばFuzzy_ConvertTargetを呼び出して、「abc xyz」という文字列が
「abcxyz」に変換されてしまったとします。それで"xyz"にヒットしたとすると、
JreGetMatchInfoの返す座標は3になってしまいます。

 その「3」という数値をFuzzy_FindPos2RealPosに渡すと、4が返ることになる
はずだと思います。

 詳しくは、実際に関数呼び出してしてどういう値が返るのかテストするなどし
て確認してほしいです。

[ ]
RE:24820 hmjre169.lzh 付属のCソースの使No.24822
makotosh さん 08/04/22 17:01
 
秀まるお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 );
}

[ ]