Created
January 5, 2017 19:20
-
-
Save JohnArchieMckown/9aefcdb68407852eeca94129a4b1d0b6 to your computer and use it in GitHub Desktop.
z/OS REXX program which can create IDCAMS input to recreate one or more specified VSAM data sets.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* REXX PROGRAM TO GENERATE IDCAMS DEFINE */ | |
TRACE E | |
DEFINED = "" | |
RESTARTS = 0 | |
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 | |
CLUSTER = 'CLUSTER' | |
DATA = 'DATA' | |
INDEX = 'INDEX' | |
BUFSPACE='BUFSPACE' | |
VOLSER='VOLSER' | |
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.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 | |
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 | |
PUSH CARD | |
"EXECIO 1 DISKW DEFINES" | |
RETURN; | |
NOVALUE: | |
SAY SIGL | |
SAY SOURCELINE(SIGL) | |
SAY ERRORTEXT(RC) | |
EXIT | |
SYNTAX: | |
RETURN; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment