Exemples pour le langage REXX

Textes écrits par Gilles HUNAULT

/* xmp01 : lire et écrire */

say " hello " say " ca va ? " pull reponse say " tiens, vous m'avez dit " reponse

/* xmp02 : lire et écrire plus sophistiqués */

say " hello " call charout ," ca va ? " parse pull reponse say " tiens, vous m'avez dit " reponse

/* xmp03 : si alors sinon */

call charout , " donner un nombre ou une formule " pull valeur . interpret " n = " valeur if n > 0 then say " cette valeur est positive et vaut " n else do say " cette valeur n'est pas positive" say " au revoir. " end /* fin du si */

/* xmp04 : structure de cas */

call charout , " donner deux mot séparés par un espace blanc : " pull n1 n2 n3 . if n3 <> "" then do say " vous avez donné plus de deux mots" exit end select when n1 < n2 then say "l'ordre ASCII est " n1 n when n1=n2 then say " ces 2 mots sont égaux " when n1 > n2 then say "l"d2c(39)"ordre ASCII est " n2 n1 end /* fin des cas */

/* xmp05 : boucles */

do i = 1 to 100 by 3 for 5 call charout , i " * " iterate end say " <-- boucle POUR aménagée " j = 11 do while (j < 25) call charout , j " " j = j + 3 if j > 20 then leave call charout , j end say " <-- boucle tant que " j = 11 do until (j >20) call charout , j " " j = j + 3 end say " <-- boucle until " say say " Boucle étrange " do j = 1 by 3 say j if j > 13 then j = j-3 else iterate j = j + 1 if j > 20 then exit end

/* xmp06 : tableaux */

jour.1 = 'Lundi' ; jour.2 = 'Mardi' ; jour.3 = 'Mercredi' ; jour.4 = 'Jeudi' ; jour.5 = 'Vendredi' ; jour.6 = 'Samedi' ; jour.7 = 'Dimanche' i = 1 do j=1 until j > 30 call charout , jour.i || ' ' if i = 7 then do ; say ; i = 1 ; end else i = i+1 end

/* xmp07 : parse, essayer avec XMP7 une petite phrase pour REXX */

parse value time() with HEURES ':' MINUTES ':' SECONDES say HEURES MINUTES say say " récupération de la phrase en deux variables " parse upper arg debut fin say " 1 : " debut " 2 : " fin say say "un seul point ajouté et tout change" parse arg debut fin . say debut fin

/* xmp08 : appel de procédures */

say " Forme 1 " do i = 1 to 5 call prix i end ; say say " Forme 2 " do i = 1 to 5 call prix2 end exit prix: procedure arg j say j "article(s) coutent " copies('*',2*j) 17.5*j " FRS." return prix2: procedure expose i say i "article(s) coutent " copies('*',3*i) 12.5*i " FRS." return

/* xmp09 : appel de programme, vérification de fichier */

arg nomfich . if (nomfich = ?) | (nomfich='') then do 'clear' say " Syntaxe : srexx xmpP09 " exit end if state(nomfich) \= '' then say " ok, ce fichier est accessible " else say " désolé, il y aun problème avec le fichier " nomfich /* fin de si */

/* xmp10 : "Write a note to a disk file. Add today's date and time." */

/* The file is called "notes.doc" */ parse arg newline call lineout 'notes.doc', date() time() newline call lineout 'notes.doc' say " le fichier notes.doc contient : " "cat notes.doc"

/* xmp11 : Bonjour, programme de démonstration */

"clear" call charout , "Ecrivez une commande comme ls -a ou man awk : " parse pull rep say "Donner une ou plusieurs notations ambigues sur la meme ligne," say " (par exemple comme *.rex ou x*) séparées par un ou plusieurs espaces" parse pull lamb do i = 1 to words(lamb) "clear" sf = word(lamb,i) say " voici un " rep " de " sf rep sf say call charout , copies(" ",45) " Enter pour continuer " pull . end /* do i = 1 to word(lambs) */

/* xmp12 : un dialogue */

say "Bonjour. Ca va ? " pull rep select when rep="OUI" then say "tant mieux " when rep = "NON" then do say " qu'est-ce qui ne va pas ?" pull . /* pull . signifie lire et ignorer polimen cette réponse de l'utilisateur */ end otherwise do say" désolé, je n'ai rien compris !, je vous donne pourtant la liste... " say 'ls *.rex' end end

/* xmp13 : les 1111 */

