Skip to content

Instantly share code, notes, and snippets.

@JohnArchieMckown
Created January 5, 2017 19:20
Show Gist options
  • Save JohnArchieMckown/9aefcdb68407852eeca94129a4b1d0b6 to your computer and use it in GitHub Desktop.
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.
/* 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