プロンプトでユーザーから入力を受け取る必要があるアプリケーションをPostScriptで構築しています(GhostScriptエグゼクティブを使用し、ファイルはプリンターに送信されません)。PostScript言語リファレンスマニュアルには、これが可能であることを示唆するものが何も見当たりません。また、幹部に戻りたくないので、これは可能ですか?
2 に答える
それは絶望的ではありません!しかし、それも簡単ではありません。%stdin以外に、読み取ることができる2つの特別なファイルがあります。(%lineedit)(r)file dup bytesavailable string readstring pop
stdinから文字列に行を読み取ります。(%statementedit)
構文的に有効なpostscriptフラグメント(および改行)が入力されるまで読み取るファイルもあります。これは括弧と中括弧に一致しますが、角括弧には一致しません。読む前に、のようなプロンプトを発行する必要があります(> )print flush
。
もう1つ、コンテキストでこれらすべてをラップすることで^Dをキャッチできstopped
ます。
{ %stopped
(> )print flush
(%lineedit)(r)file
dup bytesavailable string readstring pop
} stopped not {
(successfully read: )print
print
}{
(received EOF indication)print
}ifelse
readstringの後にブール値をポップする代わりに、空の入力行を安価に検出するために使用できます。また、EOFでトリガーされる停止は、のエラーによるものですfile
(ghostscriptはそれを呼び出します/invalidfilename
)がfile
、演算子として定義されており、演算子はエラーを通知するときに引数をスタックにプッシュすることになっていますが、私は気づきましたghostscriptは必ずしもこれを行うわけではありません(私はそれが残すものを忘れますが、あなたが期待するような2つの文字列ではありません)ので、このブロック全体mark
の前後に配置することをお勧めします。cleartomark pop
特別なファイル(%lineedit)
と(%statementedit)
、利用可能な場合は、バックスペースとcontrol-Uおよび場合によっては他のコントロールを正常に処理します。実際のAdobeプリンタは、^Tに何らかのステータスメッセージで応答すると思います。しかし、私はそれを見たことがありません。
PS。:!
ポストスクリプトデバッガーには、インタラクティブなポストスクリプトのより広範な例があります。これはデバッガーのより良いバージョンですが、例としてはおそらく使い勝手が悪いでしょう。
PostScriptはインタラクティブな言語として設計されていないため、ユーザー入力のための優れたプロビジョニングはありません。
stdinから入力を読み取ることができ、stdoutまたはstderrに書き込むことができるため、これらがコンソールに接続されている場合は、理論的にはstdoutに書き込むことでユーザーに入力を求め、stdinから入力を読み取ることができます。
stdinから読み取ると、ユーザーはエラーに対してバックスペースなどを実行できないことに注意してください。少なくとも視覚的には、データはバックスペース文字を処理できるPostScriptプログラムに送信されます。
それが私が考えることができるこれを達成する唯一の方法です。