2005/3/31 (木) 18:55:55 みく  
INCM1.23a
[3886] キーワードを指定してタグジャンプ

検索メニューの「キーワードを指定してタグジャンプ」から実行してください。
キーワードのところに文字を入力すると、一致するキーワードが表示されます。

ssrc_2005-02-04に対する差分です。
eGroups:Source/tagjump_key.lzh

2005/3/31 (木) 23:35:45 げんた  
INCM1.23c
[3888] Re: キーワードを指定してタグジャンプ
きた〜〜.ということで早速試させて頂きました.

手入力の場合は大文字と小文字の区別無しの方がうれしいかも.
あと,先頭からの一致じゃなくて途中への一致もあるとキー入力を少なくできてうれしいなぁと.
ただ途中への一致も認めた場合,一文字や二文字で検索すると引っかかりすぎてしまう懸念はありますが,これは最大数を超えたら打ち切られるのでまあ大丈夫か.
いずれも場合によって使い分けたいので,検索オプションがあるとうれしいと思います.

TAGJUMP_EDITBOX_IS_COMBOというが残ってますが,コンボボックスで過去のパターンを残せるようにするつもりだったのでしょうか.検索の履歴が残っていた方が便利ではありますが.

AddParamでは数が多すぎる場合に処理を打ち切っていますが,SetDataで戻り値をチェックしていないのでファイル末尾まで常に読んでしまうのでは?

CDlgTagJumpList::AddParam()のMAXチェックはCSortedTagJumpList()のメソッド(IsOverflowとか)にする方が最大値を利用する側で考慮不要になるので良いと思います.MAX_TAGJUMPLISTはメモリ確保には使っていないので,constメンバ変数としておいてオブジェクト生成時に最大値を決定する方が良いかな?

最後に,早速新形式の@paramを使っているところがスバラシイです.

2005/4/4 (月) 20:53:00 みく  
INCM1.23a
[3890] Re2: キーワードを指定してタグジャンプ
>手入力の場合は大文字と小文字の区別無しの方がうれしいかも.

実装しました。

>あと,先頭からの一致じゃなくて途中への一致もあるとキー入力を少なくできてうれしいなぁと.

実装しました。
(StrStrIがどのOSにもあるかが不明なのが心配)

>TAGJUMP_EDITBOX_IS_COMBOというが残ってますが,コンボボックスで過去のパターンを残せるようにするつもりだったのでしょうか.検索の履歴が残っていた方が便利ではありますが.

コンボにしました。

>CDlgTagJumpList::AddParam()のMAXチェックはCSortedTagJumpList()のメソッド(IsOverflowとか)にする方が最大値を利用する側で考慮不要になるので良いと思います.

修正しました。

#結局tagsのサーチは力技なんですよね

時間がないもので、あんまり動作確認できてません。
みなさん使ってみてくださぃ


eGroups:Source/tagjump_key0404.lzh

2005/4/4 (月) 22:42:06 げんた  
INCM1.23c
[3891] Re3: キーワードを指定してタグジャンプ
お忙しいところありがとうございます.

OverflowチェックでCSortedTagJumpList::m_bOverflowというフラグを使っていますが,これだとMAXを超えて1回溢れたところでフラグがONになりますよね.
フラグを設けなくても
bool IsOverflow( void ){ return m_nCount >= MAX_TAGJUMPLIST; }
とすれば1回の溢れも回避できて問題ないように見えますが,なんか意図があるんでしょうか.

>StrStrIがどのOSにもあるかが不明なのが心配
Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0

IEの入っていないWindows 95で起動できないと困る人はまだいるのかなぁ.(すいさん?)
MSのサポートから外れたとはいえ結構特殊な環境下で使っている人もいるかもしれないので,他の実現手段があれば回避したいところではあります.

2005/4/4 (月) 23:04:26 みく  
INCM1.23a
[3892] Re4: キーワードを指定してタグジャンプ

>OverflowチェックでCSortedTagJumpList::m_bOverflowというフラグを使っていますが,これだとMAXを超えて1回溢れたところでフラグがONになりますよね.
>フラグを設けなくても
>bool IsOverflow( void ){ return m_nCount >= MAX_TAGJUMPLIST; }
>とすれば1回の溢れも回避できて問題ないように見えますが,なんか意図があるんでしょうか.


