Tools

56. ILE-RPG 変換のバグを補正する UPDRPGSRC

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 を組み込んでいる。

【 コマンド : 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(' ソース・メンバー ')                
【 CLP: UPDRPGSRCC 】
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                                                     
【 RPG : UPDRPGSRC 】
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 に頼れば間違いなくコンパイル・エラーを
解消することができる。