Clinkの日本語パス問題を修正(3)

意外に知られていませんが、Explorerでファイルやフォルダを選択した状態でのコンテキストメニューはShiftキーを押しながら右クリックするとメニューが一部変わります。
たとえばWindows7Excelファイルを選択してShift+右クリックすると「読み取り専用で開く」というメニューが増えます。ファイルサーバに置いてある共有ファイルを参照したいときはこの方法で開くと排他ロックがかかりません。
同様にフォルダを選択してShift+右クリックすると「コマンドウィンドウをここで開く」というメニューが増えます。これを使うと直接当該フォルダがカレントディレクトリになった状態でコマンドプロンプトが開くので非常に便利です。

これは何もWindows7の専売特許ではなく、Windows XPでも例えば

に紹介されているように、レジストリにエントリを追加することで(通常の)コンテキストメニューの選択肢として機能を追加することが可能です。

で、前回の修正しかしていないClinkだと、このパターンでの起動=cmd.exe起動時点でのカレントディレクトリパスに日本語が含まれていた場合に、やはり改行位置が正しくないという問題が残っていました。
これの原因追究には結構手間取ったのですが、最終的にこのパッチに落ち着きました。

--- Temp/uYy6wd_prompt.c	Tue Aug 06 22:37:28 2013
+++ clink/clink/dll/prompt.c	Tue Aug 06 22:35:23 2013
@@ -173,6 +173,7 @@
     // Get the prompt from the terminal.
     buffer = (wchar_t*)prompt + length + 1;
     ReadConsoleOutputCharacterW(handle, buffer, length, cur, &chars_read);
+    buffer[chars_read] = L'\0';
 
     // Convert to Utf8 and return.
     length = WideCharToMultiByte(

cmd.exe起動直後に画面に表示されている内容からプロンプト文字列を読み取るのですが、その際にNUL文字をセットしないまま次のUTF-8変換処理を実行してしまっているために本来より長い(=ゴミが付加された)文字列となっていました。
ReadConsoleOutputCharacter Win32 APIは読み取った文字列についてNUL終端を保障するとは書いてないので、これはどんなOS・言語でも起こりうる潜在バグということになります。

このパッチを追加適応することによって日本語XPでも問題が解決しました。前回分を含む完全なパッチをここに置いておきます。