■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ckw mod -- 俺流改造

※2010.11.11にoption.cppのパッチを修正しました。

ご無沙汰です。
最近なんやかんや忙しくて…
さて、掲題の内容ですが
ckw -cd "C:\"
なんてカレントディレクトリのオプションを渡されると
ケツの"がエスケープされて
内部ではC:"で処理しようとしてしまいます。
それを回避する処理をmain.cppで処理してたんですが、
option.cppのオプションのパース時に処理するようにしました。
この方がスッキリするし…なんですが、もう1コ理由があって
-cdオプションに渡されたパスを
有効なディレクトリになるまで辿ってソコをカレントディレクトリにする
って処理を入れたくて、1箇所にまとめちゃおう!って言うのがそもそもの発端です。
以下のパッチを当てることで
-cd "C:\hoge\huga\foo\bar.txt"
というオプションが渡された時、
ディレクトリとして有効なのは
C:\hoge\huga\foo
の部分なので、カレントディレクトリはC:\hoge\huga\fooになります。
またhugaを間違えてfugaとして
C:\hoge\fuga\foo\bar.txt
とした場合、有効な(存在する)ディレクトリはC:\hogeなので
C:\hogeがカレントディレクトリになります。
まぁ手動で入力する人はいないでしょうがね…

これの何が嬉しいかって
ファイラのショートカットにckw -cd "%1"とか登録してて
ファイルが選択した状態でも
そのディレクトリをカレントとしてckwを起動できることです。
ってことで↓

diff -ru orig/main.cpp nocd5_mod/main.cpp
--- orig/main.cpp   2010-07-18 14:44:25 +0900
+++ nocd5_mod/main.cpp  2010-11-10 16:00:48 +0900
@@ -819,10 +819,6 @@
    si.hStdOutput = gStdOut;
    si.hStdError  = gStdErr;
 
-   if (curdir)
-       if (char *p = strstr((char*)curdir, ":\""))
-           *(p+1) = '\\';
-
    if(! CreateProcessA(NULL, buf, NULL, NULL, TRUE,
                0, NULL, curdir, &si, &pi)) {
        delete [] buf;
diff -ru orig/option.cpp nocd5_mod/option.cpp
--- orig/option.cpp 2010-07-18 14:44:25 +0900
+++ nocd5_mod/option.cpp    2010-11-11 22:21:02 +0900
@@ -997,6 +997,38 @@
        return(1); \
    }
 
+#define IS_NPOS(pos) (std::string::npos == (pos))
+static bool getParentDir(std::string &strDest){
+   int slash = strDest.find_last_of("/", strDest.size()-2);
+   int bslash = strDest.find_last_of("\\", strDest.size()-2);
+
+   int pos;
+        if (!IS_NPOS(slash) &&  IS_NPOS(bslash)) pos = slash;
+   else if ( IS_NPOS(slash) && !IS_NPOS(bslash)) pos = bslash;
+   else                                          pos = max(slash, bslash);
+
+   if (!IS_NPOS(pos)){
+       strDest.erase(pos+1);
+       return true;
+   }
+   else{
+       return false;
+   }
+}
+
+static std::string getValidDir(LPCSTR value){
+   std::string strDir = value;
+
+   // replace double-quotation to backslash
+   if (!strDir.empty() && (strDir.at(strDir.size()-1) == '\"'))
+       strDir.replace(strDir.end()-1, strDir.end(), "\\");
+
+   // trace back to valid directory
+   while (!PathIsDirectoryA(strDir.c_str()) && getParentDir(strDir));
+
+   return strDir;
+}
+
 int    ckOpt::setOption(const char *name, const char *value, bool rsrc)
 {
    bool    flagSW = true;
@@ -1028,7 +1060,7 @@
    CHK_MISC("transp",      "tr",       m_transp = atoi(value));
    CHK_MISC("transpColor",     "trc",      m_isTranspColor = lookupColor(value,m_transpColor));
    CHK_BOOL("topmost",     "top",      m_isTopMost);
-   CHK_MISC("chdir",       "cd",       m_curDir = value);
+   CHK_MISC("chdir",       "cd",       m_curDir = getValidDir(value));
    CHK_MISC("exec",        "x",        m_cmd = value);
    CHK_MISC("title",       "tl",       m_title = value);
    CHK_MISC("config",      "c",        setFile(value);loadXdefaults() );

diff -ru orig/main.cpp nocd5_mod/main.cpp
--- orig/main.cpp   2010-07-18 14:44:25 +0900
+++ nocd5_mod/main.cpp  2010-11-10 16:00:48 +0900
@@ -819,10 +819,6 @@
    si.hStdOutput = gStdOut;
    si.hStdError  = gStdErr;
 
-   if (curdir)
-       if (char *p = strstr((char*)curdir, ":\""))
-           *(p+1) = '\\';
-
    if(! CreateProcessA(NULL, buf, NULL, NULL, TRUE,
                0, NULL, curdir, &si, &pi)) {
        delete [] buf;
diff -ru orig/option.cpp nocd5_mod/option.cpp
--- orig/option.cpp 2010-07-18 14:44:25 +0900
+++ nocd5_mod/option.cpp    2010-11-10 22:48:00 +0900
@@ -997,6 +997,41 @@
        return(1); \
    }
 
+#define IS_NPOS(pos) (std::string::npos == (pos))
+static bool getParentDir(std::string &strDest){
+   int slash = strDest.find_last_of('/');
+   int bslash = strDest.find_last_of('\\');
+
+   int pos;
+        if (!IS_NPOS(slash) &&  IS_NPOS(bslash)) pos = slash;
+   else if ( IS_NPOS(slash) && !IS_NPOS(bslash)) pos = bslash;
+   else                                          pos = max(slash, bslash);
+
+   if (!IS_NPOS(pos)){
+       strDest.erase(pos);
+       return true;
+   }
+   else{
+       return false;
+   }
+}
+
+static std::string getValidDir(LPCSTR value){
+   std::string strDir = value;
+
+   // remove double-quotation
+   int dblquot = strDir.find_last_of('"');
+   if (!IS_NPOS(dblquot)) strDir.erase(dblquot);
+
+   // trace back to valid directory
+   while (!PathIsDirectoryA(strDir.c_str()) && getParentDir(strDir));
+
+   // add backslash at end
+   if (strDir.at(strDir.size()-1) != '\\') strDir += "\\";
+
+   return strDir;
+}
+
 int    ckOpt::setOption(const char *name, const char *value, bool rsrc)
 {
    bool    flagSW = true;
@@ -1028,7 +1063,7 @@
    CHK_MISC("transp",      "tr",       m_transp = atoi(value));
    CHK_MISC("transpColor",     "trc",      m_isTranspColor = lookupColor(value,m_transpColor));
    CHK_BOOL("topmost",     "top",      m_isTopMost);
-   CHK_MISC("chdir",       "cd",       m_curDir = value);
+   CHK_MISC("chdir",       "cd",       m_curDir = getValidDir(value));
    CHK_MISC("exec",        "x",        m_cmd = value);
    CHK_MISC("title",       "tl",       m_title = value);
    CHK_MISC("config",      "c",        setFile(value);loadXdefaults() );

テーマ:フリーソフト - ジャンル:コンピュータ

  1. 2010/11/10(水) 23:16:03|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
<<トリップ | ホーム | COOL WISE MAN with EDDIE”TANTAN”THORNTON>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/447-5be8bee4
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

03 | 2017/03 | 04
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。