RPG で紹介していた「ストレスのない SEU 」である EDTSRC
のソース一式を公開する。
EDTSRC は既に RPG 「 313. ストレスのない新しい SEU 」として説明したように
SEU を閉じなくてオープンしたままでコンパイルすることができる。
その機能の概要は次のとおりである。
EDTSRC は SEU としてソースをオープンしたままで、
F7 キー | : |
コンパイル (CRTBNDRPG, CRTRPGMOD, CRTPGM, CRTCMOD, ....) |
---|---|---|
F8 キー | : |
コンパイル・エラーの抽出 ( SEU をオープンしたままでコンパイル・リストから エラー・セッセージだけを抽出することができる) プログラムの実行 ( CALL ) デバッグの開始 ( STRDBG ) |
SEU はエディターとして非常にパワフルで文字ベースとしての編集効率に
優れているが唯一、問題であるのがコンパイルするためにはソースを
一旦、閉じなければならないことである。
SEU を閉じてソースを保管して、コンパイルを実行して
コンパイル・エラーがあれば、また SEU でオープンする。
同じプログラムの開発に対してこの作業を延々と繰り返さなければならない。
特にデバッグ中ではソースのオープン&クローズの繰返しはストレスを感じさせる。
今回、開発した EDTSRC は社内向けとして使用しているが
繰返し再コンパイルする作業には非常に開発効率が良く早く作ればよかったと
思っているし何より開発が快適になった。
EDTSRC は製品の発表セミナーで発表したかったのだが
いち早く利用して頂きたいので TOOLS で公開することになった。
読者のほうで自社にあった事情を鑑みて必要な修正を施してもらえれば
一層使いやすくなるのではないかと思う。
なおソースの種類が多いので導入が面倒な方のために
オブジェクトを含むライブラリーをセミナーで配布することを予定している。
オブジェクトそのものをご希望の方は次回のセミナーにご出席頂きたい。
EDTSRC はあなたの開発効率を飛躍的に向上させてくれるはずだ。
こんなに開発が楽になるとは、というところを是非実感して欲しい。
0001.00 CMD PROMPT('SEU 開始 ') 0002.00 PARM KWD(SRCFILE) TYPE(SRCFILE) + 0003.00 PROMPT(' ソース・ファイル ') 0004.00 SRCFILE: QUAL TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV)) 0005.00 QUAL TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 0006.00 (*PRV)) PROMPT(' ライブラリー ') 0007.00 PARM KWD(SRCMBR) TYPE(*NAME) LEN(10) DFT(*PRV) + 0008.00 SPCVAL((*PRV)) + 0009.00 PROMPT(' ソース・メンバー ') 0010.00 PARM KWD(TYPE) TYPE(*NAME) LEN(10) RSTD(*YES) + 0011.00 DFT(*SAME) VALUES(RPGLE RPG C CLE PRTF) + 0012.00 SPCVAL((*SAME)) PROMPT(' タイプ ') 0013.00 PARM KWD(TEXT) TYPE(*CHAR) LEN(50) DFT(*BLANK) + 0014.00 PROMPT(' テキスト '' 記述 ''') 0015.00 PARM KWD(OBJECT) TYPE(*CHAR) LEN(10) DFT(*SRCMBR) + 0016.00 PROMPT(' オブジェクト ') 0017.00 PARM KWD(OBJLIB) TYPE(*CHAR) LEN(10) MIN(1) + 0018.00 PROMPT(' オブジェクト・ライブラリー ') 0019.00 PARM KWD(OBJTYP) TYPE(*CHAR) LEN(10) RSTD(*YES) + 0020.00 DFT(*PGM) VALUES(*PGM *SRVPGM *PRTF + 0021.00 *DSPF) PROMPT(' オブジェクト・タイプ ') 0022.00 PARM KWD(COMPILE) TYPE(*CHAR) LEN(10) RSTD(*YES) + 0023.00 DFT(*OBJDFN) VALUES(CRTBNDRPG CRTRPGMOD + 0024.00 CRTBNDC CRTCMOD CRTSRVPGM CRTCMD CRTCLPGM + 0025.00 CRTPF CRTLF CRTCBLMOD CRTCBLPGM + 0026.00 CRTBNDCBL) SPCVAL((*OBJDFN)) + 0027.00 PROMPT(' コンパイラー ') 0028.00 PARM KWD(BNDSRVPGM) TYPE(BNDSRVPGM) MAX(10) + 0029.00 PMTCTL(BIND) + 0030.00 PROMPT(' バインドサービスプログラム ') 0031.00 BNDSRVPGM: QUAL TYPE(*NAME) LEN(10) 0032.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0033.00 SPCVAL((*LIBL) (*CURLIB)) + 0034.00 PROMPT(' ライブラリー ') 0035.00 PARM KWD(DEFINE) TYPE(*CHAR) LEN(80) DFT(*NONE) + 0036.00 PROMPT(' 名前定義 ') 0037.00 PARM KWD(ACTGRP) TYPE(*CHAR) LEN(10) DFT(*NEW) + 0038.00 SPCVAL((*NEW) (*CALLER)) + 0039.00 PROMPT(' 活動化グループ ') 0040.00 BIND: PMTCTL CTL(COMPILE) COND((*EQ CRTRPGMOD)) LGLREL(*OR) 0041.00 PMTCTL CTL(COMPILE) COND((*EQ CRTCBLMOD)) LGLREL(*OR) 0042.00 PMTCTL CTL(COMPILE) COND((*EQ CRTCMOD)) LGLREL(*OR)
EDTSRC の出発点となるコマンド: EDTSRC はソース情報だけでなくオブジェクト情報も
指定するようにしている。
これは F7 キーによるコンパイルを可能にするためである。
コンパイラーは、オブジェクトが存在しているのであれば *OBJDFN としておけば
現存するオブジェクトを参照することによってコンパイルに必要なサービス・プログラム
などは検索される。
次は「 5250 ハンドラー」と呼ばれる RPG プログラムを
EDTSRC で呼び出す様子である。
SEU 開始 (EDTSRC) 選択項目を入力して,実行キーを押してください。 ソース・ファイル . . . . . . . > QRPGLESRC 名前 , *PRV ライブラリー . . . . . . . . > R610SRC 名前 , *LIBL, *CURLIB, *PRV ソース・メンバー . . . . . . . > P5250HLR 名前 , *PRV タイプ . . . . . . . . . . . . *SAME *SAME, RPGLE, RPG, C, CLE... テキスト ' 記述 ' . . . . . . . *BLANK オブジェクト . . . . . . . . . *SRCMBR 文字値 オブジェクト・ライブラリー . . > ASNET.COM 文字値 オブジェクト・タイプ . . . . . > *PGM *PGM, *SRVPGM, *PRTF, *DSPF コンパイラー . . . . . . . . . *OBJDFN *OBJDFN, CRTBNDRPG... 名前定義 . . . . . . . . . . . *NONE 活動化グループ . . . . . . . . > *CALLER 文字値 , *NEW, *CALLER
5250 ハンドラーである P5250HLR という RPG プログラムは
RPG ハンドラーであるため、活動家グループは *CALLER として定義しているが
読者が開発する通常のプログラムの場合は
ほとんどが *NEW と指定するのでよい。
CRTCMD CMD(QUATTRO/EDTSRC) PGM(QUATTRO/EDTSRCCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
0001.00 PGM PARM(&SRCFILLIB &SRCMBR &SRCTYP &TEXT + 0002.00 &OBJECT &OBJLIB &OBJTYP &COMPILE + 0003.00 &BNDSRVPGM &DEFINE &ACTGRP) 0004.00 /*-------------------------------------------------------------------*/ 0005.00 /* EDTSRCCL : ソース・メンバーの編集 */ 0006.00 /* */ 0007.00 /* 2018/05/16 作成 */ 0008.00 /*-------------------------------------------------------------------*/ 0009.00 DCL VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20) 0010.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(10) 0012.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0013.00 DCL VAR(&SRCTYP) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&PGMOBJLIB) TYPE(*CHAR) LEN(20) 0015.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(1024) 0016.00 DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4) + 0017.00 VALUE(X'00000400') 0018.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) 0019.00 DCL VAR(&OBJECT) TYPE(*CHAR) LEN(10) 0020.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0021.00 DCL VAR(&OBJTYP) TYPE(*CHAR) LEN(10) 0022.00 DCL VAR(&COMPILE) TYPE(*CHAR) LEN(10) 0023.00 DCL VAR(&BNDSRVPGM) TYPE(*CHAR) LEN(202) 0024.00 DCL VAR(&DEFINE) TYPE(*CHAR) LEN(80) 0025.00 DCL VAR(&ACTGRP) TYPE(*CHAR) LEN(10) 0026.00 DCL VAR(&ACTGRP_ATR) TYPE(*CHAR) LEN(30) 0027.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0028.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0029.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0030.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0031.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0032.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0033.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0034.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0035.00 VALUE('*ESCAPE ') 0036.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0037.00 VALUE(X'000074') /* 2 進数 */ 0038.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0039.00 VALUE(X'00000000') 0040.00 DCL VAR(&OBJATR) TYPE(*CHAR) LEN(10) 0041.00 DCL VAR(&USRDFN) TYPE(*CHAR) LEN(10) 0042.00 DCL VAR(&OBJTXT) TYPE(*CHAR) LEN(50) 0043.00 DCL VAR(&COMPILER) TYPE(*CHAR) LEN(14) 0044.00 DCL VAR(&SRVSU_BIN) TYPE(*CHAR) LEN(4) 0045.00 DCL VAR(&SRVSU) TYPE(*DEC) LEN(8 0) VALUE(0) 0046.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) 0047.00 DCL VAR(&SRV) TYPE(*CHAR) LEN(10) 0048.00 DCL VAR(&SRVLIB) TYPE(*CHAR) LEN(10) 0049.00 DCL VAR(&SRVPGMLIB) TYPE(*CHAR) LEN(20) 0050.00 DCL VAR(&POS) TYPE(*DEC) LEN(4 0) 0051.00 DCL VAR(&BIN2) TYPE(*CHAR) LEN(2) 0052.00 DCLF FILE(QTEMP/DSPPGMREF) 0053.00 DCL VAR(&BLK102) TYPE(*CHAR) LEN(102) 0054.00 DCL VAR(&DEFINE_B) TYPE(*CHAR) LEN(80) 0055.00 DCL VAR(&ACTGRP_B) TYPE(*CHAR) LEN(10) 0056.00 /*( ユーザー・スペース用の変数 )*/ 0057.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) + 0058.00 VALUE(X'0000007D') /* 2 進数開始位置 : + 0059.00 125 */ 0060.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) + 0061.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */ 0062.00 DCL VAR(&RCVVAL) TYPE(*CHAR) LEN(16) + 0063.00 VALUE(X'0000000000000000') 0064.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* + 0065.00 2 進数 オフセット */ 0066.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* + 0067.00 2 進数項目数 */ 0068.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* + 0069.00 2 進数リストサイズ */ 0070.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */ 0071.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */ 0072.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */ 0073.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* + 0074.00 受取データ */ 0075.00 MONMSG MSGID(CPF0000 EDT0000) EXEC(GOTO CMDLBL(ERROR)) 0076.00 0077.00 /*( 環境の取得 )*/ 0078.00 RTVJOBA TYPE(&TYPE) 0079.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0080.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0081.00 ENDDO /* バッチ */ 0082.00 ELSE CMD(DO) /* 対話式 */ 0083.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0084.00 ENDDO /* 対話式 */ 0085.00 0086.00 /*( パラメータの取得 )*/ 0087.00 CHGVAR VAR(&SRCF) VALUE(%SST(&SRCFILLIB 01 10)) 0088.00 CHGVAR VAR(&SRCFLIB) VALUE(%SST(&SRCFILLIB 11 10)) 0089.00 IF COND(&OBJECT *EQ '*SRCMBR ') THEN(DO) 0090.00 CHGVAR VAR(&OBJECT) VALUE(&SRCMBR) 0091.00 ENDDO 0092.00 CHGDTAARA DTAARA(*LDA (1 20)) VALUE(&SRCFILLIB) 0093.00 CHGDTAARA DTAARA(*LDA (21 10)) VALUE(&SRCMBR) 0094.00 CHGDTAARA DTAARA(*LDA (31 10)) VALUE(&SRCTYP) 0095.00 CHGDTAARA DTAARA(*LDA (41 10)) VALUE(&OBJLIB) 0096.00 CHGDTAARA DTAARA(*LDA (51 10)) VALUE(&COMPILE) 0097.00 CHGDTAARA DTAARA(*LDA (432 10)) VALUE(&OBJECT) 0098.00 0099.00 /*( オブジェクト参照 )*/ 0100.00 CHGVAR VAR(&DEFINE_B) VALUE(&DEFINE) 0101.00 CHGVAR VAR(&ACTGRP_B) VALUE(&ACTGRP) 0102.00 IF COND(&COMPILE *EQ '*OBJDFN ') THEN(DO) /* + 0103.00 オブジェクト定義 */ 0104.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) /* + 0105.00 プログラム */ 0106.00 /*( QCLRPGMI: プログラム情報の検索 )*/ 0107.00 CHGVAR VAR(&PGMOBJLIB) VALUE(&OBJECT *CAT &OBJLIB) 0108.00 CALL PGM(QCLRPGMI) PARM(&RCVVAR &RCVLEN + 0109.00 'PGMI0100' &PGMOBJLIB &APIERR) 0110.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0111.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0112.00 IF COND(&MSGID *EQ 'CPF9811') THEN(DO) 0113.00 GOTO STRSEU 0114.00 ENDDO 0115.00 SNDPGMMSG + 0116.00 MSG('API: QCLRPGMI の実行で次のエラーが発生 + 0117.00 しました。 ') MSGTYPE(*DIAG) 0118.00 GOTO APIERR 0119.00 ENDDO 0120.00 CHGVAR VAR(&OBJATR) VALUE(%SST(&RCVVAR 39 10)) 0121.00 CHGVAR VAR(&OBJTXT) VALUE(%SST(&RCVVAR 111 50)) 0122.00 IF COND(&TEXT *EQ '*SAME') THEN(CHGVAR + 0123.00 VAR(&TEXT) VALUE(&OBJTXT)) 0124.00 CHGVAR VAR(&COMPILER) VALUE(%SST(&RCVVAR 254 14)) 0125.00 CHGVAR VAR(&ACTGRP_ATR) VALUE(%SST(&RCVVAR 369 30)) 0126.00 CHGVAR VAR(&SRVSU_BIN) VALUE(%SST(&RCVVAR 417 4)) 0127.00 0128.00 IF COND(&SRCTYP *EQ '*SAME ') THEN(DO) /* + 0129.00 ソース・タイプ *SAME */ 0130.00 RTVMBRD FILE(&SRCFLIB/&SRCF) MBR(&SRCMBR) + 0131.00 SRCTYPE(&SRCTYP) 0132.00 MONMSG MSGID(CPF9800) EXEC(DO) /* NOT FOUND CPF9800 */ 0133.00 IF COND(&SRCF *EQ 'QRPGLESRC ') THEN(DO) 0134.00 CHGVAR VAR(&SRCTYP) VALUE('RPGLE ') 0135.00 ENDDO 0136.00 ELSE CMD(IF COND(&SRCF *EQ 'QRPGSRC ') THEN(DO)) 0137.00 CHGVAR VAR(&SRCTYP) VALUE('RPG ') 0138.00 ENDDO 0139.00 ELSE CMD(IF COND(&SRCF *EQ 'QCSRC ') THEN(DO)) 0140.00 CHGVAR VAR(&SRCTYP) VALUE('C ') 0141.00 ENDDO 0142.00 ELSE CMD(IF COND(&SRCF *EQ 'QCMDSRC ') THEN(DO)) 0143.00 CHGVAR VAR(&SRCTYP) VALUE('CMD ') 0144.00 ENDDO 0145.00 ELSE CMD(IF COND(&SRCF *EQ 'QCLSRC ') THEN(DO)) 0146.00 CHGVAR VAR(&SRCTYP) VALUE('CLP ') 0147.00 ENDDO 0148.00 ELSE CMD(IF COND(&SRCF *EQ 'QDSPSRC ') THEN(DO)) 0149.00 CHGVAR VAR(&SRCTYP) VALUE('DSPF ') 0150.00 ENDDO 0151.00 ELSE CMD(IF COND(&SRCF *EQ 'QPRTSRC ') THEN(DO)) 0152.00 CHGVAR VAR(&SRCTYP) VALUE('PRTF ') 0153.00 ENDDO 0154.00 ENDDO /* NOT FOUND CPF9800 */ 0155.00 ENDDO /* ソース・タイプ *SAME */ 0156.00 0157.00 IF COND(&TEXT *EQ '*BLANKS') THEN(DO) 0158.00 CHGVAR VAR(&TEXT) VALUE(&OBJTXT) 0159.00 ENDDO 0160.00 DSPPGMREF PGM(&OBJLIB/&OBJECT) OUTPUT(*OUTFILE) + 0161.00 OBJTYPE(&OBJTYP) OUTFILE(QTEMP/DSPPGMREF) + 0162.00 OUTMBR(*FIRST *REPLACE) 0163.00 CHGVAR VAR(&N) VALUE(1) 0164.00 CHGVAR VAR(&SRVSU) VALUE(0) 0165.00 CHGVAR VAR(&POS) VALUE(3) 0166.00 CHGVAR VAR(&BNDSRVPGM) VALUE(&BLK102) 0167.00 READ: RCVF RCDFMT(QWHDRPPR) 0168.00 MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND)) 0169.00 IF COND((&WHOTYP *EQ '*SRVPGM ') *AND + 0170.00 (&WHLNAM *NE 'QSYS ')) THEN(DO) 0171.00 CHGVAR VAR(&SRVSU) VALUE(&SRVSU + 1) 0172.00 CHGVAR VAR(&SRV) VALUE(&WHFNAM) 0173.00 CHGVAR VAR(&SRVLIB) VALUE(&WHLNAM) 0174.00 CHGVAR VAR(&SRVPGMLIB) VALUE(&SRV *CAT &SRVLIB) 0175.00 CHGVAR VAR(%SST(&BNDSRVPGM &POS 20)) VALUE(&SRVPGMLIB) 0176.00 CHGVAR VAR(&POS) VALUE(&POS + 20) 0177.00 ENDDO 0178.00 CHGVAR VAR(&N) VALUE(&N + 1) 0179.00 GOTO READ 0180.00 REDEND: 0181.00 CHGVAR VAR(%BIN(&BIN2)) VALUE(&SRVSU) 0182.00 CHGVAR VAR(%SST(&BNDSRVPGM 1 2)) VALUE(&BIN2) 0183.00 CHGDTAARA DTAARA(*LDA (61 202)) VALUE(&BNDSRVPGM) 0184.00 CHGVAR VAR(&DEFINE) VALUE(&DEFINE_B) 0185.00 CHGVAR VAR(&ACTGRP) VALUE(&ACTGRP_B) 0186.00 /*( 単独 PGM )*/ 0187.00 IF COND(&SRVSU *EQ 0) THEN(DO) /* 単独 PGM */ 0188.00 IF COND(&SRCTYP *EQ 'RPGLE ') THEN(DO) /* + 0189.00 RPGLE */ 0190.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0191.00 CHGVAR VAR(&COMPILE) VALUE('CRTBNDRPG ') 0192.00 ENDDO 0193.00 ELSE CMD(DO) 0194.00 CHGVAR VAR(&COMPILE) VALUE('CRTRPGMOD ') 0195.00 ENDDO 0196.00 ENDDO /* RPGLE */ 0197.00 IF COND(&SRCTYP *EQ 'RPG ') THEN(DO) /* + 0198.00 RPG */ 0199.00 CHGVAR VAR(&COMPILE) VALUE('CRTRPGPGM ') 0200.00 ENDDO /* RPG */ 0201.00 IF COND((&SRCTYP *EQ 'C ') *OR (&SRCTYP + 0202.00 *EQ 'CLE ')) THEN(DO) /* C 言語 */ 0203.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) /* + 0204.00 *PGM */ 0205.00 CHGVAR VAR(&COMPILE) VALUE('CRTBNDC ') 0206.00 ENDDO /* *PGM */ 0207.00 ELSE CMD(DO) /* *MODULE */ 0208.00 CHGVAR VAR(&COMPILE) VALUE('CRTCMOD ') 0209.00 ENDDO /* *MODULE */ 0210.00 ENDDO /* C 言語 */ 0211.00 ENDDO /* 単独 PGM */ 0212.00 /*( BIND プログラム )*/ 0213.00 ELSE CMD(DO) /* BIND プログラム */ 0214.00 IF COND(&SRCTYP *EQ 'RPGLE ') THEN(DO) /* + 0215.00 RPGLE */ 0216.00 CHGVAR VAR(&COMPILE) VALUE('CRTRPGMOD ') 0217.00 ENDDO /* RPGLE */ 0218.00 IF COND((&SRCTYP *EQ 'C ') *OR (&SRCTYP + 0219.00 *EQ 'CLE ')) THEN(DO) /* C */ 0220.00 CHGVAR VAR(&COMPILE) VALUE('CRTCMOD ') 0221.00 ENDDO /* C */ 0222.00 ENDDO /* BIND プログラム */ 0223.00 0224.00 CHGDTAARA DTAARA(*LDA (263 80)) VALUE(&DEFINE) 0225.00 CHGDTAARA DTAARA(*LDA (342 10)) VALUE(&ACTGRP) 0226.00 CHGDTAARA DTAARA(*LDA (352 10)) VALUE(&OBJTYP) 0227.00 CHGDTAARA DTAARA(*LDA (382 50)) VALUE(&TEXT) 0228.00 ENDDO /* プログラム */ 0229.00 ELSE CMD(IF COND(&OBJTYP *EQ '*SRVPGM ') + 0230.00 THEN(DO)) /* サービス・プログラム */ 0231.00 /*( QBNLSPGM: サービス・プログラム情報の検索 )*/ 0232.00 CHGVAR VAR(&PGMOBJLIB) VALUE(&OBJECT *CAT &OBJLIB) 0233.00 /*( ユーザー・スペースの作成 )*/ 0234.00 CALL PGM(QUSCRTUS) PARM('SRVPGM QTEMP ' + 0235.00 'PF ' 1000 ' ' '*ALL ' + 0236.00 'DSPSRVPGM 用ユーザー空間 ' '*YES ' + 0237.00 &APIERR) 0238.00 MONMSG CPF9870 0239.00 CALL PGM(QBNLSPGM) PARM('SRVPGM QTEMP ' + 0240.00 'SPGL0200' &PGMOBJLIB &APIERR) 0241.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0242.00 SNDPGMMSG + 0243.00 MSG('API: QBNLSPGM の実行で次のエラーが発生 + 0244.00 しました。 ') MSGTYPE(*DIAG) 0245.00 GOTO APIERR 0246.00 ENDDO 0247.00 /*( リストAPIで作成されたユーザー空間の検索 )*/ 0248.00 CHGVAR VAR(&POS) VALUE(3) 0249.00 CHGVAR VAR(&BNDSRVPGM) VALUE(&BLK102) 0250.00 CHGVAR VAR(&SRVSU) VALUE(0) 0251.00 /*( リストデータセクションのオフセットを検索 )*/ 0252.00 CALL PGM(QUSRTVUS) PARM('SRVPGM QTEMP ' + 0253.00 &STRPOS &LENDTA &RCVVAL) 0254.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAL 1 4)) 0255.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAL 9 4)) 0256.00 CHGVAR VAR(&SRVSU_BIN) VALUE(&NOENTR) 0257.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAL 13 4)) 0258.00 0259.00 /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/ 0260.00 CHGVAR VAR(&STRPOS) VALUE(&OFFSET) 0261.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0262.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1) 0263.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0264.00 CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ) 0265.00 CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA)) 0266.00 CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR)) 0267.00 CHGVAR VAR(&SRVSU) VALUE(0) 0268.00 CHGVAR VAR(&POS) VALUE(3) 0269.00 CHGVAR VAR(&BNDSRVPGM) VALUE(&BLK102) 0270.00 NXTRTV: 0271.00 CALL PGM(QUSRTVUS) PARM('SRVPGM QTEMP ' + 0272.00 &STRPOS &LENDTA &RCVDTA) 0273.00 /*( 処理の開始 )*/ 0274.00 CHGVAR VAR(&SRV) VALUE(%SST(&RCVDTA 21 10)) 0275.00 CHGVAR VAR(&SRVLIB) VALUE(%SST(&RCVDTA 31 10)) 0276.00 IF COND(%SST(&SRVLIB 1 4) *EQ 'QSYS') THEN(GOTO + 0277.00 CMDLBL(BYPAS)) 0278.00 CHGVAR VAR(&SRVPGMLIB) VALUE(&SRV *CAT &SRVLIB) 0279.00 CHGVAR VAR(%SST(&BNDSRVPGM &POS 20)) VALUE(&SRVPGMLIB) 0280.00 CHGVAR VAR(&POS) VALUE(&POS + 20) 0281.00 CHGVAR VAR(&SRVSU) VALUE(&SRVSU + 1) 0282.00 /*( 処理の終了 )*/ 0283.00 BYPAS: IF COND(&N < &NOENT) THEN(DO) 0284.00 CHGVAR VAR(&N) VALUE(&N + 1) 0285.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0286.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN) 0287.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0288.00 GOTO NXTRTV 0289.00 ENDDO 0290.00 CHGVAR VAR(%BIN(&BIN2)) VALUE(&SRVSU) 0291.00 CHGVAR VAR(%SST(&BNDSRVPGM 1 2)) VALUE(&BIN2) 0292.00 CHGDTAARA DTAARA(*LDA (61 202)) VALUE(&BNDSRVPGM) 0293.00 CHGDTAARA DTAARA(*LDA (352 10)) VALUE(&OBJTYP) 0294.00 CHGDTAARA DTAARA(*LDA (382 50)) VALUE(&TEXT) 0295.00 CHGVAR VAR(&DEFINE) VALUE(&DEFINE_B) 0296.00 CHGDTAARA DTAARA(*LDA (263 80)) VALUE(&DEFINE) 0297.00 CHGVAR VAR(&ACTGRP) VALUE(&ACTGRP_B) 0298.00 CHGVAR VAR(&ACTGRP) VALUE('*CALLER ') 0299.00 CHGDTAARA DTAARA(*LDA (342 10)) VALUE(&ACTGRP) 0300.00 ENDDO /* サービス・プログラム */ 0301.00 ELSE CMD(IF COND((&OBJTYP *EQ '*DSPF ') *OR + 0302.00 (&OBJTYP *EQ '*PRTF ')) THEN(DO)) /* + 0303.00 印刷または表示ファイル */ 0304.00 RTVOBJD OBJ(&OBJLIB/&OBJECT) OBJTYPE(*FILE) + 0305.00 USRDFNATR(&USRDFN) TEXT(&TEXT) 0306.00 MONMSG MSGID(CPF9800) EXEC(GOTO CMDLBL(ERROR)) 0307.00 CHGDTAARA DTAARA(*LDA (352 10)) VALUE(&OBJTYP) 0308.00 CHGDTAARA DTAARA(*LDA (382 50)) VALUE(&TEXT) 0309.00 CHGDTAARA DTAARA(*LDA (422 10)) VALUE(&USRDFN) 0310.00 ENDDO /* 印刷または表示ファイル */ 0311.00 ENDDO 0312.00 0313.00 /*( ATTN プログラムの設定 )*/ 0314.00 STRSEU: 0315.00 SETATNPGM PGM(QUATTRO/ATTNCL) SET(*ON) 0316.00 IF COND(&DEFINE *NE ' ') THEN(DO) 0317.00 CHGMSGD MSGID(EDT0630) MSGF(QUATTRO/QEDTMSGF) + 0318.00 MSG(' リリース・モードのコンパイルも必要で + 0319.00 す。 ') 0320.00 ENDDO 0321.00 ELSE CMD(DO) 0322.00 CHGMSGD MSGID(EDT0630) MSGF(QUATTRO/QEDTMSGF) + 0323.00 MSG(&BLK102) 0324.00 ENDDO 0325.00 OVRMSGF MSGF(QEDTMSG) TOMSGF(QUATTRO/QEDTMSGF) + 0326.00 SECURE(*YES) 0327.00 0328.00 /*( SEU の開始 )*/ 0329.00 STRSEU SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0330.00 TYPE(&SRCTYP) TEXT(&TEXT) 0331.00 MONMSG MSGID(EDT0221) EXEC(GOTO CMDLBL(ERROR)) 0332.00 DLTOVR FILE(QEDTMSG) LVL(*JOB) 0333.00 MONMSG CPF9800 0334.00 SETATNPGM PGM(QUATTRO/ATTNCL) SET(*OFF) 0335.00 RETURN 0336.00 0337.00 APIERR: 0338.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0339.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0340.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0341.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0342.00 GOTO SNDMSG 0343.00 0344.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0345.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0346.00 MSGFLIB(&MSGFLIB) 0347.00 IF COND(%SST(&MSGID 1 3) *EQ 'EDT' *AND (&MSGID + 0348.00 *NE 'EDT0001') *AND (&MSGFLIB *EQ + 0349.00 '*LIBL ')) THEN(DO) 0350.00 CHGVAR VAR(&MSGFLIB) VALUE('QPDA ') 0351.00 ENDDO 0352.00 IF COND(&MSGTYPE *EQ '*ESCAPE ') THEN(DO) 0353.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ') 0354.00 ENDDO 0355.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0356.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0357.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0358.00 ENDDO 0359.00 ELSE CMD(DO) 0360.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0361.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0362.00 MSGTYPE(&MSGTYPE) 0363.00 ENDDO 0364.00 ENDPGM
CLP: EDTSRCCL は約 360 ステップ数として CLP としては大きいほうであり
EDTSRC コマンドの中心の機能を果たしている。
まずソース情報は
0092.00 CHGDTAARA DTAARA(*LDA (1 20)) VALUE(&SRCFILLIB) 0093.00 CHGDTAARA DTAARA(*LDA (21 10)) VALUE(&SRCMBR) 0094.00 CHGDTAARA DTAARA(*LDA (31 10)) VALUE(&SRCTYP) 0095.00 CHGDTAARA DTAARA(*LDA (41 10)) VALUE(&OBJLIB) 0096.00 CHGDTAARA DTAARA(*LDA (51 10)) VALUE(&COMPILE) 0097.00 CHGDTAARA DTAARA(*LDA (432 10)) VALUE(&OBJECT)
によって *LDA に保管しておいて SEU の中から F7 キーや F8 キーによって
呼び出されて実行されるプログラムでも参照できるようにしている。
次に API: QCLRPGMI: プログラム情報の検索を使ってプログラムの情報を
調べてプログラムのタイプやテキスト、特にコンパイラーが何であるかを調べている。
ソース・タイプは RTVMBRD によって
0130.00 RTVMBRD FILE(&SRCFLIB/&SRCF) MBR(&SRCMBR) + 0131.00 SRCTYPE(&SRCTYP)
のようにして取得しているがソースが存在しない場合は
ソース・タイプはソース・ファイル名によって判断している。
特殊なソース・ファイル名を使用している場合はこの EDTSRCCL を
修正する必要がある。
次に DSPPGMREF コマンドを使ってプログラムが参照しているオブジェクトを
次のように調べている。
0160.00 DSPPGMREF PGM(&OBJLIB/&OBJECT) OUTPUT(*OUTFILE) + 0161.00 OBJTYPE(&OBJTYP) OUTFILE(QTEMP/DSPPGMREF) + 0162.00 OUTMBR(*FIRST *REPLACE)
出力されたファイル: QTEMP/DSPPGMREF を次のように読み取って
このプログラムによって使用されているサービス・プログラムを
調べている
0163.00 CHGVAR VAR(&N) VALUE(1) 0164.00 CHGVAR VAR(&SRVSU) VALUE(0) 0165.00 CHGVAR VAR(&POS) VALUE(3) 0166.00 CHGVAR VAR(&BNDSRVPGM) VALUE(&BLK102) 0167.00 READ: RCVF RCDFMT(QWHDRPPR) 0168.00 MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND)) 0169.00 IF COND((&WHOTYP *EQ '*SRVPGM ') *AND + 0170.00 (&WHLNAM *NE 'QSYS ')) THEN(DO) 0171.00 CHGVAR VAR(&SRVSU) VALUE(&SRVSU + 1) 0172.00 CHGVAR VAR(&SRV) VALUE(&WHFNAM) 0173.00 CHGVAR VAR(&SRVLIB) VALUE(&WHLNAM) 0174.00 CHGVAR VAR(&SRVPGMLIB) VALUE(&SRV *CAT &SRVLIB) 0175.00 CHGVAR VAR(%SST(&BNDSRVPGM &POS 20)) VALUE(&SRVPGMLIB) 0176.00 CHGVAR VAR(&POS) VALUE(&POS + 20) 0177.00 ENDDO 0178.00 CHGVAR VAR(&N) VALUE(&N + 1) 0179.00 GOTO READ 0180.00 REDEND:
後は活動化グループやユーザー定義を検索してようやく SEU の開始となる。
0328.00 /*( SEU の開始 )*/ 0329.00 STRSEU SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0330.00 TYPE(&SRCTYP) TEXT(&TEXT)
SEU が開始されたら F13 キーを押して次のようにユーザー出口プログラムを
登録しておく。
これは一度きりの作業である。
CRTCLPGM PGM(QUATTRO/EDTSRCCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
セッション省略時の値の 変更 選択項目を入力して,実行キーを押 してください。 メンバーの番号付け直しの省略時値 . Y Y=YES, N=NO P= 前と同じ このソース仕様タイプの大文字 入力の省略時の値 . . . . . . . . N Y=YES, N=NO ユーザー出口プログラム . . . . . . EDTSRC *REGFAC, *NONE, 名前 ライブラリー . . . . . . . . . . QUATTRO 名前
ユーザー出口プログラムに EDTSRC という名前のプログラムを登録する。
これによって F7 キーまたは F8 キーを押すと指定したユーザー出口プログラムが
呼び出されて実行される。
0001.00 H DFTNAME(EDTSRC) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** SEU 出口プログラム **************************************** 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 * CRTRPGMOD OBJ(QTEMP/EDTSRC) SRCFILE(R610SRC/QRPGLESRC) 0007.00 * DBGVIEW(*SOURCE) AUT(*ALL) 0008.00 * CRTPGM PGM(ASNET.COM/EDTSRC) MODULE(QTEMP/EDTSRC) ACTGRP(*NEW) 0009.00 * AUT(*ALL) 0010.00 0011.00 *-------------------------------------------------------------------* 0012.00 * 2017/05/17 : 作成 0013.00 *-------------------------------------------------------------------* 0014.00 D MSR S 100 DIM(2) CTDATA PERRCD(1) 0015.00 0016.00 D*( CMD のプロトタイプ宣言 ) 0017.00 D CMD PR 10I 0 EXTPROC('system') 0018.00 D PATH * VALUE OPTIONS(*STRING) 0019.00 D CMDSTR S 132A 0020.00 0021.00 D QMHSNDPM PR ExtPgm('QMHSNDPM') 0022.00 D MSGID 7A CONST 0023.00 D MSGFILE 20A CONST 0024.00 D MSGDATA 6000A CONST OPTIONS(*varsize) 0025.00 D MSGDATALEN 10I 0 CONST 0026.00 D MSGTYPE 10A CONST 0027.00 D CALLSTACKE 10A CONST 0028.00 D CALLSTACKC 10I 0 CONST 0029.00 D RTNMSGKEY 4A 0030.00 D APIERR LIKEDS(QUSEC) 0031.00 D OPTIONS(*VARSIZE) 0032.00 0033.00 D RTNMSGKEY S 4A 0034.00 0035.00 DQUSEC DS 0036.00 D QUSBPRV 1 4B 0 INZ(8) 0037.00 D QUSBAVL 5 8B 0 INZ(0) 0038.00 0039.00 D HEADER DS 0040.00 D HRLEN 1 4B 0 0041.00 D HCRRN 5 8B 0 0042.00 D HCPOS 9 12B 0 0043.00 D HCCCSID 13 16B 0 0044.00 D HRECI 17 20B 0 0045.00 D HMNAM 21 30 0046.00 D HFNAM 31 40 0047.00 D HLNAM 41 50 0048.00 D HMTYP 51 60 0049.00 D HFKEY 61 61 0050.00 D HMODE 62 62 0051.00 D HSSES 63 63 0052.00 D HRSV1 64 64 0053.00 D HRETC 65 65 0054.00 D HRSV2 66 68 0055.00 D HRECO 69 72B 0 0056.00 D HSEQN 73 79 0057.00 D HRSV3 80 100 0058.00 D HLCMD 101 107 0059.00 0060.00 * RTV/CHG ユーザー・スペース検索用パラメータ 0061.00 D DS 0062.00 D USPNL 1 20 0063.00 D USPNAM 1 10 INZ('QSUSPC ') 0064.00 D USPLIB 11 20 INZ('QTEMP ') 0065.00 D USPSTR 21 24B 0 INZ(1) 0066.00 D USPLEN 25 28B 0 INZ(107) 0067.00 D USPFRC 29 29 INZ('0') 0068.00 D USPERR 30 53 0069.00 0070.00 * SNDMSG メッセージ送信パラメータ 0071.00 D DS 0072.00 D MSGID 1 7 INZ('CPF9897') 0073.00 D MSGF 8 27 INZ('QCPFMSG QSYS ') 0074.00 D MSGDTA 28 28 INZ('A') 0075.00 D MSGLEN 29 32B 0 INZ(132) 0076.00 D MSGTYP 33 42 INZ('*INFO') 0077.00 D MSGENT 43 52 INZ('*') 0078.00 D MSGCNT 53 56B 0 INZ(2) 0079.00 D MSGKEY 57 60 0080.00 D MSGERR 61 84 0081.00 0082.00 D MSG S 132A INZ('EDTSRC のテスト ') 0083.00 D AR S 1A DIM(256) 0084.00 D N S 4S 0 0085.00 D TRUE S 1A DIM(256) 0086.00 D TRUE# S 4B 0 INZ(0) 0087.00 D FALSE# S 4B 0 INZ(-1) 0088.00 D QUOT C CONST(X'7D') 0089.00 D OE C CONST(X'0E') 0090.00 D OF C CONST(X'0F') 0091.00 D NULL C CONST(X'00') 0092.00 D STACK S 4B 0 0093.00 0094.00 D*( プログラム状況データ構造 ) 0095.00 D INFDS_THIS SDS 0096.00 D PROC_NAM *PROC 0097.00 D ROUTINE *ROUTINE 0098.00 D 512A 0099.00 D PGMINFO 1 512 0100.00 D LINE_NUM 21 28 0101.00 D CPFID 40 46 0102.00 D CPFDTA 91 170 0103.00 D ERRMSGID 46 51 0104.00 D CURUSR 358 367 0105.00 0106.00 D*( WORK 日付 YYMMDD データ 構造 ) 0107.00 D DATEDS DS 0108.00 D CENTURY 1 2 0 INZ(20) 0109.00 D YYMMDD 3 8 0 0110.00 D YY 3 4 0111.00 D MM 5 6 0112.00 D DD 7 8 0113.00 D CYY 1 4 0114.00 0115.00 D COMPILE C CONST('QUATTRO/COMPILE') 0116.00 D RPGERR C CONST('QUATTRO/RPGERR') 0117.00 D CLEERR C CONST('QUATTRO/CLEERR') 0118.00 D EXECUTE C CONST('QUATTRO/EXECUTE') 0119.00 D DEBUG C CONST('QUATTRO/DEBUG') 0120.00 D SAVMSG C CONST('QUATTRO/SAVMSG') 0121.00 D UPDJOB C CONST('QUATTRO/UPDJOB') 0122.00 0123.00 * *LDA: ローカル・データ・エリア 0124.00 D WKLDA UDS DTAARA(*LDA) 0125.00 D NXTJOB 362 371 0126.00 C*-------------------------------------------------------------------------- 0127.00 C *ENTRY PLIST | 0128.00 C PARM P1 4 0 | 0129.00 C PARM P2 4 0 | 0130.00 C PARM P3 4 0 | 0131.00 C*-------------------------------------------------------------------------- 0132.00 C EXSR RTVSPC 0133.00 C MOVEL USPDTA HEADER L 0134.00 C HFKEY CASEQ '7' COMPILE_ 0135.00 C HFKEY CASEQ '8' NXTJOB_ 0136.00 C ENDCS 0137.00 C SETON LR 0138.00 C RETURN 0139.00 C****************************************************** 0140.00 C *INZSR BEGSR 0141.00 C****************************************************** 0142.00 C* 初期 CYCLE のみの実行 0143.00 C* *DTAARA DEFINE *LDA WKLDA 0144.00 C* *LOCK IN *DTAARA 0145.00 C* UNLOCK WKLDA 0146.00 C ENDSR 0147.00 C****************************************************** 0148.00 C RTVSPC BEGSR 0149.00 C****************************************************** 0150.00 C CALL 'QUSRTVUS' 0151.00 C PARM USPNL 0152.00 C PARM USPSTR 0153.00 C PARM USPLEN 0154.00 C PARM USPDTA 1024 0155.00 C ENDSR 0156.00 C****************************************************** 0157.00 C CHGSPC BEGSR 0158.00 C****************************************************** 0159.00 C CALL 'QUSCHGUS' 0160.00 C PARM USPNL 0161.00 C PARM USPSTR 0162.00 C PARM USPLEN 0163.00 C PARM USPDTA 0164.00 C PARM USPFRC 0165.00 C PARM USPERR 0166.00 C ENDSR 0167.00 C****************************************************** 0168.00 C COMPILE_ BEGSR 0169.00 C****************************************************** 0170.00 C HCRRN IFGT *ZEROS 0171.00 C EXSR SAVERR_ 0172.00 C LEAVESR 0173.00 C ENDIF 0174.00 C CALL COMPILE 0175.00 C MOVE '1' HRETC 0176.00 C MOVEL HEADER USPDTA 0177.00 C EXSR CHGSPC 0178.00 C EXSR SNDMSG 0179.00 C *LOCK IN *DTAARA 0180.00 C ENDSR 0181.00 C****************************************************** 0182.00 C SAVERR_ BEGSR 0183.00 C****************************************************** 0184.00 C CALL SAVMSG 0185.00 C EXSR SNDMSG 0186.00 C ENDSR 0187.00 C****************************************************** 0188.00 C SNDMSG BEGSR 0189.00 C****************************************************** 0190.00 /FREE 0191.00 QMHSNDPM('EDT0001':'QEDTMSGF QUATTRO ':'EDTSRC': 0192.00 6:'*INFO':'*': 0193.00 2:RTNMSGKEY:QUSEC); 0194.00 /END-FREE 0195.00 C ENDSR 0196.00 C****************************************************** 0197.00 C NXTJOB_ BEGSR 0198.00 C****************************************************** 0199.00 C SELECT 0200.00 C WHEN NXTJOB = '*RPGERR ' 0201.00 C CALL RPGERR 0202.00 C WHEN NXTJOB = '*CLEERR ' 0203.00 C CALL CLEERR 0204.00 C WHEN NXTJOB = '*EXECUTE ' 0205.00 C CALL EXECUTE 0206.00 C EVAL NXTJOB = '*DEBUG ' 0207.00 C EXSR UPDJOB_ 0208.00 C WHEN NXTJOB = '*DEBUG ' 0209.00 C CALL DEBUG 0210.00 C EVAL NXTJOB = '*EXECUTE ' 0211.00 C EXSR UPDJOB_ 0212.00 C OTHER 0213.00 C CALL EXECUTE 0214.00 C ENDSL 0215.00 *( 受取りメッセージの送信 ) 0216.00 C MOVE '1' HRETC 0217.00 C MOVEL HEADER USPDTA 0218.00 C EXSR CHGSPC 0219.00 C EXSR SNDMSG 0220.00 C ENDSR 0221.00 C****************************************************** 0222.00 C UPDJOB_ BEGSR 0223.00 C****************************************************** 0224.00 C*( 次のジョブを更新しておく ) 0225.00 C CALL UPDJOB 0226.00 C PARM NXTJOB 0227.00 C ENDSR 0228.00 ** MSR 0229.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) 0230.00 MSG('' ソースが保管されていません。 SAVE で保管してください。 '')
この RPG ソースは 230 ステップと小さなプログラムであるが
F7 キーや F8 キーが押されたときに
最初に呼び出されてそれ以降の分岐を決めるプログラムである。
次に呼び出すプログラムは
0115.00 D COMPILE C CONST('QUATTRO/COMPILE') 0116.00 D RPGERR C CONST('QUATTRO/RPGERR') 0117.00 D CLEERR C CONST('QUATTRO/CLEERR') 0118.00 D EXECUTE C CONST('QUATTRO/EXECUTE') 0119.00 D DEBUG C CONST('QUATTRO/DEBUG') 0120.00 D SAVMSG C CONST('QUATTRO/SAVMSG') 0121.00 D UPDJOB C CONST('QUATTRO/UPDJOB')
として 7 種類のプログラムが用意されている。
COMPILE | : | RPG や C 言語をコンパイルする。 |
---|---|---|
RPGERR | : | RPG のコンパイル・エラーを検索する。 |
CLEERR | : | C 言語のコンパイル・エラーを検索する。 |
EXECUTE | : | プログラムを実行する。 |
DEBUG | : | プログラムのデバッグを開始する。 |
SAVMSG | : |
ソースが修正されているのに保管されていないことを告げる 警告メッセージを出力する。 「ソースが保管されていません。 SAVE で保管してください。」 |
UPDJOB | : | 次に実行すべきジョブを *LDA に更新する。 |
CRTBNDRPG PGM(QUATTRO/EDTSRC) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
0001.00 PGM 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* COMPILE : EDTSRC 出口プログラム ( コンパイル ) */ 0004.00 /* */ 0005.00 /* 2018/05/17 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0008.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0009.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0012.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0013.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0015.00 VALUE('*ESCAPE ') 0016.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0017.00 VALUE(X'000074') /* 2 進数 */ 0018.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0019.00 VALUE(X'00000000') 0020.00 /*( QUSRTVUS 用変数 )*/ 0021.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) + 0022.00 VALUE(X'00000001') /* 2 進数開始位置 : + 0023.00 125 */ 0024.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) + 0025.00 VALUE(X'00000400') /* 2 進数受取長さ : 16 */ 0026.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* + 0027.00 受取データ */ 0028.00 DCL VAR(&RCDL) TYPE(*CHAR) LEN(4) 0029.00 DCL VAR(&RCDLEN) TYPE(*DEC) LEN(8 0) 0030.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0031.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(10) 0032.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0033.00 DCL VAR(&SRCTYP) TYPE(*CHAR) LEN(10) 0034.00 /*( コンパイル用変数 )*/ 0035.00 DCL VAR(&OBJECT) TYPE(*CHAR) LEN(10) 0036.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0037.00 DCL VAR(&OBJTYP) TYPE(*CHAR) LEN(10) 0038.00 DCL VAR(&USRDFN) TYPE(*CHAR) LEN(10) 0039.00 DCL VAR(&COMPILE) TYPE(*CHAR) LEN(10) 0040.00 DCL VAR(&BNDSRVPGM) TYPE(*CHAR) LEN(202) 0041.00 DCL VAR(&DEFINE) TYPE(*CHAR) LEN(80) 0042.00 DCL VAR(&ACTGRP) TYPE(*CHAR) LEN(10) 0043.00 DCL VAR(&BIN2) TYPE(*CHAR) LEN(2) 0044.00 DCL VAR(&SRVSU) TYPE(*DEC) LEN(8 0) VALUE(0) 0045.00 DCL VAR(&SRV_01) TYPE(*CHAR) LEN(10) 0046.00 DCL VAR(&LIB_01) TYPE(*CHAR) LEN(10) 0047.00 DCL VAR(&SRV_02) TYPE(*CHAR) LEN(10) 0048.00 DCL VAR(&LIB_02) TYPE(*CHAR) LEN(10) 0049.00 DCL VAR(&SRV_03) TYPE(*CHAR) LEN(10) 0050.00 DCL VAR(&LIB_03) TYPE(*CHAR) LEN(10) 0051.00 DCL VAR(&SRV_04) TYPE(*CHAR) LEN(10) 0052.00 DCL VAR(&LIB_04) TYPE(*CHAR) LEN(10) 0053.00 DCL VAR(&SRV_05) TYPE(*CHAR) LEN(10) 0054.00 DCL VAR(&LIB_05) TYPE(*CHAR) LEN(10) 0055.00 DCL VAR(&SRV_06) TYPE(*CHAR) LEN(10) 0056.00 DCL VAR(&LIB_06) TYPE(*CHAR) LEN(10) 0057.00 DCL VAR(&SRV_07) TYPE(*CHAR) LEN(10) 0058.00 DCL VAR(&LIB_07) TYPE(*CHAR) LEN(10) 0059.00 DCL VAR(&SRV_08) TYPE(*CHAR) LEN(10) 0060.00 DCL VAR(&LIB_08) TYPE(*CHAR) LEN(10) 0061.00 DCL VAR(&SRV_09) TYPE(*CHAR) LEN(10) 0062.00 DCL VAR(&LIB_09) TYPE(*CHAR) LEN(10) 0063.00 DCL VAR(&SRV_10) TYPE(*CHAR) LEN(10) 0064.00 DCL VAR(&LIB_10) TYPE(*CHAR) LEN(10) 0065.00 DCL VAR(&NXTJOB) TYPE(*CHAR) LEN(10) + 0066.00 VALUE('*EXECUTE ') 0067.00 /*( RTVPRTFA 用の変数 )*/ 0068.00 DCL VAR(&PRTF) TYPE(*CHAR) LEN(10) 0069.00 DCL VAR(&PRTFLIB) TYPE(*CHAR) LEN(10) 0070.00 DCL VAR(&IGCDTA) TYPE(*CHAR) LEN(4) 0071.00 DCL VAR(&IGCEXNCHR) TYPE(*CHAR) LEN(4) 0072.00 DCL VAR(&WAITFILE) TYPE(*CHAR) LEN(6) 0073.00 DCL VAR(&SHARE) TYPE(*CHAR) LEN(4) 0074.00 DCL VAR(&LVLCHK) TYPE(*CHAR) LEN(4) 0075.00 DCL VAR(&DEV) TYPE(*CHAR) LEN(10) 0076.00 DCL VAR(&SPOOL) TYPE(*CHAR) LEN(4) 0077.00 DCL VAR(&FOLD) TYPE(*CHAR) LEN(4) 0078.00 DCL VAR(&RPLUNPRT) TYPE(*CHAR) LEN(4) 0079.00 DCL VAR(&RPLUNPRTC) TYPE(*CHAR) LEN(2) 0080.00 DCL VAR(&RPLCHAR) TYPE(*CHAR) LEN(1) 0081.00 DCL VAR(&CPI) TYPE(*DEC) LEN(3 1) 0082.00 DCL VAR(&LPI) TYPE(*DEC) LEN(3 1) 0083.00 DCL VAR(&ALIGN) TYPE(*CHAR) LEN(4) 0084.00 DCL VAR(&DEVTYPE) TYPE(*CHAR) LEN(10) 0085.00 DCL VAR(&PAGLEN) TYPE(*DEC) LEN(3 0) 0086.00 DCL VAR(&PAGWTH) TYPE(*DEC) LEN(3 0) 0087.00 DCL VAR(&OVERFLOW) TYPE(*DEC) LEN(3 0) 0088.00 DCL VAR(&PAGRTT) TYPE(*CHAR) LEN(5) 0089.00 DCL VAR(&PRTTXT) TYPE(*CHAR) LEN(30) 0090.00 DCL VAR(&JUSTIFY) TYPE(*CHAR) LEN(3) 0091.00 DCL VAR(&PAGRTT) TYPE(*CHAR) LEN(5) 0092.00 DCL VAR(&PRTTXT) TYPE(*CHAR) LEN(30) 0093.00 DCL VAR(&JUSTIFY) TYPE(*CHAR) LEN(3) 0094.00 DCL VAR(&CTLCHAR) TYPE(*CHAR) LEN(5) 0095.00 DCL VAR(&PRTQLTY) TYPE(*CHAR) LEN(6) 0096.00 DCL VAR(&FORMFEED) TYPE(*CHAR) LEN(8) 0097.00 DCL VAR(&FORMTYPE) TYPE(*CHAR) LEN(10) 0098.00 DCL VAR(&COPIES) TYPE(*DEC) LEN(4 0) 0099.00 DCL VAR(&HOLD) TYPE(*CHAR) LEN(4) 0100.00 DCL VAR(&SAVE) TYPE(*CHAR) LEN(4) 0101.00 DCL VAR(&USRDTA) TYPE(*CHAR) LEN(10) 0102.00 DCL VAR(&DRAWER) TYPE(*CHAR) LEN(8) 0103.00 DCL VAR(&FONT) TYPE(*CHAR) LEN(10) 0104.00 DCL VAR(&GRPCHRSET) TYPE(*CHAR) LEN(10) 0105.00 DCL VAR(&CODEPAGE) TYPE(*CHAR) LEN(10) 0106.00 DCL VAR(&DUPLEX) TYPE(*CHAR) LEN(7) 0107.00 DCL VAR(&MULTIUP) TYPE(*DEC) LEN(2 0) 0108.00 DCL VAR(&UOM) TYPE(*CHAR) LEN(5) 0109.00 DCL VAR(&DECFMT) TYPE(*CHAR) LEN(5) 0110.00 DCL VAR(&REDUCE) TYPE(*CHAR) LEN(5) 0111.00 DCL VAR(&TBLREFCHR) TYPE(*CHAR) LEN(4) 0112.00 DCL VAR(&CCSID) TYPE(*DEC) LEN(5 0) 0113.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) 0114.00 /*( RTVDSPF 用の変数 )*/ 0115.00 DCL VAR(&DSPF) TYPE(*CHAR) LEN(10) 0116.00 DCL VAR(&DSPFLIB) TYPE(*CHAR) LEN(10) 0117.00 DCL VAR(&DSPFFLIB) TYPE(*CHAR) LEN(20) 0118.00 DCL VAR(&RTNLIB) TYPE(*CHAR) LEN(10) 0119.00 DCL VAR(&USRDFN) TYPE(*CHAR) LEN(10) 0120.00 DCL VAR(&IGCDTA) TYPE(*CHAR) LEN(4) 0121.00 DCL VAR(&IGCEXNCHR) TYPE(*CHAR) LEN(4) 0122.00 DCL VAR(&EHNDSP) TYPE(*CHAR) LEN(4) 0123.00 DCL VAR(&RSTDSP) TYPE(*CHAR) LEN(4) 0124.00 DCL VAR(&DFRWRT) TYPE(*CHAR) LEN(4) 0125.00 DCL VAR(&DECFMT) TYPE(*CHAR) LEN(5) 0126.00 DCL VAR(&SFLEND) TYPE(*CHAR) LEN(5) 0127.00 DCL VAR(&WAITFILE) TYPE(*CHAR) LEN(6) 0128.00 DCL VAR(&WAITRCD) TYPE(*CHAR) LEN(6) 0129.00 DCL VAR(&DTAQQLIB) TYPE(*CHAR) LEN(20) 0130.00 DCL VAR(&DTAQ) TYPE(*CHAR) LEN(10) 0131.00 DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(10) 0132.00 DCL VAR(&SHARE) TYPE(*CHAR) LEN(4) 0133.00 DCL VAR(&LANGID) TYPE(*CHAR) LEN(10) 0134.00 DCL VAR(&LVLCHK) TYPE(*CHAR) LEN(4) 0135.00 DCL VAR(&AUT) TYPE(*CHAR) LEN(10) 0136.00 MONMSG MSGID(CPF0000 RNS0000 CZM0000) EXEC(GOTO + 0137.00 CMDLBL(ERROR)) 0138.00 0139.00 /*( 環境の取得 )*/ 0140.00 RTVJOBA TYPE(&TYPE) 0141.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0142.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0143.00 ENDDO /* バッチ */ 0144.00 ELSE CMD(DO) /* 対話式 */ 0145.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0146.00 ENDDO /* 対話式 */ 0147.00 0148.00 /*( SEU で作成されたユーザー空間の検索 )*/ 0149.00 CHKOBJ OBJ(QTEMP/QSUSPC) OBJTYPE(*USRSPC) 0150.00 MONMSG MSGID(CPF9800) EXEC(DO) 0151.00 RTVDTAARA DTAARA(*LDA (432 10)) RTNVAR(&OBJECT) 0152.00 RTVDTAARA DTAARA(*LDA (01 10)) RTNVAR(&SRCF) 0153.00 RTVDTAARA DTAARA(*LDA (11 10)) RTNVAR(&SRCFLIB) 0154.00 RTVDTAARA DTAARA(*LDA (21 10)) RTNVAR(&SRCMBR) 0155.00 RTVDTAARA DTAARA(*LDA (31 10)) RTNVAR(&SRCTYP) 0156.00 GOTO GETPARM 0157.00 ENDDO 0158.00 CALL PGM(QUSRTVUS) PARM('QSUSPC QTEMP ' + 0159.00 &STRPOS &LENDTA &RCVDTA) 0160.00 CHGVAR VAR(&RCDL) VALUE(%SST(&RCVDTA 1 4)) 0161.00 CHGVAR VAR(&RCDLEN) VALUE(%BIN(&RCDL)) 0162.00 CHGVAR VAR(&SRCMBR) VALUE(%SST(&RCVDTA 21 10)) 0163.00 CHGVAR VAR(&SRCF) VALUE(%SST(&RCVDTA 31 10)) 0164.00 CHGVAR VAR(&SRCFLIB) VALUE(%SST(&RCVDTA 41 10)) 0165.00 CHGVAR VAR(&SRCTYP) VALUE(%SST(&RCVDTA 51 10)) 0166.00 0167.00 /*( パラメータの取得 )*/ 0168.00 GETPARM: RTVDTAARA DTAARA(*LDA (41 10)) RTNVAR(&OBJLIB) 0169.00 RTVDTAARA DTAARA(*LDA (51 10)) RTNVAR(&COMPILE) 0170.00 RTVDTAARA DTAARA(*LDA (61 202)) RTNVAR(&BNDSRVPGM) 0171.00 RTVDTAARA DTAARA(*LDA (263 80)) RTNVAR(&DEFINE) 0172.00 RTVDTAARA DTAARA(*LDA (342 10)) RTNVAR(&ACTGRP) 0173.00 RTVDTAARA DTAARA(*LDA (352 10)) RTNVAR(&OBJTYP) 0174.00 RTVDTAARA DTAARA(*LDA (422 10)) RTNVAR(&USRDFN) 0175.00 RTVDTAARA DTAARA(*LDA (432 10)) RTNVAR(&OBJECT) 0176.00 CHGVAR VAR(&BIN2) VALUE(%SST(&BNDSRVPGM 1 2)) 0177.00 CHGVAR VAR(&SRVSU) VALUE(%BIN(&BIN2)) 0178.00 CHGVAR VAR(&SRV_01) VALUE(%SST(&BNDSRVPGM 3 10)) 0179.00 CHGVAR VAR(&LIB_01) VALUE(%SST(&BNDSRVPGM 13 10)) 0180.00 CHGVAR VAR(&SRV_02) VALUE(%SST(&BNDSRVPGM 23 10)) 0181.00 CHGVAR VAR(&LIB_02) VALUE(%SST(&BNDSRVPGM 33 10)) 0182.00 CHGVAR VAR(&SRV_03) VALUE(%SST(&BNDSRVPGM 43 10)) 0183.00 CHGVAR VAR(&LIB_03) VALUE(%SST(&BNDSRVPGM 53 10)) 0184.00 CHGVAR VAR(&SRV_04) VALUE(%SST(&BNDSRVPGM 63 10)) 0185.00 CHGVAR VAR(&LIB_04) VALUE(%SST(&BNDSRVPGM 73 10)) 0186.00 CHGVAR VAR(&SRV_05) VALUE(%SST(&BNDSRVPGM 83 10)) 0187.00 CHGVAR VAR(&LIB_05) VALUE(%SST(&BNDSRVPGM 93 10)) 0188.00 CHGVAR VAR(&SRV_06) VALUE(%SST(&BNDSRVPGM 103 10)) 0189.00 CHGVAR VAR(&LIB_06) VALUE(%SST(&BNDSRVPGM 113 10)) 0190.00 CHGVAR VAR(&SRV_07) VALUE(%SST(&BNDSRVPGM 123 10)) 0191.00 CHGVAR VAR(&LIB_07) VALUE(%SST(&BNDSRVPGM 133 10)) 0192.00 CHGVAR VAR(&SRV_08) VALUE(%SST(&BNDSRVPGM 143 10)) 0193.00 CHGVAR VAR(&LIB_08) VALUE(%SST(&BNDSRVPGM 153 10)) 0194.00 CHGVAR VAR(&SRV_09) VALUE(%SST(&BNDSRVPGM 163 10)) 0195.00 CHGVAR VAR(&LIB_09) VALUE(%SST(&BNDSRVPGM 173 10)) 0196.00 CHGVAR VAR(&SRV_10) VALUE(%SST(&BNDSRVPGM 183 10)) 0197.00 CHGVAR VAR(&LIB_10) VALUE(%SST(&BNDSRVPGM 193 10)) 0198.00 0199.00 IF COND(&SRCTYP *EQ ' ') THEN(DO) 0200.00 CHGVAR VAR(&MSG) + 0201.00 VALUE(' このソースにはソース・タイプがない + 0202.00 のでコンパイルできません。 ') 0203.00 GOTO SNDMSG 0204.00 ENDDO 0205.00 /*( コンパイラーの指定 )*/ 0206.00 /*( RPG )*/ 0207.00 IF COND(&SRCTYP *EQ 'RPGLE ') THEN(DO) 0208.00 IF COND(&SRVSU *EQ 0) THEN(DO) 0209.00 CHGVAR VAR(&COMPILE) VALUE('CRTBNDRPG ') 0210.00 ENDDO 0211.00 ELSE CMD(DO) 0212.00 CHGVAR VAR(&COMPILE) VALUE('CRTRPGMOD ') 0213.00 ENDDO 0214.00 ENDDO 0215.00 /*( CLE )*/ 0216.00 IF COND((&SRCTYP *EQ 'C ') *OR (&SRCTYP + 0217.00 *EQ 'CLE ')) THEN(DO) 0218.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) /* + 0219.00 PGM */ 0220.00 IF COND(&SRVSU *EQ 0) THEN(DO) 0221.00 CHGVAR VAR(&COMPILE) VALUE('CRTBNDC ') 0222.00 ENDDO 0223.00 ELSE CMD(DO) 0224.00 CHGVAR VAR(&COMPILE) VALUE('CRTCMOD ') 0225.00 ENDDO 0226.00 ENDDO /* PGM */ 0227.00 ELSE CMD(IF COND(&OBJTYP *EQ '*SRVPGM ') + 0228.00 THEN(DO)) /* *SRVPGM */ 0229.00 CHGVAR VAR(&COMPILE) VALUE('CRTCMOD ') 0230.00 ENDDO /* *SRVPGM */ 0231.00 ENDDO 0232.00 /*( PRTF )*/ 0233.00 IF COND(&SRCTYP *EQ 'PRTF ') THEN(DO) 0234.00 CHGVAR VAR(&PRTF) VALUE(&OBJECT) 0235.00 QUATTRO/RTVPRTFA PRTF(&OBJLIB/&PRTF) RTNLIB(&PRTFLIB) + 0236.00 IGCDTA(&IGCDTA) IGCEXNCHR(&IGCEXNCHR) + 0237.00 WAITFILE(&WAITFILE) SHARE(&SHARE) + 0238.00 LVLCHK(&LVLCHK) DEV(&DEV) SPOOL(&SPOOL) + 0239.00 FOLD(&FOLD) RPLUNPRT(&RPLUNPRT) + 0240.00 RPLUNPRTC(&RPLUNPRTC) CPI(&CPI) LPI(&LPI) + 0241.00 ALIGN(&ALIGN) DEVTYPE(&DEVTYPE) + 0242.00 PAGLEN(&PAGLEN) PAGWTH(&PAGWTH) + 0243.00 OVERFLOW(&OVERFLOW) PAGRTT(&PAGRTT) + 0244.00 PRTTXT(&PRTTXT) JUSTIFY(&JUSTIFY) + 0245.00 CTLCHAR(&CTLCHAR) PRTQLTY(&PRTQLTY) + 0246.00 FORMFEED(&FORMFEED) FORMTYPE(&FORMTYPE) + 0247.00 COPIES(&COPIES) DRAWER(&DRAWER) + 0248.00 FONT(&FONT) HOLD(&HOLD) SAVE(&SAVE) + 0249.00 USRDTA(&USRDTA) GRPCHRSET(&GRPCHRSET) + 0250.00 CODEPAGE(&CODEPAGE) DUPLEX(&DUPLEX) + 0251.00 MULTIUP(&MULTIUP) UOM(&UOM) + 0252.00 DECFMT(&DECFMT) REDUCE(&REDUCE) + 0253.00 TBLREFCHR(&TBLREFCHR) CCSID(&CCSID) + 0254.00 TEXT(&TEXT) 0255.00 IF COND(&RPLUNPRTC *EQ '40') THEN(CHGVAR + 0256.00 VAR(&RPLCHAR) VALUE(' ')) 0257.00 IF COND(&USRDFN *EQ 'CRTEXPRTF ') THEN(DO) 0258.00 CHGVAR VAR(&COMPILE) VALUE('CRTEXPRTF ') 0259.00 ENDDO 0260.00 ELSE CMD(DO) 0261.00 CHGVAR VAR(&COMPILE) VALUE('CRTPRTF ') 0262.00 ENDDO 0263.00 ENDDO 0264.00 /*( DSPF )*/ 0265.00 IF COND(&SRCTYP *EQ 'DSPF ') THEN(DO) 0266.00 CHGVAR VAR(&DSPF) VALUE(&OBJECT) 0267.00 RTVDSPF DSPF(&OBJLIB/&DSPF) RTNLIB(&DSPFLIB) + 0268.00 USRDFN(&USRDFN) IGCDTA(&IGCDTA) + 0269.00 IGCEXNCHR(&IGCEXNCHR) TEXT(&TEXT) + 0270.00 EHNDSP(&EHNDSP) RSTDSP(&RSTDSP) + 0271.00 DFRWRT(&DFRWRT) DECFMT(&DECFMT) + 0272.00 SFLEND(&SFLEND) WAITFILE(&WAITFILE) + 0273.00 WAITRCD(&WAITRCD) DTAQ(&DTAQ) + 0274.00 DTAQLIB(&DTAQLIB) SHARE(&SHARE) + 0275.00 LANGID(&LANGID) LVLCHK(&LVLCHK) AUT(&AUT) 0276.00 IF COND(&USRDFN *EQ 'CRTEXDSPF ') THEN(DO) 0277.00 CHGVAR VAR(&COMPILE) VALUE('CRTEXDSPF ') 0278.00 ENDDO 0279.00 ELSE CMD(DO) 0280.00 CHGVAR VAR(&COMPILE) VALUE('CRTDSPF ') 0281.00 ENDDO 0282.00 ENDDO 0283.00 0284.00 /*( コンパイル・コマンドの指定 )*/ 0285.00 /*( CRTBNDC )*/ 0286.00 IF COND(&COMPILE *EQ 'CRTBNDC ') THEN(DO) /* + 0287.00 BND-C */ 0288.00 RMVMSG PGMQ(*ALLINACT) CLEAR(*ALL) 0289.00 ? CRTBNDC PGM(&OBJLIB/&OBJECT) + 0290.00 SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0291.00 AUT(*ALL) 0292.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0293.00 ENDDO 0294.00 /*( CRTCMOD )*/ 0295.00 IF COND(&COMPILE *EQ 'CRTCMOD ') THEN(DO) /* + 0296.00 BND-C */ 0297.00 RMVMSG PGMQ(*ALLINACT) CLEAR(*ALL) 0298.00 ? CRTCMOD MODULE(QTEMP/&SRCMBR) + 0299.00 SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0300.00 OPTIMIZE(30) DBGVIEW(*SOURCE) + 0301.00 DEFINE(&DEFINE) AUT(*ALL) 0302.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0303.00 IF COND(&SRVSU *EQ 0) THEN(DO) 0304.00 IF COND(&OBJTYP *EQ '*SRVPGM ') THEN(DO) 0305.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0306.00 MODULE(QTEMP/&SRCMBR) + 0307.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0308.00 ACTGRP(&ACTGRP) AUT(*ALL) 0309.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0310.00 ENDDO 0311.00 ENDDO 0312.00 IF COND(&SRVSU *EQ 1) THEN(DO) 0313.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0314.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0315.00 MODULE(QTEMP/&SRCMBR) + 0316.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED)) + 0317.00 ACTGRP(&ACTGRP) AUT(*ALL) 0318.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0319.00 ENDDO 0320.00 ELSE CMD(DO) 0321.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0322.00 MODULE(QTEMP/&SRCMBR) + 0323.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0324.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED)) + 0325.00 ACTGRP(&ACTGRP) AUT(*ALL) 0326.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0327.00 ENDDO 0328.00 ENDDO 0329.00 IF COND(&SRVSU *EQ 2) THEN(DO) 0330.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0331.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0332.00 MODULE(QTEMP/&SRCMBR) + 0333.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0334.00 (&LIB_02/&SRV_02 *IMMED)) ACTGRP(&ACTGRP) + 0335.00 AUT(*ALL) 0336.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0337.00 ENDDO 0338.00 ELSE CMD(DO) 0339.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0340.00 MODULE(QTEMP/&SRCMBR) + 0341.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0342.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0343.00 (&LIB_02/&SRV_02 *IMMED)) ACTGRP(&ACTGRP) + 0344.00 AUT(*ALL) 0345.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0346.00 ENDDO 0347.00 ENDDO 0348.00 IF COND(&SRVSU *EQ 3) THEN(DO) 0349.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0350.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0351.00 MODULE(QTEMP/&SRCMBR) + 0352.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0353.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0354.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0355.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0356.00 ENDDO 0357.00 ELSE CMD(DO) 0358.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0359.00 MODULE(QTEMP/&SRCMBR) + 0360.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0361.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0362.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0363.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0364.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0365.00 ENDDO 0366.00 ENDDO 0367.00 IF COND(&SRVSU *EQ 4) THEN(DO) 0368.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0369.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0370.00 MODULE(QTEMP/&SRCMBR) + 0371.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0372.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0373.00 *IMMED) (&LIB_04/&SRV_04 *IMMED)) + 0374.00 ACTGRP(&ACTGRP) AUT(*ALL) 0375.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0376.00 ENDDO 0377.00 ELSE CMD(DO) 0378.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0379.00 MODULE(QTEMP/&SRCMBR) + 0380.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0381.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0382.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0383.00 *IMMED) (&LIB_04/&SRV_04 *IMMED)) + 0384.00 ACTGRP(&ACTGRP) AUT(*ALL) 0385.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0386.00 ENDDO 0387.00 ENDDO 0388.00 IF COND(&SRVSU *EQ 5) THEN(DO) 0389.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0390.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0391.00 MODULE(QTEMP/&SRCMBR) + 0392.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0393.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0394.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0395.00 (&LIB_05/&SRV_05 *IMMED)) ACTGRP(&ACTGRP) + 0396.00 AUT(*ALL) 0397.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0398.00 ENDDO 0399.00 ELSE CMD(DO) 0400.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0401.00 MODULE(QTEMP/&SRCMBR) + 0402.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0403.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0404.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0405.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0406.00 (&LIB_05/&SRV_05 *IMMED)) ACTGRP(&ACTGRP) + 0407.00 AUT(*ALL) 0408.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0409.00 ENDDO 0410.00 ENDDO 0411.00 IF COND(&SRVSU *EQ 6) THEN(DO) 0412.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0413.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0414.00 MODULE(QTEMP/&SRCMBR) + 0415.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0416.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0417.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0418.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0419.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0420.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0421.00 ENDDO 0422.00 ELSE CMD(DO) 0423.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0424.00 MODULE(QTEMP/&SRCMBR) + 0425.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0426.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0427.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0428.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0429.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0430.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0431.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0432.00 ENDDO 0433.00 ENDDO 0434.00 IF COND(&SRVSU *EQ 7) THEN(DO) 0435.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0436.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0437.00 MODULE(QTEMP/&SRCMBR) + 0438.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0439.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0440.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0441.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0442.00 *IMMED) (&LIB_07/&SRV_07 *IMMED)) + 0443.00 ACTGRP(&ACTGRP) AUT(*ALL) 0444.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0445.00 ENDDO 0446.00 ELSE CMD(DO) 0447.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0448.00 MODULE(QTEMP/&SRCMBR) + 0449.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0450.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0451.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0452.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0453.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0454.00 *IMMED) (&LIB_07/&SRV_07 *IMMED)) + 0455.00 ACTGRP(&ACTGRP) AUT(*ALL) 0456.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0457.00 ENDDO 0458.00 ENDDO 0459.00 IF COND(&SRVSU *EQ 8) THEN(DO) 0460.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0461.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0462.00 MODULE(QTEMP/&SRCMBR) + 0463.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0464.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0465.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0466.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0467.00 *IMMED) (&LIB_07/&SRV_07 *IMMED) + 0468.00 (&LIB_08/&SRV_08 *IMMED)) ACTGRP(&ACTGRP) + 0469.00 AUT(*ALL) 0470.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0471.00 ENDDO 0472.00 ELSE CMD(DO) 0473.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0474.00 MODULE(QTEMP/&SRCMBR) + 0475.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0476.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0477.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0478.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0479.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0480.00 *IMMED) (&LIB_07/&SRV_07 *IMMED) + 0481.00 (&LIB_08/&SRV_08 *IMMED)) ACTGRP(&ACTGRP) + 0482.00 AUT(*ALL) 0483.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0484.00 ENDDO 0485.00 ENDDO 0486.00 IF COND(&SRVSU *EQ 9) THEN(DO) 0487.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0488.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0489.00 MODULE(QTEMP/&SRCMBR) + 0490.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0491.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0492.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0493.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0494.00 *IMMED) (&LIB_07/&SRV_07 *IMMED) + 0495.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0496.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0497.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0498.00 ENDDO 0499.00 ELSE CMD(DO) 0500.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0501.00 MODULE(QTEMP/&SRCMBR) + 0502.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0503.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0504.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0505.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0506.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0507.00 *IMMED) (&LIB_07/&SRV_07 *IMMED) + 0508.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0509.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0510.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0511.00 ENDDO 0512.00 ENDDO 0513.00 IF COND(&SRVSU *EQ 10) THEN(DO) 0514.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0515.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0516.00 MODULE(QTEMP/&SRCMBR) + 0517.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0518.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0519.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0520.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0521.00 *IMMED) (&LIB_07/&SRV_07 *IMMED) + 0522.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0523.00 *IMMED) (&LIB_10/&SRV_10 *IMMED)) + 0524.00 ACTGRP(&ACTGRP) AUT(*ALL) 0525.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0526.00 ENDDO 0527.00 ELSE CMD(DO) 0528.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0529.00 MODULE(QTEMP/&SRCMBR) + 0530.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0531.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0532.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0533.00 *IMMED) (&LIB_04/&SRV_04 *IMMED) + 0534.00 (&LIB_05/&SRV_05 *IMMED) (&LIB_06/&SRV_06 + 0535.00 *IMMED) (&LIB_07/&SRV_07 *IMMED) + 0536.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0537.00 *IMMED) (&LIB_10/&SRV_10 *IMMED)) + 0538.00 ACTGRP(&ACTGRP) AUT(*ALL) 0539.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0540.00 ENDDO 0541.00 ENDDO 0542.00 ENDDO 0543.00 /*( CRTBNDRPG )*/ 0544.00 IF COND(&COMPILE *EQ 'CRTBNDRPG ') THEN(DO) 0545.00 ? CRTBNDRPG PGM(&OBJLIB/&OBJECT) + 0546.00 SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0547.00 DFTACTGRP(*NO) ACTGRP(&ACTGRP) + 0548.00 DBGVIEW(*SOURCE) AUT(*ALL) 0549.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0550.00 ENDDO 0551.00 /*( CRTRPGMOD )*/ 0552.00 IF COND(&COMPILE *EQ 'CRTRPGMOD ') THEN(DO) 0553.00 ? CRTRPGMOD MODULE(QTEMP/&SRCMBR) + 0554.00 SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0555.00 DBGVIEW(*SOURCE) AUT(*ALL) 0556.00 MONMSG MSGID(CPF6801) EXEC(RETURN) 0557.00 IF COND(&SRVSU *EQ 1) THEN(DO) 0558.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0559.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0560.00 MODULE(QTEMP/&SRCMBR) + 0561.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED)) + 0562.00 ACTGRP(&ACTGRP) AUT(*ALL) 0563.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0564.00 ENDDO 0565.00 ELSE CMD(DO) 0566.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0567.00 MODULE(QTEMP/&SRCMBR) + 0568.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0569.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED)) + 0570.00 ACTGRP(&ACTGRP) AUT(*ALL) 0571.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0572.00 ENDDO 0573.00 ENDDO 0574.00 IF COND(&SRVSU *EQ 2) THEN(DO) 0575.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0576.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0577.00 MODULE(QTEMP/&SRCMBR) + 0578.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0579.00 (&LIB_02/&SRV_02 *IMMED)) ACTGRP(&ACTGRP) + 0580.00 AUT(*ALL) 0581.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0582.00 ENDDO 0583.00 ELSE CMD(DO) 0584.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0585.00 MODULE(QTEMP/&SRCMBR) + 0586.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0587.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0588.00 (&LIB_02/&SRV_02 *IMMED)) ACTGRP(&ACTGRP) + 0589.00 AUT(*ALL) 0590.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0591.00 ENDDO 0592.00 ENDDO 0593.00 IF COND(&SRVSU *EQ 3) THEN(DO) 0594.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0595.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0596.00 MODULE(QTEMP/&SRCMBR) + 0597.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0598.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0599.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0600.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0601.00 ENDDO 0602.00 ELSE CMD(DO) 0603.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0604.00 MODULE(QTEMP/&SRCMBR) + 0605.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0606.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0607.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0608.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0609.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0610.00 ENDDO 0611.00 ENDDO 0612.00 IF COND(&SRVSU *EQ 4) THEN(DO) 0613.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0614.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0615.00 MODULE(QTEMP/&SRCMBR) + 0616.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0617.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0618.00 *IMMED) (&LIB_04/&SRV_04)) + 0619.00 ACTGRP(&ACTGRP) AUT(*ALL) 0620.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0621.00 ENDDO 0622.00 ELSE CMD(DO) 0623.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0624.00 MODULE(QTEMP/&SRCMBR) + 0625.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0626.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0627.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0628.00 *IMMED) (&LIB_04/&SRV_04)) + 0629.00 ACTGRP(&ACTGRP) AUT(*ALL) 0630.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0631.00 ENDDO 0632.00 ENDDO 0633.00 IF COND(&SRVSU *EQ 5) THEN(DO) 0634.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0635.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0636.00 MODULE(QTEMP/&SRCMBR) + 0637.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0638.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0639.00 *IMMED) (&LIB_04/&SRV_04) + 0640.00 (&LIB_05/&SRV_05)) ACTGRP(&ACTGRP) AUT(*ALL) 0641.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0642.00 ENDDO 0643.00 ELSE CMD(DO) 0644.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0645.00 MODULE(QTEMP/&SRCMBR) + 0646.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0647.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0648.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0649.00 *IMMED) (&LIB_04/&SRV_04) + 0650.00 (&LIB_05/&SRV_05)) ACTGRP(&ACTGRP) AUT(*ALL) 0651.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0652.00 ENDDO 0653.00 ENDDO 0654.00 IF COND(&SRVSU *EQ 6) THEN(DO) 0655.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0656.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0657.00 MODULE(QTEMP/&SRCMBR) + 0658.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0659.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0660.00 *IMMED) (&LIB_04/&SRV_04) + 0661.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0662.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0663.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0664.00 ENDDO 0665.00 ELSE CMD(DO) 0666.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0667.00 MODULE(QTEMP/&SRCMBR) + 0668.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0669.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0670.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0671.00 *IMMED) (&LIB_04/&SRV_04) + 0672.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0673.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0674.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0675.00 ENDDO 0676.00 ENDDO 0677.00 IF COND(&SRVSU *EQ 7) THEN(DO) 0678.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0679.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0680.00 MODULE(QTEMP/&SRCMBR) + 0681.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0682.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0683.00 *IMMED) (&LIB_04/&SRV_04) + 0684.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0685.00 *IMMED) (&LIB_07/&SRV_07)) + 0686.00 ACTGRP(&ACTGRP) AUT(*ALL) 0687.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0688.00 ENDDO 0689.00 ELSE CMD(DO) 0690.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0691.00 MODULE(QTEMP/&SRCMBR) + 0692.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0693.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0694.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0695.00 *IMMED) (&LIB_04/&SRV_04) + 0696.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0697.00 *IMMED) (&LIB_07/&SRV_07)) + 0698.00 ACTGRP(&ACTGRP) AUT(*ALL) 0699.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0700.00 ENDDO 0701.00 ENDDO 0702.00 IF COND(&SRVSU *EQ 8) THEN(DO) 0703.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0704.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0705.00 MODULE(QTEMP/&SRCMBR) + 0706.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0707.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0708.00 *IMMED) (&LIB_04/&SRV_04) + 0709.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0710.00 *IMMED) (&LIB_07/&SRV_07) + 0711.00 (&LIB_08/&SRV_08 *IMMED)) ACTGRP(&ACTGRP) + 0712.00 AUT(*ALL) 0713.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0714.00 ENDDO 0715.00 ELSE CMD(DO) 0716.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0717.00 MODULE(QTEMP/&SRCMBR) + 0718.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0719.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0720.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0721.00 *IMMED) (&LIB_04/&SRV_04) + 0722.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0723.00 *IMMED) (&LIB_07/&SRV_07) + 0724.00 (&LIB_08/&SRV_08 *IMMED)) ACTGRP(&ACTGRP) + 0725.00 AUT(*ALL) 0726.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0727.00 ENDDO 0728.00 ENDDO 0729.00 IF COND(&SRVSU *EQ 9) THEN(DO) 0730.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0731.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0732.00 MODULE(QTEMP/&SRCMBR) + 0733.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0734.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0735.00 *IMMED) (&LIB_04/&SRV_04) + 0736.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0737.00 *IMMED) (&LIB_07/&SRV_07) + 0738.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0739.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0740.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0741.00 ENDDO 0742.00 ELSE CMD(DO) 0743.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0744.00 MODULE(QTEMP/&SRCMBR) + 0745.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0746.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0747.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0748.00 *IMMED) (&LIB_04/&SRV_04) + 0749.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0750.00 *IMMED) (&LIB_07/&SRV_07) + 0751.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0752.00 *IMMED)) ACTGRP(&ACTGRP) AUT(*ALL) 0753.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0754.00 ENDDO 0755.00 ENDDO 0756.00 IF COND(&SRVSU *EQ 10) THEN(DO) 0757.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) 0758.00 ? CRTPGM PGM(&OBJLIB/&OBJECT) + 0759.00 MODULE(QTEMP/&SRCMBR) + 0760.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0761.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0762.00 *IMMED) (&LIB_04/&SRV_04) + 0763.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0764.00 *IMMED) (&LIB_07/&SRV_07) + 0765.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0766.00 *IMMED) (&LIB_10/&SRV_10)) + 0767.00 ACTGRP(&ACTGRP) AUT(*ALL) 0768.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0769.00 ENDDO 0770.00 ELSE CMD(DO) 0771.00 ? CRTSRVPGM SRVPGM(&OBJLIB/&OBJECT) + 0772.00 MODULE(QTEMP/&SRCMBR) + 0773.00 SRCFILE(&SRCFLIB/QSRVSRC) SRCMBR(&OBJECT) + 0774.00 BNDSRVPGM((&LIB_01/&SRV_01 *IMMED) + 0775.00 (&LIB_02/&SRV_02 *IMMED) (&LIB_03/&SRV_03 + 0776.00 *IMMED) (&LIB_04/&SRV_04) + 0777.00 (&LIB_05/&SRV_05) (&LIB_06/&SRV_06 + 0778.00 *IMMED) (&LIB_07/&SRV_07) + 0779.00 (&LIB_08/&SRV_08 *IMMED) (&LIB_09/&SRV_09 + 0780.00 *IMMED) (&LIB_10/&SRV_10)) + 0781.00 ACTGRP(&ACTGRP) AUT(*ALL) 0782.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0783.00 ENDDO 0784.00 ENDDO 0785.00 ENDDO 0786.00 /*( CRTPRTF )*/ 0787.00 IF COND(&COMPILE *EQ 'CRTPRTF ') THEN(DO) 0788.00 ?CRTPRTF FILE(&PRTFLIB/&PRTF) SRCFILE(&SRCFLIB/&SRCF) + 0789.00 SRCMBR(&SRCMBR) DEV(&DEV) + 0790.00 DEVTYPE(&DEVTYPE) IGCDTA(&IGCDTA) + 0791.00 IGCEXNCHR(&IGCEXNCHR) TEXT(&TEXT) + 0792.00 PAGESIZE(&PAGLEN &PAGWTH) LPI(&LPI) + 0793.00 CPI(&CPI) OVRFLW(&OVERFLOW) FOLD(&FOLD) + 0794.00 RPLUNPRT(&RPLUNPRT &RPLCHAR) + 0795.00 ALIGN(&ALIGN) PRTQLTY(&PRTQLTY) + 0796.00 FORMFEED(&FORMFEED) DRAWER(&DRAWER) + 0797.00 FONT(&FONT) DECFMT(&DECFMT) + 0798.00 REDUCE(&REDUCE) PRTTXT(&PRTTXT) + 0799.00 JUSTIFY(&JUSTIFY) DUPLEX(&DUPLEX) + 0800.00 UOM(&UOM) SPOOL(&SPOOL) + 0801.00 FORMTYPE(&FORMTYPE) COPIES(&COPIES) + 0802.00 USRDTA(&USRDTA) LVLCHK(*NO) AUT(*ALL) 0803.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0804.00 ENDDO 0805.00 /*( CRTEXPRTF )*/ 0806.00 IF COND(&COMPILE *EQ 'CRTEXPRTF ') THEN(DO) 0807.00 ?CRTEXPRTF FILE(&PRTFLIB/&PRTF) SRCFILE(&SRCFLIB/&SRCF) + 0808.00 SRCMBR(&SRCMBR) DEV(&DEV) + 0809.00 DEVTYPE(&DEVTYPE) IGCDTA(&IGCDTA) + 0810.00 IGCEXNCHR(&IGCEXNCHR) TEXT(&TEXT) + 0811.00 PAGESIZE(&PAGLEN &PAGWTH) LPI(&LPI) + 0812.00 CPI(&CPI) OVRFLW(&OVERFLOW) FOLD(&FOLD) + 0813.00 RPLUNPRT(&RPLUNPRT &RPLCHAR) + 0814.00 ALIGN(&ALIGN) PRTQLTY(&PRTQLTY) + 0815.00 FORMFEED(&FORMFEED) DRAWER(&DRAWER) + 0816.00 FONT(&FONT) DECFMT(&DECFMT) + 0817.00 REDUCE(&REDUCE) PRTTXT(&PRTTXT) + 0818.00 JUSTIFY(&JUSTIFY) DUPLEX(&DUPLEX) + 0819.00 UOM(&UOM) SPOOL(&SPOOL) + 0820.00 FORMTYPE(&FORMTYPE) COPIES(&COPIES) + 0821.00 USRDTA(&USRDTA) LVLCHK(*NO) AUT(*ALL) 0822.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0823.00 ENDDO 0824.00 /*( CRTDSPF )*/ 0825.00 IF COND(&COMPILE *EQ 'CRTDSPF ') THEN(DO) 0826.00 ?CRTDSPF FILE(&DSPFLIB/&DSPF) SRCFILE(&SRCFLIB/&SRCF) + 0827.00 SRCMBR(&SRCMBR) IGCDTA(&IGCDTA) + 0828.00 IGCEXNCHR(&IGCEXNCHR) TEXT(&TEXT) + 0829.00 ENHDSP(&EHNDSP) RSTDSP(&RSTDSP) + 0830.00 DFRWRT(&DFRWRT) DECFMT(&DECFMT) + 0831.00 SFLENDTXT(&SFLEND) WAITFILE(&WAITFILE) + 0832.00 WAITRCD(&WAITRCD) DTAQ(&DTAQ) + 0833.00 SHARE(&SHARE) LANGID(&LANGID) + 0834.00 LVLCHK(&LVLCHK) AUT(&AUT) 0835.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0836.00 ENDDO 0837.00 /*( CRTEXDSPF )*/ 0838.00 IF COND(&COMPILE *EQ 'CRTEXDSPF ') THEN(DO) 0839.00 ?CRTEXDSPF FILE(&DSPFLIB/&DSPF) + 0840.00 SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0841.00 IGCDTA(&IGCDTA) IGCEXNCHR(&IGCEXNCHR) + 0842.00 TEXT(&TEXT) ENHDSP(&EHNDSP) + 0843.00 RSTDSP(&RSTDSP) DFRWRT(&DFRWRT) + 0844.00 DECFMT(&DECFMT) SFLENDTXT(&SFLEND) + 0845.00 WAITFILE(&WAITFILE) WAITRCD(&WAITRCD) + 0846.00 DTAQ(&DTAQ) SHARE(&SHARE) + 0847.00 LANGID(&LANGID) LVLCHK(&LVLCHK) AUT(&AUT) 0848.00 MONMSG MSGID(CPF6801) EXEC(GOTO CMDLBL(ERROR)) 0849.00 ENDDO 0850.00 0851.00 CHGVAR VAR(&MSGTYPE) VALUE('*INFO ') 0852.00 GOTO ERROR 0853.00 RETURN 0854.00 0855.00 NXTRTV: 0856.00 RETURN 0857.00 0858.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0859.00 SNDPGMMSG + 0860.00 MSG('API: QUHDSPH の実行で次のエラーが発生 + 0861.00 しました。 ') MSGTYPE(*DIAG) 0862.00 GOTO APIERR 0863.00 ENDDO 0864.00 RETURN 0865.00 0866.00 APIERR: 0867.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0868.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0869.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0870.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0871.00 GOTO SNDMSG 0872.00 0873.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0874.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0875.00 MSGFLIB(&MSGFLIB) 0876.00 IF COND(&MSGFLIB *EQ '*LIBL ') THEN(DO) 0877.00 IF COND((&MSGF *EQ 'QCPFMSG ') *OR (&MSGF *EQ + 0878.00 'QCZCMDMSG ')) THEN(DO) 0879.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0880.00 ENDDO 0881.00 ELSE CMD(DO) 0882.00 CHGVAR VAR(&MSGFLIB) VALUE('QDEVTOOLS ') 0883.00 ENDDO 0884.00 ENDDO 0885.00 IF COND(&MSGTYPE *EQ '*ESCAPE ') THEN(DO) 0886.00 CHGVAR VAR(&MSGTYPE) VALUE('*INFO ') 0887.00 IF COND((&SRCTYP *EQ 'RPGLE ') *OR (&SRCTYP + 0888.00 *EQ 'RPG ')) THEN(DO) 0889.00 CHGVAR VAR(&NXTJOB) VALUE('*RPGERR ') 0890.00 ENDDO 0891.00 IF COND((&SRCTYP *EQ 'C ') *OR (&SRCTYP + 0892.00 *EQ '*CLE ')) THEN(DO) 0893.00 CHGVAR VAR(&NXTJOB) VALUE('*CLEERR ') 0894.00 ENDDO 0895.00 ENDDO 0896.00 CHGDTAARA DTAARA(*LDA (362 10)) VALUE(&NXTJOB) 0897.00 CHGDTAARA DTAARA(*LDA (372 10)) VALUE(' ') 0898.00 SNDMSG: /*( CZM1613: コンパイルに失敗しました。 QSYS/QCZCMDMSG)*/ 0899.00 IF COND(&MSGID *EQ ' ') THEN(DO) 0900.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(&MSG) 0901.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0902.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0903.00 ENDDO 0904.00 ELSE CMD(DO) 0905.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(&MSG) 0906.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0907.00 MSGDTA(&MSGDTA) TOPGMQ(*SAME (*PGMNAME + 0908.00 *NONE QSUCPP)) TOMSGQ(&TOPGMQ) + 0909.00 MSGTYPE(&MSGTYPE) 0910.00 ENDDO 0911.00 ENDPGM
CLPとしては COMPILE は大きいほうである。
最初に SEU が自ら作成したユーザー・スペースを次のようにして検索している。
0148.00 /*( SEU で作成されたユーザー空間の検索 )*/ 0149.00 CHKOBJ OBJ(QTEMP/QSUSPC) OBJTYPE(*USRSPC) : 0158.00 CALL PGM(QUSRTVUS) PARM('QSUSPC QTEMP ' + 0159.00 &STRPOS &LENDTA &RCVDTA) 0160.00 CHGVAR VAR(&RCDL) VALUE(%SST(&RCVDTA 1 4)) 0161.00 CHGVAR VAR(&RCDLEN) VALUE(%BIN(&RCDL)) 0162.00 CHGVAR VAR(&SRCMBR) VALUE(%SST(&RCVDTA 21 10)) 0163.00 CHGVAR VAR(&SRCF) VALUE(%SST(&RCVDTA 31 10)) 0164.00 CHGVAR VAR(&SRCFLIB) VALUE(%SST(&RCVDTA 41 10)) 0165.00 CHGVAR VAR(&SRCTYP) VALUE(%SST(&RCVDTA 51 10)) : 0855.00 NXTRTV: 0856.00 RETURN
ユーザー・スペース: QTEMP/QSUSPC はユーザー出口プログラムが
指定されたときだけに作成される。
つねに作成されるわけではない。
このユーザー・スペースによっていろいろなソース情報を取得することができる。
ソース・タイプと以前に検索しておいたサービス・プログラムの数を
組み合わせると例えば RPG であれば CRTBNDRPG でコンパイルすればよいのか
それとも CRTRPGMOD + CRTPGM でサービス・プログラムを
バインドする必要があるのかを判断することができる。
もちろんバインドすべきサービス・プログラムもすべて判別しているので
CRTPGM でサービス・プログラムを正しく指定することもできる。
これは C言語のコンパイルでも同じことである。
( 残念ながら COBOL のコンパイルは今回はサポートしなかったが原理は同じなので
読者が工夫して COBOL のコンパイルもサポートすることも難しくはないはずである。)
さらに役に立つのは印刷ファイル( PRTF )や表示装置ファイル( DSPF )の
再コンパイルである。
特に印刷ファイル( PRTF )は個々に設定内容が異なるために再作成するときには
必ず注意深く元の印刷ファイル( PRTF )の設定値を調べなければならないが
元の設定値を見落としてしまうヒューマン・エラーは必ず発生するものである。
CLP: COMPILE は この Tools の「37. 印刷ファイルの属性を調べる RTVPRTFA 」を
利用していて元の印刷ファイルが正確に再作成されるようになっている。
CRTCLPGM PGM(QUATTRO/COMPILE) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
0001.00 /********************************************************************/ 0002.00 /* */ 0003.00 /* RPGERR : RPG コンパイル・エラーの検索 */ 0004.00 /* */ 0005.00 /* Office Quattro Co,.Ltd 2018/05/19 18:06:08 created */ 0006.00 /* */ 0007.00 /* */ 0008.00 /********************************************************************/ 0009.00 #pragma comment(COPYRIGHT, "as400-net.com EnterpriseServer (C) CopyRight ™ 0010.00 Office Quattro.Corp. 2018- All right reserved. Users Restricted ™ 0011.00 Rights - Use, duplication or disclosure restricted by Office Quattro ™ 0012.00 Corp. Licenced Materials-Property of Office Quattro.") 0013.00 #include0014.00 #include 0015.00 #include 0016.00 #include /* triml */ 0017.00 #include 0018.00 #include 0019.00 #include 0020.00 #include 0021.00 #include 0022.00 #include 0023.00 #include 0024.00 #include 0025.00 #include 0026.00 #include 0027.00 0028.00 #define TRUE 0 0029.00 #define FALSE -1 0030.00 #define MAX_SPACE_SIZE 16776704 0031.00 #define ID_LEN 16 0032.00 int bLR = FALSE; 0033.00 typedef struct { 0034.00 int BYTESPRO; 0035.00 int BYTESAVL; 0036.00 char MSGID[7]; 0037.00 char RESRVD; 0038.00 char EXCPDATA[100]; 0039.00 } ERRSTRUCTURE; /* Define the error return structure */ 0040.00 ERRSTRUCTURE errcode;/* Error Code Structure for RCVMSG */ 0041.00 volatile _INTRPT_Hndlr_Parms_T ca; 0042.00 typedef struct { 0043.00 char NM[10]; 0044.00 char LIB[10]; 0045.00 } QNAME; /* Define the qualified name */ 0046.00 QNAME inname; /* Qualified user space name */ 0047.00 typedef struct { 0048.00 char job[10]; 0049.00 char user[10]; 0050.00 char jobnbr[6]; 0051.00 } JOBINFO; /* Define the qualified job name structure */ 0052.00 JOBINFO jobinfo; 0053.00 typedef struct spfr_header { 0054.00 char user_data[64]; 0055.00 int generic_header_size; 0056.00 char header_version[4]; 0057.00 char spooled_file_level[6]; 0058.00 char format_name[8]; 0059.00 char information_status; 0060.00 char reserved2; 0061.00 int usrspc_used; 0062.00 int first_buffer_offset; 0063.00 int buffers_requested; 0064.00 int buffers_returned; 0065.00 int print_data_sz300; 0066.00 int nbr_comp_pages; 0067.00 char reserved3[16]; 0068.00 } spfr_header; 0069.00 spfr_header* inspace; 0070.00 #define SO 0x0f /* 2004/03/20 シフトアウト DBCS フィールドの始まり */ 0071.00 #define SI 0x0e /* 2004/03/20 シフトイン DBCS フィールドの終わり */ 0072.00 #define CR 0x0d /* 印刷位置を行の左端へ移動 */ 0073.00 #define FF 0x0c /* 改ページ */ 0074.00 #define NL 0x15 /* 印刷位置を次の行の左端へ移動 */ 0075.00 #define HT 0x05 /* 水平タブ */ 0076.00 #define IRS 0x1e /* NL(New Line) 制御コードと同じ */ 0077.00 #define LF 0x25 /* 印刷位置を垂直方向に 1 行分移動 */ 0078.00 #define BEL 0x2f /* 印刷を中止させ、操作員に注意を促す */ 0079.00 #define NLP 0x00 /* 何も印刷されない */ 0080.00 #define SPS 0x09 /* スーパースクリプトの指定 */ 0081.00 #define SBS 0x38 /* サブスクリプトの指定 */ 0082.00 #define CTL2b 0x2b /* 制御コード : SET 制御 */ 0083.00 0084.00 #define SA 0x28 /* Set Attribute(SA) */ 0085.00 #define SA_RESET 0x00 0086.00 #define SA_COLOR 0x42 0087.00 0088.00 #define CTLD1 0xd1 /* 制御コード : D1 制御コード */ 0089.00 #define SCL 0x81 /*SetCGCSThroughLocalID 言語別文字セット指定 2bd1nn810b*/ 0090.00 0091.00 #define CTLFD 0xfd /* 制御コード : FD 制御コード */ 0092.00 #define DGL 0x00 /*DefineGridLine 罫線の指定と印刷 2bfdnn00*/ 0093.00 #define SIT 0x01 /*SetIGCTypeDBCS 文字のピッチの指定 2bfdnn01*/ 0094.00 #define SFSS 0x02 /*SetFontSizeScaling フォントサイズ拡大の印刷倍率指定 */ 0095.00 #define SPCC 0x03 /*SetPresentationofControlCharactorSOSI の扱い方の指定 */ 0096.00 0097.00 #define CTLD2 0xd2 /* 制御コード : D2 制御コード */ 0098.00 #define SCD 0x29 /*SetCharacterDensity 英数カナ文字 (1 バイト ) ピッチ設定 */ 0099.00 #define PPM 0x48 /*PagePresentationMedia 形式設定元給紙カセト品質両面印刷 */ 0100.00 #define TABSTOPS 0x01 /* SetHorizontalTabStops */ 0101.00 0102.00 #define CTLD3 0xd3 /* 制御コード : D3 制御コード */ 0103.00 #define STO 0xf6 /*SetTextOrientation ページの回転の指定 2bd3nnf6*/ 0104.00 0105.00 #define CTLD4 0xd4 /* 制御コード : D4 制御コード */ 0106.00 #define BUS 0x0a /*BeginUnderscoreBeginUnderscore2bd4nn0a*/ 0107.00 #define EUS 0x0e /*EndUnderscoreBeginUnderscore2bd4nn0e*/ 0108.00 0109.00 #define CTLPP 0x34 /* 制御コード :34 位置を 2 つのパラメータ指定の位置移動 */ 0110.00 #define PPC0 0xc0 /* 印刷位置 ( 桁数 nn) で指定された位置 ( 桁 ) へ横方移動 */ 0111.00 #define PPC8 0xc8 /* 現在の印刷位置から nn 桁分、横方向に移動 */ 0112.00 #define PPC4 0xc4 /* 印刷位置 ( 行数 nn) で指定された位置 ( 行 ) へ縦向移動 */ 0113.00 #define PP4C 0x4c /* 現在の印刷位置から nn 行分、縦方向に移動 */ 0114.00 0115.00 #define CTLTRN 0x35 /* 制御コード :35 通常印刷されない制御コードを印刷する */ 0116.00 0117.00 #define CTLFE 0xfe /* 制御コード : FE 代替文字フォントのロード */ 0118.00 #define CTLC6 0xc6 /* 制御コード :C6 行ピッチを 1/72 インチ単位で指定 */ 0119.00 #define CTLC8 0xc8 /* 制御コード :C8 印刷不可能なフォントを受信した場合指定 */ 0120.00 #define CTLC1 0xc1 /* 制御コード C1 桁数左右マジン水平 TAB 停止位置1字単位 */ 0121.00 #define CTLC2 0xc2 /* コード C2 行数上下マージン垂直 TAB 停止位置1文字単位 */ 0122.00 0123.00 #define CTLLIPS "@@C?" /* 2008/9/7 CANON LIPS */ 0124.00 0125.00 #define OPT_HPT 0 /* 2004/04/10 オプションフラグ HPT */ 0126.00 #define OPT_HTM 1 /* 2004/04/10 オプションフラグ HTML */ 0127.00 #define OPT_TXT 2 /* 2004/04/10 オプションフラグ TEXT */ 0128.00 #define OPT_PDF 3 /* 2004/04/10 オプションフラグ PDF */ 0129.00 #define OPT_DOC 4 /* 2004/04/10 オプションフラグ DOC */ 0130.00 #define OPT_XLS 5 /* 2004/04/10 オプションフラグ Excel */ 0131.00 #define OPT_PRT 6 /* 2004/04/10 オプションフラグ Print */ 0132.00 #define OPT_ESCP 7 /* 2004/05/20 オプションフラグ ESCPDBCS */ 0133.00 #define OPT_LPR 7 /* 2004/06/04 オプションフラグ LPR */ 0134.00 #define OPT_PSC 8 /* 2007/07/30 オプションフラグ PSC */ 0135.00 #define OPT_PREVIEW 9 /* 2010/01/24 オプションフラグ PREVIEW */ 0136.00 0137.00 #define KEI_COR_X 15 /* 2005/08/31 罫線 1 ドット左補正 */ 0138.00 #define KEI_COR_Y 0 /* 2005/08/31 罫線 1 ドット下補正 */ 0139.00 0140.00 #define ESC 0x1b /* 2004/06/04 ESC/P ESC コード */ 0141.00 #define ESCP_UNITR 1800 /* 2004/07/16 ESC/P UNIT */ 0142.00 #define ESCP_UNIT 600 /* 2004/07/16 ESC/P UNIT H*/ 0143.00 #define ESCP_MAX_POS 816 /* 2004/08/29 ESC/P PAPER MAX(15Inchi) */ 0144.00 0145.00 0146.00 /*************************************************************/ 0147.00 /* 内 部 使 用 関 数 */ 0148.00 /*************************************************************/ 0149.00 void GetParam(int argc, char *argv[]); 0150.00 void INZSR(void); 0151.00 int setCompileList(void); 0152.00 int rtvComplieError(int nxterr); 0153.00 int printOut(int line, int col, char* linebuf, int len, int LINE); 0154.00 void ApiError(char* place, int stmno, ERRSTRUCTURE* errcode, char* pgm); 0155.00 void LRRTN(void); 0156.00 0157.00 /*************************************************************/ 0158.00 /* IMPORT 関 数 */ 0159.00 /*************************************************************/ 0160.00 /*************************************************************/ 0161.00 /* IMPORT 変 数 */ 0162.00 /*************************************************************/ 0163.00 /*************************************************************/ 0164.00 /* 外 部 呼 出 し 関 数 */ 0165.00 /*************************************************************/ 0166.00 void MonitorMSG(_INTRPT_Hndlr_Parms_T ca, char* ref); 0167.00 #pragma linkage(MonitorMSG, OS) 0168.00 #pragma map(MonitorMSG, "ASNET.COM/MONMSG") 0169.00 void RtvJobA(char[], char[], char[], char[], char[], char[], 0170.00 char[], char[], char[], char[], char[], char[], char[], 0171.00 char[], char[]); 0172.00 #pragma map(RtvJobA, "RTVJOBA ") /*CLP*/ 0173.00 #pragma linkage(RtvJobA, OS) 0174.00 /*************************************************************/ 0175.00 /* グ ロ ー バ ル 変 数 */ 0176.00 /*************************************************************/ 0177.00 /*------( 受取りパラメータ値 )----------*/ 0178.00 char NXTJOB[11], NXTSTP[11], SRCMBR[11]; 0179.00 /*------( 受取りパラメータ値 )----------*/ 0180.00 char ref[133]; 0181.00 char job[10], user[10], jobnbr[6], outq[10], outqlib[10], date[6]; 0182.00 char type[1], prtdev[10], langid[3], cntryid[2], ccsid[5]; 0183.00 char dftccsid[5], cymddate[7], sbmmsgq[10], sbmmsgqlib[10]; 0184.00 char jobid[ID_LEN], ascnbr[6]; 0185.00 char spoolid[17], linebuf[256], splnm[10]; 0186.00 int splno = -1; /* *LAST */ 0187.00 int nxterr, m_bERR = FALSE; 0188.00 int nxtstp, curstp = 0; 0189.00 /********************************************************************/ 0190.00 /* m a i n --- main module of this pgm */ 0191.00 /* */ 0192.00 /* なし */ 0193.00 /* */ 0194.00 /*------------------------------------------------------------------*/ 0195.00 0196.00 int main(int argc, char *argv[]){ 0197.00 0198.00 #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE, ™ 0199.00 _CTLA_HANDLE) 0200.00 GetParam(argc, argv); /*[ パラメータの取得 ]*/ 0201.00 INZSR(); /*[ 初期設定 ]*/ 0202.00 0203.00 if(strncmp(NXTJOB, "*RPGERR ", 10) == 0){/* RPG エラー */ 0204.00 if(strncmp(NXTSTP, " ", 10) == 0){/* 初期環境セット */ 0205.00 if(setCompileList() == FALSE) exit(-1); 0206.00 }/* 初期環境セット */ 0207.00 nxterr = atoi(NXTSTP) + 1; 0208.00 if(rtvComplieError(nxterr) == FALSE) exit(-1); 0209.00 }/* RPG エラー */ 0210.00 LRRTN(); 0211.00 exit(0); 0212.00 0213.00 MONMSG: 0214.00 #pragma disable_handler 0215.00 strcpy(ref, "TEST_AA-MAIN"); 0216.00 MonitorMSG(ca, ref); 0217.00 0218.00 exit(0); 0219.00 } 0220.00 /*************************************/ 0221.00 void GetParam(int argc, char *argv[]) 0222.00 /*************************************/ 0223.00 { 0224.00 } 0225.00 /****************/ 0226.00 void INZSR(void) 0227.00 /****************/ 0228.00 { 0229.00 _DTAA_NAME_T dtaname = {"*LDA ", " "}; 0230.00 errcode.BYTESPRO = 160; 0231.00 errcode.BYTESAVL = 0; 0232.00 0233.00 QXXRTVDA(dtaname, 21, 10, SRCMBR); 0234.00 QXXRTVDA(dtaname, 362, 10, NXTJOB); 0235.00 QXXRTVDA(dtaname, 372, 10, NXTSTP); 0236.00 if(NXTSTP[0] == ' ') nxtstp = 1; 0237.00 else nxtstp = atoi(NXTSTP); 0238.00 atexit(LRRTN); 0239.00 memcpy(job, "* ", 10); 0240.00 RtvJobA(job, user, jobnbr, outq, outqlib, date, 0241.00 type, prtdev, langid, cntryid, ccsid, dftccsid, cymddate, 0242.00 sbmmsgq, sbmmsgqlib); 0243.00 memcpy(jobinfo.job, job, 10); 0244.00 memcpy(jobinfo.user, user, 10); 0245.00 memcpy(jobinfo.jobnbr, jobnbr, 6); 0246.00 memset(jobid, ' ', sizeof(jobid)); 0247.00 memset(spoolid, ' ', sizeof(spoolid)); 0248.00 spoolid[16] = 0x00; 0249.00 memcpy(splnm, SRCMBR, 10); 0250.00 } 0251.00 /*************************/ 0252.00 int setCompileList(void) 0253.00 /*************************/ 0254.00 { 0255.00 Qus_SPLA0200_t spla0200; 0256.00 int handle, pos, i, line, col, page, pot; 0257.00 char TEXT[50] = "RPG COMPILE LIST USER-SPACE"; 0258.00 long int_size; 0259.00 0260.00 /*-----------------------------------------------------------------*/ 0261.00 /* ( 1 ) スプール情報の取得 */ 0262.00 /*-----------------------------------------------------------------*/ 0263.00 QUSRSPLA((char *)&spla0200, sizeof(Qus_SPLA0200_t), "SPLA0200", 0264.00 (char*)&jobinfo, jobid, spoolid, splnm, splno, (char*)&errcode); 0265.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0266.00 ApiError("QUSRSPLA", __LINE__, &errcode, "TESTSPOOL"); 0267.00 return FALSE; 0268.00 }/* APIERR */ 0269.00 /*-----------------------------------------------------------------*/ 0270.00 /* ( 2 ) スプールを入れるユーザー・スペースの作成 */ 0271.00 /*-----------------------------------------------------------------*/ 0272.00 memset(&inname, 0, sizeof(QNAME)); 0273.00 memcpy(inname.NM, "RPGERRSPC ", 10); 0274.00 memcpy(inname.LIB, "QTEMP ", sizeof(inname.LIB)); 0275.00 int_size = (spla0200.File_Buffer_Size + 84) * 0276.00 (spla0200.Number_Buffers + 0277.00 spla0200.Total_Pages * 12) + 128 + sizeof(spla0200); 0278.00 if(int_size > MAX_SPACE_SIZE) int_size = MAX_SPACE_SIZE; 0279.00 QUSCRTUS((char*)&inname, "SPLF ", int_size, " ", 0280.00 "*ALL ", TEXT, "*YES ", (char*)&errcode); 0281.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0282.00 ApiError("QUSCRTUS", __LINE__, &errcode, "RPGERR"); 0283.00 return FALSE; 0284.00 }/* APIERR */ 0285.00 /*-----------------------------------------------------------------*/ 0286.00 /* ( 3 ) QSPOPNSP - スプール・ファイルのオープン */ 0287.00 /*-----------------------------------------------------------------*/ 0288.00 QSPOPNSP(&handle, (char*)&jobinfo, (char*)&jobid, (char*)&spoolid, 0289.00 splnm, splno, -1, &errcode); 0290.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0291.00 ApiError("QSPOPNSP", __LINE__, &errcode, "TESTSPOOL"); 0292.00 return FALSE; 0293.00 }/* APIERR */ 0294.00 /*-----------------------------------------------------------------*/ 0295.00 /* ( 4 ) QSPGETSP - スプール・ファイルの読み取り */ 0296.00 /*-----------------------------------------------------------------*/ 0297.00 QSPGETSP(handle, (char*)&inname, "SPFR0300", -1, "*WAIT ", 0298.00 &errcode); 0299.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0300.00 ApiError("QSPGETSP", __LINE__, &errcode, "TESTSPOOL"); 0301.00 return FALSE; 0302.00 }/* APIERR */ 0303.00 /*-----------------------------------------------------------------*/ 0304.00 /* ( 5 ) QSPCLOSP - スプール・ファイルのクローズ */ 0305.00 /*-----------------------------------------------------------------*/ 0306.00 QSPCLOSP(handle, &errcode); 0307.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0308.00 ApiError("QSPCLOSP", __LINE__, &errcode, "TESTSPOOL"); 0309.00 return FALSE; 0310.00 }/* APIERR */ 0311.00 0312.00 return TRUE; 0313.00 } 0314.00 /**********************************/ 0315.00 int rtvComplieError(int nxterrno) 0316.00 /**********************************/ 0317.00 { 0318.00 long int int_size, spl_size; 0319.00 int handle, pos, i, j, k, line, col, page, pot, stri; 0320.00 char* splbuf; 0321.00 char cmd[256]; 0322.00 0323.00 memset(&inname, 0, sizeof(QNAME)); 0324.00 memcpy(inname.NM, "RPGERRSPC ", 10); 0325.00 memcpy(inname.LIB, "QTEMP ", sizeof(inname.LIB)); 0326.00 /*-----------------------------------------------------------------*/ 0327.00 /* ( 6 ) QUSPTRUS - ユーザー・スペースのポインターを取得 */ 0328.00 /*-----------------------------------------------------------------*/ 0329.00 QUSPTRUS((char *)&inname, &inspace, &errcode); 0330.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0331.00 ApiError("QUSPTRUS", __LINE__, &errcode, "TESTSPOOL"); 0332.00 }/* APIERR */ 0333.00 /*-----------------------------------------------------------------*/ 0334.00 /* ( 7 ) ユーザー・スペースからスプールの読み取り */ 0335.00 /*-----------------------------------------------------------------*/ 0336.00 spl_size= inspace->usrspc_used -(inspace->first_buffer_offset -1); 0337.00 splbuf = ((char *)inspace) + inspace->first_buffer_offset; 0338.00 /*-----------------------------------------------------------------*/ 0339.00 /* ( 8 ) QUSPTRUS - ユーザー・スペースからバッファーにコピー */ 0340.00 /*-----------------------------------------------------------------*/ 0341.00 QUSPTRUS((char *)&inname, &splbuf, &errcode); 0342.00 if(errcode.BYTESAVL != 0){/* APIERR */ 0343.00 ApiError("QUSPTRUS", __LINE__, &errcode, "TESTSPOOL"); 0344.00 }/* APIERR */ 0345.00 /*-----------------------------------------------------------------*/ 0346.00 /* ( 9 ) スプール・バッファーを読み取って処理する */ 0347.00 /*-----------------------------------------------------------------*/ 0348.00 splbuf += 140; 0349.00 pos = 0; 0350.00 line = 1; col = 1; page = 1; 0351.00 i = 0; m_bERR = FALSE; 0352.00 while(i < spl_size){/*while*/ 0353.00 switch(splbuf[i]){/*switch*/ 0354.00 case CR:/* 印刷位置を行の左端へ移動 */ 0355.00 if(pos > 0) printOut(line, col, linebuf, pos, __LINE__); 0356.00 line ++; 0357.00 col = 1; 0358.00 memset(linebuf, 0, sizeof(linebuf)); 0359.00 pos = 0; break; 0360.00 case FF:/* 改ページ */ 0361.00 if(pos > 0) printOut(line, col, linebuf, pos, __LINE__); 0362.00 page ++; line = col = 1; 0363.00 memset(linebuf, 0, sizeof(linebuf)); 0364.00 pos = 0; break; 0365.00 case LF:/* 印刷位置を垂直方向に 1 行分移動 */ 0366.00 if(pos > 0) printOut(line, col, linebuf, pos, __LINE__); 0367.00 line ++; 0368.00 memset(linebuf, 0, sizeof(linebuf)); 0369.00 break; 0370.00 case NL:/* 印刷位置を次の行の左端へ移動 */ 0371.00 case IRS:/* NL(New Line) 制御コードと同じ */ 0372.00 if(pos > 0) printOut(line, col, linebuf, pos, __LINE__); 0373.00 line ++; col = 1; 0374.00 memset(linebuf, 0, sizeof(linebuf)); 0375.00 pos = 0; break; 0376.00 case HT:/* 水平タブ */ 0377.00 break; 0378.00 case BEL:/* 印刷を中止させ、操作員に注意を促す */ 0379.00 break; 0380.00 case SPS:/* スーパースクリプトの指定 */ 0381.00 break; 0382.00 case SBS:/* サブスクリプトの指定 */ 0383.00 break; 0384.00 case CTLPP:/* PP 制御 */ 0385.00 /* if(pos > 0) printOut(line, col, linebuf, pos, __LINE__); */ 0386.00 /* pos = 0; */ 0387.00 switch(splbuf[i+1]){/*switch*/ 0388.00 case PPC0: col = splbuf[i+2]; 0389.00 for(j = pos; j 0) printOut(line, col, linebuf, pos, __LINE__); 0422.00 strcpy(cmd, 0423.00 "CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(™ 0424.00 '* * * * * メ ッ セ ー ジ の 要 約 の 終 わ り * * * *')"); 0425.00 system(cmd); 0426.00 exit(0); 0427.00 } 0428.00 /******************************************************************/ 0429.00 int printOut(int line, int col, char* linebuf, int len, int LINE) 0430.00 /******************************************************************/ 0431.00 { 0432.00 char* ptr; 0433.00 int i, j, sev, lenw, pos; 0434.00 char msgid[9], sevc[6], num[6], stmt[132], msg[132], cmd[256], 0435.00 buff[256]; 0436.00 0437.00 if(m_bERR == FALSE){/* ERRMSG */ 0438.00 if(strstr(linebuf, "MSG ID SV") != NULL){/* エラーの開始 */ 0439.00 m_bERR = TRUE; 0440.00 return TRUE; 0441.00 }/* エラーの開始 */ 0442.00 else return FALSE; 0443.00 }/* ERRMSG */ 0444.00 linebuf[len] = 0x00; 0445.00 if(strncmp(linebuf, "*RNF", 4) != 0) return FALSE; 0446.00 sscanf(linebuf, "%s %s %s %s %s", msgid, sevc, num, stmt, msg); 0447.00 sevc[2] = 0x00; 0448.00 sev = atoi(sevc); 0449.00 if(sev == 0) return FALSE; 0450.00 msgid[8] = 0x00; sevc[3] = 0x00; 0451.00 if(strlen(stmt) > 10){/* ステートメントなし */ 0452.00 strcpy(msg, stmt); 0453.00 stmt[0] = 0x00; 0454.00 /* return FALSE; */ 0455.00 }/* ステートメントなし */ 0456.00 if(strlen(msg) < 10) return FALSE; 0457.00 curstp ++; 0458.00 if(curstp < nxtstp) return TRUE; 0459.00 sprintf(cmd, 0460.00 "CHGDTAARA DTAARA(*LDA (372 4)) VALUE('%04d')", curstp+1); 0461.00 system(cmd); 0462.00 sprintf(linebuf, "%s %d %s %s", msgid, sev, stmt, msg); 0463.00 if(strchr(linebuf, '™'') != NULL){/* 引用符 */ 0464.00 lenw = strlen(linebuf); 0465.00 j = 0; 0466.00 for(i = 0; i 0) linebuf[pos+1] = 0x00; 0483.00 sprintf(cmd, 0484.00 "CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG('%s')", linebuf); 0485.00 system(cmd); 0486.00 exit(0); 0487.00 return TRUE; 0488.00 } 0489.00 /*********************************************************************/ 0490.00 void ApiError(char* place, int stmno, ERRSTRUCTURE* errcode, char* pgm) 0491.00 /*********************************************************************/ 0492.00 { 0493.00 char msgid[8], msgdta[101], Message[512]; 0494.00 int msglen, msgdtalen, pos; 0495.00 char* ptr; 0496.00 typedef struct { 0497.00 Qmh_Rtvm_RTVM0100_t rtvm0100; 0498.00 char msg[512]; 0499.00 } ERRMSG; 0500.00 ERRMSG errmsg; 0501.00 0502.00 memset(msgid, 0, sizeof(msgid)); 0503.00 memcpy(msgid, errcode->MSGID, 7); 0504.00 msgid[7] = 0x00; 0505.00 memset(msgdta, 0, sizeof(msgdta)); 0506.00 memcpy(msgdta, errcode->EXCPDATA, 100); 0507.00 msgdta[100] = 0x00; 0508.00 msglen = sizeof(ERRMSG); 0509.00 msgdtalen = strlen(msgdta); 0510.00 memset(&errmsg, 0, sizeof(ERRMSG)); 0511.00 QMHRTVM(&errmsg, msglen, "RTVM0100", msgid, "QCPFMSG *LIBL ", 0512.00 msgdta, msgdtalen, "*YES ", "*YES ", errcode); 0513.00 memset(Message, 0, sizeof(Message)); 0514.00 memcpy(Message, errmsg.msg, 512); 0515.00 ptr = strstr(Message, "&N"); 0516.00 if(ptr != NULL){ 0517.00 pos = (int)(ptr - Message); 0518.00 Message[pos] = 0x00; 0519.00 } 0520.00 printf("(%s) [ERR AT = %d] %s-%s™n", place, stmno, msgid, Message); 0521.00 getchar(); 0522.00 exit(-1); 0523.00 } 0524.00 /****************/ 0525.00 void LRRTN(void) 0526.00 /****************/ 0527.00 { 0528.00 if(bLR == TRUE) return; 0529.00 bLR = TRUE; 0530.00 system("DLTOVR QPRINT "); 0531.00 }
プログラム: RPGERR は C言語によるコンパイル・リストのスプール・ファイルを
検索するプログラムである。
RPG の技術者の方は C言語というと難しいように思えてしまうが
開発言語には得意・不得意の分野があって印刷スプール・ファイルの検索は
RPG はあまり向いていない。
固定長のファイルのアクセスは RPG のほうが手っ取り早いのだが
印刷スプールのようにストリーム・ファイル系を扱うには C言語のほうが
扱いやすい。
とは言っても C言語でも短時間でコンパイル・リストの検索を開発できたのは
Spool ライターによる開発実績があるからに他ならない。
関数: printOut の
0445.00 if(strncmp(linebuf, "*RNF", 4) != 0) return FALSE; 0446.00 sscanf(linebuf, "%s %s %s %s %s", msgid, sevc, num, stmt, msg); 0447.00 sevc[2] = 0x00; 0448.00 sev = atoi(sevc);
の部分で *RNFxxxx となるエラー・メッセージを検索している。
エラー・メッセージは F8 キーを一回、押すと最初のエラー・メッセージが
SEU の画面下部に表示される。
次にさらに F8 キーを押すと次のエラー・メッセージが表示される。
次々と F8 キーを押していくと最後には
「* * * * * メ ッ セ ー ジ の 要 約 の 終 わ り * * * *」
と表示されてエラー・メッセージの終わりを告げる。
これは C言語をコンパイルした場合も同じである。
開発者は F8 キーによって SEU でコンパイル・エラーをすべて修正してから
もう一度 F7 キーを押して再コンパイルすると正しくコンパイルすることができる。
CRTBNDC PGM(QUATTRO/RPGERR) SRCFILE(MYSRCLIB/QCSRC) AUT(*ALL)
0001.00 PGM 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* CLPERR : C 言語コンパイル・エラーの検索 */ 0004.00 /* */ 0005.00 /* 2018/05/21 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0008.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0009.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0012.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0013.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0015.00 VALUE('*ESCAPE ') 0016.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0017.00 VALUE(X'000074') /* 2 進数 */ 0018.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0019.00 VALUE(X'00000000') 0020.00 DCLF FILE(QTEMP/JOBLOG) ALWVARLEN(*YES) 0021.00 DCL VAR(&NXTJOB) TYPE(*CHAR) LEN(10) 0022.00 DCL VAR(&NXTSTP) TYPE(*CHAR) LEN(4) 0023.00 DCL VAR(&STEP) TYPE(*DEC) LEN(4 0) 0024.00 DCL VAR(&COUNT) TYPE(*DEC) LEN(4 0) VALUE(0) 0025.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0026.00 0027.00 /*( 環境の取得 )*/ 0028.00 RTVJOBA TYPE(&TYPE) 0029.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0030.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0031.00 ENDDO /* バッチ */ 0032.00 ELSE CMD(DO) /* 対話式 */ 0033.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0034.00 ENDDO /* 対話式 */ 0035.00 RTVDTAARA DTAARA(*LDA (362 10)) RTNVAR(&NXTJOB) 0036.00 RTVDTAARA DTAARA(*LDA (372 4)) RTNVAR(&NXTSTP) 0037.00 IF COND(&NXTSTP *EQ ' ') THEN(DO) 0038.00 CHGVAR VAR(&STEP) VALUE(1) 0039.00 ENDDO 0040.00 ELSE CMD(DO) 0041.00 CHGVAR VAR(&STEP) VALUE(&NXTSTP) 0042.00 /* CHGVAR VAR(&STEP) VALUE(&STEP + 1) */ 0043.00 ENDDO 0044.00 0045.00 /*( ジョブログの取得 )*/ 0046.00 DSPJOBLOG JOB(*) OUTPUT(*OUTFILE) + 0047.00 OUTFILE(QTEMP/JOBLOG) OUTMBR(*FIRST *REPLACE) 0048.00 READ: RCVF RCDFMT(QMHPFT) 0049.00 MONMSG MSGID(CPF0864) EXEC(DO) 0050.00 CHGVAR VAR(&MSG) VALUE('* * * * * メ ッ セ + 0051.00 ー ジ の 要 約 の 終 わ り * + 0052.00 * * * *') 0053.00 GOTO REDEND 0054.00 ENDDO 0055.00 IF COND(&QMHRMD *NE 'QCZCUTIL ') THEN(DO) 0056.00 GOTO READ 0057.00 ENDDO 0058.00 CHGVAR VAR(&COUNT) VALUE(&COUNT + 1) 0059.00 IF COND(&COUNT *LT &STEP) THEN(DO) 0060.00 GOTO READ 0061.00 ENDDO 0062.00 CHGVAR VAR(&MSG) VALUE(%SST(&QMHMDT 3 132)) 0063.00 REDEND: CHGVAR VAR(&MSGTYPE) VALUE('*INFO ') 0064.00 CHGVAR VAR(&STEP) VALUE(&STEP + 1) 0065.00 CHGVAR VAR(&NXTSTP) VALUE(&STEP) 0066.00 CHGDTAARA DTAARA(*LDA (372 4)) VALUE(&NXTSTP) 0067.00 GOTO SNDMSG 0068.00 RETURN 0069.00 0070.00 APIERR: 0071.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0072.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0073.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0074.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0075.00 GOTO SNDMSG 0076.00 0077.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0078.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0079.00 MSGFLIB(&MSGFLIB) 0080.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0081.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(&MSG) 0082.00 SNDPGMMSG MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) + 0083.00 TOPGMQ(*SAME (*PGMNAME *NONE QSUCPP)) + 0084.00 TOMSGQ(*TOPGMQ) MSGTYPE(*INFO) 0085.00 MONMSG MSGID(CPF2400) 0086.00 /* MONMSG MSGID(CPF2400) EXEC(RETURN) */ 0087.00 ENDDO 0088.00 ELSE CMD(DO) 0089.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(&MSG) 0090.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0091.00 MSGDTA(&MSGDTA) TOPGMQ(*SAME (*PGMNAME + 0092.00 *NONE QSUCPP)) TOMSGQ(&TOPGMQ) + 0093.00 MSGTYPE(&MSGTYPE) 0094.00 MONMSG MSGID(CPF2400) 0095.00 /* MONMSG MSGID(CPF2400) EXEC(RETURN) */ 0096.00 ENDDO 0097.00 ENDPGM
C言語のコンパイル・エラーを検索するのがこの CLP: CLEERR であるが
C言語のコンパイルは通常、コンパイル・リストを出力しないことが多い。
大抵はエラー・メッセージだけがログとして残る。
そこでここでは C言語のエラー・メッセージの検索方法として
0045.00 /*( ジョブログの取得 )*/ 0046.00 DSPJOBLOG JOB(*) OUTPUT(*OUTFILE) + 0047.00 OUTFILE(QTEMP/JOBLOG) OUTMBR(*FIRST *REPLACE)
によって出力されたジョブログ: QTEMP/JOBLOG を
0048.00 READ: RCVF RCDFMT(QMHPFT) 0049.00 MONMSG MSGID(CPF0864) EXEC(DO) 0050.00 CHGVAR VAR(&MSG) VALUE('* * * * * メ ッ セ + 0051.00 ー ジ の 要 約 の 終 わ り * + 0052.00 * * * *') 0053.00 GOTO REDEND 0054.00 ENDDO
によって読み取って解析するようにしている。
CRTCLPGM PGM(QUATTRO/CLEERR) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
0001.00 PGM 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* EXECUTE : EDTSRC PGM の実行 */ 0004.00 /* */ 0005.00 /* 2018/05/20 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(1024) 0008.00 DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4) + 0009.00 VALUE(X'00000400') 0010.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0011.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0012.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0013.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0015.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0016.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0017.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0018.00 VALUE('*ESCAPE ') 0019.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0020.00 VALUE(X'000074') /* 2 進数 */ 0021.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0022.00 VALUE(X'00000000') 0023.00 /*( プラグラム用変数 )*/ 0024.00 DCL VAR(&OBJECT) TYPE(*CHAR) LEN(10) 0025.00 DCL VAR(&PGMOBJLIB) TYPE(*CHAR) LEN(20) 0026.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0027.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0028.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(10) 0029.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0030.00 DCL VAR(&OBJTYP) TYPE(*CHAR) LEN(10) 0031.00 DCL VAR(&BIN4) TYPE(*CHAR) LEN(4) 0032.00 DCL VAR(&PRMSU) TYPE(*DEC) LEN(8 0) 0033.00 DCL VAR(&BLK) TYPE(*CHAR) LEN(132) 0034.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0035.00 0036.00 /*( 環境の取得 )*/ 0037.00 RTVJOBA TYPE(&TYPE) 0038.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0039.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0040.00 ENDDO /* バッチ */ 0041.00 ELSE CMD(DO) /* 対話式 */ 0042.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0043.00 ENDDO /* 対話式 */ 0044.00 0045.00 /*( パラメータの取得 )*/ 0046.00 GETPARM: RTVDTAARA DTAARA(*LDA (41 10)) RTNVAR(&OBJLIB) 0047.00 RTVDTAARA DTAARA(*LDA (21 10)) RTNVAR(&SRCMBR) 0048.00 RTVDTAARA DTAARA(*LDA (432 10)) RTNVAR(&OBJECT) 0049.00 RTVDTAARA DTAARA(*LDA (352 10)) RTNVAR(&OBJTYP) 0050.00 RTVDTAARA DTAARA(*LDA (01 10)) RTNVAR(&SRCF) 0051.00 RTVDTAARA DTAARA(*LDA (11 10)) RTNVAR(&SRCFLIB) 0052.00 0053.00 /*( PGM )*/ 0054.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) /* + 0055.00 PGM */ 0056.00 /*( QCLRPGMI: プログラム情報の検索 )*/ 0057.00 CHGVAR VAR(&PGMOBJLIB) VALUE(&OBJECT *CAT &OBJLIB) 0058.00 CALL PGM(QCLRPGMI) PARM(&RCVVAR &RCVLEN + 0059.00 'PGMI0100' &PGMOBJLIB &APIERR) 0060.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0061.00 SNDPGMMSG + 0062.00 MSG('API: QCLRPGMI の実行で次のエラーが発生 + 0063.00 しました。 ') MSGTYPE(*DIAG) 0064.00 GOTO APIERR 0065.00 ENDDO 0066.00 CHGVAR VAR(&BIN4) VALUE(%SST(&RCVVAR 221 4)) 0067.00 CHGVAR VAR(&PRMSU) VALUE(%BIN(&BIN4)) 0068.00 0069.00 /*( プログラムの実行 )*/ 0070.00 IF COND(&PRMSU *EQ 0) THEN(DO) 0071.00 CALL PGM(&OBJLIB/&OBJECT) PARM(' ') 0072.00 ENDDO 0073.00 ELSE CMD(DO) 0074.00 ? QUATTRO/CALL PGM(&OBJLIB/&OBJECT) 0075.00 ENDDO 0076.00 CHGDTAARA DTAARA(*LDA (362 10)) VALUE('*DEBUG ') 0077.00 ENDDO /* PGM */ 0078.00 /*( DSPF )*/ 0079.00 ELSE CMD(IF COND(&OBJTYP *EQ '*DSPF ') + 0080.00 THEN(DO)) /* DSPF */ 0081.00 STRSDA OPTION(3) TSTFILE(&OBJLIB/&OBJECT) MODE(*STD) 0082.00 ENDDO /* DSPF */ 0083.00 /*( PRTF )*/ 0084.00 ELSE CMD(IF COND(&OBJTYP *EQ '*PRTF ') + 0085.00 THEN(DO)) /* PRTF */ 0086.00 ?STRRLU SRCFILE(&SRCFLIB/&SRCF) SRCMBR(&SRCMBR) + 0087.00 OPTION(6) 0088.00 RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0089.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0090.00 MSGFLIB(&MSGFLIB) 0091.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(&MSG) 0092.00 RETURN 0093.00 ENDDO /* PRTF */ 0094.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) MSG(&BLK) 0095.00 CHGDTAARA DTAARA(*LDA (362 10)) VALUE('*DEBUG ') 0096.00 RETURN 0097.00 0098.00 APIERR: 0099.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0100.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0101.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0102.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0103.00 GOTO SNDMSG 0104.00 0105.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0106.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSG 0107.00 MSGFLIB(&MSGFLIB) 0108.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0109.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) 0110.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0111.00 ENDDO 0112.00 ELSE CMD(DO) 0113.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0114.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0115.00 MSGTYPE(&MSGTYPE) 0116.00 ENDDO 0117.00 ENDPGM
CLP: EXECUTE はプログラムを実行するための CLP である。
F7 キーでコンパイルしてコンパイル・エラーがあれば F8 キーを押すと
コンパイル・エラーが検索されるが、コンパイル・エラーがなければ
F8 キーを押すとそのプログラムが実行される。
CRTCLPGM PGM(QUATTRO/EXECUTE) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
0001.00 PGM 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* DEBUG : EDTSRC DEBUG 開始 */ 0004.00 /* */ 0005.00 /* 2018/06/01 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0008.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0009.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0012.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0013.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0015.00 VALUE('*ESCAPE ') 0016.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0017.00 VALUE(X'000074') /* 2 進数 */ 0018.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0019.00 VALUE(X'00000000') 0020.00 /*( プラグラム用変数 )*/ 0021.00 DCL VAR(&OBJECT) TYPE(*CHAR) LEN(10) 0022.00 DCL VAR(&PGMOBJLIB) TYPE(*CHAR) LEN(20) 0023.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0024.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0025.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(10) 0026.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10) 0027.00 DCL VAR(&OBJTYP) TYPE(*CHAR) LEN(10) 0028.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0029.00 0030.00 /*( 環境の取得 )*/ 0031.00 RTVJOBA TYPE(&TYPE) 0032.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0033.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0034.00 ENDDO /* バッチ */ 0035.00 ELSE CMD(DO) /* 対話式 */ 0036.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0037.00 ENDDO /* 対話式 */ 0038.00 0039.00 /*( パラメータの取得 )*/ 0040.00 GETPARM: RTVDTAARA DTAARA(*LDA (41 10)) RTNVAR(&OBJLIB) 0041.00 RTVDTAARA DTAARA(*LDA (21 10)) RTNVAR(&SRCMBR) 0042.00 RTVDTAARA DTAARA(*LDA (432 10)) RTNVAR(&OBJECT) 0043.00 RTVDTAARA DTAARA(*LDA (352 10)) RTNVAR(&OBJTYP) 0044.00 RTVDTAARA DTAARA(*LDA (01 10)) RTNVAR(&SRCF) 0045.00 RTVDTAARA DTAARA(*LDA (11 10)) RTNVAR(&SRCFLIB) 0046.00 0047.00 /*( PGM )*/ 0048.00 CHGDTAARA DTAARA(*LDA (362 10)) VALUE('*EXECUTE ') 0049.00 IF COND(&OBJTYP *EQ '*PGM ') THEN(DO) /* + 0050.00 PGM */ 0051.00 STRDBG PGM(&OBJLIB/&OBJECT) UPDPROD(*YES) 0052.00 CALL PGM(&OBJLIB/&OBJECT) PARM(' ') 0053.00 ENDDBG 0054.00 ENDDO /* PGM */ 0055.00 ELSE CMD(IF COND(&OBJTYP *EQ '*SRVPGM ') + 0056.00 THEN(DO)) /* SRVPGM */ 0057.00 ?STRDBG SRVPGM(&OBJLIB/&OBJECT) 0058.00 CALL PGM(&OBJLIB/&OBJECT) PARM(' ') 0059.00 ENDDBG 0060.00 ENDDO /* SRVPGM */ 0061.00 CHGDTAARA DTAARA(*LDA (362 10)) VALUE('*EXECUTE ') 0062.00 RETURN 0063.00 0064.00 APIERR: 0065.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0066.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0067.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0068.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0069.00 GOTO SNDMSG 0070.00 0071.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0072.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0073.00 MSGFLIB(&MSGFLIB) 0074.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0075.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0076.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0077.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0078.00 ENDDO 0079.00 ELSE CMD(DO) 0080.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0081.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0082.00 MSGTYPE(&MSGTYPE) 0083.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0084.00 ENDDO 0085.00 ENDPGM
CLP : DEBUG は F8 キーを押して実行を行った後にさらに F8 キーを押すと
この DEBUG が呼び出されてプログラムはデバッグ・モードで実行される。
CRTCLPGM PGM(QUATTRO/DEBUG) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
0001.00 PGM 0002.00 CHGMSGD MSGID(EDT0001) MSGF(QUATTRO/QEDTMSGF) + 0003.00 MSG(' ソースが保管されていません。 SAVE で + 0004.00 保管してください。 ') 0005.00 ENDPGM
CLP: SAVMSG は CHGMSGD コマンドによって
メッセージ・ファイル: QUATTRO/QEDTMSGF の
MSGID: EDT0001 を修正しているだけである。
これは SEU に結果のメッセージを送信するための手段であるが
メッセージ・データによる動的なメッセージを送信したいところであるが
SEU は動的なメッセージを受け取るようには設計されていない。
(恐らくは SEU の設計ミスである)
そこでメッセージ ID のメッセージを毎度、無理やり変更してから
メッセージを送信するという不細工な手段を取らざるを得ない。
CRTCLPGM PGM(QUATTRO/SAVMSG) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
以上で EDTSRC に関連するプログラムの紹介を終える。
かなりソースの種類があって面倒なように見えるが導入して頂ければ
いかに開発効率が良くなったかを実感して頂けるはずである。
よく PDM を拡張したものを社内のツールとして運用している例を
目にするのだが SEU そのものを変えている例はほとんど見られない。
SEU の機能を拡張すると開発がいっそう楽になることは間違いない。
是非お試し頂きたい。