昇順で並べて最初のn件を保持します。
複数のフォルダにtagsファイルがあるときのための対応です。
(もう少しうまい方法ないかなぁ)

StrStrIはやっぱ自作しないと駄目なようですね。
my_icmp.cppあたりに追加しましょう。

2005/4/5 (火) 18:44:10 みく  
INCM1.23a
[3894] Re5: キーワードを指定してタグジャンプ

早速バグ修正です。

CDlgTagJumpList.h:49行目
#define TAG_FORMAT          "%[^\t\r\n]\t%[^\t\r\n]\t%d;\"\t%s\t%s"

CDlgTagJumpList.cpp:668行目
if( (!m_bTagJumpICase) && (!m_bTagJumpAnyWhere) ) break;


タグジャンプのキーワードに"operator +="みたいなのがあるので.

2005/4/7 (木) 20:13:39 みく  
INCM1.23a
[3901] Re6: キーワードを指定してタグジャンプ

char* my_strstri( const char* s1, const char* s2 )
{
        size_t n = strlen( s2 );
        for( const char* p1 = s1; *p1; p1++ ){
                if( my_strnicmp( p1, s2, n ) == 0 ) return p1;
                if( my_iskanji1( *p1 ) && *(p+1) != 0 ) p1++;
        }
        return NULL;
}

char* my_strstr( const char* s1, const char* s2 )
{
        size_t n = strlen( s2 );
        for( const char* p1 = s1; *p1; p1++ ){
                if( strncmp( p1, s2, n ) == 0 ) return p1;
                if( my_iskanji1( *p1 ) && *(p+1) != 0 ) p1++;
        }
        return NULL;
}

char* my_strchri( const char* s1, char c2 )
{
        char C2 = my_toupper( c2 );
        for( const char* p1 = s1; *p1; p1++ ){
                if( my_toupper( *p1 ) == C2 ) return p1;
                if( my_iskanji1( *p1 ) && *(p+1) != 0 ) p1++;
        }
        return NULL;
}

char* my_strchr( const char* s1, char c2 )
{
        for( const char* p1 = s1; *p1; p1++ ){
                if( *p1 == c2 ) return p1;
                if( my_iskanji1( *p1 ) && *(p+1) != 0 ) p1++;
        }
        return NULL;
}

2005/4/10 (日) 21:00:15 げんた  
INCM1.23c
[3905] Re7: キーワードを指定してタグジャンプ
Thanks...ですが今回の変更箇所以外でstrstr, strchr使われている部分も置き換えないとまずい??

2005/4/10 (日) 21:08:17 げんた  
INCM1.23c
[3906] Re7: キーワードを指定してタグジャンプ
ヘッダファイル my_icmp.h

// 2005.04.07 MIK strstr系関数追加
#ifdef strstr
#  undef strstr
#endif
#define strstr(a,b)        my_strstr((a),(b))
#ifdef strstri
#  undef strstri
#endif
#define strstri(a,b)        my_strstri((a),(b))
#ifdef strchr
#  undef strchr
#endif
#define strchr(a,b)        my_strchr((a),(b))
#ifdef strchri
#  undef strchri
#endif
#define strchri(a,b)        my_strchri((a),(b))

// 2005.04.07 MIK strstr系関数追加
SAKURA_CORE_API int __cdecl char* my_strstri( const char* s1, const char* s2 );
SAKURA_CORE_API int __cdecl char* my_strstr( const char* s1, const char* s2 );
SAKURA_CORE_API int __cdecl char* my_strchri( const char* s1, char c2 );
SAKURA_CORE_API int __cdecl char* my_strchr( const char* s1, char c2 );

とここまで書いて気付いたこと.
1つ目の引数がchar*の場合とconst char*の場合で戻り値のconstの有無が切り替わるように両方定義しないとまずいような.

2005/4/10 (日) 22:57:17 げんた  
INCM1.23c
[3907] Re8: キーワードを指定してタグジャンプ
>とここまで書いて気付いたこと.
どころか全然デバッグしてないじゃん...(T_T)

