SCAN (ストリングの走査)

コード 演算項目 1 演算項目 2 結果フィールド 標識
SCAN (E) 比較ストリング:長さ 基本ストリング: 開始 左端の位置 _ ER FD

SCAN 命令では、演算項目 2 に入っているストリング (基本ストリング) を走査して、演算項目 1 に入っているサブストリング (比較ストリング) を見付けます。 走査は、演算項目 2 に入っている指定位置から開始されて、演算項目 1 に指定されている比較ストリングの長さだけ続けられます。 比較ストリングと基本ストリングは両方とも同じタイプ (すなわち、両方とも文字、両方とも図形、または両方とも UCS-2) でなければなりません。

演算項目 1 には、比較ストリングか、比較ストリングにコロンを付け長さを 指定したものを入れなければなりません。 演算項目 1 の比較ストリング部分には、フィールド名、配列要素、名前のつい た定数、データ構造名、リテラル、またはテーブル名のいずれかを入れる ことができます。 長さの部分は小数点以下の桁数がゼロの数値でなければならず、名前のついた 定数、配列要素、フィールド名、リテラル、またはテーブル名のいずれかを 入れることができます。 長さが指定されていない場合には、比較ストリング の長さになります。

演算項目 2 には、基本ストリングか、 または基本ストリングにコロンを付け SCAN の開始位置を指定したものを入れなければなりません。 演算項目 2 の基本ストリング部分には、フィールド名、配列要素、名前のつい た定数、データ構造名、リテラル、またはテーブル名のいずれかを入れる ことができます。 演算項目 2 の開始位置部分は、小数点以下の桁数がゼロの数値でなければなら ず、名前のついた定数、配列要素、フィールド名、リテラル、またはテー ブル名とすることができます。 図形または UCS-2 ストリングが使用された場合、開始位置と長さは 2 バイト単位で測定されます。開始位置が指定されていない場合には、値 1 が使用されます。

結果フィールドには、基本ストリング中の比較ストリングの左端の位置の数 値 (見付かった場合) が入ります。 これは小数点以下の桁数がゼロの数値でな ければならず、フィールド名、配列要素、配列名、またはテーブル名のいずれ かを入れることができます。 ストリングが見付からない場合には、結果フィールドは 0 に設定されます。 結果フィールドに配列が入っている場合には、 比較ストリングのそれぞれのオカレンス が配列に入れられて、左端のオカレンスが要素 1 に入れられます。右端のオカレンス が入っている要素の後の配列要素はすべてゼロになります。 結果の配列は、演算項目 2 に指定された基本ストリングのフィールド長と同じ 長さでなければなりません。
注:
  1. ストリングには 1 桁目から指標が付きます。
  2. 開始位置が 1 より大きい場合には、結果フィールドに、開始位置からでな く、基本ストリングの先頭からの比較ストリングの相対位置が入ります。
  3. 演算項目 1、演算項目 2、または結果フィールドに形象定数を使用することは できません。
  4. データ構造内に演算項目 1 と結果フィールドまたは演算項目 2 と結果フィ ールドのオーバーラップがあってはなりません。

SCAN 例外 (プログラム状況コード 100) を 処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラーは、開始位置が演算項目 2 の長さより大きい場合、または演算項目 1 の 値が大き過ぎる場合に起こります。 エラー処理の詳細については、プログラム例外/エラーを 参照してください。

走査中のストリングが見付かった場合にオンに設定される標識を 75 から 76 桁目に 指定することができます。 この情報は %FOUND 組み込み関数からも入手することが できます。この関数は、等しい項目が見付かった場合に '1' を戻します。

SCAN は、演算項目 2 の左端文字 (開始位置によって指定) から開始されて、 演算項目 2 の文字を演算項目 1 の文字と比較しながら、左から右へと 1 文字 ずつ続けられます。 結果フィールドが配列以外の場合には、SCAN 命令で比較ス トリングの最初のオカレンスだけが見付けられます。 最初のオカレンスを超えて走査を続行するためには、前の SCAN 命令の結果フ ィールドを使用して、次の SCAN の開始位置を計算してください。 結果フィールドが数値配列の場合には、配列内の要素と同数のオカレンスが記 録されます。 オカレンスが見付からない場合には、結果フィールドはゼロに設定されます。結果フィールドが配列の場合には、そのすべての要素がゼロに 設定されます。

比較ストリングに指定された先行ブランク、後書きブランク、または組み込み ブランクは SCAN 命令に含まれます。

SCAN 命令では大文字と小文字が区別されます。 大文字で指定された基本ス トリングの中から小文字で指定された比較ストリングを見付けることはできま せん。

詳細については、ストリング命令を参照してください。

図 1. SCAN 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * The SCAN operation finds the substring 'ABC' starting in
 * position 3 in factor 2;  3 is placed in the result field.
 * Indicator 90 is set on because the string is found.  Because
 * no starting position is specified, the default of 1 is used.
C     'ABC'         SCAN      'XCABCD'      RESULT                   90
 *
 * This SCAN operation scans the string in factor 2 for an
 * occurrence of the string in factor 1 starting at position 3.
 * The 'Y' in position 1 of the base string is ignored because
 * the scan operation starts from position 3.
 * The operation places the values 5 and 6 in the first and
 * second elements of the array.  Indicator 90 is set on.
C
C                   MOVE      'YARRYY'      FIELD1            6
C                   MOVE      'Y'           FIELD2            1
C     FIELD2        SCAN      FIELD1:3      ARRAY                    90
 *
 * This SCAN operation scans the string in factor 2, starting
 * at position 2, for an occurrence of the string in factor 1
 * for a length of 4.  Because 'TOOL' is not found in FIELD1,
 * INT is set to zero and indicator 90 is set off.
C
C                   MOVE      'TESTING'     FIELD1            7
C                   Z-ADD     2             X                 1 0
C                   MOVEL     'TOOL'        FIELD2            5
C     FIELD2:4      SCAN      FIELD1:X      INT90            20
C
 *
 * The SCAN operation is searching for a name.  When the name
 * is found, %FOUND returns '1' so HandleLine is called.
C     SrchName      SCAN      Line
C                   IF        %FOUND
C                   EXSR      HandleLine
C                   ENDIF                
図 2. 図形を使用する SCAN 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++
 *
 *       A Graphic SCAN example
 *
 *       Value of Graffld is graphic 'AACCBBGG'.
 *       Value of Number after the scan is 3 as the 3rd graphic
 *       character matches the value in factor 1
D Graffld       S              4G   inz(G'oAACCBBGGi')
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..
 * The SCAN operation scans the graphic string in factor 2 for
 * an occurrence of the graphic literal in factor 1. As this is a
 * graphic operation, the SCAN will operate on 2 bytes at a time
C
C     G'oBBi'       SCAN      Graffld:2     Number            5 0    90
C