(2008/08/18 追記)
最近になってWindowsのコマンドプロンプトでキーボードからEOFが入力できることを知りました(Ctrl+Z(→Enter))。今まではキーボードからは行単位でしかテキストデータを入力できないと思い込んでいました。このページで公開しているモジュールのis_stdin_redirected関数は、キーボードからはEOFが入力できないと決めつけて、あったほうが便利なのではないかと思い作ったので、今となっては少し恥ずかしいところがあります。
最初にこのモジュールを作っている頃に、コンソールアプリケーションの作り方をネットで調べたりしていて、標準入力がリダイレクトされているかを調べることにこだわっている人って案外いないなあ、などと考えていたのですが、キーボードからEOFが入力できるのであればこだわる必要はあまりありませんね。
このモジュールは、コンソール・プログラムでは必須の機能であるがHSP3CLの標準機能ではカバーできない作業を引き受けます。
is_stdin_redirected 関数
コンソール・アプリは起動して最初に、標準入力から処理対象のデータを受け取りますが、HSP3CLでは標準入力がキーボードであるか、もしくはパイプかファイルであるかによってinput命令の第3引数を変える必要があります。キーボードであればp3に1を指定し、Enterキーの押し下げ(改行コードの入力)によってデータの受け取りを終了しなければなりませんし、パイプかファイルであればp3に0を指定し、EOFが来るまでデータの受け取りを続けなければなりません。
この時、このモジュールのis_stdin_redirected関数を実行することで、標準入力がキーボード以外にリダイレクトされているかをチェックできます。戻り値が1であればリダイレクトされていますので、input命令を実行するときp3に0を指定すればよいと分かりますし、戻り値が0であればp3は1でよいと分かります。
input2 命令
私の環境ではHSP3CLでinput命令を実行した時に受け取るデータのサイズが大きいとシステムエラーが発生してスクリプトが強制終了してしまうことがあります。input ?,?,0 の代わりにinput2命令を使うことでデータのサイズを気にせずにすみます。
mes2 命令
HSP3CLでは標準出力へのデータ出力はmes命令で行うことができますが、mes命令は引数に指定したデータを出力するときに必ず末尾に改行コードを追加してしまいます(ver3.0a時点での仕様)。これはHSP3CLで作ったアプリを単独で実行する場合には大した問題にはなりませんが、HSP3CLで作ったアプリをいくつもパイプでつなぎながら連続で実行する場合、一つのアプリの処理が終了する度にデータの末尾に改行コードが一つずつ増えていってしまうことになり不便です。
そこでこのモジュールではmes2という命令を用意しています。mes命令の代わりにこのmes2命令を使うことで、その時点で保持しているそのままのデータを出力することができます。p1に指定する変数の中身は複数行文字列でもかまいません。
>> スクリプトを見る
>> ダウンロード