◀ANSI版開発トップへ
  • 3886 キーワードを指定してタグジャンプ
    • 3888 Re: キーワードを指定してタグジャンプ
      • 3890 Re2: キーワードを指定してタグジャンプ
        • 3891 Re3: キーワードを指定してタグジャンプ
          • 3892 Re4: キーワードを指定してタグジャンプ
            • 3894 Re5: キーワードを指定してタグジャンプ
              • 3901 Re6: キーワードを指定してタグジャンプ
                • 3905 Re7: キーワードを指定してタグジャンプ
                • 3906 Re7: キーワードを指定してタグジャンプ
                  • 3907 Re8: キーワードを指定してタグジャンプ
                    • 3909 Re9: キーワードを指定してタグジャンプ
                      • 3917 Re10: キーワードを指定してタグジャンプ
                      • 3918 Re10: キーワードを指定してタグジャンプ
              • 3927 Re6: キーワードを指定してタグジャンプ
      • 3938 Re2: キーワードを指定してタグジャンプ
        • 3973 Re3: キーワードを指定してタグジャンプ
  • [3886] キーワードを指定してタグジャンプ みく 2005年03月31日 18:55


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

    ssrc_2005-02-04に対する差分です。
    eGroups:Source/tagjump_key.lzh
    • [3888] Re: キーワードを指定してタグジャンプ げんた 2005年03月31日 23:35

      きた~~.ということで早速試させて頂きました.

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

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

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

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

      最後に,早速新形式の@paramを使っているところがスバラシイです.
      • [3890] Re2: キーワードを指定してタグジャンプ みく 2005年04月04日 20:53

        >手入力の場合は大文字と小文字の区別無しの方がうれしいかも.

        実装しました。

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

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

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

        コンボにしました。

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

        修正しました。

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

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


        eGroups:Source/tagjump_key0404.lzh
        • [3891] Re3: キーワードを指定してタグジャンプ げんた 2005年04月04日 22:42

          お忙しいところありがとうございます.

          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のサポートから外れたとはいえ結構特殊な環境下で使っている人もいるかもしれないので,他の実現手段があれば回避したいところではあります.
          • [3892] Re4: キーワードを指定してタグジャンプ みく 2005年04月04日 23:04


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

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

            StrStrIはやっぱ自作しないと駄目なようですね。
            my_icmp.cppあたりに追加しましょう。
            • [3894] Re5: キーワードを指定してタグジャンプ みく 2005年04月05日 18:44


              早速バグ修正です。

              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 +="みたいなのがあるので.
              • [3901] Re6: キーワードを指定してタグジャンプ みく 2005年04月07日 20:13


                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;
                }
                • [3905] Re7: キーワードを指定してタグジャンプ げんた 2005年04月10日 21:00

                  Thanks...ですが今回の変更箇所以外でstrstr, strchr使われている部分も置き換えないとまずい??
                • [3906] Re7: キーワードを指定してタグジャンプ げんた 2005年04月10日 21:08

                  ヘッダファイル 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の有無が切り替わるように両方定義しないとまずいような.
                  • [3907] Re8: キーワードを指定してタグジャンプ げんた 2005年04月10日 22:57

                    >とここまで書いて気付いたこと.
                    どころか全然デバッグしてないじゃん...(T_T)

                    const char*と__cdeclを同居させようとしてもコンパイルエラーになるんですが,どう書けばいいんでしょう.
                    そもそも__cdeclって本当に必要なの?
                    • [3909] Re9: キーワードを指定してタグジャンプ みく 2005年04月11日 18:39


                      直接掲示板にコーディングしてたんで、バグだらけでした。すいません。
                      __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;
                      }
                      • [3917] Re10: キーワードを指定してタグジャンプ げんた 2005年04月17日 19:53

                        ポインタ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));
                        }

                        サイズオーバーのため次へ続く
                      • [3918] Re10: キーワードを指定してタグジャンプ げんた 2005年04月17日 19:54

                        >>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]*/
              • [3927] Re6: キーワードを指定してタグジャンプ みく 2005年04月21日 19:12


                バグ修正。
                ダイレクトタグジャンプで選んだ箇所にジャンプしない。
                パッチを当てた後の行番号で、
                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;
      • [3938] Re2: キーワードを指定してタグジャンプ みく 2005年06月01日 21:09


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

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

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

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

        find_key()関数でnMatch++してるので、
        nMatchがMAX値になったら、そのファイルの検索を打ち切るように
        条件を追加すればファイルを最後まで全部なめなくてもすみます。
        • [3973] Re3: キーワードを指定してタグジャンプ げんた 2005年07月09日 22:55

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

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