ある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ソースでは長くなるので次にサンプル・ソースを示す。
----------------------------------------------------------------------- 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)
を実行するようになっている。