Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

ターミナル入出力

この章は、Caché のターミナル入出力について説明します。

ターミナル入出力機能の概要

ObjectScript は、直列の非同期 ASCII ターミナルをサポートするコマンドを提供します。また、これらのコマンドをコンソール入出力で使用できます。

ターミナル入出力を使用すると、ルーチンで以下を実行できます。

  • 入力文字のエコーを有効、あるいは無効にできます。

  • ANSI 標準のエスケープ・シーケンスを送受信できます。

  • キーボード割り込みを制御し、特有のユーザ対話用プログラムを生成できます。これには、フォーマット画面、反転映像、フィールドをスキップする特殊キーなどがあります。

  • Ctrl-C 割り込みを有効、あるいは無効にできます。

  • XON (Ctrl-Q) と XOFF (Ctrl-S) により、入出力データのフローを制御できます。

  • COM ポートの状態パラメータおよびモデムのボー・レートを指定します。

  • 独自の終端文字を指定したとき、外部プロトコルに適合させることができます。

  • 自動装置のような非ターミナル・デバイスと通信できます。

プリンタは、ほとんどのプラットフォームでターミナル入出力デバイスとして処理されます。UNIX® システムでは、常にプリンタがターミナル入出力デバイスとして処理されます。Windows では、シリアル通信ポートを通じて接続されているプリンタは、ターミナル入出力デバイスとして処理されます。それ例外のプリンタは、Windows システムではシーケンシャル・ファイル入出力デバイスとして処理されます。詳細は、このドキュメントの "プリンタ" の章を参照してください。

主デバイスとなるログイン・ターミナルとコンソール

Caché へのログインに使用したターミナルやコンソールは、主デバイスです。ユーザ側で主デバイスを開く必要はありません。OPENUSE が発行されていない場合、プロセスは最初にREAD または WRITE を発行します。OPEN 0 USE 0 が明示的に発行されたかのように、システムは自動的に主デバイスを開き、現在のデバイスとして確立します。

Note:

この章でいうターミナルとは、ターミナルとコンソールの両方を指します。

入出力状態を表示する特殊変数

入出力コマンドは、特殊変数値に影響します。これらの変数をテストすることで、入出力条件を判断できます。

  • $IO は、現在のデバイス名を含みます。

  • $TEST は、直前に実行された処理が成功したかどうかを示すブーリアン値を含みます。

  • $X$Y は、カーソル位置を示します。

  • $ZA$ZB$KEYREAD 処理の情報を示します。$ZB$KEY は類似していますが、同じものではありません。

デバイスに依存しない $IO 特殊変数の詳細は、“入出力デバイスとコマンド” の章を参照してください。次のセクションでは、その他の特殊変数に関しターミナル固有の情報を説明しています。

$X と $Y とカーソル位置

カーソルや印字ヘッドについて、$X は水平方向の位置情報、$Y は垂直方法の位置情報を持ちます。$X=0,$Y=0 は、CRT 画面あるいは印刷ページの上部左端を意味します。$X$Y の両方について、Caché ではそのモジュロ 256 が計算されます。つまり、範囲は 0 から 255 で、その後は再度 0 から始まります。

以下のテーブルは、入力した文字とその入力に対する画面上の応答 (エコー) を示しています。

文字エコーの効果
文字 ASCII コード $X に対する効果 $Y に対する効果
Form Feed 12 $X=0 $Y=0
Return 13 $X=0 $Y=$Y
Line Feed 10 $X=$X $Y=$Y+1
Backspace 8 $X=$X-1 $Y=$Y
Tab 9 $X=$X+1 $Y=$Y
出力できる ASCII 文字 32 ~ 126 $X=$X+1 $Y=$Y

OPENUSE の S プロトコルはエコーを無効にします。また、入力中の $X$Y の変更も無効にします。したがって、これらの変数はカーソルの真の位置を示します。

WRITE * および $X と $Y

WRITE * は、$X$Y を変更しません。したがって、ターミナルに制御シーケンスを送信しても、$X$Y は真のカーソル位置を示します。制御シーケンスの中には、カーソルを動かすものもあるため、必要なときに、$X あるいは $Y を直接設定できます。

$X と $Y の例

以下の例では、制御シーケンスは、VT100 ターミナルのカーソルを 10 行、20 列目に移動し、それに応じて $X$Y を設定します。

 ; set DY and DX to desired 
 ; values for $Y and $X 
 SET DY=10
 SET DX=20
 ; ...
 ; escape sequence moves
 ; cursor to desired position
 WRITE *27, *91, DY+1, *59, DX+1, *72
 ; ...
 ; updates $X and $Y
 SET $Y=DY
 SET $X=DX

$X と $Y に対するエスケープ・シーケンスのさまざまな影響

エスケープ・シーケンスは、$X$Y の値に対する効果を変更できます。この効果を制御する要因には、以下の 3 つがあります。

$X と $Y に対するエスケープ・シーケンスの影響 (Windows システムおよび UNIX® システム)

既定の UNIX® と Windows では、ASCII のエスケープ文字 (10 進数値 27) を含む文字列を入力したときやそれに対するエコーが表示されるとき、他の文字シーケンスと同様に、Caché によって $X$Y が更新されます。したがって、ターミナルで動作し、画面には表示されない ANSI 標準の制御シーケンスでは、$X$Y の値とカーソル位置との関係に矛盾が生じます。

この問題を防ぐ一番簡単な方法は、その動作を変更する DX() メソッドを使用することです (次セクション参照)。あるいは Write * 文の文字列で、各文字の ASCII 値を使用できます。

制御シーケンスの例

以下のコードを考えます。

%SYS>WRITE $CHAR(27)_"[lm"

このコードを使用するかわりに、$X$Y を更新しない以下の文を使用できます。

%SYS>WRITE *27,*91,*49,*109
エスケープ・シーケンスに対する $X の更新制御の変更

実際のプロセスで、既定ではない方法で $X を更新するには、%SYSTEM.ProcessOpens in a new tab クラスの DX(n)Opens in a new tab メソッドを発行します。

システム管理者は、Config.MiscellaneousOpens in a new tab クラスの DXOpens in a new tab プロパティを設定することによりシステム全体の既定の動作を変更できます。

いずれの場合も、n には以下のような 0 から 4 までの値を指定します。

$X を更新するための既定の動作
0 UNIX® と Windows での Caché の動作 (UNIX® と Windows での既定の動作)
1 DSM による動作
2 DTM/MSM による動作

詳細は、"ObjectScript ランゲージ・リファレンス" の "$X" を参照してください。

タイムアウト付き処理結果を示す $TEST

$TEST 特殊変数は、タイムアウト値を持つコマンドで設定されます。これらのコマンドには OPEN およびREAD があります。$TEST の値は、1 あるいは 0 に設定されます。

  • タイムアウトになる前に時間制限コマンドが成功した場合、$TEST には 1 が設定されます。

  • 時間制限コマンドがタイムアウトになった場合、$TEST には 0 が設定されます。

Note:

タイムアウトなしの OPEN および READ コマンドは、$TEST に影響を与えません。

詳細は、"ObjectScript ランゲージ・リファレンス" の "$TEST" を参照してください。

READ のステータスを示す $ZA

$ZA 特殊変数にはビット・フラグがあり、現在のデバイスで最後に実行された READ のステータスを示します。ユーザは $ZA を設定できず、Caché がその値を制御します。$ZA の値は、次の READ が実行されるまで有効な状態で保持されます。以下のテーブルのように、$ZA 値には、この変数をプログラムがどのようにテストするのかを示す合計値が含まれます。($ZA 値には、モデム接続ステータス用のビット・フラグが含まれますが、ここに記載されていません。$ZA ビット・フラグの値の全リストについては、"ObjectScript ランゲージ・リファレンス" の "$ZA" を参照してください。)

$ZA の Read ステータス値
テスト 意味
1 $ZA#2 ブレークが有効かどうかに関係なく、Ctrl-C を受信しました。
2 $ZA\2#2 READ がタイムアウトになりました。
256 $ZA\256#2 Caché が無効なエスケープ・シーケンスを検出しました。
512 $ZA\512#2 ハードウェアがパリティ・エラーもしくはフレーミング・エラーを検出しました。

$ZA がエラーを示す状況は数多くありますが、$ZTRAP 特殊変数にトラップすることによるプログラム・フローへの割り込みは発生しません。エラーに関連するプログラムは、READ を実行するたびに $ZA を検証する必要があります。当然、ブレークを有効にする Ctrl-C は、$ZTRAP にトラップします。エラー・トラップと $ZTRAP の詳細は、"Caché ObjectScript の使用法" の "エラー処理" の章と "ObjectScript ランゲージ・リファレンス" の "$ZTRAP" を参照してください。

READ の終了原因を示す $ZB

$ZB は、現在のデバイスで最後の READ 処理を終了させた文字シーケンスあるいはイベントを示します。ユーザ側で $ZB を設定することはできません。READ を実行するたびに、Caché によって $ZB の値が設定されます。この値を使用して、上向き矢印やファンクション・キーなど、出力されない文字を操作できます。

$ZB には、以下のいずれかが含まれます。

  • キャリッジ・リターンなどの終端文字

  • エスケープ・シーケンス

  • 固定長 READ x#yy 番目の文字

  • READ *x の 1 文字

  • 時間制限つきの READ がタイムアウトになったときの空文字列

$ZB に含まれる文字は、64 文字以下です。それを超える長さのエスケープ・シーケンスは無効です。

