CL

68. 複数の環境で動作するCLP

あるCLP がいくつかの異なるライブラリーで使用される場合であっても
同じソースCLP から生成されたCLPプログラムで動作させるようにしたい。
つまり、このCLP が実行されるとき、どのライブラリーから実行されたのかが
わかれば、異なるライブラリーで実行されても、実行環境を判断することができるようになる。

ここに示す例は弊社の XMLパーサーを実行するCLPソースである。
XMLパーサーは EnterpriseServer でも SpoolライターVer5.0 でもどちらの製品でも
提供されるコマンドである。

           コマンド   :   XML_PARSE
                            :
           CLP        :   XML_PARSE_C
                            :
           プログラム :   XML_PARSE

のような関係になるのであるが CLP XML_PARSEC はプログラム : XML_PARSE
どのライブラリーから呼び出せばよいかの判断が必要となる。

つまり、コマンド: XML_PARSE から呼び出されて実行されるCLPプログラム: XML_PARSEC
ライブラリー: ASNET.COM とライブラリー: SPOOLWTR のどちらでも提供されている。
CLP: XML_PARSEC は実行プログラム: XML_PARSE をどのライブラリーから呼び出せば
よいのかを実行時に判断しなければならない。
この判断のために「65. CLP の名前を取得するには ? (2)」 で使用された MI : _MATPGMNM
再び使用することで実現することができる。

実際のCLPソースでは長くなるので次にサンプル・ソースを示す。

【 サンプル・ソース: XML_PARSEC 】
-----------------------------------------------------------------------
0001.00              PGM                                                                
0002.00 /*----------------------------------------------------------*/                  
0003.00 /*   XML_PARSEC : XML パーサー VER 1.0 BY OFFICE QUATTRO    */                  
0004.00 /*                                                         */                   
0005.00 /*                                                         */                   
0006.00 /*       - このプログラムは各製品共通に利用されるので      */                   
0007.00 /*         オブジェクト・ライブラリーが異なっても良い      */                   
0008.00 /*         ように API: _MATPGMNM を使用している。          */                   
0009.00 /*         そのため CLP ではなく CLLE としている。         */                   
0010.00 /*                                                         */                   
0011.00 /*       - CRTBNDCL XXXX/XML_PARSEC SRCFILE(XXX/QCLLESRC)  */                   
0012.00 /*----------------------------------------------------------*/                  
0013.00              DCL        VAR(&PGM)    TYPE(*CHAR) LEN(10)                        
0014.00              DCL        VAR(&OBJLIB) TYPE(*CHAR) LEN(10)                        
0015.00              DCL        VAR(&BUFFER) TYPE(*CHAR) LEN(80)                        
0016.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))                 
0017.00                                                                                 
0018.00              CALLPRC    PRC('_MATPGMNM') PARM(&BUFFER)                          
0019.00              CHGVAR     VAR(&PGM) VALUE(%SST(&BUFFER 51 10))                    
0020.00              CHGVAR     VAR(&OBJLIB) VALUE(%SST(&BUFFER 19 10))                 
0021.00                                                                                 
0022.00              CALL       PGM(&OBJLIB/XML_PARSE)                                  
0023.00              RETURN                                                             
0024.00                                                                
0025.00              ENDPGM                                            
-----------------------------------------------------------------------
【 解説 】

CLP はソース・タイプ CLLE で作成しておいてコンパイルは CRTCLPGM ではなく
CRTBNDCL によってコンパイルする。

0018.00              CALLPRC    PRC('_MATPGMNM') PARM(&BUFFER)

によってプログラム名の解決MI : _MATPGMNM を実行すると
&BEFFER の 51桁目からプログラム名を、19 桁目からライブラリー名を
取得することができる。
このライブラリー名が この CLP が実行されているライブラリーであり、
これによって

0022.00              CALL       PGM(&OBJLIB/XML_PARSE)

を実行するようになっている。