GT.Mの組み込み特殊変数は、アプリケーション・コードがデバイスの状態を通信および管理するための手段を提供します。
GT.Mは、デバイスを識別する3つの固有の特殊変数が用意されています。
最後にUSEコマンドで指定されたカレントデバイスの名前を含みます。SETコマンドで$IOは変更できません。USEは、USE $PRINCIPAL として$IOと同じように生成しますが、しかし、$Pは好ましい構造です。
プロセスはその親からSTDIN、STDOUT、STDERRの3つのオープン・ファイル・ディスクリプタを継承します。これらのファイル・ディスクリプタはすべて異なるファイルやデバイスにマップできます。GT.MはMアプリケーションがSTDERRにアクセスする方法を提供しません。STDINとSTDOUTはオペレーティングシステム内の異なるデバイス、ファイル、ソケット、パイプなどにマップすることができますが、Mはデバイス$PRINCIPALのみを提供し、両方を参照します。プロセスの起動時および$PRINCIPALがUSEコマンドで選択されている場合、READコマンドはSTDINに適用され、WRITEコマンドはSTDOUTに適用されます。標準入力のデバイス・タイプによって、どのUSEデバイス・パラメータが$PRINCIPALに適用されるかが決まります。
対話型プロセスの場合、$PRINCIPALはユーザーの端末です。GT.Mはプリンシパル(主)デバイスのCLOSEを無視します。GT.Mは、$PRINCIPALの内容を変更するSETコマンドを許可しません。
0は、$PRINCIPALの代わりに使用されます(たとえば、USE 0)。FISは、アプリケーション・コードが$PRINCIPALを使用することを推奨しています。環境変数 gtm_principal を使用して、$PRINCIPALにGT.Mによって報告された文字列を設定し、USEコマンドに対して$PRINCIPALの代わりに使用することができます。
GT.Mには、仮想的なカーソル位置を決定するために、2つの固有の特殊変数が備わっています。$Yが現在の行を指し示している間、$Xは現在の列を指します。
$Xは、現在の出力レコード内の仮想カーソルの水平位置を指定し、0〜65,535の範囲の整数値が含まれています。$X=0 は、新しいレコードまたは行の最初の位置を表します。
OPENされたすべてのデバイスは、$Xを持っています。しかし、GT.Mは、現デバイスの$Xへのアクセス権だけを持ちます。
一般に、Mモードでは、GT.Mは現在のデバイスに書き込まれ、読み出されるすべての文字に対して$Xをインクリメントします; UTF-8モードのデバイスの動作については、以下を参照してください。GT.Mフォーマットの制御文字、FILTERと、デバイスのWIDTHとWRAPもまた$Xで影響を受けます。
$X はプログラム・トラック出力を支援するためのカウンタに過ぎないため、SET $Xはカーソルの位置を変更したり、他のIOを実行したりしません。逆に、端末またはWRITEによって他のデバイスに送信された一連の文字が、以下に説明されている場合を除いて再配置される場合、$X はこの変更を反映しません。
$Yは、現在の出力レコード内の仮想カーソルの垂直位置を指定し、0〜65,535の範囲の整数値が含まれています。$Y=0 は、行またはラインの一番上を表します。
OPENされたすべてのデバイスは、$Yを持っています。しかし、GT.Mは、現デバイスの$Yへのアクセスを持ちます。
GT.Mが進行中の論理レコードが終了すると、一般的に$Yがインクリメントします。特定のGT.Mフォーマットの制御文字を処理する時、または、デバイスWIDTHによって決定されていてそしてデバイスがWRAPする設定がされていて、レコードがその最大サイズに達する時に、GT.Mは論理レコードの終わりを認識します。"logical record(論理レコード)" の定義は、デバイスそれぞれによって異なります。正確な定義については、各デバイスのタイプにあるセクションを参照してください。FILTERとデバイス LENGTHはまた、$Yに影響を与えます。
$Yはプログラム・トラックの出力を支援するためのカウンタに過ぎないので、SET $Yはカーソルの位置を変更したり、他のIOを実行したりしません。逆に、端末またはWRITEによって他のデバイスに送信された文字のシーケンスが、以下に説明する場合を除いて再配置される場合、$Y はこの変更を反映しません。
以下の要因は、仮想カーソルの位置($Xと$Y)のメンテナンスに影響します。
仮想 "ページ" の境界
フォーマットの制御文字
フィルタリングGT.M文字
各デバイスは、仮想"ページ"を定義するWIDTHとLENGTH を持ちます。LENGTHがどのくらいのレコード数がページに収まるかを決定する時には、WIDTHはデバイスのレコードの最大サイズを決定します。GT.Mは、現レコードのサイズ($X)が最大幅に達しデバイスが有効になっているWRAPを持っている時、GT.Mは新しいレコードを開始します。現在のライン($Y)が最大のLENGTHに達すると、GT.Mは新しいページを開始します。
GT.Mは、仮想カーソルの操作を可能にするいくつかの書式制御文字(WRITEコマンドのコンテキストで使用される)があります。すべてのI/Oデバイスの場合、GT.Mフォーマットの制御文字は、以下のように実行します。
! : $X を ゼロ(0)に設定し、$Yをインクリメントし、進行中の論理レコードを終了します。"論理レコード" の定義は、デバイスごとに異なりますし、それぞれのデバイスのセクションで説明されています。
# : $Xと$Yをゼロ(0)に設定し、進行中の論理レコードを終了します。
?n : n が $Xより大きい場合、n-$X個のスペースをデバイスに書き込み、$Xをnにします。もし n の数が$X以下の場合、?n は 効果ありません。WRAPが有効であって n がラインのWIDTHを超える時には、WRITE ?n は、$Yをインクリメントし n#WIDTHに等しい$xをセットします( #はGT.Mのモジュロ(剰余)演算子)。
UTF-8モードでは、GT.Mは次の測定単位で$Xをメンテナンスします。
デバイス |
Input |
Output |
---|---|---|
FIFO |
コード・ポイント |
列表示 |
PIPE |
コード・ポイント |
列表示 |
SD |
コード・ポイント |
列表示 |
SOC |
コード・ポイント |
コード・ポイント |
TRM |
列表示 |
列表示 |
GT.Mは、文字フィルタリングの2つのモードが用意されています。フィルタリングが有効になっている時には、特定の<CTRL>文字および/またはエスケープシーケンスは、カーソルの位置上で特殊効果があります(例えば、もし$Xがゼロでない場合、<BS> (ASCII 8) は$Xをデクリメントします)。書き込みのフィルタリングの詳細については、 “FILTER” を参照してください。
GT.Mは、デバイス上で動作するコマンドに関する情報を伝えるいくつかのI / Oステータス変数を提供します。
最後のコマンドでエラー条件が発生しなかった場合、真偽値として解釈されたときの$DEVICEの値は0(FALSE)です。真理値として解釈される場合、もしデバイスのステータスがすべてのエラー条件、$ DEVICEの値を、反映している場合は1(TRUE)です。
PIPEで:
0は、利用可能なデータが読み取られたことを示す 0 のタイムアウトを伴うREADを示します。
"1,Resource temporarily unavailable" は、ゼロ(0)タイムアウトのREADに利用可能な入力がないことを示します。
"1,<error signature>" は読み取りエラーを示します。
0 はWRITEが成功したことを示します。
"1,Resource temporarily unavailable" は、パイプがいっぱいでWRITEがブロックするWRITEの失敗を示します。
この条件でも例外が発生します。
"1,<error signature>" は読み取りエラーを示します。
$K[EY] は、現在のデバイスから最新のREADコマンドを終了する文字列(文字の先頭と終端を含む)を含みます。現在のデバイスに対してREADコマンドが発行されてない場合、またはターミネータが使用されていない場合、$KEYの値は空の文字列です。
PIPEで:
$KEYは、PIPEに接続されたコマンドを実行する作成されたプロセス・シェルのUNIXプロセスIDが含まれています。
詳細については、 “$Key”を参照してください。
$ZAは、デバイス上で最後に読み取られた状態が含まれます。値は次のような意味を持つ10進整数です:
ターミナルI/O:
0:読み出し操作の正常終了を示します
1:パリティエラーを示します
2:ターミネータ・シーケンスが長すぎたことを示します
9:すべての他のエラーのデフォルトを示します
シーケンシャルディスク:
0:読み出し操作の正常終了を示します
9:読み取り操作の失敗を示します
FIFO:
0: 正常終了またはタイムアウトを示します
9:読み取り操作の失敗を示します
SOCKETの場合:
0: 正常終了またはタイムアウトを示します
9:読み取り操作の失敗を示します
PIPEで:
0:READ x:n を使用するときの正常終了またはタイムアウトを示します、n>0
9:READ xまたはREAD x:n の障害を示します、n>0
9:パイプがいっぱいでWRITEがブロックするWRITEの失敗を示します
注意 | |
---|---|
$ ZAは、現デバイスの状態を指します。したがって、$ZAに対してUSEコマンドおよび参照のシーケンスでは注意をはらってください。 |
$ZBは、最後にREADした端末の入力ターミネータを指定する文字列を含みます。$ZBはヌルであり、それは端末以外のデバイスのためにはメンテナンスしません。$ZBは、<CR> (ASCII 13) または <ESC> (ASCII 27) で始まるエスケープシーケンスなど、ゼロ(0)から15バイトの長さの正規の入力ターミネータが含まれる場合があります。タイムアウトによって終了される任意のREADのために、または、最大長に達する入力によって終了される任意の固定長READのために、$ZBはnullです。
$ZBは、ASCIIコードの数値のシーケンスではない、実際の文字列を含みます。
デバイスがCHSETをUTF-8またはUTF-16 *に設定してオープンされている場合、$ZBには不正な文字が含まれています。これはソケット、シーケンシャルファイル(したがってFIFOとPIPE)とターミナルに当てはまります。
例:
set zb=$zb for i=1:1:$length(zb) write !,i,?5,$ascii(zb,i)
この例では、$ZBの文字のASCIIコードのシリーズが表示されます。
$ZBは、現デバイスの最後のREADターミネータを指します。したがって、$ZBに対してUSEコマンドと参照をシーケンスするときは、注意が必要です
$ ZEOFは、最後のREAD操作がファイルの終端に達したかどうかを示す真偽値式を含みます。$ZEOFは、EOFの位置でTRUE(1)であり、他の位置でFALSE (0) です。GT.Mは、端末デバイスのために$ZEOFを持続しません。
$ZEOFAは、現デバイスのファイルの終端の状態を指します。したがって、$ZEOFに対してUSEコマンドと参照をシーケンスするときは、注意が必要です
$ZEOFは、読み込み時に接続が切断された場合にターミナルに設定されます。
$PRINCIPALの入出力デバイスが異なる場合、USEコマンドは、$PRINCIPALの入力側に適切なデバイスパラメータを適用するために、固有の特殊変数$ZPINを認識します。$ZPINを使用するUSEは、$PRINCIPALの入力側と出力側のREADとWRITEに対して$IOを$PRINCIPALに設定します。$ZSOCKET() は最初の引数として$ZPINを受け取り、デバイスがスプリットSOCKETデバイスであれば、入力SOCKETデバイスに関する情報を供給します。USEまたは$ZSOCKET()以外のコンテキストで、または、$PRINCIPALが分割されたデバイスでない場合、$PRINCIPAL、$ZPIN、$ZPOUTは同義です。分割された$PRINCIPALの場合、$ZPINは$PRINCIPALの値の後に文字列 "< /" を返します。OPEN $ZPINを試みると、DEVOPENFAILエラーが発生します。
$PRINCIPALの入出力デバイスが異なる場合、USEコマンドは、$PRINCIPALの入力側に適切なデバイスパラメータを適用するために、固有の特殊変数$ZPOUTを認識します。$ZPOUTを使用するUSEは、$PRINCIPALの入力側と出力側のREADとWRITEに対して$IOを$PRINCIPALに設定します。$ZSOCKET() は最初の引数として$ZPOUTを受け取り、デバイスがスプリットSOCKETデバイスであれば、出力SOCKETデバイスに関する情報を供給します。USEまたは$ZSOCKET()以外のコンテキストで、または、$PRINCIPALが分割されたデバイスでない場合、$PRINCIPAL、$ZPIN、$ZPOUTは同義です。分割された$PRINCIPALの場合、$ZPOUTは$PRINCIPALの値の後に文字列 "> /" を返します。OPEN $ZPOUTを試みると、DEVOPENFAILエラーが発生します。