$ZB の例

以下の例は、ユーザ定義の入力文字を READ コマンド変数 x に割り当て、入力ターミネータ (通常は Enter) を $ZB 特殊変数に割り当てます。ターミナル・プロンプトからこのコマンドを発行する場合、READ コマンドと同じコマンド行で、$ZB 値をトラップする変数を設定する必要があります。コマンド行の作成に使用する改行は、終端文字として $ZB に記述されるからです。この例では、ZZDUMP を使用して $ZB でトラップされる文字の値を表示します。

USER>READ x SET y=$ZB
USER>ZZDUMP y

0000: 0D 
USER>

OPEN コマンドと USE コマンド

OPEN コマンド

ターミナルの所有権を構築します。オプションのパラメータ・リストでは、右マージンの設定、デバイス・プロトコルの指定、および 1 つ以上の終端文字の指定が可能です。以下のパラメータ・リストに従って、timeout 引数または mnespace 引数 (またはその両方) を必要に応じて指定できます。mnespace 引数は、WRITE /mnemonic で使用する制御ニーモニックを定義している Caché ルーチンを指定します。

OPEN は、デバイスが完全に開くまで、プロセスを休止します。Ctrl-C を押して OPEN コマンドに割り込むと、<NOTOPEN> エラーを生じます。

OPEN は、タイムアウトを指定しない限り、デバイスが開くまで制御を保持します。タイムアウトを設定している場合、指定した時間内にデバイスが開かないと $TEST が 0 に設定され、制御はプロセスに戻ります。オペレーティング・システム・レベルで無効なデバイスであっても、OPEN は、そのデバイスが正常に開くまで、またはタイムアウトになるまでデバイスの取得を続けます。

OPEN 構文

OPEN コマンドは、以下の引数をとります。

OPEN terminal:(margin:protocols:terminator:portstate:baud):timeout:"mnespace"

terminal 引数のみが必須です。terminal 引数には、値がターミナル・デバイス名となる式を指定することもできます。ゼロ (0) はプロセスの主デバイスを示します。$IO は現在のデバイスです。terminal の最大長は 256 文字です。

複数の引数はコロン (:) で区切ります。リスト内の引数を省略するには、プレースホルダとしてコロンを指定する必要があります。ただし、末尾にはコロンを使用できません。コマンドまたはパラメータ・リストの末尾にコロンを記述しないでください。

オプションのパラメータ・リストは括弧で囲み、次のオプション・パラメータを記述できます。

  • margin は、右マージンを指定することにより行ごとの文字数を指定する整数です。

  • protocols は、ターミナルのオプションを指定する 1 文字以上のコードです。

  • terminator は、READ 処理を終了する 1 文字以上の文字列です。これらの文字は、特定の protocols に対して定義する終端文字を補足します。

  • portstateは、COM ポート状態を指定する文字列です。

  • baud は、COM ポートのボー・レートを指定する整数です。

これらのオプションのパラメータは、記述した順序による位置パラメータまたは /KEYWORD=value 構文によるキーワード・パラメータとして指定できます。キーワード・パラメータは、任意の順序で指定できます。Caché では、パラメータが左から右の順に実行されるので、パラメータ間の相互関係により優先の順序が決まる場合もあります。位置パラメータとキーワード・パラメータを同じパラメータ・リスト内で混在して使用することもできます。複数のパラメータを含む場合、それらを囲む括弧は必須です。

以下のパラメータ・リストは同じものです。

   OPEN $IO:(80:"BFU":$CHAR(13)) 
    ; all positional
   OPEN $IO:(80::$CHAR(13):/PARAMS="BFU") 
    ; mixed positional and keyword, using the /PARAMS keyword
    ; to specify a protocol letter code string.
   OPEN $IO:(/MARGIN=80:/TERMINATOR=$CHAR(13):/BREAK:/FLUSH:/UPCASE)
    ; all keyword, using separate keywords 
    ; for each protocol letter code.

パラメータ・リスト (パラメータ・リストを指定していない場合は代替のコロン) の後に、timeout の秒数をオプションで指定できます。また、このデバイスの制御ニーモニックを保持するルーチンを指定する mnespace 引数を指定できます。

詳細は、"ObjectScript ランゲージ・リファレンス" の "OPEN" を参照してください。

USE コマンド

指定されたターミナルを現在のデバイスにします。プログラマ・モードでは、同じコード行にある連続したすべての入出力コマンドが、そのデバイスを対象とします。アプリケーション・モードでは、USE コマンドで指定したデバイスが、次の USE コマンドまで現在のデバイスとなります。

USE 構文

USE コマンドは、以下の引数をとります。

USE terminal:(margin:protocols:terminator):"mnespace"

terminal 引数には、値がターミナル・デバイス名となる式を指定することもできます。ゼロ (0) はプロセスの主デバイスを示します。$IO は現在のデバイスです。terminal の最大長は 256 文字です。

複数の引数はコロン (:) で区切ります。引数を省略するにはコロンを指定する必要があります。コマンドまたはパラメータ・リストの末尾にはコロンを記述しないでください。

オプションのパメータ・リストは括弧で囲み、margin パラメータ、protocols パラメータ、および terminator パラメータを記述できます。オプションの margin パラメータ、protocols パラメータ、および terminator パラメータは、記述した順序による位置パラメータまたは /KEYWORD=value 構文によるキーワード・パラメータとして指定できます。キーワード・パラメータは、任意の順序で指定できます。Caché では、パラメータが左から右の順に実行されるので、パラメータ間の相互関係により優先の順序が決まる場合もあります。位置パラメータとキーワード・パラメータを同じパラメータ・リスト内で混在して使用することもできます。複数のパラメータを含む場合、それらを囲む括弧は必須です。

USE コマンドで COM ポート状態とボー・レートを指定するには、適切なキーワード・パラメータを使用します。

パラメータ・リスト (パラメータ・リストを指定していない場合は代替のコロン) の後に、mnespace 引数をオプションで指定できます。これは、WRITE /mnemonic で使用する制御ニーモニックを定義している ObjectScript ルーチンを特定します。

詳細は、"ObjectScript ランゲージ・リファレンス" の "USE" を参照してください。

OPEN コマンドと USE コマンドの位置パラメータ

以下の位置パラメータは、OPEN コマンドと USE コマンドで使用できます。デバイスに対するこれらのパラメータは OPEN コマンドと USE コマンドのいずれでも設定できます。あるいは、管理ポータルで構成した既定の設定を使用することもできます。これらのパラメータは位置を示します。パラメータを省略すると、その代わりとして、前にコロンを置く必要があります。

margin

第 1 位置パラメータ : 右マージンを指定する整数値で、これによって 1 行の文字数が決まります。1 から 255 までの値が出力用の右マージンとして設定でき、他の値は無効となります。空文字列を指定すると、マージンの設定は変更されません。Windows プラットフォームでは、“:n” を使用して出力マージンを制御することはできません。そのため、Caché ではこのような記述は無視されます。例えば、“|PRN| :121” のようなコードは無視されます。出力幅を制御するには、プリンタに適切な制御文字を送信します。これは、他のプラットフォームにも当てはまります。

さまざまなターミナル・タイプの既定マージンは、管理ポータルで定義します。システム, 構成, デバイス設定, サブタイプ を選択します。リストされている各デバイス・サブタイプの [編集] をクリックすると、[右マージン :] の既定のオプションが表示されます。

protocols

第 2 位置パラメータ : 引用符で囲まれた文字コードの文字列です (例えば "BNFU")。それぞれの文字により、ターミナルの通信規則の 1 つが有効になります。文字コードは、大文字と小文字を区別しません。文字コードは、任意の順序で指定できます。Caché では、パラメータが左から右の順に実行されるので、パラメータ間の相互関係により優先の順序が決まる場合もあります。文字コードのテーブルは "文字コード・プロトコル" を参照してください。

文字列の前にプラス記号やマイナス記号を記述すると、プロトコルは以下のような影響を受けます。

  • 前にプラスやマイナスがない場合 : 新規の文字列で既存のプロトコル文字列が置換されます。

  • 文字コード文字列の前にプラス (+) を記述した場合 : 既存のプロトコル文字列に新規の文字列のプロトコルが追加されます。

  • 文字コード文字列の前にマイナス (-) を記述した場合 : 新規の文字列のプロトコルは無効になりますが、他のプロトコルは引き続き有効です。

プロトコルを有効にする + オプションと無効にする – オプションは、DSM-11 互換モードでは使用できません。

terminator

第 3 位置パラメータ : READ を終了する文字を含む、最大 8 文字の文字列です。プロトコル文字列に使用しているターミネータに、これらのターミネータが付加されます。"入出力操作を終了するためのターミネータ" を参照してください。

portstate

第 4 位置パラメータ : COM ポート状態を制御する最大 8 バイトの文字列で、それぞれのバイト位置に制御内容が割り当てられています。portstate バイトは、以下のとおりです (バイトは左から右の順に 1 から番号が付けられます)。

