RPG III ソースを CVTRPGSRC コマンドで ILE-RPG に変換できることは良く知られて
いるが、CVTRPGSRC で時々エラーが発生して正しく変換できない場合がある。
つまり CVTRPGSRC の実行ではエラーにはならないのだが、変換された ILE-RPG ソースを
コンパイルするとコンパイル・エラーが発生する。
これは元の RPG III ソースの中で漢字シフト文字( 0x0E
, 0x0F
) を作るために
MOVE '0e0f' OEOF 2 MOVELOEOF OE 1 MOVE OEOF OF 1
のような演算を行っている場合である。
これと全く同じソースでなくても最初の '0e0f'
の部分を、コンパイラーが
エラーとして受け付けてくれないのである。
ここに紹介する UPDRPGSRC コマンドは CVTRPGSRC によって生成された
ILE-RPG ソースに上記のような部分があればそれを補正してくれるツールである。
弊社では RPG III から ILE-RPG へと CVTRPGSRC コマンドによって変換した後には
必ず UPDRPGSRC を組み込んでいる。
0001.00 CMD PROMPT('ILE-RPG ソースの補正 ') 0002.00 PARM KWD(SRCFILE) TYPE(SRCFILE) + 0003.00 PROMPT('FROM ファイル ') 0004.00 SRCFILE: QUAL TYPE(*NAME) LEN(10) DFT(QRPGLESRC) 0005.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0006.00 SPCVAL((*LIBL)) PROMPT(' ライブラリー ') 0007.00 PARM KWD(SRCMBR) TYPE(*CHAR) LEN(10) DFT(*SRCMBR) + 0008.00 PROMPT(' ソース・メンバー ')
0001.00 PGM PARM(&SRCFILLIB &SRCMBR) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* UPDRPGSRC : ILE-RPG ソースの補正 */ 0004.00 /* */ 0005.00 /* 2017/02/19 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20) 0008.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&SRCFLIB) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&ERRCD) TYPE(*CHAR) LEN(1) 0012.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0013.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0014.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0015.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0016.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0017.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0018.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0019.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0020.00 VALUE('*ESCAPE ') 0021.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0022.00 VALUE(X'000074') /* 2 進数 */ 0023.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0024.00 VALUE(X'00000000') 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 0036.00 /*( パラメータの取得 )*/ 0037.00 CHGVAR VAR(&SRCF) VALUE(%SST(&SRCFILLIB 01 10)) 0038.00 CHGVAR VAR(&SRCFLIB) VALUE(%SST(&SRCFILLIB 11 10)) 0039.00 0040.00 OVRDBF FILE(QRPGLESRC) TOFILE(&SRCFLIB/&SRCF) + 0041.00 MBR(&SRCMBR) SECURE(*YES) OVRSCOPE(*JOB) 0042.00 CALL PGM(ASNET.COM/UPDRPGSRC) PARM(&MSG &ERRCD) 0043.00 DLTOVR FILE(QRPGLESRC) LVL(*JOB) 0044.00 IF COND(&ERRCD *EQ ' ') THEN(DO) 0045.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ') 0046.00 IF COND(&MSG *NE ' ') THEN(GOTO CMDLBL(SNDMSG)) 0047.00 ENDDO 0048.00 RETURN 0049.00 0050.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0051.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0052.00 MSGFLIB(&MSGFLIB) 0053.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0054.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0055.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0056.00 ENDDO 0057.00 ELSE CMD(DO) 0058.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0059.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0060.00 MSGTYPE(&MSGTYPE) 0061.00 ENDDO 0062.00 ENDPGM
0001.00 H DFTNAME(UPDRPGSRC) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 H COPYRIGHT('(C) OfficeQuattrb Co,.Ltd Japan 2017-') 0003.00 F********** ILE-RPG ソースの補正 *********************************** 0004.00 FQRPGLESRC UP F 112 DISK 0005.00 F******************************************************************* 0006.00 D MSR S 80 DIM(1) CTDATA PERRCD(1) 0007.00 0008.00 * RPG ソース内のシフト文字を変換する 0009.00 * CRTBNDRPG ASNET.COM/UPDRPGSRC SRCFILE(R610SRC/QRPGLESRC) AUT(*ALL) 0010.00 0011.00 D AR S 1 DIM(112) 0012.00 0013.00 D OUTBUF DS 0014.00 D SRCDTA 1 112 0015.00 D SPEC 18 18 0016.00 D AST 19 19 0017.00 D FLD1 24 37 0018.00 D ENZAN 38 47 0019.00 D FLD2 48 61 0020.00 D KEKKA 62 75 0021.00 0022.00 D OEOF S 4A INZ(X'7D0E0F7D') 0023.00 D N S 4S 0 0024.00 D HEX C CONST('X''0E0F'' ') 0025.00 0026.00 IQRPGLESRC AA 10 0027.00 I 1 112 SRCDTA 0028.00 0029.00 C*------------------------------------------------------------ 0030.00 C *ENTRY PLIST 0031.00 C PARM MSG 80 0032.00 C PARM ERRCD 1 0033.00 C*------------------------------------------------------------ 0034.00 * 0035.00 C 0036.00 C SPEC IFEQ 'C' 0037.00 C AST ANDEQ ' ' 0038.00 C OEOF SCAN SRCDTA:1 N 50 0039.00 C *IN50 IFEQ *ON 0040.00 C MOVEA(P) SRCDTA AR 0041.00 C MOVEA HEX AR(N) 0042.00 C MOVEA(P) AR SRCDTA 0043.00 C*------------------------------------------------------------ 0044.00 C EXCEPT @OUTPUT 0045.00 C*------------------------------------------------------------ 0046.00 C MOVEL MSR(1) MSG 0047.00 C MOVE *BLANKS ERRCD 0048.00 C ENDIF 0049.00 C ENDIF 0050.00 OQRPGLESRC E @OUTPUT 0051.00 O SRCDTA 112 0052.00 ** MSR -- 以下は配列 -- 0053.00 シフト文字の記述を更新しました。
MOVE 'OeOf'
のような演算を見つけたら
MOVE X'OEOF'
のように置換えるだけである。
これだけでコンパイル・エラーは解消される。
手動で変換後の ILE-RPG ソースを修正してもよいが 'OeOf'
を
探し出すのも面倒なので UPDRPGSRC に頼れば間違いなくコンパイル・エラーを
解消することができる。