const char*と__cdeclを同居させようとしてもコンパイルエラーになるんですが,どう書けばいいんでしょう.
そもそも__cdeclって本当に必要なの?

2005/4/11 (月) 18:39:00 みく  
INCM1.23a
[3909] Re9: キーワードを指定してタグジャンプ

直接掲示板にコーディングしてたんで、バグだらけでした。すいません。
__cdeclはstring.h互換にするために付けてるだけなんで、除いちゃってもかまいません。
strstrとstrchrは置き換えたら(¥とかで)効果ありそうなんですが、
サクラの場合、p[i]=='\\'なんてしてるのがほとんどなので、あんまり意味ないです。

SAKURA_CORE_API char* __cdecl my_strstri( const char* s1, const char* s2 );
SAKURA_CORE_API char* __cdecl my_strstr( const char* s1, const char* s2 );
SAKURA_CORE_API char* __cdecl my_strchri( const char* s1, int c2 );
SAKURA_CORE_API char* __cdecl my_strchr( const char* s1, int c2 );

char* my_strstri( const char* s1, const char* s2 ){
        size_t n = strlen( s2 );
        for( const unsigned char* p1 = (const unsigned char*)s1; *p1; p1++ ){
                if( my_strnicmp( (const char*)p1, s2, n ) == 0 ) return (char*)p1;
                if( my_iskanji1( *p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

char* my_strstr( const char* s1, const char* s2 ){
        size_t n = strlen( s2 );
        for( const unsigned char* p1 = (const unsigned char*)s1; *p1; p1++ ){
                if( strncmp( (const char*)p1, s2, n ) == 0 ) return (char*)p1;
                if( my_iskanji1( *p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

char* my_strchri( const char* s1, int c2 ){
        int C2 = my_toupper( c2 );
        for( const unsigned char* p1 = (const unsigned char*)s1; *p1; p1++ ){
                if( my_toupper( *p1 ) == C2 ) return (char*)p1;
                if( my_iskanji1( *p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

char* my_strchr( const char* s1, int c2 ){
        for( const unsigned char* p1 = (const unsigned char*)s1; *p1; p1++ ){
                if( *p1 == c2 ) return (char*)p1;
                if( my_iskanji1( *p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

2005/4/17 (日) 19:53:12 げんた  
INCM1.23c
[3917] Re10: キーワードを指定してタグジャンプ
ポインタp1そのものをunsigned char*とすると,キャストが必要な場所が三カ所出来てしまうので,unsigned char*で無いと符号拡張されて都合の悪いkanji1だけキャストするようにしてみました.

▼my_icmp.h
// 2005.04.07 MIK strstr系関数追加
#ifdef strstri
#  undef strstri
#endif
#define strstri(a,b)        my_strstri((a),(b))
#ifdef strchri
#  undef strchri
#endif
#define strchri(a,b)        my_strchri((a),(b))

(中略)
// 2005.04.07 MIK strstr系関数追加
SAKURA_CORE_API const char* __cdecl my_strstri( const char* s1, const char* s2 );
SAKURA_CORE_API const char* __cdecl my_strstr( const char* s1, const char* s2 );
SAKURA_CORE_API const char* __cdecl my_strchri( const char* s1, int c2 );
SAKURA_CORE_API const char* __cdecl my_strchr( const char* s1, int c2 );

inline SAKURA_CORE_API char* __cdecl my_strstri( char* s1, const char* s2 )
{
        return const_cast<char*>(my_strstri((const char*)s1, s2));
}

inline SAKURA_CORE_API char* __cdecl my_strstr( char* s1, const char* s2 )
{
        return const_cast<char*>(my_strstr((const char*)s1, s2));
}

inline SAKURA_CORE_API char* __cdecl my_strchri( char* s1, int c2 )
{
        return const_cast<char*>(my_strchri((const char*)s1, c2));
}

inline SAKURA_CORE_API char* __cdecl my_strchr( char* s1, int c2 )
{
        return const_cast<char*>(my_strchr((const char*)s1, c2));
}

サイズオーバーのため次へ続く

2005/4/17 (日) 19:54:01 げんた  
INCM1.23c
[3918] Re10: キーワードを指定してタグジャンプ
>>3917 の続きです.

▼my_icmp.c
/*!
        strstr()の大文字小文字同一視版

        @note
        Windows APIにあるStrStrIはIE4が入っていないPCでは使用不可のため
        独自に作成

        @date 2005.04.07 MIK 新規作成
*/
const char* my_strstri( const char* s1, const char* s2 ){
        size_t n = strlen( s2 );
        for( const char* p1 = s1; *p1; p1++ ){
                if( my_strnicmp( p1, s2, n ) == 0 ) return p1;
                if( my_iskanji1( *(const unsigned char*)p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

/*!
        strstr()の2byte code対応版

        @date 2005.04.07 MIK 新規作成
*/
const char* my_strstr( const char* s1, const char* s2 ){
        size_t n = strlen( s2 );
        for( const char* p1 = s1; *p1; p1++ ){
                if( strncmp( p1, s2, n ) == 0 ) return p1;
                if( my_iskanji1( *(const unsigned char*)p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

/*!
        @date 2005.04.07 MIK 新規作成
*/
const char* my_strchri( const char* s1, int c2 ){
        int C2 = my_toupper( c2 );
        for( const char* p1 = s1; *p1; p1++ ){
                if( my_toupper( *p1 ) == C2 ) return p1;
                if( my_iskanji1( *(const unsigned char*)p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}

/*!
        @date 2005.04.07 MIK 新規作成
*/
const char* my_strchr( const char* s1, int c2 ){
        for( const char* p1 = s1; *p1; p1++ ){
                if( *p1 == c2 ) return p1;
                if( my_iskanji1( *(const unsigned char*)p1 ) && *(p1+1) != 0 ) p1++;
        }
        return NULL;
}
/*[EOF]*/

2005/4/21 (木) 19:12:47 みく  
INCM1.23a
[3927] Re6: キーワードを指定してタグジャンプ

バグ修正。
ダイレクトタグジャンプで選んだ箇所にジャンプしない。
パッチを当てた後の行番号で、
CTagJumpList.cpp:GetData()の267-269行目をifの前に移動

+        hwndList = ::GetDlgItem( m_hWnd, IDC_LIST_TAGJUMP );
+        m_nIndex = ListView_GetNextItem( hwndList, -1, LVIS_SELECTED );
+        if( m_nIndex == -1 || m_nIndex >= MAX_TAGJUMPLIST ) return FALSE;

        if( 0 != m_lParam )
        {
                m_pShareData->m_bTagJumpICase = m_bTagJumpICase;
                m_pShareData->m_bTagJumpAnyWhere = m_bTagJumpAnyWhere;

-                hwndList = ::GetDlgItem( m_hWnd, IDC_LIST_TAGJUMP );
-                m_nIndex = ListView_GetNextItem( hwndList, -1, LVIS_SELECTED );
-                if( m_nIndex == -1 || m_nIndex >= MAX_TAGJUMPLIST ) return FALSE;

2005/6/1 (水) 21:09:31 みく  
INCM1.23a
[3938] Re2: キーワードを指定してタグジャンプ

#げんたさんの言ってた意味がわかったような。。。

管理個数が100個
1個目のtagsファイルでヒットするレコードが120件
2個目のtagsファイルでヒットするレコードが130件
あったとして、
tagsファイルはソートされてるので

1個目で100個登録した時点でそのtagsファイルの検索を打ち切る。
2個目で100個登録した時点でそのtagsファイルの検索を打ち切る。

という動作でよいような気がします。

find_key()関数でnMatch++してるので、
nMatchがMAX値になったら、そのファイルの検索を打ち切るように
条件を追加すればファイルを最後まで全部なめなくてもすみます。

2005/7/9 (土) 22:55:24 げんた  
INCM1.23c
[3973] Re3: キーワードを指定してタグジャンプ
>1個目のtags
>2個目のtags

そうか,tagsファイルが複数あったら全部見てくれるんですね.
tagsファイルが一つだけなら溢れ処理は不要かと思ってしまいました.

どうも最近同じものがちょっと違ったパスでヒットするなあと思っていてこの仕様に気付きました.

INCM/CMT
Cyclamen v3.81
[ut:0.020][st:0.010]