CAT (2 つの文字ストリングの連結)

自由形式構文 (許可されていない - + 演算子を使用)
コード 演算項目 1 演算項目 2 結果フィールド 標識
CAT (P) ソース・ストリング 1 ソース・ストリング 2: ブランクの数 ターゲット・ストリング

CAT 命令は、演算項目 2 に指定されたストリングを演算項目 1 に指定されたス トリングの終わりに連結して、これを結果フィールドに入れます。ソース・ストリングとターゲット・ストリングはすべて同じタイプで、すべて文字か、すべて図形か、すべて UCS-2 のいずれかでなければなりません。演算項目 1 が指定されていない場合には、演算項目 2 は結果フィールドのスト リングの終わりに連結されます。

演算項目 1 にはストリングを入れることができ、このストリングはフィールド 名、配列要素、名前のついた定数、データ構造名、テーブル名、またはリ テラルのいずれかとすることができます。 演算項目 1 が指定されていない場合には、結果フィールドが使用されます。 次の説明では、演算項目 1 が指定されていない場合に、演算項目 1 が結果フィ ールドに適用されることを示します。

演算項目 2 にはストリングを入れなければならず、連結するストリング間に挿 入するブランクの数を入れることができます。 その形式は、ストリングの後にコロンを付けブランクの数が続いた形にな ります。 これらのブランクはデータの形式です。例えば、文字データの場合、ブランクは x'40' で、UCS-2 データの場合、ブランクは x'0020' です。ストリング部分には、フィールド名、配列要素、名前のついた定数、デー タ構造名、テーブル名、リテラル、または構造サブフィールド名のいずれかを 入れることができます。 ブランクの数の部分は小数点以下の桁数がゼロの数値でなければならず、名前 のついた定数、配列要素、リテラル、テーブル名、またはフィールド名の いずれかを入れることができます。

コロンを指定した場合には、ブランクの数を指定しなければなりません。 コロンを指定しない場合には、演算項目 1 (演算項目 1 が指定されていない場 合には結果フィールド) の後書きブランク (もしあれば) に連結が行われま す。

ブランクの数 N が指定されている場合には、演算項目 1 は結果フィールドに左 寄せでコピーされます。 演算項目 1 が指定されていない場合には、結果フィールドのストリングが使用 されます。 その後で、最後の非ブランク文字に続けて N 個のブランクが追加されます。 次に、この結果に演算項目 2 が付加されます。 結果に N 個のブランクを追加する時には演算項目 2 の先行ブランクはカウント されません。演算項目 2 の一部と見なされるだけです。ブランクの数が指定されて いない場合には、演算項目 1 と演算項目 2 の後書き および先行のブランクは結果に含められます。

結果フィールドはストリングでなければならず、フィールド名、配列要素、デ ータ構造名、またはテーブル名のいずれかを入れることができます。 その長さは、演算項目 1 と演算項目 2 に中間のブランクを加えた長さでなけれ ばならず、そうでない場合には右側で切り捨てが行われます。 結果のフィールドが可変長の場合、その長さは変わりません。

命令拡張 P は、連結が行われた後で結果フィールドが命令の結果より長い場 合に、結果フィールドの右にブランクを埋め込む必要があることを示します。 埋め込みが指定されていない場合には、このフィールドの左端部分が影響を受け るだけです。

実行時にブランクの数がゼロより小さい場合には、コンパイラーはデフォルトの値 としてブランクの数をゼロとします。

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

注:
演算項目 1、演算項目 2、または結果フィールドに形象定数を使用することは できません。演算項目 1 と結果フィールド、または演算項目 2 と結果フィールドのデータ構 造にオーバーラップがあってはなりません。
図 259. CAT 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * The following example shows leading blanks in factor 2.  After
 * the CAT, the RESULT contains 'MR. SMITH'.
 *
C                   MOVE      'MR.'         NAME              3
C                   MOVE      ' SMITH'      FIRST             6
C     NAME          CAT       FIRST         RESULT            9
 *
 *  The following example shows the use of CAT without factor 1.
 *  FLD2 is a 9 character string.  Prior to the concatenation, it
 *  contains 'ABC      '; FLD1 contains 'XYZ
 *  After the concatenation, FLD2 contains 'ABC  XYZ '.
 *
C                   MOVEL(P) 'ABC'          FLD2              9
C                   MOVE     'XYZ'          FLD1              3
C                   CAT      FLD1:2         FLD2
図 260. 先行ブランクのある CAT 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * CAT concatenates LAST to NAME and inserts one blank as specified
 * in factor 2.  TEMP contains 'Mr. Smith'.
C                   MOVE      'Mr.   '      NAME              6
C                   MOVE      'Smith '      LAST              6
C     NAME          CAT       LAST:1        TEMP              9
 *
 * CAT concatenates 'RPG' to STRING and places 'RPG/400' in TEMP.
C                   MOVE     '/400'         STRING            4
C     'RPG'         CAT      STRING         TEMP              7
 *
 * The following example is the same as the previous example except
 * that TEMP is defined as a 10 byte field.  P operation extender
 * specifies that blanks will be used in the rightmost positions
 * of the result field that the concatenation result, 'RPG/400',
 * does not fill.  As a result, TEMP contains 'RPG/400   '
 * after concatenation.
C                   MOVE      *ALL'*'       TEMP             10
C                   MOVE      '/400'        STRING            4
C     'RPG'         CAT(P)    STRING        TEMP
 *
 * After this CAT operation, the field TEMP contains 'RPG/4'.
 * Because the field TEMP was not large enough, truncation occurred.
C                   MOVE      '/400'        STRING            4
C     'RPG'         CAT       STRING        TEMP              5
 *
 * Note that the trailing blanks of NAME are not included because
 * NUM=0.  The field TEMP contains 'RPGIV     '.
C                   MOVE      'RPG  '       NAME              5
C                   MOVE      'IV   '       LAST              5
C                   Z-ADD     0             NUM               1 0
C     NAME          CAT(P)    LAST:NUM      TEMP             10
図 261. 図形データによる CAT 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
 *
 * The following example shows the use of graphic strings
 *
DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++
 *       Value of Graffld  is 'AACCBBGG'.
 *       Value of Graffld2 after CAT 'aa    AACCBBGG      '
 *       Value of Graffld3 after CAT 'AABBCCDDEEFFGGHHAACC'
 *
D Graffld                        4G   INZ(G'oAACCBBGGi')
D Graffld2                      10G   INZ
D Graffld3                      10G   INZ(G'oAABBCCDDEEFFGGHHi')
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.
 * The value 2 represents 2 graphic blanks as separators
C     G'oaai'       cat       Graffld:2     Graffld2
C                   cat       Graffld       Graffld3