Voici quelques éléments d'explication du programme REXX.
"EXECIO * DISKR IN (STEM ENR. FINIS" |
Lecture du fichier IN dans le tableau ENR
La notation ENR.I est équivalante à la notation tableau ENR[I].
L'élément 0 contient le nombre d'éléments dans le tableau (hors 0).
DO I = 1 TO ENR.0 . . . .
END |
Boucle sur le traitement de toutes les lignes du fichier contenues dans le tableau ENR
ENR.I -> Ligne I du fichier.
IF POS('QUEUE(',ENR.I) > 0 THEN DO . . . .
END |
On teste la présence de la chaîne 'QUEUE(' dans la ligne en cours.
La fonction POS retourne la position de la chaîne (0 si non trouvée).
NOM = TRANSLATE(ENR.I,' ','(')
NOM = TRANSLATE(NOM,' ',')') |
La variable NOM reçoit la ligne en cours et l'on remplace les caractères '(' et ')' par des espaces.
PARSE VALUE NOM WITH L1 L2 L3 |
La variable NOM est décomposée en mots dans les variables L1 L2 et L3.
La variable L3 reçoit le 3eme mot et les suivants.
Tous les espaces contenus dans la variable L2 sont supprimés.
La variable L2 ne conserve que les 20 premiers caractères.
Si elle à une lonfueur inférieure à 20 on complete avec des espaces.
La variable I est utilisé comme numéro de la ligne en cours.
On fait +2, I pointe maintenant deux lignes plus loin.
PUSH L2!!' NOMBRE DE MSG : '!!M2 "EXECIO 1 DISKW OUT (" |
On écrit sur le fichier sorte OUT la chaîne résultat de la concaténation de L2, ' NOMBRE DE MSG : ' et M2
Voici un équivalant (enfin presque, non testé) en awk :
/QUEUE\(/ {
NOM = $0;
gsub(/[()]/, " ", NOM);
n = split(NOM, L);
for (i=4; i<=n; i++) L[3] = L[3] (L[3] != "" ? " " : "" ) L[i];
if (L[1] == 1) {
L[1] = L[2];
L[2] = L[3];
gsub(/ /, "", L[2]);
}
L[2] = sprintf("%-30.30s", L[2]);
getline;
getline;
COMP = $0;
gsub(/[()]/, " ", COMP);
n = split(COMP, M);
for (i=4; i<=n; i++) M[3] = M[3] (M[3] != "" ? " " : "" ) M[i];
M[2] = sprintf("%-8.8s", M[2]);
if (M[2] > 0) {
print L[2] " NOMBRE DE MSG : " M[2];
}
next;
} |
Pour l'exécuter :