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 に頼れば間違いなくコンパイル・エラーを
解消することができる。