バイト 意味
1 切断 D = ポートを切断 (停止) する。空白 = ポートを切断しない。
2 モデム制御 1 = モデム制御を使用する。0 = モデム制御を使用しない。空白 = モデム制御を変更しない。
3 データ・ビット 5 = 5 データ・ビット。6 = 6 データ・ビット。7 = 7 データ・ビット。8 = 8 データ・ビット。空白 = データ・ビット設定を変更しない。
4 パリティ 0 = パリティなし。0 = 奇数パリティ。2 = 偶数パリティ。3 = マーク・パリティ。4 = スペース・パリティ。空白 = パリティ設定を変更しない。
5 ストップ・ビット 1 = 1 ストップ・ビット。5 = 1.5 ストップ・ビット。2 = 2 ストップ・ビット。空白 = ストップ・ビット設定を変更しない。
6 フロー制御 X = Xon/Xoff フロー制御を使用する。C = CTS/RTS フロー制御を使用する。D = DSR/DTR フロー制御を使用する。N = フロー制御を無効にする。空白 = フロー制御を変更しない。
7 DTR 設定 0 = DTR を無効にする (オフに設定、オフを保持)。1 = DTR を有効にする (オンに設定、オンを保持)。空白 = DTR 状態を変更しない。
8 $ZA エラー報告 0 = $ZA エラー報告を無効にする (既定)。1 = $ZA エラー報告を有効にする。空白 = $ZA エラー報告を変更しない。

以下の例は、COM ポート状態の文字列です。

  OPEN "COM2":(:::" 0801x0")

この文字列の値は、次のとおりです。空白 (ポートを切断しない)、0 (モデム制御を使用しない)、8 (8 データ・ビット)、0 (パリティなし)、1 (1 ストップ・ビット)、X (Xon/Xoff フロー制御)、0 (DTR を無効にする)、既定 ($ZA エラー報告を無効にする)。

Disconnect パラメータは、DTR シグナルのレベルを 2 秒間下げた後、元に戻すことで、モデム制御ポートを停止します。この切断によってポートは閉じません。切断後に、COM デバイスを開き直さなくても、再度ダイヤルできます。

Modem Control パラメータは、Caché が RLSD (Received Line Signal Detector) ピンの状態にどのように応答するかを決定します。このピンは、DCD (Data Carrier Detect) ピンとも呼ばれます。回線がモデム制御されている場合 (modem control=1)、Caché は RLSD の状態を監視しています。キャリアが存在しない状態で READ コマンドを発行すると、<ENDOFFILE> エラーが生成されます。キャリアが存在しない状態で WRITE コマンドを発行した場合は、エラーは生成されません。これは、接続が確立する前にモデムにダイヤル・コマンドを送信できる必要があるからです。Caché モデム制御は、いつでも有効 (1) あるいは無効 (0) にできます。モデムにコマンドを送信する際にはモデム制御を無効にし、キャリアが検出されて接続が確立された後はモデム制御を有効にすることをお勧めします。

DTR Setting パラメータは、接続されたモデムからのログインを制御するために使用されます。DTR 設定が 0 (ゼロ) の場合、DTR 制御シグナルはオフになり、モデムはコンピュータと通信できません。この場合は、ダイヤルイン接続できません。DTR 設定が 1 の場合、DTR 制御シグナルはオンになり、モデムはコンピュータと通信できます。これでダイヤルイン接続が可能になります。DTR をオフ (0) に設定している場合、接続されたモデムを使用してダイヤルアウトするためには、OPEN コマンドまたは USE コマンドで DTR をオン (1) に設定する必要があります。多くの場合、NULL モデム・ケーブルを使用して直接ターミナル・デバイスまたはシリアル・プリンタに接続すれば、DTR 設定は重要ではなくなります。これは、NULL モデム・ケーブルによって DTR 制御ピンが強制的にオンになるためです。

$ZA Error Reporting パラメータは、$ZA 特殊変数へのモデム制御ピンの状態の報告を有効にします。このチェックは、COM ポートのモデム制御バイト設定に関係なく実行できます。$ZA エラー報告が有効になっている場合、COM ポート・エラーは、Windows ClearCommError() 関数の呼び出しでクリアされます。ポート・エラー状態は、$ZA ビット 16 から 22 で報告されます。$ZA ビット値のテーブルについては、"Caché ObjectScript リファレンス" の "$ZA" を参照してください。

baud

第 5 位置パラメータ : 目的の COM ポートのボー・レートを指定する整数値です。サポートされているボー・レートは、110、300、600、1200、4800、9600、14400、19200、38400、56000、57600、115200、128000、256000 です。

OPEN コマンドと USE コマンドのキーワード・パラメータ

以下のテーブルは、OPEN コマンドと USE コマンドの両方を使用して、ターミナル・デバイスを制御するキーワード・パラメータの説明です。それぞれのキーワードについて、OPEN および USE の対応する文字コード・プロトコルがテーブルに一覧表示されています。これらのプロトコルの使用に関する詳細は、文字コード・プロトコルのテーブルにあります。

ターミナル・デバイスの OPEN と USE のキーワード・パラメータ
キーワード 既定値 文字コード・プロトコル 説明
/BAUD=n     baud 位置パラメータに相当します。/BAUD=n は COM ポートのモデムのボー・レートを設定します。サポートされている値は、110、300、600、1200、4800、9600、14400、19200、38400、56000、57600、115200、128000、256000 です。

/BREAK[=n]

または

/BRE[=n]

0 B /BREAK を指定した場合、または /BREAK=nn が 0 以外の場合、このプロトコルが有効になります。/BREAK=nn が 0 の場合、このプロトコルが無効になります。
/COMPARAMS=str     portstate 位置パラメータに相当します (このキーワードは、位置に依存しない方法で COM ポート状態バイト・コード文字列を指定する方法を提供します)。str を指定できる portstate バイト・コードは、この章で前述しているテーブルに一覧表示されています。
/CRT[=n] オペレーティング・システムのターミナル設定に依存します。 C と P C プロトコルと P プロトコルに関連します。/CRT を指定した場合、または /CRT=nn が 0 以外の場合、C プロトコルが有効になり、P プロトコルが無効になります。/CRT=nn が 0 の場合、C プロトコルが無効になり、P プロトコルが有効になります。
/DISCONNECT     portstate 位置パラメータの 1 番目のバイトに相当します。/DISCONNECT は COM ポートを切断 (停止) します。これによってポートは閉じません。COM デバイスを開き直さずに、再度ダイヤルアウトできます。
/ECHO[=n] 1 S /ECHO を指定した場合、または /ECHO=nn が 0 以外の場合、このプロトコルが無効になります。/ECHO=nn が 0 の場合、このプロトコルが有効になります。
/EDIT[=n] 0 R と N /EDIT を指定した場合、または /EDIT=nn が 0 以外の場合、R プロトコルが有効になり、N プロトコルが無効になります。/EDIT=nn が 0 の場合、R プロトコルが無効になり、N プロトコルが有効になります。

/FLUSH[=n]

または

/FLU[=n]

0 F /FLUSH を指定した場合、または /FLUSH=nn が 0 以外の場合、このプロトコルが有効になります。/FLUSH=nn が 0 の場合、このプロトコルが無効になります。
/GZIP[=n] 1   GZIP と互換性のあるストリーム・データ圧縮を指定します。/GZIP を指定した場合、または /GZIP=n (n は 0 以外) を指定した場合、WRITE の発行時に圧縮、READ の発行時に解凍が有効になります。/GZIP=0 を指定した場合は、圧縮と解凍が無効になります。/GZIP=0 を発行して、圧縮/解凍を無効にする前に、$ZEOS 特殊変数をチェックして、ストリーム・データの読み込みが実行中でないことを確認してください。/GZIP 圧縮は、/IOTABLE を使用して構築した変換などの入出力変換には影響しません。これは、圧縮がその他すべての変換 (暗号化を除く) の後に適用され、解凍がその他すべての変換 (暗号化を除く) の前に適用されるためです。

/IMAGE[=n]

あるいは

/IMA[=n]

0 I /IMAGE を指定した場合、または /IMAGE=nn が 0 以外の場合、このプロトコルが有効になります。/IMAGE=nn が 0 の場合、このプロトコルが無効になります。

/IOTABLE[=name]

または

/IOT[=name]

name が指定されない場合、デバイスの既定の入出力変換テーブルを使用します。   K\name\ プロトコルに対応します。これは、デバイスの入出力変換テーブルを確立します。

/MARGIN=n

または

/MAR=n

0 (マージンなし)   ターミナル・デバイスの右マージンを設定する margin 位置パラメータに対応します。
/MODE=n 既定なし  

n の値に従って、プロトコルをリセットしてターミナル・モードを設定します。

n=0 は、LF と ESC を既定のターミネータに設定します。

n=1 は、モード 0 と同様、S プロトコルを有効にします。

n=2 は、モード 0 と同様、T プロトコルを有効にします。

/NOXY [=n] 0   $X および $Y の処理なし : /NOXY を指定した場合、または /NOXY=n (n は 0 以外の値) を指定した場合、$X および $Y の処理が無効になります。これにより READ 操作および WRITE 操作のパフォーマンスを大幅に向上させることができます。$X および $Y の変数値が不確定であるため、マージン処理 ($X に依存) は無効になります。/NOXY=0 の場合は、$X および $Y の処理が有効になります。これが既定です。
/OBUFSIZE=nnn 256   ターミナル出力バッファのサイズをバイト単位で指定します。出力バッファのサイズを大きくすると、待ち時間の長いワイド・エリア・ネットワークを通じた Telnet の画面描画パフォーマンスが向上することがあります。/OBUFSIZE の有効値は 256 から 65536 です。既定値は、256 です。

/PARAMS=str

または

/PAR=str

既定なし   protocols 位置パラメータに相当します (このキーワードは、位置に依存しない方法でプロトコル文字コード文字列を指定する方法を提供します)。str に含めることができる文字コードのテーブルは "文字コード・プロトコル" を参照してください。

