REXX – Reading a sequential file into a STEM (array)

The below REXX program gets a PS file my.seq.dsn into a STEM (array).
We can immediately FREE the file, since the file data has now copied to an internal variable.

/******REXX******/
ADDRESS TSO                                     
"ALLOC F(INFILE) DSN('my.seq.dsn') SHR REU"    
/* INFILE is a logical name for the file */
"EXECIO * DISKR INFILE ( FINIS STEM MYFILE." 
/* MYFILE is the stem (array) that holds the data */
"FREE F(INFILE)"
I = 1
/* MYFILE.0 will have the number of */
/* elements in the stem             */
DO WHILE I <= MYFILE.0
   SAY ' LINE ' I ' : ' MYFILE.I
   I = I + 1
END
EXIT

INFILE – my.seq.dsn

MY
DATA
SET
IS THIS

Result of the above Rexx program is:

 LINE 1 : MY
 LINE 2 : DATA
 LINE 3 : SET
 LINE 4 : IS THIS
Advertisement

REXX – STRREPLACE : Replace part of a string with new string

The Below Rexx function STRREPLACE can replace a part of a string with a new one

/*REXX*/
MYSTR = 'MY TEST STRING'
SAY MYSTR
MYSTR = STRREPLACE(MYSTR,'TEST','NEW')
SAY MYSTR
EXIT
/* A FUNCTION TO DO A STRING REPLACE */
STRREPLACE:
ORIGINAL = ARG(1)
OLDTXT = ARG(2)
NEWTXT = ARG(3)
/* YOU CAN CHANGE THE BELOW KEY (TMPTXT), WHICH IS USED AS A TEMPORARY
POINTER TO IDENTIFY THE TEXT TO BE REPLACED */
TMPTXT = '6A53CD2EW1F'
NEWSTR = ORIGINAL
DO WHILE POS(OLDTXT,NEWSTR) > 0
NEWSTR = SUBSTR(NEWSTR, 1 , POS(OLDTXT,NEWSTR)-1) ||,
TMPTXT || SUBSTR(NEWSTR, POS(OLDTXT,NEWSTR) + LENGTH(OLDTXT))
END
DO WHILE POS(TMPTXT,NEWSTR) > 0
NEWSTR = SUBSTR(NEWSTR, 1 , POS(TMPTXT,NEWSTR)-1) ||,
NEWTXT || SUBSTR(NEWSTR, POS(TMPTXT,NEWSTR) + LENGTH(TMPTXT))
END
RETURN NEWSTR

Introduction to REXX – Some examples

– A Rexx program should have a comment “/*rexx*/” in the first line
– Rexx statements are Case insensitive
– A rexx program can be executed by giving “EX” to the rexx member containing the rexx program

Hello World program

/************REXX***********/
 SAY "HELLO WORLD"
 EXIT

IF-ELSE in Rexx

/******REXX******/
/* EXECUTE SOME INSTRUCTIONS CONDITIONALLY */
 SAY 'ENTER NUMBER LESS THEN 10 '
 PULL A
 IF A<10 THEN
    DO
       SAY "CORRECT NUMBER!!"
    END
 ELSE SAY "WRONG!"
 EXIT

DO-Loops in Rexx

/*******REXX***********/
  /* SAY "HI" 5 TIMES */
  DO 5
     SAY "HI"
  END
  /**/
  DO C=1 TO 5
     SAY "HI"
  END
  /**/
  DO M=0.3 TO 1.5 BY .3
     SAY "HI"
  END
  /* INFINITE LOOP*/
 /*
 DO FOREVER
     SAY "HI"
 END
 */
 EXIT

DO WHILE and DO UNTIL

DO WHILE runs the loop all the times if the condition given validates to TRUE
DO UNTIL runs the loop all the times if the condition given validates to FALSE

/************REXX***********/
 DO WHILE A = 5
   SAY 'HI'
   /* SOMETHING THAT MODIFIES A */
 END

 DO UNTIL A = 5
   SAY 'HI'
   /* SOMETHING THAT MODIFIES A */
 END
 EXIT

SELECT statement in REXX

The below code shows how to use the SELECT clause. You can also note the use of NOT Operator “”.

/******REXX******/
/* DECIDE WHAT RANGE A NUMBER IS IN */
 SAY 'ENTER A NUMBER'
 PULL A
 SELECT
    WHEN A>0 & A<100 THEN SAY "1-99"
    WHEN A<100 & A<500 THEN SAY "100-499"
    WHEN  (A<500 | A>=1000) THEN SAY "500-29"
    OTHERWISE SAY "OUT OF RANGE"
 END
 EXIT

Dividing one Number by another
PULL gets the value from the user.

/******REXX****************************************************/
 /* DIVIDING ONE NUMBER BY ANOTHER NUMBER */
 /**************************************************************/
 SAY 'DIVIDING ONE NUMBER BY ANOTHER NUMBER'
 SAY 'ENTER NUMERATOR:'
 PULL Z
 SAY 'ENTER DENOMINATOR:'
 PULL N
 IF N=0 THEN
   SAY 'DIVISION BY ZERO'
 ELSE DO
   SAY 'NUM / DENOM IS' Z/N
   SAY 'REST IS' Z//N
 END
 EXIT

A list of REXX functions can be found here.

You can also download a complete Tutorial PDF.