bcc32 putty.c

patch -Np1 < puttykj.patch
patch -Np1 < puttyjp.patch
patch -Np1 < putty-imefix.patch # 行番号が変わってたので手動で。

make -f makefile.bor
# iso2022.c でなんだかエラー。不正な初期化とかなんとか。
<調査中>
「WCHAR a = { buf2, 0 };」が悪さをしていました。こんな初期化を認めていないのがBorlandだそうな。仕方が無いので、「WCHAR a = { 0, 0 }; a[0] = buf2;」とワンクッション入れます*1。これを3箇所(マクロ内とその後のCASE文に2箇所)訂正してもう一度困憊る。

わーにんぐが大量に出るが、使われないコード!って怒られるくらい。気になるならコメントアウトしてやんなー。と、追っていくと、「strncasecmp」って関数が見つからないそうな。なにそれ?…いや、無いって言われても。さてどうしましょうかね。strcmp改造して作るかな?

結局作ってしまった。まいっか。
その後、l10n.cでも似たコトが。今度はn無しの「strcasecmp」が無いって。えー。// こぴぺー
でもそれはエラーじゃなくて、鰐さんだった。エラーの原因は同一変数名の多重定義。C++じゃないんだから〜と思いつつ変数名をぺちぺち変えてあげる。けど、ダメダメちゃん。何も良い方法が思いつかなかったので「q = p_v->DUMMYUNIONNAME.item.pszText;」とかに変えてみる。unionを使ってたらしいので、仕方なし。しかし、何故?

やっとコンパイルは出来た、けど動作確認なんてしてもない。とりあえず改変記録をメモめもめも。

#ifdef __BORLANDC__
int strncasecmp(const char *s1, const char *s2, size_t n)
{
register size_t i;
register int a=0,b=0;
for(i=0;i b ) return +1;
else if( a < b ) return -1;
else return 0;
}
#endif

#ifdef __BORLANDC__
int strcasecmp(const char *s1, const char *s2)
{
register int a=0,b=0;
register int i=0;

while(1) {
a = s1[i];
b = s2[i];
if( a == 0 || b == 0 ) break;
if( 'a' <= a && a <= 'z' ) a = a + 'A' - 'a';
if( 'a' <= b && b <= 'z' ) b = b + 'A' - 'a';
if( a != b ) break;
i++;
}
if( a > b ) return +1;
else if( a < b ) return -1;
else return 0;
}
#endif

と、static LRESULT CALLBACK wndproc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 関数にて、

q = p->item.pszText;
if (getl10nstr (q, "", a, 256))
p->item.pszText = a;
r = CallWindowProc (proc, hwnd, msg, wparam, lparam);
p->item.pszText = q;

を次に変更

#if (_WIN32_IE >= 0x0400) && (defined __BORLANDC__)
q = p_v->DUMMYUNIONNAME.item.pszText;
if (getl10nstr (q, "", a, 256))
p_v->DUMMYUNIONNAME.item.pszText = a;
r = CallWindowProc (proc, hwnd, msg, wparam, lparam);
p_v->DUMMYUNIONNAME.item.pszText = q;
#else
q = p_v->item.pszText;
if (getl10nstr (q, "", a, 256))
p_v->item.pszText = a;
r = CallWindowProc (proc, hwnd, msg, wparam, lparam);
p_v->item.pszText = q;
#endif

以上。

見事に動作しました、拍手。 // そんな簡単なコトに拍手しなくても、ねぇ。

  • 折角だから*2CYGWIN版でも作ってみる

「MonitorFromWindow」って関数のリンカエラーが発生していたのが気になってたのでめも。
スマートじゃないけど、「MONITOR_DEFAULTTONEAREST」を#undefした方が早いと思うし、影響がどう出るかは知らない。

*1:実はもーちょっと違うけど

*2:赤い扉は選びません