/TERMINATOR=str

または

/TER=str

既定なし   ユーザ定義のターミネータを構築する terminator 位置パラメータに相当します。str を構成するには、"入出力操作を終了するためのターミネータ" を参照してください。

/TPROTOCOL[=n]

または

/TPR[=n]

0 T /TPROTOCOL を指定した場合、または /TPROTOCOL=nn が 0 以外の場合、このプロトコルが有効になります。/TPROTOCOL=nn が 0 の場合、このプロトコルが無効になります。

/TRANSLATE[=n]

または

/TRA[=n]

1 K /TRANSLATE を指定した場合、または /TRANSLATE=n の n が 0 以外の場合はデバイスの入出力変換が有効になります。/TRANSLATE=n の n が 0 の場合は、デバイスの入出力変換が無効になります。

/UPCASE[=n]

または

/UPC[=n]

0 U /UPCASE を指定した場合、または /UPCASE=n の n が 0 以外の場合、このプロトコルが有効になります。/UPCASE=nn が 0 の場合、このプロトコルが無効になります。

/XYTABLE[=name]

または

/XYT[=name]

name が指定されていない場合、デバイスの既定の $X/$Y アクション・テーブルを使用します。 Y\name\ Y\name\ プロトコルに対応します。これは、デバイスの $X/$Y アクション・テーブルを確立します。

OPEN コマンド実行の検証

OPEN コマンドが成功したかどうかを判断するために、コードでは $TEST または $ZE (またはその両方) の使用をお勧めします。$TEST は、OPEN コマンドが timeout 引数で指定された場合にのみ設定されます。Ctrl-COPEN コマンドに割り込んだ場合にのみ、<NOTOPEN> エラーが発生します。したがって、コードは <NOTOPEN> エラーに依存していないことが必要です。

OPEN と USE の文字コード・プロトコル

特別な状況やターミナルでは、異なるプロトコルが必要になる場合があります。protocols 文字コード・パラメータ (あるいは対応するキーワード・パラメータ) を使用し、Caché がターミナルでやり取りするための規則を変更できます。プロトコルは、通常の読み取りや単一文字の読み取りに影響します。

すべての特殊プロトコルが無効になっている通常モードで、大半のターミナル入出力には十分です。通常モードでは、Caché は、受信する各 ASCII 文字をエコーし、ターミナルで表示するよう返送します。Enter キーあるいは有効なエスケープ・シーケンスは、READ コマンドを終了します。

ターミナルに OPEN を発行すると、+ オプションまたは - オプションで指定されたプロトコル以外の既存のプロトコルはすべて無効になります。

以下のテーブルは、有効な protocols 文字とその効果の説明です。

OPEN と USE の文字コード・プロトコル
プロトコル文字 名前 定義
B BREAK

ブレークが有効の場合 (+B)、Ctrl-C は、実行中のルーチンに <INTERRUPT> エラーを生成して割り込みます。ブレークが無効の場合 (-B)、Ctrl-C キーを押しても割り込みが発生せず、“^C” は表示されません。このプロトコルの使用は、以下のように、ログイン・モードで確立される BREAK コマンドの既定に依存します。

プログラマ・モードでログインすると、割り込みが必ず有効になります (BREAK 1)。OPEN コマンドまたは USE コマンドで指定した B (または /BREAK) プロトコルは何の影響も与えません。

アプリケーション・モードでログインすると BREAK 0 が既定になり、OPEN コマンドまたは USE コマンドで指定した B (または /BREAK) プロトコルで割り込みを有効または無効にできます。

C CRT ターミナル C モードでは、ASCII 表記で 3、8、10、13、21、および 127 の 6 つを除くすべての 8 ビット文字をデータとして使用できます。Delete 文字である 127 (ASCII 表記) は BackSpace キーと同じ動作を実現します。つまり、画面上で現在の位置の前にある 1 文字を消去します。ASCII 表記で 21 (Ctrl-U) は、BackSpace キーと同じ機能を提供して文字を消去しながら READ の開始位置までカーソルを移動します。右マージンの設定またはターミナルの種類に従って強制的に新しい行が始まっている場合、Ctrl-U は、物理的に最後の行にある文字のみを消去できます。いずれの場合も、Ctrl-U は、READ 以降のすべての入力をキャンセルします。C は、P プロトコルと相互に排他的です。
F フラッシュ READ 以前の入力バッファをフラッシュ (空に) します。入力バッファをフラッシュし、ユーザが READ 処理の前にターミナルに入力しないようにできます。Caché は、READ 処理間の入力を破棄するからです。F プロトコルに関係なく、WRITE *–1 コマンドは、いつでも入力バッファをフラッシュします。
I イメージ・モード

I モードでは、terminator パラメータで明示的に指定したターミネータを除き、256 個すべての 8 ビット文字をデータとして使用できます。READ を終了する機能を実現する文字はありません。ターミネータを明示的に指定しない場合、単一文字および固定長の READ 処理のみを使用する必要があります。ターミネータを定義せずに通常どおりに READ を実行すると、<TERMINATOR> エラーが発生します。

イメージ・モード (I) の protocol は、別の protocol 文字と結合できます。イメージ・モードでは、プロトコル文字 P、C、および B は無視されますが、F、N、R、S、および T は機能します。イメージ・モードでない場合、デバイスは N (通常) モードです。

K\name\

または

Knum

入出力変換モード K プロトコルをデバイスで使用する際に、システム全体で変換が使用できる場合、入出力変換がデバイスで発生します。テーブル名を指定することで、変換の基本となっている既存の定義済みテーブルを特定します (テーブルをロードするスロット数の “num” を示す従来の Knum は廃止されましたが、現在もサポートされています)。
N 通常モード N モードでは、ASCII 表記で 3、8、10、13、21、および 127 の 6 つを除くすべての 8 ビット文字をデータとして使用できます。これらの暗黙のターミネータおよび制御文字を編集するコマンド行については、この章の後半で説明します。R (行呼び出し) プロトコルが有効の場合、N モードを指定すると R プロトコルが無効になります。protocols を指定していない場合は、このモードが既定になります。
P 出力デバイス ASCII の Delete 文字は、バックスラッシュ (\) としてエコーし、Ctrl-U は、“^U” に続くキャリッジ・リターンと改行をエコーします。ターミナルに OPEN コマンドを発行すると、Caché は自動的にプロトコル C あるいは P を実行します。これは、オペレーティング・システムのターミナル設定に依存します。これらのプロトコルは、プロトコルを明示的なデバイスに変更するまで有効です。C および P 以外のプロトコル文字列は、このプロトコルをキャンセルしません。
R 行呼び出しモードを有効にする R プロトコルは、デバイスの行呼び出しモードを有効にします。現在のプロセスの行呼び出しをアクティブにするには、%SYSTEM.ProcessOpens in a new tab クラスの LineRecall()Opens in a new tab メソッドを使用します。システム全体の行呼び出しを既定に設定するには、Config.MiscellaneousOpens in a new tab クラスの LineRecallOpens in a new tab プロパティを使用します。指定デバイスに対して、R プロトコルがこれら既定の設定よりも優先して適用されます。既に開いているデバイスの行呼び出しモードを変更するには、そのデバイスに対し、もう一度 OPEN コマンドで明示的に指定する必要があります。行呼び出しモードは、N プロトコルを指定することで無効になります。
S 隠し入力 READ に何もエコーしません。READ コマンドは、$X$Y を変更しません。行呼び出しモードは無効です。
T ターミネータ

T モードでは、どの制御文字もデータとして扱われません。制御文字は、10 進数値の 0 から 31 および 127 から 159 の ASCII 文字です。これらの制御文字のほとんどが READの ターミネータ文字として扱われます。例外は、ターミネータ以外の制御操作を実行する ASCII 3 (Ctrl-C)、ASCII 8 (バックスペース)、ASCII 17 (Ctrl-Q)、ASCII 19 (Ctrl-S)、ASCII 21 (Ctrl-U)、ASCII 24 (Ctrl-X)、ASCII 27 (ESC)、および ASCII 127 (DEL) の各制御文字です。

T モードと I モード を組み合わせると (IT プロトコル)、すべての制御文字 (ASCII 0 から 31 および 127 から 159) は、出力制御文字である Ctrl-Q (XOFF) と Ctrl-S (XON) および入力制御文字である Ctrl-HCtrl-Y を除き、READ のターミネータ文字として扱われます。出力制御文字である Ctrl-QCtrl-S は、大半のターミナルで遮断されるため、IT モードの場合も READ を終了しません。

U 大文字モード U モードでは、すべての入力文字が大文字に変換されます。

Y\name\

または

Ynum

$X/$Y アクション・モード デバイスに Y プロトコルを使用する場合、システムは、$X/$Y というアクション・テーブルを使用します。テーブル名を指定することで、変換に使用された事前定義の $X/$Y アクション・テーブルを識別します。名前がわからない場合、システム管理者に問い合わせてください。$X/$Y アクションは常に使用できます。Y が指定されず、システム既定の $X/$Y が定義されていない場合、組み込みの $X/$Y アクション・テーブルを使用します。+ オプションは、Y プロトコルを有効にし、- は無効にします。$X/$Y の関連を無効にするには、コマンド USE 0:(:"Y0") を発行します (テーブルをロードするスロット数であるnum を使用する従来の Ynum については記述されていませんが、現在もサポートされています)。

