CL

123. 文字列の長さを取得するには

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) で終わってしまう。