OS Ver7.4 にはCLPの組込み関数として %LEN が使えるが
Ver6.1では組込み関数は少なく使えない。
文字列に入っている文字数を調べるサブ・ルーチン: GET_LENGTHを
紹介する。
ここでは先行ゼロの消去のテクニックやCLPによるザブ・ルーチンの
テクニックも含まれている。
サブ・ルーチンをCLPでも使い始めると整理がよく見やすくなるので
お奨めである。
[TESTLEN:文字列の長さを取得するCLP]
ソースはこちらから
0001.00 PGM
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* TESTLEN : CLP 文字変数の長さの取得 */
0004.00 /* */
0005.00 /* 2020/05/06 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&STRING) TYPE(*CHAR) LEN(132)
0008.00 DCL VAR(&LEN) TYPE(*DEC) LEN(4 0)
0009.00 DCL VAR(&LENC) TYPE(*CHAR) LEN(4)
0010.00
0011.00 CHGVAR VAR(&STRING) VALUE('SET YOUR PGM')
0012.00 CALLSUBR SUBR(GET_LENGTH)
0013.00 CHGVAR VAR(&LENC) VALUE(&LEN)
0014.00 /*( 先行ゼロの消去 )*/
0015.00 NXTLEN: IF COND(%SST(&LENC 1 1) = '0') THEN(DO)
0016.00 CHGVAR VAR(&LENC) VALUE(%SST(&LENC 2 3))
0017.00 GOTO NXTLEN
0018.00 ENDDO
0019.00 SNDPGMMSG MSG(' 文字列 ' *CAT &STRING *TCAT +
0020.00 ' の長さは ' *CAT &LENC *TCAT +
0021.00 ' です。 ') MSGTYPE(*DIAG)
0022.00 RETURN
0023.00
0024.00 /***********************************/
0025.00 SUBR SUBR(GET_LENGTH) /* CMPMSG の長さを調べる */
0026.00 /***********************************/
0027.00 CHGVAR VAR(&LEN) VALUE(132)
0028.00 CHGVAR VAR(&LEN) VALUE(17)
0029.00 CHECK: IF COND(%SST(&STRING &LEN 1) *EQ ' ') THEN(DO)
0030.00 CHGVAR VAR(&LEN) VALUE(&LEN - 1)
0031.00 GOTO CHECK
0032.00 ENDDO
0033.00 ENDSUBR
0034.00 ENDPGM
[解説]
文字列 &STRING の長さ132桁の最後尾から前に1桁ずつLOOPして
ブランクでない文字に行き着くとそこで終わりとして入っている文字列の長さを
算出している。
%LENを使えば %LEN(&STRING) で終わってしまう。