プロトコル文字列の例

以下の一連の例は、プロトコル文字列の使用方法を示しています。以下の各 USE コマンドは、その前に実行した USE コマンドで構築したプロトコル上で実行します。

   USE 0:(80:"BP" )

文字コード BP は、B と P プロトコルを有効にします。この例はブレーク (B) を有効にし、ターミナルを出力デバイス (P) として処理するよう Caché に命令します。

   USE 0:(80:"P")

上述の例にある USE コマンドに続いてこのコマンドを実行すると、P プロトコルは有効のままで、B プロトコルが無効になります。

   USE 0:(80:"+R" )

+R は、他のプロトコル設定に影響せずに、行呼び出しモードを有効にします。

   USE 0:(80:"")

空の文字列は、すべてのプロトコルを無効にします。しかし、P あるいは C は有効のままです。

   USE 0:(80)

プロトコル・パラメータを省略すると、プロトコルと明示的なターミネータは、変更されない状態のままとなります。

プロトコル・ターミネータ文字

OPEN プロトコルと USE プロトコル は、READ 入力文字、制御シーケンス、およびキーストロークのうち、暗黙のターミネータ文字として処理される文字を定義します。これには、I (イメージ・モード)、N (通常モード (既定))、R (行呼び出しモード)、および T (ターミネータ・モード) の 4 種類のプロトコルがあります。

  • I (イメージ・モード) では、256 個すべての 8 ビット文字をデータとして使用できます。READ 入力ターミネータやコマンド行編集文字として扱われる文字はありません。このため、イメージ・モードでは、単一の文字または固定長の READ 処理のみを使用する必要があります。ターミネータを定義せずに通常どおりに READ を実行すると、<TERMINATOR> エラーが発生します。

  • N (通常モード) および C (CRT モード) では、ASCII の 3、8、10、13、21、および 127 の 6 つを除くすべての文字をデータとして使用できます。ASCII の 10 (改行) と 13 (キャリッジ・リターン) の2 つは、READ を終了し、入力を送信します。ASCII 3 (Ctrl-C) は、入力を破棄し、BREAK が有効になっている場合は <INTERRUPT> エラーを発行します。ASCII の 8 (バックスペース) および 127 (削除) は、画面上で後退して 1 文字を消去してから READ を続行します。ASCII の 21 は、後退して前にあるすべての文字を消去してから READ を続行します。

  • R (行呼び出しモード) では、ASCII の 1 から 8、10 から 14、16、18、21、23、24、27 および 127 の 20 個を除くすべての文字をデータとして使用できます。ASCII の 10 (改行) と 13 (キャリッジ・リターン) は、READ を終了し、入力を送信します。ASCII 3 (Ctrl-C) は、入力を破棄し、BREAK が有効になっている場合は <INTERRUPT> を発行します。他の文字は、以下のコマンド行編集機能を実行します。

    1   ^A = beginning of line
    2   ^B = back word
    3   ^C = interrupt
    4   ^D = delete current character
    5   ^E = end of line
    6   ^F = forward word
    7   ^G = delete to beginning of word ("wipe word backward")
    8   ^H = BS = destructive backspace
    9   ^I = HT = horizontal tab (echoed as a SPACE)
    10  ^J = LF = end of input
    11  ^K = VT = forward character
    12  ^L = FF = erase to end of line
    13  ^M = CR = end of input (same as LF)
    14  ^N = recall next input line
    16  ^P = recall previous input line
    18  ^R = back char (reverse)
    21  ^U = erase to start of line
    23  ^W = delete to end of word "gobble word forward")
    24  ^X = erase entire line
    27  ESC lead character for arrow and function keys
    127 DEL = destructive backspace (same as BS)
    
  • T (ターミネータ・モード) では、ASCII の 0 から 31 および 127 から 159 の 65 個の制御文字を除くすべての文字をデータとして使用できます。これらの文字のほとんどは、READ 終端文字として扱われます。これには、他のすべてのプロトコルではデータとして扱われるタブ文字 (ASCII 9) も含まれます。コマンド行制御文字として扱われる文字もいくつかあります。ASCII の 3 (Ctrl-C) は、入力を破棄し、BREAK が有効になっている場合は <INTERRUPT> を発行します。ASCII の 8 (バックスペース) および 127 (削除) は、画面上で後退して 1 文字を消去してから READ を続行します。ASCII 21 (Ctrl-U) および ASCII 24 (Ctrl-X) は、後退して前にあるすべての文字を消去してから READ を続行します。ASCII 27 は、エスケープ文字です。

  • IT (イメージ・モード + ターミネータ・モード) では、ASCII の 0 から 31 および 127 から 159 の 65 個の制御文字を除くすべての文字をデータとして使用できます。このモードでは、すべての制御文字が READ ターミネータ文字として扱われます。

これらのモードのいずれでも、terminator パラメータを使用して、追加のターミネータ文字を明示的に指定できます。イメージ・モードは、ビット・ストリーム・データに使用することが多いので、通常は、任意の文字をターミネータとして指定することは避けます。

明示的ターミネータ文字

OPEN コマンドまたは USE コマンドの terminator パラメータを使用して、特定の文字を READ コマンドまたは WRITE コマンドのターミネータとして定義できます。これらの明示的ターミネータは、指定した protocol で決まるターミネータ文字を補足するために使用できます。この terminator パラメータは、protocol による文字の指定を無視し、指定した文字を代わりのターミネータ文字として指定するためにも使用できます。文字をターミネータとして再定義する機能に対する例外は、ASCII 0 (NULL)、ASCII 3 (Ctrl-C)、および 2 つの出力制御文字 Ctrl-Q (XON) および Ctrl-S (XOFF) です。これらの文字は、元の機能が保持され、ターミネータ文字として再定義できません。

以下の例は、Z、BackspaceTab を主デバイスのターミネータとして定義します。アンダースコアは、連結演算子です。

  USE 0:("":"":"Z"_$CHAR(8,9))

所有していないターミナルに対して OPEN コマンドを発行すると、明示的なターミネータの Caché 内部リストが暗黙的にクリアされます。プロトコル文字列を検出すると、Caché は以下を実行します。

  1. 明示的なターミネータ・リストをクリアします。

  2. プロトコル文字列に従い、プロトコルを設定します。

  3. ターミネータ文字列が存在する場合、それを内部的な明示的ターミネータ・リストにコピーします。

    以下のテーブルは、明示的なターミネータ文字列の例です。

ターミネータ文字列 : 例
ターミネータ文字列 定義
USE 0:(80:"C":$CHAR(27)) このエスケープ文字は、エスケープ・シーケンスを開始せず、READ を終了します。
USE 0:(80:"C":"") 空の文字列は、すべてのターミネータをクリアします。
USE 0:(80:"C") protocol の指定時に terminator パラメータを省略すると、すべてのターミネータをクリアします。
USE 0:(80) または U 0:80 protocolterminator の両方を省略すると、ターミネータは変更されません。

Read 操作でのプロトコルとターミネータの概要

以下の文字は、通常モード (非イメージ) の READ を終了します。

  • Enter

  • ASCII NUL 以外のターミネータ文字列の文字と Ctrl-CCtrl-OCtrl-QCtrl-S

  • T プロトコルが有効な場合の、出力制御文字以外の制御文字。制御文字は、10 進数コード 0 から 31、および 127 から 159 の出力されない文字です。

  • あらゆるエスケープ・シーケンス

  • 固定長 READ x#yy 番目の文字。

以下の文字は、イメージ・モードの READ を終了します。

  • ASCII NUL 以外のターミネータ文字列で指定された文字

  • T プロトコルが有効な場合の制御文字

  • 固定長 READ x#yy 番目の文字。

READ コマンド

キーボードから入力した 0 から 32KB までを、指定した変数に読み取ります。timeout はオプションです。コマンドは、シャープ記号 # やコロン : で終了できません。

構文

READ variable:timeout         ; Variable-length read
READ variable#length:timeout  ; Fixed-length read
READ *variable:timeout        ; Single-character read

詳細は、"ObjectScript ランゲージ・リファレンス" の "READ" を参照してください。

以下のテーブルは、Read コマンド引数の使用方法です。

READ コマンド引数 : 例
結果
READ ^GLO ターミネータを検出するまで現在のデバイスから文字列を読み取り、結果の文字列をグローバル ^GLO に置きます。
READ X:60 ターミネータを検出するまで現在の文字列から読み取り、読み取った文字列を変数 X に置きます。入力が終了するまで最大 60 秒間待機します。キーを押しても、タイムアウト値はリセットされません。
READ *X 現在のデバイスから 1 つの文字を読み取り、10 進値をローカル変数 X に置きます。
READ X#1 現在のデバイスから 1 つの文字を読み取り、その文字列値をローカル変数 X に置きます。
READ X#45:60 現在のデバイスから最大 45 文字までを読み取り、その文字列値をローカル変数 X に置きます。入力が終了するまで最大 60 秒間待機します。

行呼び出し

行呼び出しモードでは、ターミナルからの READ 操作に対する入力として、編集可能な行の行呼出しが提供されます。これらの呼び出し可能な行には、以前の READ 入力行と以前のコマンド行の両方が含まれます。行呼出しの前提条件として、入力行のエコーが必要です。

