あらいぐまパスカル、角砂糖を洗う(←さらに適当)

そういえばクリスマスなのだった。じゃあなんかいつもと違うことやるかーてな気分がなくもなかったので、OS/2WDSibylインスコしてみることにした。念のため説明しますと、これは OS/2 と Win32 上で動作する (Object) Pascal統合開発環境要するに Delphi 的なアレらしいです。

しかしインスコするだけで面倒なのでした。ぶっちゃけウチの環境ではインストーラがまともに動かなかったので若干の手作業が必要でした。念のため要点を書いておく。

  • EMX ランタイムが必要。EMXWRAP をインポートしている実行ファイルがある。
  • 日本語コードページからのインスコはもれなく失敗する。CHCP 437 したコンソールからインストーラを実行する。
  • サブプログラムとの連動が甘いようで、環境によってはインストーラが途中でだんまり(子プロセスのイベント待ちで止まる)。
    必要なプログラムを手動で起動してやれば処理は続行できる(英語コンソールで実行する必要がある)。

うちの環境だと "Compile RC-Files" とインストールステップ表示されたところで処理が止まってしまうのでした(中止ボタンを押してインストーラを中断することはできる)。しかたないので、インストーラは起動したままにして、OS/2 コマンドプロンプトを開いて CHCP 437 し、以下のコマンドを実行する。

D:\WDSibyl\Tools\Output\OS2\CompileAllRC D:\WDSibyl\Bin\OS2\ D:\WDSibyl\Library\Source\RC\ D:\WDSibyl\OS\OS2\Lib -OS2 -INSTALL

日本語コンソール上で実行するとなぜか失敗する。英語モードにするとうまくいくのになあ。

ちなみに似たような作業があと3回必要なので、インストーラの進捗状況を確認しつつ、そのつど実行する。

D:\WDSibyl\Tools\Output\OS2\CompileAllPas D:\WDSibyl\Bin\OS2\ D:\WDSibyl\Library\Source D:\WDSibyl\OS\OS2\Lib -OS2 -INSTALL
D:\WDSibyl\Tools\Output\OS2\CompileAllRC D:\WDSibyl\Bin\OS2\ D:\WDSibyl\Library\Source\RC\ D:\WDSibyl\OS\Win32\Lib -W32 -INSTALL
D:\WDSibyl\Tools\Output\OS2\CompileAllPas D:\WDSibyl\Bin\OS2\ D:\WDSibyl\Library\Source D:\WDSibyl\OS\Win32\Lib -W32 -INSTALL

いったんインスコに成功すれば、chcp 437 しなくても統合環境は起動できる。

はっきりいって IDE そのもののレベルでもコンパイラのランタイムライブラリのレベルでも、DBCS に関してはほとんどまともに考慮されていないと思われまする。だってさあ、ランタイムのソースの中にこんなのがあるんですよ(uString.pas)。

Function UniChar2UniChar(ch : Char) : tUniChar;

Begin
  Result.chW:=ord(ch);
End;

Function UniUniChar2Char(ch : tUniChar) : Char;

Begin
  if ch.chW > 128 then
    case ch.chW of
      214 : Result:='・;
      223 : Result:='・;
      228 : Result:='・;
      246 : Result:='1';
      252 : Result:='・;
      else Writeln('UniUniChar2Char: ',ch.chW);
    end
  else Result:=ch.ch[0];
End;

(中略)

Procedure UniStrPCopy(Dest :pUniChar; const Source: String);

var cou,Cou1 : LongWord;
    d        : pUniCodeString absolute Dest;

Begin
  Cou1:=0;
  for Cou:=1 to length(Source) do
    Begin
      d^[Cou1]:=UniChar2UniChar(Source[cou]);
      inc(Cou1);
    end;
  d^[Cou1].chW:=0;
End;

いくらおいらがもう Pascal ほとんど忘れちゃってるつーても、DBCS 方面とか Unicode 方面とかのまともなハンドリングがほとんど期待できないコードだというのはうすうす察せられますですヨ…。

(追記) もうすこし調べた(といってもソースを "DBCS" とかで grep したとかそんな程度ですが)のですが少なくとも GUI レベルでは DBCS を考慮したコードがそこそこあったりするのですよね。それなのにコマンドラインツールが日本語コンソールだと落ちるという。ちなみにコマンドライン版のコンパイラ(WDSPC10)も日本語モードだと落ちた。chcp 437 すれば動くという。しかも自前の簡単なプログラムをコンパイルして日本語モードで実行しても動くし。いったい何がいけないのやら。よくわかりません。