numeric digits 200 /* Recherche de y tel que x*y ne contienne que des 1 pour x impair de 1 à 99 */ say " x y" do t = 1 to 50 x = 2*t - 1 if 0 < (x//5) then do p = 11 y = p mod x do while y <> 0 p = p*10+1 y = p // x end /* while */ y = p / x if length(y) < 70 then say format(x,3) format(y,70) else do say format(x,3) substr(y,1,70) say format(substr(y,71,length(y)-70),80) end end end /* pour */

/* xmp14 : gestion de répertoire*/

/* # 1.1 on génére la liste des fichiers avec redirection */ /* de la sortie dans le fichier fn */ fn = 'dir.dir' 'ls -l > ' fn /* # 1.2 on initialise les tableaux dynamiques */ /* et le nombre de fichiers vus, d'extensions distinctes */ compte. = 0 ; nom. = 0 ; taille. = 0 ; nbfic = 0 ; nbext = 0 ; /* # 2. on passe en revue le fichier obtenu */ do lines(fn) ligne = linein(fn) /* # 2.1 une ligne valide est non vide, contient / */ /* (dans la date) et ne contient pas de . */ /* en premier mot, contrairement aux sous-répertoires */ if ligne <> "" then do parse var ligne pass lnk user grp kO mois jou heure fid . parse var fid with nom "." ext /* # 2.2 le . dans parse permet d'ignorer */ /* le reste de la ligne */ if substr(pass,1,1) = "-" then do if ext ="" then do ext = '???' end /* if words(ligne) = 4 then */ /* # 2.3 on utilise l'indexation dynamique */ if compte.ext = 0 then do /* nouvelle extension */ compte.ext = 1 ; nbext = nbext + 1 nom.nbext = ext ; taille.ext = taille.ext + kO end /* nouvelle extension */ else do /* ancienne extension */ /* utilisation de la "mémoire associative" */ compte.ext = compte.ext + 1 taille.ext = taille.ext + kO end /* ancienne extension */ /* et on compte un fichier en plus */ nbfic = nbfic + 1 end /* if if pos("/",ligne) > 0 & pos(".",nom) = 0 */ end /* if ligne <> then */ end /* do while lines(fn) */ /* # 3. après la parcours, affichage */ if nbfic = 0 then say "Pas de fichiers (peut-etre)" ; else do fvc = " fichiers vus dans la directory " exd = " extensions différentes " bl = copies(" ",3) say nbfic fvc "avec" nbext exd say call charout , " extension nombre taille kO ³ " say " extension nombre taille en kO " nbl = 1 ; do i = 1 to nbext /* on écrit une ligne sur 2 */ ext = nom.i ; nb = compte.ext ; taillekO = trunc(taille.ext/1000) if ext = '???' then ext = '(vide)' call charout , bl left(ext,6) bl format(nb,3) format(taillekO,12) bl if nbl = 1 then call charout , "³" nbl = nbl + 1 ; if nbl = 3 then do ; say ; nbl = 1 ; end end /* do i = 1 to nbext */ ; say end

/* xmp15 trouvez donc à quoi sert ce programme...*/

/* Program to read from the keyboard and interpret REXX instructions */ If arg(1, 'e') then do interpret arg(1) exit End Say 'REXX interpreter running...type EXIT to terminate' Say start: Signal On error Signal On syntax Signal On failure Signal On halt Do Forever call charout ,"> " parse linein @_@ interpret @_@ End Error: Say 'REXX:- Application returned an errorlevel' rc signal start Syntax: Say 'REXX:- Error' rc':' errortext(rc) signal start Failure: If rc = -3 then Say 'REXX:- Program not found' Else if rc = -8 then Say 'REXX:- Insufficient memory for program' Else Say 'REXX:- Return code' rc Signal start Halt: Say 'REXX:- CTRL-BREAK intercepted' Signal start

/* xmp16 trouvez donc à quoi sert ce programme...*/

/* C:\I\HEXA.REX Gilles HUNAULT Angers, le 17 Aout 89 12:02 */ /* affiche l'argument et son équivalent en HEXA */ arg phraz if phraz = "" then do say "Syntaxe : xmp16 " exit end do i = 1 to length(phraz) cc = substr(phraz,i,1) call charout , ' '||cc end say do i = 1 to length(phraz) cc = substr(phraz,i,1) call charout , c2x(cc) end say "salut..."

/* xmp17 trouvez donc à quoi sert ce programme...*/

/* affiche tous les fichiers depuis le début du mois */ arg specif if specif ='' then specif = '*.*' /* specif contient *.* ou *.BAT par exemple */ /* on récupère le numéro du mois en cours */ auj = date(E) parse var auj jour '/' nmois '/' an /* on commence au jour numéro 1 d'où : */ jour = 01 olddate = nmois'/'jour'/'an /* on lance LISTFILE avec les bons arguments */ say copies(' ',20) 'Fichiers depuis le début du mois ' say "listfile specif '(' SINCE olddate TREE SORTA N E SORTD D" /* éventuellement on prévient l'utilisateur qu'il n'y a aucun fichier correspondant aux spécifications depuis le début du mois en cours */ if rc <> 0 then do "clear" say ' Désolé, pas de fichier correspondant à ' specif say ' depuis le début du mois ' end /* le code retour est non nul */

/* xmp18 trouvez donc à quoi sert ce programme...*/

/* 19éme décimale) de puissance 10 - 19éme décimale) de puissance -10 réponse (1) */ Say "Un peu de patience..." numeric digits 1000 pi = 3.1415926535897932384626433832 n = 10 /* numeric digits 10 pi = 31 n = 2 */ a = pi do i = 1 to n a = a* pi end b = 1/a c = substr(a,19,1) d = substr(b,19,1) say "pi : " pi say "^10 (20 dec: " substr(a,1,20) say "1/ (20 dec: " substr(b,1,20) say "dec 19 ^10 : " c say "dec 19 1/ : " d say "diff : " c-d /* 19éme décimale) de puissance 10 - 19éme décimale) de puissance -10 réponse (1) */ Say "Un peu de patience..." numeric digits 1000 pi = 3.1415926535897932384626433832 n = 10 /* numeric digits 10 pi = 31 n = 2 */ a = pi do i = 1 to n a = a* pi end b = 1/a c = substr(a,19,1) d = substr(b,19,1) say "pi : " pi say "^10 (20 dec: " substr(a,1,20) say "1/ (20 dec: " substr(b,1,20) say "dec 19 ^10 : " c say "dec 19 1/ : " d say "diff : " c-d

/* xmp19 trouvez donc à quoi sert ce programme...*/

/* numeric digits 800 */ 'cls' call charout, " Donner N " pull n say " sa racine est " sqr(n) exit /*****************************************/ sqr: procedure arg nb rac = 1 do while rac*rac <= nb rac = rac + 1 end say " --> encadrement entier : " rac-1 " et " rac return rac-1