CHG_OUT

1. Syntax

1  CHG_OUT (
1  old ,
2.1 new
1  , new
2  ,
1! 1
1 count
3  ,
1! 1
1 start
4  ,
1! 0
1 length
5  ,
1! ''
1 text_char
6  )
注: 最後に指定された引数の後のコンマは省略可能です。

FASTREXX プロシージャーで使用できます。

出力レコードの中の old ストリングの 1 つ以上のオカレンスを new ストリングに変更します。また、正常に実行されると、OUTPOS の値も更新され、出力レコード内で最後に変更されたフィールドの終わりから 1 バイト先の位置になります。

Returns
単一のブランク。
old
変更する旧ストリング。この引数が省略されると、新規ストリングは start の位置に挿入されます。
&varname を指定して、文字変数、数値変数、または TALLY リテラルを置換できます。ここで、varname は既存の変数名と一致します。
注:
  1. 数値は、先行ゼロが除去された表示画面形式に変換されます。
  2. 変数名が検出されない場合、ストリングはリテラルに解釈されます。
new
新規ストリング。この引数が省略されると、oldcount 個のオカレンスが削除されます。
&varname を指定して、文字変数、数値変数、または TALLY リテラルを置換できます。ここで、varname は既存の変数名と一致します。
注:
  1. 数値は、先行ゼロが除去された表示画面形式に変換されます。
  2. 変数名が検出されない場合、ストリングはリテラルに解釈されます。
count
変更する old のオカレンスの 最大数。負でない整数でなければなりません。デフォルト値は 1 です。値が 0 の場合、 old ストリングのフィールドが省略されない限り (この場合は、値が 1 であることと同等です)、すべてのオカレンスが変更されます。
start
old のオカレンスの検索を開始する出力レコード内の 位置 (バイト単位)。以下のように指定できます。
絶対位置
正の整数である必要があります。デフォルト値は 1 です。start が出力レコードの現在の長さより大きければ、この関数は無効になります。
現行 INPOS からの相対位置
IPx または INx として指定する必要があります。結果の値がゼロ以下になる場合、関数はエラーとなります。結果の値が出力レコードの現在の長さより大きいと、この関数は無効になります。
現行 OUTPOS からの相対位置
OPx または ONx、あるいは Px または Nx として指定できます。結果の値がゼロ以下になる場合、関数はエラーとなります。結果の値が出力レコードの現在の長さより大きいと、この関数は無効になります。
length
old のオカレンスを検索する出力レコードの 量 (バイト数)。負でない整数でなければなりません。デフォルト値は 0 です。値が 0 の場合、start から出力の残りの部分が検索されることを示します。lengthold より小さければ、この関数は無効になります。
text_char
ヌル・ストリングまたは単一文字を指定できます。

ヌル・ストリング (デフォルト) の指定は、CHG_OUT がテキストに依存することなく動作することを示します。

単一文字の指定は、特殊なテキスト依存型の文字を定義し、テキストに依存した変更動作が必要であることを示します。text_char に文字が指定されると、CHG_OUT は次のように動作します。
  • 新規ストリングと旧ストリングの長さが同じである場合、CHG_OUT は、テキストに依存した変更動作が要求されない場合と同じように動作します。
  • 新規ストリングが旧ストリングより短い場合、置換が行われると、CHG_OUT は置換されたストリングの終わりに続く最初の text_char 文字を検索します。レコード全体が検索される点に注意してください。text_char 文字が検出されると、この最初の後続文字の場所に追加の text_char 文字が挿入されて、new と old の長さの差を埋めます。text_char 文字がレコードの残りで検出されない場合は、挿入は行われず、レコードの長さが短くなります。レコードが固定長で、不足を補う後続のアクションが行われない場合、File Manager レコード埋め込みプロセスにより、書き込み時にレコードが埋められます。

    意図された効果は、複数行のテキストが、text char 文字で区切られる列で位置合わせされた場合に、置換後も列で位置合わせされるようにすることです。これは、COBOL または JCL など右側にシーケンス番号があるファイルを更新する場合に有用です。

  • 新規ストリングが旧ストリングより長い場合、置換が行われると、CHG_OUT は置換されたストリングの右側で 2 つの連続した text_char 文字を検索します。レコード全体が検索される点に注意してください。2 つの連続した text_char 文字が検出されると、これらの文字は単一の text_char 文字に置き換えられます。このプロセスは、残りの単一文字 (その文字も含む) から開始して、新旧ストリングの長さの差になるまで繰り返されます。このアルゴリズムを使用すると、複数の text_char 文字が単一の text_char 文字に減りますが、他の文字の間にある単一の text_char 文字が除去されることはありません。

    意図された効果は、ストリングにある既存の ブランク 領域を使用して、可能な限り右側のテキストを未変更のまま残そうとすることです。この目的を達成するために十分な数の text_char 文字があることは保証されません。text_char 文字数が不十分である場合、レコードの残りは右側にシフトされ、長さが固定の場合は書き込み時に切り捨てられることがあります。これは、右側にシーケンス番号がある COBOL または JCL ソースなどのファイルを変更する場合に有用です。

  • 複数のストリング置換を指定している場合も (count が 1 より大きい場合)、その意図は同じです。検索は左から右に進められ、最初に検索引数が検査され、次に展開または縮小する text_char 文字が検査されます。検索引数は検出されると置き換えられ、検索は置換されたストリングの直後から続行されます。
  • ストリング置換が length 引数によりバイト位置に限定されることがある点に注意してください。ただし、追加または除去する text char 文字の検索は、必要に応じて、その制限を超えてレコードの終わりまで続行されます。

例 1

現在の出力レコードに「abcabcabcabcabcabcabc」が含まれているとした場合、以下を実行すると、

CHG_OUT('abc','DeF',0)
/*  All occurrences of old within the            */
/*  output record are changed                             */

出力レコードは「DeFDeFDeFDeFDeFDeFDeF」となります。

例 2

現在の出力レコードに「abcabcabcabcabcabcabc」が含まれているとした場合、以下を実行すると、

CHG_OUT('abc','DeF',,4)
/*  1 (default) occurrences of old changed,      */
/*  starting at position 4 within the output record       */

出力レコードは「abcDeFabcabcabcabcabc」となります。

例 3

現在の出力レコードに「aaaaaaaaaa」が含まれているとした場合、以下を実行すると、

CHG_OUT('a','A',0,3,2)
/*  all occurrences of old changed, starting at  */
/*  position 3 in the output record, for a length of 2    */

出力レコードは「aaAAaaaaaa」となります。

例 4

現在の出力レコードに「abcabcabcabcabcabcabc」が含まれ、INPOS が現在 13 に、OUTPOS が現在 4 に設定されているとした場合、以下を実行すると、

CHG_OUT('abc','DeF',1,P3)
/*  1 occurrence of old changed,                 */
/*  uses OUTPOS as the default target, therefore          */
/*  starts at position 7 within the output record         */

出力レコードは「abcabcDeFabcabcabcabc」となり、OUTPOS は 10 に設定されます (INPOS は未変更)。

例 5

現在の出力レコードに「abcabcabcabcabcabcabc」が含まれ、INPOS が現在 13 に、OUTPOS が現在 4 に設定されているとした場合、以下を実行すると、

CHG_OUT('abc','DeF',1,IN3)
/*  1 occurrence of old changed,                 */
/*  forces start to use INPOS value, therefore            */
/*  starts at position 10 within the output record        */

出力レコードは「abcabcabcDeFabcabcabc」となり、OUTPOS は 13 に設定されます (INPOS は未変更)。