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.