外部 REXX 関数での絶対位置決めおよび相対位置決め
入力または出力レコード内の位置を参照するすべての File Manager 外部 REXX 関数は、レコード内のバイトの位置を決定するために絶対値を使用できます。例えば、FLD 関数の構文は、次のとおりです。
FLD(start_column,length,type)
ここで、start_column は入力レコードにある特定のバイトを 参照する整数になります。
ただし、いくつかの外部 REXX 関数では、入力または出力 レコード内の「現在位置」を相対的に表す、 オフセット値として指定される位置も許容しています。現在位置は、それぞれのレコードが処理されるときに初期化されますが、これらの関数によって変更することができます。
入力レコードの場合、このことは、入力レコード内でストリングを検索し、見つかったストリングと相対位置にあるフィールドの内容をテストしたりコピーしたりするといったタスクを実行することを可能にします。
出力レコードの場合、このことは、最近に更新された出力レコードのフィールドの相対位置に、簡単にフィールドまたは定数を追加することを可能にします。例えば、正確な現在の開始位置を追跡している必要も、追加されたフィールドの長さを開始位置に手作業で反映したりする必要もなしに、いくつもの定数やフィールドを次々に出力レコードに追加することができます。
次の関数は、相対位置決めをサポートしています。
- CHG_OUT
- CHG_VAR
- FINDNEXT
- FINDPREV
- FLD
- FLD_CO
- FLD_OUT
- FLD_TM
- FLD_TYPE
- FLDI
- FLDO
- MOD_DATE
- OVLY_OUT
- OVLY_VAR
- SETC
- SETN
- TESTC
- TESTN
- VAR_OUT
- VAR_TM
入力および出力レコード内で現行位置を保持するために、これらの関数は INPOS と OUTPOS の 2 つの内部変数を使用します。これらの変数は REXX 環境では外部化されることはなく、上記の関数または SET_OLEN を使用することで、間接的にアクセスまたは変更することしかできません (相対位置の引数はサポートされていませんが、いくつかの環境では OUTPOS の値の変更をサポートしています)。
- INPOS
- 処理されているそれぞれの新規レコードでは、INPOS は 1 に設定されます。INTPOS は、以下の関数が使用されると (副次作用として) 変更されます。
- FLD_CO
- FLD_CO 関数によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、INPOS が現在の入力レコードの位置に変更されます。needle が検出された場合、INPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
- FLDI
- FLDI 関数 (contains 演算子を使用) によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、INPOS が現在の入力レコードの位置に変更されます。needle が検出された場合、INPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
VER 演算子とともに FLDI 関数を使用し、検査が失敗した場合、INPOS は検査が失敗した文字の桁に設定されます。
- FINDNEXT
- FINDNEXT 関数によって needle の検索が正常に実行されるたびに、INPOS が変更され、検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
- FINDPREV
- FINDPREV 関数によって needle の検索が正常に実行されるたびに、INPOS が変更され、検出された needle の最初のバイトに設定されます。needle が検出されなければ、INPOS は変更されません。
- OUTPOS
- 処理されているそれぞれの新規レコードでは、OUTPOS は、現行出力レコード長より 1 だけ大きく設定されます。テンプレートがレコードの再形式設定に使用されていない限り、出力レコードは当初、入力レコードと同じ長さです。OUTPOS は、以下の関数が使用されると (副次作用として) 変更されます。
- CHG_OUT
- CHG_OUT は、出力レコード内の最後に変更されたフィールドの終わりから 1 バイト先に OUTPOS を設定します。
- FLD_OUT
- FLD_OUT は、出力レコード内のオーバーレイされているフィールドの終わりから 1 バイト先に OUTPOS を設定します。
- OVLY_OUT
- OVLY_OUT は、出力レコード内のオーバーレイされているフィールドの終わりから 1 バイト先に OUTPOS を設定します。
- SET_OLEN
- SET_OLEN は、出力レコードの切り捨てを行って、削減されたレコード長より既存の OUTPOS のほうが大きくなるような場合にのみ、OUTPOS を変更します。この場合、OUTPOS は削減された長さに 1 を加算した値にリセットされます。
- contains 演算子を使用する FLDO
- FLDO 関数 (contains 演算子を使用) によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、OUTPOS が現在の入力レコードの位置に変更されます。needle が検出された場合、OUTPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、OUTPOS は変更されません。
VER 演算子とともに FLDO 関数を使用し、検査が失敗した場合、OUTPOS は検査が失敗した文字の桁に設定されます。
- VARPOS
- 処理されているそれぞれの新規レコードでは、VARPOS は 1 に設定されます。VARPOS は、以下の関数が使用されると (副次作用として) 変更されます。
- CHG_VAR
- CHG_VAR は、変数内の最後に変更されたフィールドの終わりから 1 バイト先に VARPOS を設定します。
- OVLY_VAR
- OVLY_VAR は、変数内のオーバーレイされているフィールドの終わりから 1 バイト先に VARPOS を設定します。
- TESTC
- TESTC 関数 (contains 演算子を使用) によってストリング (タイプ C または U) である needle の検索が正常に実行されると常に、VARPOS が現行変数位置に変更されます。needle が検出された場合、VARPOS は検出された needle の最初のバイトに設定されます。needle が検出されなければ、VARPOS は変更されません。
VER 演算子と共に TESTC 関数を使用し、検査が失敗した場合、VARPOS は検査が失敗した文字の桁に設定されます。