Skip to content

Instantly share code, notes, and snippets.

@JohnArchieMckown
Last active October 6, 2021 10:27
Show Gist options
  • Save JohnArchieMckown/95822a4017fb025e3a98 to your computer and use it in GitHub Desktop.
Save JohnArchieMckown/95822a4017fb025e3a98 to your computer and use it in GitHub Desktop.
REXX program to parse a LISTCAT and create IDCAMS control cards
/* REXX PROGRAM TO GENERATE IDCAMS DEFINE */
TRACE E
DEFINED = ""
RESTARTS = 0
CARD='/* RUN AT ' TIME('N') ' ON ' DATE('S')
DO FOREVER;
EXITCODE = @MAIN()
IF EXITCODE = 0 THEN LEAVE
RESTARTS = RESTARTS+1
IF RESTARTS > 3 THEN LEAVE
SAY '************ RESTART ***********'
ADDRESS ATTACH "IDCAMS"
IF RC <> 0 THEN LEAVE
END;
EXIT EXITCODE
@MAIN:PROCEDURE
TYPE.1 = 'CLUSTER'
TYPE.2 = 'PATH'
TYPE.3 = 'AIX'
BLANKS = COPIES(' ',80)
DEFCL.= ''
REF.0 = 0
DEF.='*NO*'
OFFSET6 = '$'
DO FOREVER
"EXECIO 1 DISKR IDCAMS"
IF RC <> 0 THEN LEAVE
PARSE PULL RECORD
TEST = LEFT(RECORD,7)
IF TEST = '1IDCAMS' THEN ITERATE;
RECORD=SUBSTR(RECORD,2); /* STRIP OUT THE CARRIAGE */
OFFSET = VERIFY(RECORD,' '); /* FIND LOCATION OF 1ST NON-BLANK */
IF OFFSET = 0 THEN ITERATE; /* IGNORE BLANK LINE */
CALL @NODASH;
TOCALL = 'CALL @OFFSET'OFFSET
CALL @DOCALL
END;
CALL @DUMPIT
"EXECIO 0 DISKR IDCAMS (FINIS"
"EXECIO 0 DISKW DEFINES (FINIS"
EXITCODE = 0
DO I = 1 TO REF.0
A = REF.I
IF DEF.A = '*YES*' THEN ITERATE
CARD = " LISTC ENT('"A"') OUTFILE(IDCAMSO) ALL"
PUSH CARD
"EXECIO 1 DISKW SYSIN"
SAY 'NOT FOUND "'A'"'
EXITCODE=8
END
IF EXITCODE <> 0 THEN "EXECIO 0 DISKW SYSIN(FINIS"
RETURN EXITCODE;
@DOCALL:
SIGNAL ON SYNTAX
INTERPRET TOCALL
SIGNAL OFF SYNTAX
RETURN;
@OFFSET1:
@OFFSET4:
SIGNAL OFF SYNTAX
PARSE VAR RECORD VARNAME VARDATA
VARNAME = LEFT(VARNAME,LENGTH(VARNAME)-1)
TOCALL = 'CALL @'VARNAME
SIGNAL @DOCALL
RETURN;
@CLUSTER:
@AIX:
@PATH:
SIGNAL OFF SYNTAX
CALL @DUMPIT;
DROP DEFCL.
DEFCL.=''
DEFCL.$TYPE = VARNAME
DEFCL.VARNAME = VARDATA
COMP = $COMP
OFFSET6 = '$'
RETURN;
@DATA:
@INDEX:
SIGNAL OFF SYNTAX
COMP = SPACE(VARNAME,0);
DEFCL.COMP = SPACE(VARDATA,0);
RETURN;
@OFFSET6:
SIGNAL OFF SYNTAX
PARSE VAR RECORD FUNCTION REST
OFFSET6 = SPACE(FUNCTION,0)
RETURN;
@OFFSET8:
SIGNAL OFF SYNTAX
DO WHILE LENGTH(RECORD) > 0
PARSE VAR RECORD VARNAME RECORD
VARNAME = SPACE(VARNAME,0)
IF RIGHT(VARNAME,1) = '^'
THEN DO;
PARSE VAR RECORD VALUE RECORD
VALUE = SPACE(VALUE,0)
VARNAME = LEFT(VARNAME,LENGTH(VARNAME)-1)
C = DEFCL.COMP.VARNAME VALUE
DEFCL.COMP.VARNAME = STRIP(C)
END;
ELSE DEFCL.COMP.$KEYWORD = DEFCL.COMP.$KEYWORD VARNAME' '
END;
RETURN;
@NODASH:
SIGNAL OFF SYNTAX
TRECORD = RECORD
TEMP1 = ''
FDASH = POS('--',TRECORD)
DO WHILE FDASH <> 0
TEMP1 = TEMP1 LEFT(TRECORD,FDASH-1)
TEMP1 = STRIP(TEMP1,'T')'^ '
TRECORD = SUBSTR(TRECORD,FDASH)
FDASH = VERIFY(TRECORD,'-'); /* FIND NON-DASH */
IF FDASH =0 THEN ITERATE;
TRECORD = SUBSTR(TRECORD,FDASH)
FDASH = POS('--',TRECORD)
END;
TEMP1 = TEMP1 TRECORD
RECORD = SPACE(TEMP1,1)
RETURN;
@DUMP:
SIGNAL OFF SYNTAX
ARG NAME
VALUE = VALUE(NAME)
RETURN;
@DUMPIT:
SIGNAL OFF SYNTAX
CARD = ' '
CALL @OUTCARD
A=DEFCL.$TYPE
A=DEFCL.A
DEF.A = '*YES*'
DO I=1 TO 3
A = TYPE.I
B = STRIP(DEFCL.$COMP.A)
DO WHILE LENGTH(B) > 0
PARSE VAR B DATA B
B=STRIP(B)
I = REF.0+1
REF.0 = I
REF.I = DATA
END
END
TOCALL = 'CALL @1'DEFCL.$TYPE
SIGNAL @DOCALL
RETURN;
@1PATH:
SIGNAL OFF SYNTAX
PATH = 'PATH'
CARD = 'DEL 'DEFCL.PATH' PATH'
CALL @OUTCARD
CARD = 'DEF PATH(-'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.PATH') -'
CALL @OUTCARD
AIX='AIX'
CARD = LEFT(BLANKS,6)'PATHENTRY('DEFCL.$COMP.AIX') -'
CALL @OUTCARD
IF POS(' NOUPDATE ',DEFCL.$COMP.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'NOUPDATE -'
CALL @OUTCARD
END
ELSE CARD = LEFT(BLANKS,4)')'
CALL @OUTCARD
RETURN;
@1CLUSTER:
SIGNAL OFF SYNTAX
IF DEFCL.DATA.VOLSER <> " " THEN ,
DEFCL.DATA.VOLSER=WORD(DEFCL.DATA.VOLSER,1) ||,
COPIES(' *',WORDS(DEFCL.DATA.VOLSER)-1)
IF DEFCL.INDEX.VOLSER <> " " THEN ,
DEFCL.INDEX.VOLSER=WORD(DEFCL.INDEX.VOLSER,1) ||,
COPIES(' *',WORDS(DEFCL.INDEX.VOLSER)-1)
CLUSTER = 'CLUSTER'
DATA = 'DATA'
INDEX = 'INDEX'
BUFSPACE='BUFSPACE'
VOLSER='VOLSER'
STORAGECLASS='STORAGECLASS'
MANAGEMENTCLASS='MANAGEMENTCLASS'
DATACLASS='DATACLASS'
DEFCL.DATA.$KEYWORD = DEFCL.DATA.$KEYWORD' '
DEFCL.INDEX.$KEYWORD = DEFCL.INDEX.$KEYWORD' '
CARD = 'DEL 'DEFCL.CLUSTER' CLUSTER'
CALL @OUTCARD
CARD = 'DEF CLUSTER( -'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.CLUSTER') -'
CALL @OUTCARD
IF DEFCL.$COMP.STORAGECLASS <> '' THEN DO
CARD = LEFT(BLANKS,6)'STORAGECLASS('DEFCL.$COMP.STORAGECLASS') -'
CALL @OUTCARD
END
IF DEFCL.$COMP.MANAGEMENTCLASS <> '' THEN DO
CARD = LEFT(BLANKS,6)'MANAGEMENTCLASS(' ||,
DEFCL.$COMP.MANAGEMENTCLASS') -'
CALL @OUTCARD
END
IF DEFCL.$COMP.DATACLASS <> '' THEN DO
CARD = LEFT(BLANKS,6)'DATACLASS('DEFCL.$COMP.DATACLASS') -'
CALL @OUTCARD
END
IF DEFCL.$COMP.LOG <> '(NULL)' THEN DO
CARD = LEFT(BLANKS,6)'LOG('DEFCL.$COMP.LOG') -'
CALL @OUTCARD
END
IF DEFCL.$COMP.LOGSTREAMID <> '(NULL)' THEN DO
CARD = LEFT(BLANKS,6)'LOGSTREAMID('DEFCL.$COMP.LOGSTREAMID') -'
CALL @OUTCARD
END
IF DEFCL.$COMP.FRLOG <> '(NULL)' THEN DO
CARD = LEFT(BLANKS,6)'FRLOG('DEFCL.$COMP.FRLOG') -'
CALL @OUTCARD
END
IF DEFCL.DATA.VOLSER = DEFCL.INDEX.VOLSER
IF DEFCL.DATA.VOLSER = DEFCL.INDEX.VOLSER
THEN DO;
CARD = LEFT(BLANKS,6)'VOLUMES('DEFCL.DATA.VOLSER') -'
CALL @OUTCARD
DEFCL.DATA.VOLSER = ''
DEFCL.INDEX.VOLSER = ''
END;
CARD = LEFT(BLANKS,6)'BUFFERSPACE('DEFCL.DATA.BUFSPACE') -'
CALL @OUTCARD
TEMP1 ='FREESPACE-%CI'
TEMP2 ='FREESPACE-%CA'
TEMP1 = SPACE(DEFCL.DATA.TEMP1,0)
TEMP2 = SPACE(DEFCL.DATA.TEMP2,0)
IF TEMP1 <> 0 | TEMP2 <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'FREESPACE('TEMP1 TEMP2') -'
CALL @OUTCARD;
END;
RKP = 'RKP'
KEYLEN = 'KEYLEN'
IF KEYLEN <> 0
THEN DO;
A = SPACE(DEFCL.DATA.KEYLEN,0)
B = SPACE(DEFCL.DATA.RKP,0)
CARD = LEFT(BLANKS,6)'KEYS('A B') -'
CALL @OUTCARD;
END;
MAXLRECL = 'MAXLRECL'
AVGLRECL = 'AVGLRECL'
A = SPACE(DEFCL.DATA.AVGLRECL,0)
B = SPACE(DEFCL.DATA.MAXLRECL,0)
CARD = LEFT(BLANKS,6)'RECORDSIZE('A B') -'
CALL @OUTCARD
PARSE VAR DEFCL.DATA.$KEYWORD . 'SHROPTNS(' SHRX ')' .
CARD = LEFT(BLANKS,6)'SHAREOPTIONS('SHRX') -'
CALL @OUTCARD
IF POS(' REPLICATE ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'/*REPLICATE */ -'
CALL @OUTCARD;
END;
IF POS(' IMBED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'/*IMBED*/ -'
CALL @OUTCARD;
END;
IF POS(' NONINDEXED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'NONINDEXED -'
CALL @OUTCARD;
END;
IF POS(' NUMBERED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'NUMBERED -'
CALL @OUTCARD
END
IF POS(' ORDERED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'ORDERED -'
CALL @OUTCARD
END
IF POS(' REUSE ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'REUSE -'
CALL @OUTCARD
END
IF POS(' SPANNED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'SPANNED -'
CALL @OUTCARD
END
IF POS(' SPEED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'SPEED -'
CALL @OUTCARD
END
IF POS(' WRITECHK ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'WRITECHECK -'
CALL @OUTCARD
END
CARD = LEFT(BLANKS,4)') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)'DATA( -'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.DATA') -'
CALL @OUTCARD
IF DEFCL.DATA.VOLSER <> ''
THEN DO;
CARD = LEFT(BLANKS,6)'VOLUMES('DEFCL.DATA.VOLSER') -'
CALL @OUTCARD
END;
CISIZE='CISIZE'
CARD = LEFT(BLANKS,6)'CONTROLINTERVALSIZE('DEFCL.DATA.CISIZE') -'
CALL @OUTCARD
SPRI='SPACE-PRI'
SSEC='SPACE-SEC'
STYPE='SPACE-TYPE'
A = SPACE(DEFCL.DATA.SPRI,0)
B = SPACE(DEFCL.DATA.SSEC,0)
C = SPACE(DEFCL.DATA.STYPE,0)
CARD = LEFT(BLANKS,6) || C'('A B') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)')'
IF POS(' INDEXED ',DEFCL.DATA.$KEYWORD) <> 0
THEN CARD = CARD'-'
ELSE DO;
CALL @OUTCARD
RETURN;
END;
CALL @OUTCARD
CARD = LEFT(BLANKS,4)'INDEX( -'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.INDEX')-'
CALL @OUTCARD
IF DEFCL.INDEX.VOLSER <> ''
THEN DO;
CARD = LEFT(BLANKS,6)'VOLUMES('DEFCL.INDEX.VOLSER') -'
CALL @OUTCARD
END;
CISIZE='CISIZE'
CARD = LEFT(BLANKS,6)'CONTROLINTERVALSIZE('DEFCL.INDEX.CISIZE') -'
CALL @OUTCARD
SPRI='SPACE-PRI'
SSEC='SPACE-SEC'
STYPE='SPACE-TYPE'
A = SPACE(DEFCL.INDEX.SPRI,0)
B = SPACE(DEFCL.INDEX.SSEC,0)
C = SPACE(DEFCL.INDEX.STYPE,0)
CARD = LEFT(BLANKS,6) || C'('A B') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)')'
CALL @OUTCARD
RETURN;
@1AIX:
SIGNAL OFF SYNTAX
IF DEFCL.DATA.VOLSER <> " " THEN ,
DEFCL.DATA.VOLSER=WORD(DEFCL.DATA.VOLSER,1) ||,
COPIES(' *',WORDS(DEFCL.DATA.VOLSER)-1)
IF DEFCL.INDEX.VOLSER <> " " THEN ,
DEFCL.INDEX.VOLSER=WORD(DEFCL.INDEX.VOLSER,1) ||,
COPIES(' *',WORDS(DEFCL.INDEX.VOLSER)-1)
CLUSTER = 'CLUSTER'
AIX = 'AIX'
DATA = 'DATA'
INDEX = 'INDEX'
BUFSPACE='BUFSPACE'
VOLSER='VOLSER'
DEFCL.DATA.$KEYWORD = DEFCL.DATA.$KEYWORD' '
DEFCL.INDEX.$KEYWORD = DEFCL.INDEX.$KEYWORD' '
CARD = 'DEL 'DEFCL.AIX' AIX'
CALL @OUTCARD
CARD = 'DEF ALTERNATEINDEX (-'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.AIX') -'
CALL @OUTCARD
SIGNAL ON NOVALUE
CARD = LEFT(BLANKS,6)'RELATE('DEFCL.$COMP.CLUSTER') -'
SIGNAL OFF NOVALUE
CALL @OUTCARD
IF DEFCL.DATA.VOLSER = DEFCL.INDEX.VOLSER
THEN DO;
CARD = LEFT(BLANKS,6)'VOLUMES('DEFCL.DATA.VOLSER') -'
CALL @OUTCARD
DEFCL.DATA.VOLSER = ''
DEFCL.INDEX.VOLSER = ''
END;
CARD = LEFT(BLANKS,6)'BUFFERSPACE('DEFCL.DATA.BUFSPACE') -'
CALL @OUTCARD
TEMP1 ='FREESPACE-%CI'
TEMP2 ='FREESPACE-%CA'
TEMP1 = DEFCL.DATA.TEMP1; TEMP2 = DEFCL.DATA.TEMP2
IF TEMP1 <> 0 | TEMP2 <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'FREESPACE('TEMP1 TEMP2') -'
CALL @OUTCARD;
END;
AXRKP = 'AXRKP'
KEYLEN = 'KEYLEN'
IF KEYLEN <> 0
THEN DO;
A = SPACE(DEFCL.DATA.KEYLEN,0)
B = SPACE(DEFCL.DATA.AXRKP,0)
CARD = LEFT(BLANKS,6)'KEYS('A B') -'
CALL @OUTCARD;
END;
MAXLRECL = 'MAXLRECL'
AVGLRECL = 'AVGLRECL'
A = SPACE(DEFCL.DATA.AVGLRECL,0)
B = SPACE(DEFCL.DATA.MAXLRECL,0)
CARD = LEFT(BLANKS,6)'RECORDSIZE('A B') -'
CALL @OUTCARD
IF POS(' ERASE ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'ERASE -'
CALL @OUTCARD;
END;
IF POS(' IMBED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'/*IMBED*/ -'
CALL @OUTCARD;
END;
IF POS(' ORDERED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'ORDERED -'
CALL @OUTCARD
END
IF POS(' REPLICATE ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'/*REPLICATE*/ -'
CALL @OUTCARD
END
IF POS(' REUSE ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'REUSE -'
CALL @OUTCARD
END
IF POS(' SPEED ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'SPEED -'
CALL @OUTCARD
END
IF POS(' UNIQUEKEY ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'UNIQUEKEY -'
CALL @OUTCARD
END
IF POS(' NOUPGRADE ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'NOUPGRADE -'
CALL @OUTCARD
END
IF POS(' WRITECHK ',DEFCL.DATA.$KEYWORD) <> 0
THEN DO;
CARD = LEFT(BLANKS,6)'WRITECHECK -'
CALL @OUTCARD
END
CARD = LEFT(BLANKS,4)') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)'DATA( -'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.DATA') -'
CALL @OUTCARD
IF DEFCL.DATA.VOLSER <> ''
THEN DO;
CARD = LEFT(BLANKS,6)'VOLUMES('DEFCL.DATA.VOLSER') -'
CALL @OUTCARD
END;
CISIZE='CISIZE'
CARD = LEFT(BLANKS,6)'CONTROLINTERVALSIZE('DEFCL.DATA.CISIZE') -'
CALL @OUTCARD
SPRI='SPACE-PRI'
SSEC='SPACE-SEC'
STYPE='SPACE-TYPE'
A = SPACE(DEFCL.DATA.SPRI,0)
B = SPACE(DEFCL.DATA.SSEC,0)
C = SPACE(DEFCL.DATA.STYPE,0)
CARD = LEFT(BLANKS,6) || C'('A B') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)'INDEX( -'
CALL @OUTCARD
CARD = LEFT(BLANKS,6)'NAME('DEFCL.INDEX')-'
CALL @OUTCARD
IF DEFCL.INDEX.VOLSER <> ''
THEN DO;
CARD = LEFT(BLANKS,6)'VOLUMES('DEFCL.INDEX.VOLSER') -'
CALL @OUTCARD
END;
CISIZE='CISIZE'
CARD = LEFT(BLANKS,6)'CONTROLINTERVALSIZE('DEFCL.INDEX.CISIZE') -'
CALL @OUTCARD
SPRI='SPACE-PRI'
SSEC='SPACE-SEC'
STYPE='SPACE-TYPE'
A = SPACE(DEFCL.INDEX.SPRI,0)
B = SPACE(DEFCL.INDEX.SSEC,0)
C = SPACE(DEFCL.INDEX.STYPE,0)
CARD = LEFT(BLANKS,6) || C'('A B') -'
CALL @OUTCARD
CARD = LEFT(BLANKS,4)')'
CALL @OUTCARD
RETURN;
@OUTCARD:
SIGNAL OFF SYNTAX
DO WHILE LENGTH(CARD) > 72
BREAKAT=LASTPOS(' ',CARD,70)
IF 0 = BREAKAT THEN EXIT 20
QUEUE STRIP(LEFT(CARD,BREAKAT),'T')||" -"
CARD=" " || STRIP(SUBSTR(CARD,BREAKAT),'L')
END
QUEUE CARD
QUEUE ''
"EXECIO * DISKW DEFINES"
RETURN;
NOVALUE:
SAY SIGL
SAY SOURCELINE(SIGL)
SAY ERRORTEXT(RC)
EXIT
SYNTAX:
RETURN;
@SherryCM
Copy link

John, I just downloaded this REXX script and trying to run it.... Question is, where do I supply the input VSAM dataset name for the IDCAMS, or is this to be run in BATCH?

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment