Nouveautés syntaxique du CL en V5R40. ------------------------------------ Nouveaux types de variables et nouvelles options de déclaration Après les types *INT et *UINT en V5R30, le type *PTR (pointeur) est maintenant admis. DCL VAR(&pointeur) TYPE(*PTR) ce qui permet ensuite, la déclaration d'une variable basée sur ce pointeur DCL VAR(&Data) TYPE(???) STG(*BASED) BASPTR(&pointeur) un pointeur peut être renseigné : 1/ par copie d'un pointeur 2/ par récupération de l'adresse d'une variable avec %ADDRESS() ou %ADDR CHGVAR &pointeur %ADDRESS(&autreData) |
3/ en incrémentation, décrémentation avec la fonction %OFFSET() ou %OFS CHGVAR %OFFSET(&pointeur) VALUE(%OFFSET(&pointeur) + 1) Enfin une variable peut pointer directement sur une autre (comme une DS) évitant ainsi les %SST() dans le code. DCL VAR(&Data) TYPE(*CHAR) LEN(256) DCL VAR(&portion) TYPE(*CHAR) LEN(10) + STG(*DEFINED) DEFVAR(&Data 11) &portion recouvrant les Octets 11 à 20 de &Data Exemple avec un pgm associé à la commande STRWCH le but de jeu est de détecter les profils désactivés à cause d'un nombre trop élevé de tentatives d'ouverture de session infructueuses. le message CPF1393 est alors envoyé à QHST |
la commande STRWCH SSNID(HST_1393) WCHPGM(AF4test/HTS_1393) WCHMSG(CPF1393) WCHMSGQ(*HSTLOG) lance l'espion voici la partie déclaration du CL PGM PARM(&TYPE &SESSION &ERREUR &DATA) DCL &TYPE *CHAR 10 DCL &SESSION *CHAR 10 DCL &ERREUR *CHAR 10 DCL &DATA *CHAR 1000 DCL &MSG *CHAR 7 STG(*DEFINED) DEFVAR(&Data 5) DCL &MSGF *CHAR 10 STG(*DEFINED) DEFVAR(&Data 391) DCL &MSGFL *CHAR 10 STG(*DEFINED) DEFVAR(&Data 401) DCL &MDTAOFS *INT 4 STG(*DEFINED) DEFVAR(&Data 441) DCL &PTR *PTR DCL &MSGDTA *CHAR 80 STG(*BASED) BASPTR(&ptr) |
CHGVAR &PTR VALUE(%ADDR(&DATA)) CHGVAR %OFS(&PTR) VALUE(%OFS(&PTR) + &MDTAOFS) CHGVAR &ERREUR VALUE(' ') SNDUSRMSG MSGID(&MSG) MSGF(&MSGFL/&MSGF) MSGDTA(&MSGDTA) MSGTYPE(*INFO) TOUSR(CM) /* CM en copie */ MONMSG CPF0000 EXEC(CHGVAR &ERREUR '*ERROR') ENDPGM Pour finir, le CL implémente maintenant la notion de sous programme définition d'un sous programme SUBR / ENDSUBR les sous programmes doivent être placés en FIN de pgm ils ne doivent pas être imbriqués ils peuvent bien sûr s'appeller les uns les autres dans la limite indiquée par la nouvelle commande DLCPRCOPT (dft = 99) |
exemple de source CL avec des sous programmes PGM DCL DCL .../... CALLSUBR SUBR(TEST) /* fin logique du pgm */ SUBR SUBR(TEST) .../... ENDSUBR le sous programme peut retourner une valeur numérique ENDSUBR RTNVAL(&rt) cette valeur est alors récupérée lors de l'appel par CALLSUBR ..RTNVAL(&R) (&R doit être une variable de type *INT de lg 4). |