CMTSRC
analyse et commente en marge
les structures DO, IF
et autres d'un programme RPG.
En pratique, définir une option PDM
CMTSRC &L/&F &N *STRUC /* Structures de programme RPG */
Pour trouver raidement des erreurs de structures dans le source,
utiliser l'instruction de recherche
F ? 4
tags
, CMTSRC3
ST : CMTSRC SRCF(&L/&f) MBR(&N)
CMD PROMPT('Structures d''un Source')
/* compiler avec PGM(CMTSRC1) HLPPNLGRP(*LIBL/CMTSRCH) HLPID(*CMD) */
/* Patrick LARREYA, 1990-2000 */
PARM KWD(SRCF) TYPE(FILE) PROMPT('Fichier')
PARM KWD(MBR) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT('Membre')
PARM KWD(COMMENT) TYPE(*CHAR) LEN(6) RSTD(*YES) +
DFT(*STRUC) VALUES(*STRUC *TAGS *BOTH *NONE) +
PROMPT('Commentaires ajoutés')
PARM KWD(CLEAR) TYPE(*CHAR) LEN(4) RSTD(*YES) +
DFT(*NUM) VALUES(*ALL *NUM *NOT) +
PROMPT('Nettoyage des marges')
FILE: QUAL TYPE(*NAME) LEN(10) DFT(QRPGSRC)
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL) (*CURLIB)) +
PROMPT('Bibliothèque')
|
:PNLGRP. :HELP NAME='CMTSRC'. :p.Cette commande permet de commenter en marge les structures d'un programme RPG ou RPG38 afin de repérer rapidement leurs imbrications. :p.En général, elle ne doit pas être utilisée directement, et il est plus simple d'ajouter dans le fichier d'option de PDM une option ST : :pc. CMTSRC &L/&F &N *STRUC /* Structures de programme RPG */ :EHELP. :HELP NAME='CMTSRC/SRCF'.Fichier source - Aide. :XH2.Fichier source :p.Entrer le nom du fichier source, et de sa bibliothèque. :EHELP. :HELP NAME='CMTSRC/MBR'.Membre - Aide. :XH2.Membre :p.Entrer le nom du membre à traiter. :EHELP. :HELP NAME='CMTSRC/COMMENT'.Type de commentaires - Aide. :XH2.Type de commentaires :p.Entrer :pk.*STRUC:epk. pour commenter seulement les ordres de structuration, :pk.*TAGS:epk. pour commenter seulement les tags et subroutines, :pk.*BOTH:epk. pour inclure des deux types de commentaires, ou :pk.*NONE:epk. pour n'inclure aucun commentaire. :EHELP. :HELP NAME='CMTSRC/CLEAR'.Nettoyage des marges - Aide. :XH2.Nettoyage des marges :p.Entrer :pk.*ALL:epk. pour nettoyer complètement la marge avant tout autre traitement, :pk.*NUM:epk. pour ne nettoyer la marge que si elle ne contient que des chiffres, ou :pk.*NOT:epk. pour ne pas nettoyer la marge. :EHELP. :epnlgrp. |
PGM PARM(&FICL &MBR &COM &NET)
/* Commentaire des structures d'un source (tags) */
/* Patrick LARREYA, 1990-2000 */
DCL &FICL *CHAR 20
DCL &LIB *CHAR 10
DCL &SRC *CHAR 10
DCL &MBR *CHAR 10
DCL &TYP *CHAR 10
DCL &COM *CHAR 6
DCL &NET *CHAR 4
DCL &ERR *CHAR 1 VALUE('0')
DCL &MSGID *CHAR 7
DCL &MSGF *CHAR 10
DCL &MSGLIB *CHAR 10
DCL &MSGDTA *CHAR 256
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERREUR))
CHGVAR &SRC %SST(&FICL 1 10)
CHGVAR &LIB %SST(&FICL 11 10)
RTVMBRD FILE(&LIB/&SRC) MBR(&MBR) RTNLIB(&LIB) +
SRCTYPE(&TYP)
IF ((&TYP *NE 'RPG') *AND (&TYP *NE 'RPG38')) DO
SNDPGMMSG MSG(&LIB !< '/' !< &SRC !< '/' !< &MBR !> +
'n''est pas de type RPG. Traitement +
abandonné.')
GOTO FINFIN
ENDDO
SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) +
MSGDTA('Traitement en cours pour ' !! +
&LIB !< '/' !< &SRC !< '/' !< &MBR !< +
'...') TOPGMQ(*EXT) MSGTYPE(*STATUS)
OVRDBF FILE(SRCF) TOFILE(&LIB/&SRC) MBR(&MBR)
IF (&NET = *ALL *OR &NET = *NUM) CALL CMTSRC4 &NET
IF (&COM = *STRUC *OR &COM = *BOTH) CALL CMTSRC2
IF (&COM = *TAGS *OR &COM = *BOTH) CALL CMTSRC3
SNDPGMMSG MSG('Traitement de' !> &LIB !< '/' !< &SRC +
!< '/' !< &MBR !> 'effectué.')
ERREUR: IF (&ERR = '1') GOTO FINFIN
CHGVAR &ERR '1'
RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) +
MSGF(&MSGF) MSGFLIB(&MSGLIB)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGLIB/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
FINFIN: ENDPGM
|
GOTO
, car il ne devrait pas y en avoir.
H*------------------------------------------------------------------- H* Commentateur de structures auto-commenté. H* H* Ne modifie que les lignes concernées (pas de remise à blanc autres) H* Recherche rapide d'erreur, utiliser Find : F ? 4 H* Patrick LARREYA, 1990-2000 H*------------------------------------------------------------------- FSRCF UF F 92 DISK ISRCF NS 01 I 13 92 SRCDTA ISRCDTA DS I 1 2 DEBTAB I 6 7 CID I 28 32 OPER I 28 29 OP2 I 28 30 OP3 C* Rang est le compteur d'imbrications C Z-ADD0 RANG 30 C* Cartes C, en éliminant les commantaires CO/CA pour OR ou AND sur indics 1{ C DO *HIVAL C READ SRCF 97 C 97 LEAVE 2{ C CID IFNE 'C ' C CID ANDNE'CO' C CID ANDNE'CA' C ITER 2} C END 2{ C DEBTAB IFEQ '**' C LEAVE 2} C END C* Subroutine 2{ C OPER IFEQ 'ENDSR' C OPER OREQ 'BEGSR' 3{ C RANG IFNE 0 C MOVE '?' INFO 1 C EXCPT C Z-ADD0 RANG 3} C END C ITER 2} C END C* Fermeture de structure (identifiée par "}") 2{ C OP3 IFEQ 'END' C MOVE ' ' DERDEB 3 3{ C RANG IFEQ 0 C MOVE '?' INFO 3| C ELSE C MOVE '}' INFO 3} C END C EXCPT 3{ C RANG IFNE 0 C SUB 1 RANG 3} C ENDIF C ITER 2} C END C* Filtrage sur CAS suite 2{ C OP3 IFEQ 'CAS' C DERDEB ANDEQ'CAS' C ITER 2} C END C MOVE OP3 DERDEB C* Ouverture de structure (identifiée par "{") 2{ C OP2 IFEQ 'IF' C OP2 OREQ 'DO' C OPER OREQ 'SELEC' C OP3 OREQ 'CAS' C ADD 1 RANG C MOVE '{' INFO C EXCPT 2} C END C* Intermédiaire de structure (identifié par "=") 2{ C OP2 IFEQ 'WH' C OPER OREQ 'OTHER' C OPER OREQ 'ELSE ' 3{ C RANG IFEQ 0 C MOVE '?' INFO 3| C ELSE C MOVE '|' INFO 3} C END C EXCPT C ITER 2} C END C* Un controle sur les fins de end pourrait être ajouté 1} C ENDDO C SETON LR OSRCF E O RANG 15 ' 0' O INFO 16 |
H*------------------------------------------------------------------- H* Commentateur de structures TAGs et SR H* Recherche rapide d'erreur, utiliser Find : F ? 4 H* Patrick LARREYA, 1990-2000 H*------------------------------------------------------------------- FSRCF UF F 92 DISK E TAG 999 6 ISRCF NS 01 I 13 92 SRCDTA ISRCDTA DS I 1 2 DEBTAB I 6 7 CID I 18 23 NTAG I 28 32 OPER I 28 29 OP2 I 28 30 OP3 I 33 38 FAC2 I 43 48 RESUL C*----------------------------------------------------------------------- C* Cartes C, en éliminant les commantaires CO/CA pour OR ou AND sur indics C Z-ADD0 IT 30 N° Tag C MOVE '---' INFO 3 1{ C DO *HIVAL C READ SRCF 97 C 97 LEAVE 2{ C CID IFNE 'C ' C CID ANDNE'CO' Or C CID ANDNE'CA' And C CID ANDNE'CL' L1 ... Ln C ITER 2} C END 2{ C DEBTAB IFEQ '**' C LEAVE 2} C END C* Enregistrement des TAGS et subroutines 2{ C OPER IFEQ 'ENDSR' C OPER OREQ 'BEGSR' C OPER OREQ 'TAG ' C NTAG IFNE *BLANK C ADD 1 IT C MOVE NTAG TAG,IT C Z-ADDIT IT2 20 C EXCPTMAJTAG C ENDIF 3} C ENDIF C ENDDO C*----------------------------------------------------------------------- C* Second passage C CLOSESRCF C OPEN SRCF C* Cartes C, en éliminant les commantaires CO/CA pour OR ou AND sur indics C MOVE '<--' INFO 3 1{ C DO *HIVAL C READ SRCF 97 C 97 LEAVE 2{ C CID IFNE 'C ' C CID ANDNE'CO' C CID ANDNE'CA' C ITER 2} C END 2{ C DEBTAB IFEQ '**' C LEAVE 2} C END C* Enregistrement des TAGS et subroutines C MOVE *BLANK NTAG C OP3 IFEQ 'CAS' C OP3 OREQ 'CAB' C MOVE RESUL NTAG C END 2{ C OPER IFEQ 'EXSR ' C OPER OREQ 'GOTO ' C MOVE FAC2 NTAG C END C NTAG IFNE *BLANK C Z-ADD1 IT C NTAG LOKUPTAG,IT 90 C *IN90 IFEQ '1' C MOVE '<--' INFO C ELSE C MOVE ' ? ' INFO C Z-ADD0 IT C ENDIF C Z-ADDIT IT2 C EXCPTMAJTAG 3} C ENDIF C ENDDO C SETON LR OSRCF E MAJTAG O IT2 14 ' 0' O INFO 17 |
FSRCF UF F 92 DISK
I* Force à blanc la numérotation en marge
ISRCF NS 01
I 13 16 NUMA
I 13 14 TB
C *ENTRY PLIST
C PARM TYPNET 4 *ALL ou *NUM
C SETON 98
C DO *HIVAL
C READ SRCF 99
C 99 LEAVE
C TB IFEQ '**' Postes Table
C LEAVE
C ENDIF
C TYPNET IFNE '*ALL'
C TESTN NUMA 98 Numéro.
C END
C 98 EXCPTMAJ
C ENDDO
C SETON LR
OSRCF E MAJ
O 17 ' '
|