Caché は、可変長ターミナル読み取り (READ variable) と固定長ターミナル読み取り (READ variable#length) の両方で、行呼び出しをサポートしています。Caché は、単一文字ターミナル読み取り (READ *varaiable) では行呼び出しをサポートしていません。行呼び出しでは、オプションの timeout 引数をサポートしています。

固定長ターミナル読み取りの場合、呼び出された行は、READ で指定した文字数よりも 1 文字少ない文字数まで切り捨てられます。READ で指定した最終文字の位置は、行終了文字の入力、編集文字の指定、またはデータ文字 1 文字の追加のために予約されています。

行呼び出しがアクティブである場合、上矢印キーと下矢印キーを使用して以前のターミナル入力行を呼び出すことにより、READ に入力を提供できます。その後、左矢印キー、右矢印キー、Home キーおよび End キーを使用して、呼び出された行を編集するためにカーソルの位置を変更できます。文字を削除するには Backspace キー、行全体を削除するには Ctrl-X キー、行の中でカーソルの左側にある部分をすべて削除するには Ctrl-U キーをそれぞれ使用します。

行呼び出しがアクティブでない場合、4 つの 矢印 キー、Home キー、および End キーはすべて、行終了文字を発行します。1 つの入力文字を削除するには Backspace キー、入力行全体を削除するには Ctrl-X キー (または Ctrl-U キー) を使用します。

OPEN コマンドまたは USE コマンドを使用すると、R プロトコルを指定することで行呼び出しをアクティブにでき、N、I、S、または T のいずれかのプロトコルを指定することで行呼び出しを非アクティブにできます。

ターミナル入出力に影響する特殊なプロトコル文字

各オペレーティング・システムは、特定のプロトコル文字 (UNIX® の場合) やキーの組み合わせ (例えば、Windows プラットフォームでの CTR-ALT-DEL) を無効にし、これらの文字が Caché に影響を与えないようにします。Windows のコンソールは、これらのオペレーティング・システム機能を阻害しません。

他の特殊文字は、ルーチンの実行方法を変更できますが、READ コマンドの変数には使用されません。イメージ・モードでターミナルを操作すると、これらの機能は無効となり、Caché はこれらの文字を他の文字と同様に扱います。

READ は、入出力制御文字に影響されます。READ は、終端文字以外の制御文字すべてを読み取りますが、エコーしません。

出力制御文字は、ルーチン・フローとルーチン出力の両方に影響します。以下はその説明です。

出力制御文字
出力制御文字 10 進数値 定義
Ctrl-C 3 ブレークが有効の場合、Ctrl-C はルーチンの実行に割り込みます。ルーチンは、<INTERRUPT> エラーが発生したかのように動作します。ブレークが無効の場合、Ctrl-C により Caché は現在の READ までの入力をすべて破棄します。Ctrl-C を使用して、ネットワーク処理を必要とするグローバル・モジュール要求に割り込むことができます。Ctrl-C をトラップするには、特殊変数 $ZTRAP を設定します。詳細は、ブレークの有効化についてのセクションを参照してください。
Ctrl-S 19 Ctrl-S は、ターミナルへの出力を中断します。Caché で Ctrl-Q が検出されると、ターミナルへの出力が再開します。
Ctrl-Q 17 Ctrl-Q は、Ctrl-S で一時停止している出力を再開します。

入力制御文字は、入力に影響を与えます。これらの文字は、イメージ・モード (I プロトコル) ではデータとして扱われますが、通常モードでは現在の READ コマンドへの入力に影響します。以下は、これらの文字についての説明です。

入力制御文字
入力制御文字 10 進数値 定義
Delete 127 Delete 文字は、最後に入力された文字を削除します。Delete キーを繰り返し押すと、右から左へ文字が削除されます。しかし、現在の READ コマンドの開始位置より前の文字は削除されません。Delete は、バックスペースを使用して、CRT 画面の最後の文字を消去します。Delete は、(テレタイプなどの) 印刷ターミナルではバックスラッシュ ("\") としてエコーします。
Ctrl-U 21 最後のキャリッジ・リターンまで、現在の READ を開始後に入力されたすべての文字、あるいは UNIX® で先行入力のバッファ・コンテンツを削除します。Ctrl-U は、CRT では削除された文字を消去します。プリンタ上では ^U をエコーし、Enter と LineFeed を送信します。先行入力されたバッファを完全にフラッシュするには、Ctrl-X を使用します。
Ctrl-H 8 システムによっては、Delete と同じ機能を実行します。
Return 13 キャリッジ・リターンは、“I” (イメージ・モード) を除くすべてのプロトコルで READ を終了します。
Escape 27 エスケープ・シーケンスを開始します。このシーケンスは READ を終了し、$ZB は、先行の Escape を含むすべてのシーケンスを取得します。Caché にシーケンス文字がエコー表示されません。しかし、WRITE * コマンドでエスケープ・シーケンスを指定していない場合、$X$Y は変更されます。この章で前述している "$X と $Y とカーソル位置" を参照してください。無効なエスケープ・シーケンスは、$ZA のビット 8 を設定します。READ X の例を考えてみます。文字 “AB”、Escape、および “E” を入力すると、X には “AB” の 2 文字が含まれます。一方、$ZB には、Escape E の 2 文字が含まれます。$X は、AB で 2 つ増加しますが、E では増加しません。
LineFeed 10 Caché は、すべてのターミナル入出力に対し、LineFeed をターミネータと解釈します。
Tab 9 Tab は、スペースとしてエコーするデータ値で、$X を 1 増加し、READ が返した文字列に Tab 文字として格納されます。これは、“T” (ターミネータ) を除く すべてのプロトコルに当てはまります。“T” プロトコルでは、タブはターミネータ制御文字です。

UNIX® ジョブ制御の無効化

UNIX® ジョブ制御文字 Ctrl-Z を Caché 内で使用すると、深刻な問題が生じる場合があります。このため、ジョブ制御をサポートする UNIX® シェルを備えたプラットフォームで Caché を起動すると、自動的に Ctrl-Z が無効になります。Caché を終了し、UNIX® シェル・コマンドを実行するために $ZF(-1) を呼び出すと、Ctrl-Z が再び有効になります。

READ コマンドによる入力の処理

READ コマンドは、入力バッファから文字を受け取るたびにそれを処理します。以下のテーブルは、このプロセスが通常モードでどのように発生するかを示しています。以下の図は、READ コマンドがイメージ・モード・データを処理する方法を示しています。

通常 (非イメージ) モードでの READ コマンド処理
generated description: tio readproc
イメージ・モードでの READ コマンド処理
generated description: tio readprocimage

WRITE コマンド

ゼロ個以上の文字をターミナルに書き込みます。

構文

WRITE *variable
WRITE *-n
WRITE #
WRITE /mnemonic

各項目の内容は次のとおりです。

引数 定義
(なし) 引数なしの WRITE は、すべてのローカル変数を現在のデバイスに書き込みます。
*variable WRITE *variable は、10 進数値が x と等しい ASCII 文字を書き込みます。変数の値は、ASCII 文字の 0 から 255 までの整数になります。Unicode 文字の場合は 254 以下です。規定上は、0 から 127 までの値は 7 ビット ASCII 文字を表します。128 から 255 までの値は拡張 ASCII 文字セットを表しますが、アプリケーション自体に関連する文字です。ハードウェアとソフトウェアが正常に設定されている場合、Caché は 8 ビットのデータを処理できます。例 : 8 番目のビットを使用して、国際的な文字セットを表すことができます。Caché ルーチンは WRITE * を使用して、デバイス依存機能に制御文字を送信できます。例 : WRITE *27,*91,*50,*74 は、ターミナル画面をクリアします。WRITE * は、$X または $Y を変更しません。WRITE * の出力は、出力デバイスに特有であると想定しているためです。
*-1

WRITE *-1 は、次の READ が発行されると、入力バッファをクリアします。次の READ コマンドのために保留になっているすべての文字がクリアされます。したがって、先行入力文字がクリアされます。

入力バッファは、キーボードから入力された文字を保持します。また、ルーチンが READ コマンドを実行する前にユーザが入力した文字も保持します。これにより、画面に入力が表示される前に質問に応答できます。READ コマンドがバッファから文字を取得するとき、Caché は、質問と応答を一緒に表示するようにターミナルにエコー・バックします。ルーチンがエラーを検出すると、WRITE *-1 を発行し、これらの応答をキャンセルする場合があります。

*-10

WRITE *-10 は、直ちに入力バッファをクリアします。この処理は、次の READ コマンドを待ちません。したがって、WRITE *-10 の前に発行されたすべての先行入力文字をクリアします。WRITE *-10 の後に発行された先行入力文字は、次の READ コマンドが使用するために入力バッファに残ります。

# WRITE # を CRT ターミナルに発行すると、画面をクリアし、ホーム位置 (0,0) にカーソルを移動します。ハードコピー・ターミナルには、キャリッジ・リターンと書式送りが書き込まれます。WRITE # は、$Y を 0 に設定します。
/mnemonic WRITE /mnemonic を発行すると、Caché は、ニーモニックをアクティブなニーモニック空間で定義されたものとして解釈します。アクティブなニーモニック空間がない場合は、エラーが返されます。2 つの方法で、アクティブなニーモニック空間を指定できます。その 1 つは、ネームスペースとネットワーク構成エディタを使用して、デバイス・タイプごとに既定のニーモニック空間を指定する方法です。もう 1 つは、デバイスに対する OPEN コマンドまたは USE コマンドでニーモニック空間を指定する方法です。詳細は、"ニーモニック空間によるデバイス制御" を参照してください。

詳細は、"ObjectScript ランゲージ・リファレンス" の "WRITE" を参照してください。

以下の例にある WRITE * では、ユーザ・ターミナルで警告音を発してプロンプトを表示し、受信済みで使用されていない文字を入力バッファからクリアします。

   SET eek="No. I can't accept that reply" 
   WRITE *7,eek,*-10

以下の 2 つの例は、WRITE *-1WRITE *-10 との違いを示します。どちらの場合も、ユーザは、最初の READ に応答して ENTER キーを押し、その後、HANG コマンドに起因する 2 つの一時停止の間に先に入力します。

  READ "type:",x HANG 4 WRITE *-1 HANG 4 READ "type:",y

上記の例で、Caché は、2 番目の READ が発行されると、入力バッファをクリアします。したがって、いずれかの HANG 中に入力したテキストはすべてバッファからクリアされます。

  READ "type:",x HANG 4 WRITE *-10 HANG 4 READ "type:",y

上記の例で、Caché は、WRITE *-10 が発行されると直ちに入力バッファをクリアします。したがって、最初の HANG の間に入力したテキストはすべてクリアされますが、2 番目の HANG 中に入力したテキストはすべて 2 番目の READ コマンドに提供されます。

以下の例は、WRITE /mnemonic で制御ニーモニック CUP (CUrsor Position) を使用し、ターミナルの 4 行 3 列目にカーソルを移動します。この例では、事前定義のニーモニック空間 ^%X364 は USE コマンドで指定し、開いているターミナル・デバイスの名前は terminal 変数を使用して指定します。^%X364 の詳細は、"ターミナルの事前定義ニーモニック空間" を参照してください。

   USE terminal:(80:"BP"):"%X364"
   SET %1=3,%2=4
   WRITE /CUP(%1,%2)

CLOSE コマンド

OPEN コマンドで取得したデバイスの所有権を解放します。

構文

CLOSE device

詳細は、"ObjectScript ランゲージ・リファレンス" の "CLOSE" を参照してください。

ターミナルの事前定義ニーモニック空間

Caché では、ターミナルでの使用のために、以下の 2 つの事前定義ニーモニック空間を提供します。

  • ANSI X3.64 ターミナル用 ^%X364

  • DTM PC コンソール用 ^%XDTM

これらのニーモニック空間の 1 つをアクティブにすると、関連する制御ニーモニックも WRITE /mnemonic コマンドで使用できます。また、独自のニーモニック空間も生成できます。ニーモニック空間の詳細は、"ターミナル入出力" の章の "ニーモニック空間によるデバイス制御" を参照してください。

以下のセクションは、ニーモニック空間用制御ニーモニックを説明しています。

X3.64 のニーモニック空間

Caché は、ANSI X3.64 を定義するために、組み込みのニーモニック空間を提供します。このニーモニック空間は、管理者のネームスペース内にある Caché ルーチン %X364 です。以下のいずれかの方法で、ルーチン %X364 を使用します。

  • Caché システム管理者が [IO 設定] 構成設定で、既定のニーモニック空間として %X364 を入力します。管理ポータルから、システム, 構成, デバイス設定, IO設定 を選択します。

  • このニーモニック空間を指定する OPEN コマンドを発行します。

     OPEN "terminal"::"^%X364"

以下のテーブルは、ニーモニックのリストです。

%X364 ニーモニック空間の制御ニーモニック
呼び出しシーケンス 名前 影響を受けるシステム変数
APC アプリケーション・プログラム・コマンド
BEL 警戒音を鳴らす
CBT(%1) カーソル後退タブ $X
CCH 取り消し文字
CHA(%1) カーソル水平絶対位置 $X
CHT(%1) カーソル水平タブ $X
CNL(%1) カーソル行送り $X,$Y
CPL(%1) カーソル前行移動 $X,$Y
CPR カーソル位置の報告
CTC(%1,%2,%3,%4, %5,%6,%7,%8,%9) カーソル・タブ制御
CUB(%1) カーソル後退 $X
CUD(%1) カーソル下方移動 $Y
CUF(%1) カーソル前方移動 $X
CUP(%1,%2) カーソル位置 $X, $Y
CUU(%1) カーソル上方移動 $Y
CVT(%1) カーソル垂直タブ $Y
DA デバイス属性
DAQ(%1,%2,%3,%4, %5,%6,%7,%8,%9) 適用範囲の定義
DCH(%1) 文字削除
DCS デバイス制御文字列
DL(%1) 行削除
DMI 手動入力の無効
DSR(%1) デバイス・ステータスの報告
EA(%1) 範囲内消去
ECH(%1) 文字消去
ED(%1) 表示内消去
EF(%1) フィールド内消去
EL(%1) 行内消去
EMI 手動入力の有効
EPA 保護範囲の終了
ESA 選択範囲の終了
FNT フォント選択
GSM 図形サイズの変更
GSS 図形サイズの選択
HPA(%1) 水平位置属性 $X
HPR(%1) 相対水平位置 $X
HTJ 調整付き水平タブ $X
HTS 水平タブ設定 $X
HVP(%1,%2) 水平垂直位置 $X, $Y
ICH(%1) 文字挿入
IL(%1) 行挿入
IND インデックス $Y
INT 割り込み
JFY 位置調整
MC 媒体のコピー
MW メッセージ待機
NEL 次行 $X, $Y
NP(%1) 次ページ
OSC オペレーティング・システム・コマンド
PLD 一部行下方送り $Y
PLU 一部行上方送り $Y
PM 秘匿メッセージ
PP(%1) 先行ページ
PU1 非公開使用 1
PU2 非公開使用 2
QUAD QUAD
REP(%1) REPEAT $X, $Y
RI リバース索引 $Y
RIS 初期状態へのリセット $X=0 $Y=0
RM(%1,%2,%3,%4,% 5,%6,%7,%8,%9) リセット・モード
SEM 範囲編集モードの選択
SGR(%1,%2,%3,%4, %5,%6,%7,%8,%9) 図形表示の選択
SL 左スクロール
SM(%1,%2,%3,%4,% 5,%6,%7,%8,%9) 設定モード
SPA 保護範囲の開始
SPI スペースの追加
SR 右スクロール
SS2 単一シフト 2
SS3 単一シフト 3
SSA 選択範囲の開始
ST ターミネータ文字列
STS 転送状態の設定
SU 上方スクロール
TBC タブ・クリア
TSS 半角スペース指定
VPA(%1) 垂直位置属性 $Y
VPR(%1) 相対垂直位置 $Y
VTS 垂直タブ設定

DTM PC コンソール用ニーモニック空間

Caché は、DTM アプリケーション開発用に使用するニーモニックに適合した Caché ルーチン %XDTM を提供します。このニーモニック空間は有効ですが、ターミナルの既定のニーモニック空間としては設定されません。DTM 用に生成したアプリケーションを Caché に移植する場合、以下のいずれかを実行します。

  • 管理ポータルで、^%XDTM をターミナルの既定のニーモニック空間 ([MnemonicTerminal]) として構成します。

  • OPEN コマンドまたは USE コマンドを使用して、^%XDTM ニーモニック空間を参照します。

DTM の例

UNIX®

  OPEN "/dev/tty04/"::"^%XDTM"

Windows

  OPEN "c:\sys\user"::"^%XDTM"

その後、Caché は、以下のテーブルのように、DTM 制御ニーモニックを WRITE /mnemonic コマンドに適切に変換します。

DTM PC コンソール用制御ニーモニック
ニーモニック 説明
AA 通常モード
AB 太字モード
AC 下線モード
AD 太字、下線モード
AE 反転映像
AF 反転映像/太字モード
AG 反転映像/下線モード
AH 反転映像/太字、下線モード
AI 点滅モード
AJ 太字、点滅モード
AK 下線、点滅モード
AL 太字、下線、点滅モード
AM 反転映像/太字、点滅モード
AN 反転映像/太字、点滅モード
AO 反転映像/下線、点滅モード
AP 反転映像/太字、下線、点滅モード
AZ モード Z
B(%1,%2) 映像属性の設定:%1 は文字属性、%2 はフレーム・クリア属性
BOX ウィンドウ相対ユーティリティ・ボックスの描画
C(%1,%2) カーソルを列 %1、行 %2 に配置
CLR 現在のフレームをクリア
COLOR(%1,%2) IBM PC 標準色に設定 : 前景 %1、背景 %2
DC(%1) %1 文字の削除
EC(%1) %1 文字の消去
EF フレームの最後まで消去
EL 行の最後まで消去
F(%1,%2,%3, %4,%5) 左上隅の行幅 %4、行高 %5 の四角い領域を $CHAR(%1) で埋める
GETCUR ターミナル・カーソル位置に戻る
HF 画面の半輝度化の解除
HIDECURSOR マウス・カーソルを隠す
HN 画面を半輝度化
IC(%1) %1 文字の挿入
LF リテラル・モードを無効
LN リテラル・モードを有効にし、PC の画面に制御文字を画像で表示
MARK(%1) 画面に印付け
NORM 標準表示属性を有効
PAD(%1) パディング用として %1 NULLS を書き込み
PF 一時停止の解除
PN 一時停止
RF 反転映像画面オフ
RN 反転映像画面
SD(%1,%2,%3) 現在のフレームを %3 行ずつスクロール・ダウン
SHOWCURSOR マウス・カーソルの表示
SU(%1,%2,%3) 現在のフレームを %1 から %2 に %3 行ずつスクロール・アップ (ただし、行 %2 は含まない)
VF カーソル表示オフ
VN カーソル表示オン
WBOX 画像相対ユーティリティ・ボックスの描画
WCLOSE ユーティリティ・ウィンドウを閉じる
WINDOW スクロール・ウィンドウの設定
WOPEN ユーティリティ・ウィンドウを開く
Y(%1) バイナリ・フレーム属性の設定

PRINT コマンドと ZPRINT コマンド

現在ロードしている Caché ルーチンの 1 行以上を、現在のデバイスに書き込みます。

ZPRINT は、PRINT と同じ機能と引数を持ちます。

構文

PRINT
ZPRINT
PRINT x
ZPRINT x
PRINT x:y
ZPRINT x:y

各項目の内容は次のとおりです。

引数 定義
(なし) 引数なしの PRINT あるいは ZPRINT コマンドは、すべてのルーチンを出力します。
x,y 変数 xy は、出力する行範囲を示します。TAG+OFFSET 形式の行参照、あるいは +7 の形式の行数のいずれかになります。ルーチン内以外の行を参照すると、ルーチンの最終行に続く空の行があるものと見なします。x は、出力する最初の行あるいは唯一の行です。y は、出力する最後の行です。

詳細は、"ObjectScript ランゲージ・リファレンス" の "PRINT" を参照してください。

以下の例では、現在のルーチンの最初の行、INIT で開始する 4 行目、FINI から最後までの行すべてを出力します。

INIT
  SET a=1
  SET b=2
  SET c=3
  SET d=4
FINI
  SET x=24
  SET y=25
  SET z=26
  PRINT +1,INIT:INIT+3,FINI:+9999

ターミナルのプログラミング

Caché を使用したフォーマット済み CRT 画面のプログラム

ターミナル入出力の機能の中には、次のようにフォーマット済み画面のプログラムに役立つものもあります。

  • WRITE * を使用して、制御文字を簡単に送信する

  • READ を使用して、エスケープ・シーケンスの応答を受信する

  • SET $X = expressionSET $Y = expression を使用して、現在のカーソル位置を更新する

固定長の READ とプログラム固有の終端文字により、個々のフィールドの読み取りが簡単になります。隠しプロトコルを使用して、パスワードを非表示にできます。

WRITE * は、$X$Y も変更しません。変更するには、WRITE $C(X) を使用するか、それらを明示的に設定します。

この例は、VT100 カーソルを行 10 列 20 に設定します。

%SYS>SET DY=10,DX=20
%SYS>WRITE *27,*91,DY+1,*59,DX+1,*72 SET $Y=DY,$X=DX

CURRENT^%IS を使用した変数設定

ユーティリティ・ルーチン CURRENT^%IS は、現在のデバイスで作業するのに役立つローカル変数を設定します。このルーチンを呼び出すには、以下を入力します。

%SYS>DO CURRENT^%IS

このコマンドは、以下の変数を設定します。

CURRENT^%IS で使用できる機能
コード 定義
W @FF 画面をクリアし、左上隅 (列 0、行 0) にカーソルを移動して $X=0、$Y=0 とします。
S DX=42,DY=10 X XY $X=42、$Y=10 をそのままにした状態で、カーソルを直接列 42、行 10 に移動します。

エスケープ・シーケンスのプログラミング

エスケープ・シーケンスの ANSI 規格により、スマート・ターミナル・プログラムを実用できます。エスケープ文字とそれに続くすべての文字は画面に表示されませんが、$X$Y が更新されます。WRITE * 文を使用してターミナルにエスケープ・シーケンスを送信し、$X$Y を直接設定して最新の状態にします。

ANSI 規格は、エスケープ・シーケンスの標準構文を規定しています。特定のエスケープ・シーケンスの機能は、使用するターミナルの種類によって異なります。

READ の後に続く $ZB に、入力されたエスケープ・シーケンスが記述されます。Caché は、ANSI 規格のエスケープ・シーケンスと、ANSI 形式を使用する他のエスケープ・シーケンスを $ZB に置きます。Caché は、エスケープ・シーケンスの以下の 2 つの形式を認識します。

通常形式

  • ESC

  • オプションとして、文字 “O”、10 進数値 79

  • ゼロ個以上の 10 進数値 3247 の文字

  • 10 進数値 48126 の 1 文字

制御形式

  • ESC 文字、10 進数値 27

  • “[” 文字、10 進数値 91

  • ゼロ個以上の 10 進数値 4863 の文字

  • ゼロ個以上の 10 進数値 3247 の文字

  • 10 進数値 64126 の 1 文字

さらに、シーケンスは 16 文字以下とする必要があります。この形式や規則に従わないエスケープ・シーケンスを使用すると $ZA のビット 8 が設定され、その値は 256 になります。

ここでは、Help キーを押すと、2 文字のシーケンス Escape-? が送信されるターミナルをプログラムしているとします (? は、10 進数値 63 です)。

%SYS>SET HELP=$C(27,63)
ASK READ !,"Enter ID: ",X I $ZB=HELP Do GIVEHELP GoTo ASK

このルーチンは、以下のように非標準のエスケープ・シーケンスを検出できます。

  1. ESC をターミネータにします。

  2. ESC$ZB に表示された場合、以下を実行します。

    1. 隠しプロトコルのエコーを無効にし、$X/$Y が変更されないようにします。

    2. READ * で残りのシーケンスを読み取ります。

    3. 隠しプロトコルを無効にし、再度エコーを使用できるようにします。

      以下の図では、ユーザに ID を入力するよう要求しています。ユーザが、Esc-? を押すと、ヘルプ画面が表示されます。サブルーチン ESCSEQ は、非標準エスケープ・シーケンスの最後にアスタリスク “*” が使用されていることを前提としています。

DEMOS 
  SET HELP=$C(27,63) ;Get Help with <ESC>?
    SET ESC=$C(27) USE 0:("":"":ESC) ; Make <ESC> a READ terminator
                                     ; character
ASK READ !,"Enter ID: ",X I $ZB=ESC Do ESCSEQ G:SEQ=HELP ASK 
    . ;Input ID. Handle Help request. 
    .
    Quit
HELPSCR  ;Process Help request 
    . 
    Quit
ESCSEQ  USE 0:("":"S") SET SEQ=ESC ;Set terminal to no echo,init SEQ 
    FOR I=1:1 {
      READ *Y 
      SET SEQ=SEQ_$C(Y)
      QUIT:Y=42 }
    ; Read in Escape sequence, 
    ; end at "*" 
    USE 0:("":"":ESC) Quit ;Redefine terminator

全二重および半二重ターミナルとエコーのサポート

Caché は、全二重ターミナルの使用を想定しています。つまり、キーボードの動作は、プリンタや画面に依存していない必要があります。

全二重とは、双方向で同時に独立して送信が行われるということです。半二重とは、一度に片方向のみの送信を意味します。二重ターミナルは、エコーと関係ありません。しかし、リモート・エコーを全二重、ローカル・エコーを半二重と表示しているターミナルもあります。これは、入力した文字がターミナル自身で表示され、Caché はその文字をエコーしないことを意味します。

ターミナルのローカル・エコーあるいは全二重を無効に設定し、Caché がエコーできるようにします。エコーが発生するのは、コンピュータが文字を受け取ったときではなく、READ コマンドが入力バッファから文字を取得したときです。したがって、プロンプトとダイアログの応答は、ユーザが事前に入力したかどうかに関係なく、画面の決められた位置に表示されます。

公開ネットワークの中には、ターミナルに独自のエコーを供給するものもあります。

Windows システムでは、コンソールはローカル・エコーの設定変更を許可していません。ターミナル・エミュレータ (例えば VT220) 経由のターミナルでは、ターミナル・エミュレータ・ドキュメントを参照して、ローカル・エコーを無効にしてください。

UNIX® では、stty コマンドを使用して二重エコーを防ぎ、$X$Y がカーソル位置と一致しているようにします。

Caché がサポートするコンピュータ間リンクと特殊デバイス

Caché は、柔軟なプロトコルと大容量バッファを提供しており、ルーチンが特殊なデバイスとそのプロトコルを処理できるようにしています。例えば、Caché は、ターミナル・リンクで接続された 2 台のコンピュータ間の全二重通信を簡単にサポートしています。2 つの Caché システムで必要な操作は、物理的な接続、適切なプロトコルの指定、および同一の速度、パリティ、文字列長の設定のみです。外部コンバータを使用すると、Caché は、同期 EBCDIC ターミナルのように IBM ポートと通信できます。

コンピュータ間のリンクを設定する場合、以下の点に注意してください。

  • OPEN コマンドまたは USE コマンドで S プロトコルを指定するか、オペレーティング・システムのターミナル・パラメータを使用して、両方のエコーを無効にします。

  • 通信プロトコルが XON/XOFF フロー制御 (Ctrl-QCtrl-S) をサポートしていない場合、未応答の送信はオペレーティング・システムの入力バッファ範囲内に制限してください。

  • イメージ・モードの場合、Caché は XON/XOFF をサポートしません。非イメージ (通常) モードでは、オペレーティング・システムの入力バッファが一杯の場合、コンピュータが XOFF を発行するかどうかは、オペレーティング・システムのターミナル・パラメータで決まります。XOFF と XON がサポートされていない場合、その必要がないようバッファに余裕を持たせてください。

  • 読み取り操作の後で $ZA をテストして、パリティやデータのオーバーラン状態などの送信エラーを検出します。

FeedbackOpens in a new tab