z/OS ISPF Edit and Edit Macros
Previous topic | Next topic | Contents | Contact z/OS | Library | PDF


Writing program macros

z/OS ISPF Edit and Edit Macros
SC19-3621-00

When you write a program macro, it can help to first type it as a CLIST or REXX macro to debug the logic and the command statements. The example that follows is a simple macro that separates each line in a set of data with a line of dashes. The REXX version, called ISRSLREX, is shown in Figure 1. The PL/I program is shown in Figure 2, and the COBOL program is shown in Figure 3. Notice that a VDEFINE is not required for the variable SAVE, which is referenced only by the ISPF editor.

Figure 1. ISRSLREX REXX macro
/* Rexx **************************************************************/
/***** Sample Edit Macro *********************************************/
/*                                                                   */
/* 5647-A01 (C) COPYRIGHT IBM CORP 1995, 2003                        */
/*                                                                   */
/* ISRSLREX - separates lines with a line of dashes.                 */
/*                                                                   */
/*********************************************************************/
TRACE
ADDRESS ISPEXEC
'ISREDIT MACRO'

   'ISREDIT (SAVE) = USER_STATE'
   'ISREDIT RESET'
   'ISREDIT EXCLUDE ----- 1 ALL'
   'ISREDIT DELETE ALL X'
   LASTL = 1
   LINE = 0
   LINX = COPIES('-',70)

   LL = LASTL + 1
   DO WHILE LINE < LL
     'ISREDIT LINE_AFTER 'LINE' = (LINX)'
     'ISREDIT (LASTL) = LINENUM .ZLAST'
     LL = LASTL + 1
     LINE = LINE + 2
   END
   'ISREDIT USER_STATE = (SAVE)'
EXIT
Figure 2. ISRSEPP PL/I macro
 /*                                                                */
 /* 5647-A01 (C) COPYRIGHT IBM CORP 1995, 2003                     */
 /*                                                                */
 /* ISRSEPP - EDIT MACRO PROGRAM TO INSERT SEPARATOR LINES         */
 /*            PL/I                                                */
 /*                                                                */
 ISRSEPP: PROC OPTIONS (MAIN);
 /*                                                            */
 DECLARE
   LINEX CHAR (70) INIT ((70)'-') ,     /* SEPARATOR LINE ---  */
   LASTL FIXED BIN(31,0) INIT (0),      /* LAST LINE OF TEXT   */
   LINE  FIXED BIN(31,0) INIT (0),      /* CURRENT LINE NUMBER */
   LEN0  FIXED BIN(31,0) INIT (0),      /* LENGTHS - 0         */
   LEN1  FIXED BIN(31,0) INIT (1),      /* LENGTHS - 1         */
   LEN4  FIXED BIN(31,0) INIT (4),      /* LENGTHS - 4         */
   LEN70 FIXED BIN(31,0) INIT (70);     /* LENGTHS - 70        */
                                        /*                     */
 DECLARE                                /*                     */
   ISPLINK ENTRY OPTIONS(ASM,INTER,RETCODE); /* LINK TO ISPF   */
                                        /*                     */
   CALL ISPLINK('VDEFINE','(LASTL)',LASTL,'FIXED',LEN4);
   CALL ISPLINK('VDEFINE','(LINE)', LINE, 'FIXED',LEN4);
   CALL ISPLINK('VDEFINE','(LINEX)',LINEX,'CHAR', LEN70);

   CALL ISPLINK('ISREDIT',LEN0,'¢ MACRO ¢');
   CALL ISPLINK('ISREDIT',LEN0,'¢ (SAVE) = USER_STATE ¢');
   CALL ISPLINK('ISREDIT',LEN0,'¢ RESET ¢');
   CALL ISPLINK('ISREDIT',LEN0,'¢ EXCLUDE ------ 1 ALL ¢');
   CALL ISPLINK('ISREDIT',LEN0,'¢ DELETE ALL X ¢');

   LASTL = 1;
   LINE = 0;

 DO WHILE (LINE < (LASTL + 1));
   CALL ISPLINK('ISREDIT',LEN0,'¢ LINE_AFTER &LINE = (LINEX) ¢    ');
   CALL ISPLINK('ISREDIT',LEN0,'¢ (LASTL) = LINENUM .ZLAST ¢');
   LINE = LINE + 2;
 END;

   CALL ISPLINK('ISREDIT',LEN0,'¢ USER_STATE = (SAVE) ¢');

 END IISRSEPP;
Figure 3. ISRSEPC COBOL macro
       ID DIVISION.
       PROGRAM-ID. ISRSEPC.
      *
      *           EDIT MACRO PROGRAM TO INSERT SEPARATOR LINES
      *
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01  LINEX   PIC  X(70) VALUE  ALL  "-".
      *   SEPARATOR LINE ------
       01  LASTL   PIC  9(6)  VALUE    0  COMP.
      *   LAST LINE OF TEXT
       01  LYNE    PIC  9(6)  VALUE    0  COMP.
      *   CURRENT LINE NUMBER

       01  ISREDIT PIC  X(8)  VALUE  "ISREDIT ".
       01  VDEFINE PIC  X(8)  VALUE  "VDEFINE ".
       01  ZLASTL  PIC  X(8)  VALUE  "(LASTL )".
       01  ZLINE   PIC  X(8)  VALUE  "(LINE  )".
       01  ZLINEX  PIC  X(8)  VALUE  "(LINEX )".
       01  FIXED   PIC  X(8)  VALUE  "FIXED   ".
       01  CHAR    PIC  X(8)  VALUE  "CHAR    ".
       01  LEN0    PIC  9(6)  VALUE    0  COMP.
       01  LEN4    PIC  9(6)  VALUE    4  COMP.
       01  LEN70   PIC  9(6)  VALUE   70  COMP.

       01  EM1     PIC  X(10) VALUE  "¢  MACRO ¢".
       01  EM2     PIC  X(24) VALUE  "¢  (SAVE) = USER_STATE ¢".
       01  EM3     PIC  X(10) VALUE  "¢  RESET ¢".
       01  EM4     PIC  X(25) VALUE  "¢  EXCLUDE ------ 1 ALL 0".
       01  EM5     PIC  X(18) VALUE  "¢  DELETE ALL X ¢".
       01  EM6     PIC  X(30) VALUE  "¢ LINE_AFTER &LINE = (LINEX) ¢".
       01  EM7     PIC  X(28) VALUE  "¢ (LASTL) = LINENUM .ZLAST ¢".
       01  EM8     PIC  X(23) VALUE  "¢ USER_STATE = (SAVE) ¢".

       PROCEDURE DIVISION.
           CALL  "ISPLINK" USING  VDEFINE  ZLASTL  LASTL  FIXED LEN4.
           CALL  "ISPLINK" USING  VDEFINE  ZLINE   LYNE   FIXED LEN4.
           CALL  "ISPLINK" USING  VDEFINE  ZLINEX  LINEX  CHAR  LEN70.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM1.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM2.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM3.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM4.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM5.

           MOVE  1 TO LASTL.
           MOVE  0 TO LYNE.
           PERFORM LOOP UNTIL LYNE IS NOT LESS THAN (LASTL + 1).
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM8.
           GOBACK.
       LOOP.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM6.
           CALL  "ISPLINK" USING  ISREDIT  LEN0    EM7.
           ADD 2 TO LYNE.

Go to the previous page Go to the next page




Copyright IBM Corporation 1990, 2014