CL

64. CLP の名前を取得するには ? (1)

CLP の自分自身の名前を取得するには 自分自身にメッセージを送信して
それを自分自身が受け取って、誰が送信したのかを調べる方法がよく知られている。

【 サンプルCLP : TESTWHO 】
---------------------------------------------------------------------------------------
0001.00              PGM                                                       
0002.00 /*---------------------------------------------------------*/          
0003.00 /*    TESTWHO   :   CLP の名前を調べる                     */          
0004.00 /*---------------------------------------------------------*/          
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                 
0006.00              DCL        VAR(&SENDER) TYPE(*CHAR) LEN(80)               
0007.00              DCL        VAR(&CALPGM) TYPE(*CHAR) LEN(10)               
0008.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))        
0009.00                                                                        
0010.00              SNDPGMMSG  MSG(' ') TOPGMQ(*PRV)                          
0011.00              RCVMSG     PGMQ(*PRV) SENDER(&SENDER)                     
0012.00              CHGVAR     VAR(&CALPGM) VALUE(%SST(&SENDER 27 10))        
0013.00              SNDPGMMSG  MSG('PGM NAME IS ' *CAT &CALPGM) +             
0014.00                           MSGTYPE(*DIAG)                               
0015.00              RETURN                                                    
0016.00                                                                        
0017.00  ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                             
0018.00  SNDMSG:     SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                       
0019.00              ENDPGM                                                    
---------------------------------------------------------------------------------------
【 解説 】
SNDPGMMSG  MSG(' ') TOPGMQ(*PRV)

によって、このプログラムの呼び出し元のメッセージ待ち行列にブランクのメッセージを送る。
それを

RCVMSG     PGMQ(*PRV) SENDER(&SENDER)

によって受け取って

CHGVAR     VAR(&CALPGM) VALUE(%SST(&SENDER 27 10))

によって呼び出したプログラム、つまり自分自身の名前を取得する。