DCL SPCPTR .PARM-CONTROL PARM; DCL SPCPTR .PARM-INFO PARM; DCL OL PARAMETERS(.PARM-CONTROL, .PARM-INFO) EXT PARM MIN(2); DCL DD PARM-CONTROL CHAR(32) BAS(.PARM-CONTROL); DCL DD PARM-OPERATION CHAR(1) DEF(PARM-CONTROL) POS(1); /* G - GET INFO FOR MBR */ /* S - SET SOURCE DATE/TIME */ /* O - SET OBJECT DATE/TIME */ /* T - SET MEMBER TYPE */ /* D - SET DESCRIPTIVE TEXT */ DCL DD PARM-FEEDBACK CHAR(1) DEF(PARM-CONTROL) POS(2); /* BLANK - OK */ /* E - ERROR */ /* O - OPERATION UNKNOWN */ DCL DD PARM-LIBRARY CHAR(10) DEF(PARM-CONTROL) POS(3); /* *LIBL - LIBRARY LIST */ DCL DD PARM-FILE CHAR(10) DEF(PARM-CONTROL) POS(13); DCL DD PARM-MEMBER CHAR(10) DEF(PARM-CONTROL) POS(23); /* *FILE - MEMBER = FILE */ DCL DD PARM-INFO CHAR(86) BAS(.PARM-INFO); DCL DD PARM-TYPE CHAR(10) DEF(PARM-INFO) POS(1); DCL DD PARM-DATE-SRC CHAR(13) DEF(PARM-INFO) POS(11); DCL DD PARM-DATE-OBJ CHAR(13) DEF(PARM-INFO) POS(24); DCL DD PARM-TEXT CHAR(50) DEF(PARM-INFO) POS(37); DCL EXCM EXCEPTION-LIST EXCID(H'0000') BP(ERROR-DETECTED) IGN; DCL SYSPTR .CONTEXT; DCL SYSPTR .CURSOR; DCL SPCPTR .CURSOR-SPACE; DCL SPC CURSOR-SPACE BAS(.CURSOR-SPACE); DCL DD CSR-MBR-HEADER BIN(4) DEF(CURSOR-SPACE) POS(5); DCL SPC MBR-CURSOR BAS(.POINTER); DCL DD MBR-CHANGE-TIMESTAMP CHAR(8) DEF(MBR-CURSOR) POS(129); DCL SPCPTR .MBR-HEADER; DCL SPC MBR-HEADER BAS(.MBR-HEADER); DCL SYSPTR .MHDR-PREV-MCB DIR; DCL SYSPTR .MHDR-NEXT-MCB DIR; DCL SYSPTR .MHDR-FILE-CB DIR; DCL SYSPTR .MHDR-SHARE-DIR DIR; DCL SYSPTR .MHDR-DATA-DICT DIR; DCL DD MHDR-STATUS CHAR(2) DIR; DCL DD * CHAR(2) DIR; DCL DD MHDR-TEXT CHAR(50) DIR; DCL DD MHDR-TYPE CHAR(10) DIR; DCL DD * CHAR(10) DIR; DCL DD MHDR-CHANGE-DATE CHAR(13) DIR; DCL DD MHDR-CREATE-DATE CHAR(13) DIR; DCL DD MHDR-PREFRD-UNIT CHAR(1) DIR; DCL DD MHDR-ALLOC-TYPE CHAR(2) DIR; DCL DD MHDR-INIT-RECS BIN(4) DIR; DCL DD MHDR-RECS-EXTEND BIN(2) DIR; DCL DD MHDR-NBR-EXTENDS BIN(2) DIR; DCL DD MHDR-RECOVER-OPT CHAR(1) DIR; DCL DD MHDR-SAVE-DATE CHAR(13) DIR; DCL DD MHDR-RSTR-DATE CHAR(13) DIR; DCL DD MHDR-%-DLT-ALLOW CHAR(1) DIR; DCL DD MHDR.USER-AREA BIN(4) DIR; DCL DD MHDR-OLD-S-DATE CHAR(13) DIR; DCL DD MHDR-OLD-R-DATE CHAR(13) DIR; DCL DD MHDR........... CHAR(1) DIR; DCL SPCPTR .ARG1 INIT(POINTER); DCL DD POINTER CHAR(16) BDRY(16); DCL PTR .POINTER DEF(POINTER) POS( 1); DCL DD PTR-TYPE CHAR(8) DEF(POINTER) POS( 1); DCL DD PTR-SEGMENT CHAR(5) DEF(POINTER) POS( 9); DCL DD PTR-OFFSET CHAR(3) DEF(POINTER) POS(14); DCL OL MIMAKPTR (.ARG1) ARG; DCL SYSPTR .MIMAKPTR; DCL DD RESOLVE CHAR(34); DCL DD RESOLVE-TYPE CHAR( 2) DEF(RESOLVE) POS( 1) INIT(X'0000'); DCL DD RESOLVE-NAME CHAR(30) DEF(RESOLVE) POS( 3); DCL DD RESOLVE-AUTH CHAR( 2) DEF(RESOLVE) POS(33) INIT(X'0000'); /**************************************************************/ ENTRY * (PARAMETERS) EXT; CPYBLA PARM-FEEDBACK, " "; CMPBLA(B) RESOLVE-TYPE, X'0000'/NEQ(TEST-LIBRARY); RESOLVE-TO-MAKE-POINTER-PGM: CPYBLA RESOLVE-TYPE, X'0201'; CPYBLAP RESOLVE-NAME, "MIMAKPTR", " "; RSLVSP .MIMAKPTR, RESOLVE, *, *; TEST-LIBRARY: CMPBLAP(B) PARM-LIBRARY, "*LIBL", " "/NEQ(GET-CONTEXT); CPYBWP .CONTEXT, *; /* NULL */ B TEST-MEMBER; GET-CONTEXT: CPYBLA RESOLVE-TYPE, X'0401'; CPYBLAP RESOLVE-NAME, PARM-LIBRARY, " "; RSLVSP .CONTEXT, RESOLVE, *, *; TEST-MEMBER: CPYBLAP RESOLVE-NAME( 1:30), PARM-FILE, " "; CPYBLA RESOLVE-NAME(11:10), PARM-FILE; CMPBLAP(B) PARM-MEMBER, "*FILE", " "/EQ(=+2); CPYBLA RESOLVE-NAME(11:10), PARM-MEMBER;: RESOLVE-TO-CURSOR: CPYBLA RESOLVE-TYPE, X'0D50'; RSLVSP .CURSOR, RESOLVE, .CONTEXT, *; SETSPPFP .CURSOR-SPACE, .CURSOR; ADDSPP .MBR-HEADER, .CURSOR-SPACE, CSR-MBR-HEADER; TEST-OPERATION: CMPBLA(B) PARM-OPERATION, "S"/EQ(SET-SOURCE-INFO); CMPBLA(B) PARM-OPERATION, "T"/EQ(SET-MEMBER-TYPE); CMPBLA(B) PARM-OPERATION, "D"/EQ(SET-DESCRIPTIVE-TEXT); GET-MBR-OBJECT: CPYBWP .POINTER, .CURSOR; CPYBREP PTR-OFFSET, X'00'; CALLX .MIMAKPTR, MIMAKPTR, *; CMPBLA(B) PARM-OPERATION, "O"/EQ(SET-OBJECT-INFO); CMPBLA(B) PARM-OPERATION, "G"/EQ(GET-INFO-FOR-MBR); B OPERATION-ERROR; GET-INFO-FOR-MBR: CPYBLA PARM-TYPE, MHDR-TYPE; CPYBLA PARM-TEXT, MHDR-TEXT; CPYBLA BIN-TIMESTAMP, MBR-CHANGE-TIMESTAMP; CALLI TIMESTAMP-TO-DATE, *, .TIMESTAMP-TO-DATE; CPYBLA PARM-DATE-OBJ, CYYMMDDHHMMSS; CPYBLA PARM-DATE-SRC, MHDR-CHANGE-DATE; B RETURN; SET-SOURCE-INFO: CPYBLA MHDR-CHANGE-DATE, PARM-DATE-SRC; B RETURN; SET-OBJECT-INFO: CPYBLA CYYMMDDHHMMSS, PARM-DATE-OBJ; CALLI DATE-TO-TIMESTAMP, *, .DATE-TO-TIMESTAMP; CPYBLA MBR-CHANGE-TIMESTAMP, BIN-TIMESTAMP; B RETURN; SET-MEMBER-TYPE: CPYBLA MHDR-TYPE, PARM-TYPE; B RETURN; SET-DESCRIPTIVE-TEXT: CPYBLA MHDR-TEXT, PARM-TEXT; B RETURN; OPERATION-ERROR: CPYBLA PARM-FEEDBACK, "O"; RETURN: RTX *; ERROR-DETECTED: CPYBLA PARM-FEEDBACK, "E"; RTX *; /************************ TIME CONVERSIONS *************************/ DCL DD BIN-TIMESTAMP CHAR(8) BDRY(8); DCL DD BIN-TIME-HI BIN(4) UNSGND DEF(BIN-TIMESTAMP) POS(1); DCL DD BIN-TIME-LO BIN(4) UNSGND DEF(BIN-TIMESTAMP) POS(5); DCL DD TIMESTAMP PKD(21,0); /* CAN HOLD 64-BIT UNSIGNED */ DCL DD TIMESTAMP-HI PKD(11,0); DCL DD TIMESTAMP-LO PKD(11,0); DCL DD TWO**32 PKD(11,0) INIT(P'4294967296'); DCL DD NBR-SECONDS PKD(15,0); DCL DD NBR-DAYS BIN(4); DCL DD NBR-YEARS BIN(4); DCL DD ADD-YEARS BIN(4); DCL DD NBR-PERIODS BIN(4); DCL DD DAY-MONTH BIN(4); DCL DD D BIN(4); DCL DD S BIN(4); DCL DD M BIN(4); /* DAY BASE FOR: JanFebMarAprMayJunJulAugSepOctNovDec*/ DCL DD DAYS CHAR(36) INIT("000031059090120151181212243273304334"); DCL DD DAYS-ACCUM (12)ZND(3,0) DEF(DAYS) POS(1); DCL DD YYYYMMDDHHMMSS CHAR(14); DCL DD YEAR ZND(4,0) DEF(YYYYMMDDHHMMSS) POS( 1); DCL DD MONTH ZND(2,0) DEF(YYYYMMDDHHMMSS) POS( 5); DCL DD DAY ZND(2,0) DEF(YYYYMMDDHHMMSS) POS( 7); DCL DD HOUR ZND(2,0) DEF(YYYYMMDDHHMMSS) POS( 9); DCL DD MIN ZND(2,0) DEF(YYYYMMDDHHMMSS) POS(11); DCL DD SEC ZND(2,0) DEF(YYYYMMDDHHMMSS) POS(13); DCL DD CENTURY ZND(2,0) DEF(YYYYMMDDHHMMSS) POS(1); DCL DD CENTURY-FLAG ZND(1,0) DEF(YYYYMMDDHHMMSS) POS(2); DCL DD CYYMMDDHHMMSS CHAR(13) DEF(YYYYMMDDHHMMSS) POS(2); DCL INSPTR .TIMESTAMP-TO-DATE; ENTRY TIMESTAMP-TO-DATE INT; CPYNV TIMESTAMP-LO, BIN-TIME-LO; CPYNV TIMESTAMP-HI, BIN-TIME-HI; MULT TIMESTAMP, TIMESTAMP-HI, TWO**32; ADDN(S) TIMESTAMP, TIMESTAMP-LO; DIV(SR) TIMESTAMP, 4096000000; /* NOW SECONDS */ ADDN(S) TIMESTAMP, 43386; /* 12:03:06 PM */ DIVREM NBR-DAYS, TIMESTAMP, 86400, NBR-SECONDS; SUBN(S) NBR-DAYS, 131; /* WAS: AUG 23,1928, NOW: JAN 01,1929 */ DIVREM NBR-PERIODS, NBR-DAYS, 1461, NBR-DAYS; /* 4 YEARS */ MULT NBR-YEARS, NBR-PERIODS, 4; ADDN(S) NBR-YEARS, 1929; DIVREM ADD-YEARS, NBR-DAYS, 365, NBR-DAYS; ADDN YEAR, NBR-YEARS, ADD-YEARS; CPYNV M, 13; CMPNV(B) ADD-YEARS, 3/LO(FIND-MONTH); LEAP-YEAR: CMPNV(B) NBR-DAYS, 59/LO(FIND-MONTH),EQ(FEB-29TH); SUBN(S) NBR-DAYS, 1; FIND-MONTH: SUBN(S) M, 1; SUBN(B) DAY-MONTH, NBR-DAYS, DAYS-ACCUM(M)/NEG(FIND-MONTH); ADDN DAY, DAY-MONTH, 1; CPYNV(B) MONTH, M/NNAN(COMPUTE-TIME); FEB-29TH: CPYNV MONTH, 2; CPYNV DAY, 29; COMPUTE-TIME: DIVREM HOUR, NBR-SECONDS, 3600, NBR-SECONDS; DIVREM MIN, NBR-SECONDS, 60, SEC; SUBN CENTURY-FLAG, CENTURY, 19; B .TIMESTAMP-TO-DATE; DCL INSPTR .DATE-TO-TIMESTAMP; ENTRY DATE-TO-TIMESTAMP INT; ADDN CENTURY, CENTURY-FLAG, 19; SUBN NBR-YEARS, YEAR, 1925; DIVREM NBR-PERIODS, NBR-YEARS, 4, ADD-YEARS; MULT NBR-DAYS, NBR-PERIODS, 1461; MULT D, ADD-YEARS, 365; ADDN(S) NBR-DAYS, D; CPYNV M, MONTH; ADDN(S) NBR-DAYS, DAYS-ACCUM(M); ADDN(S) NBR-DAYS, DAY; CMPNV(B) ADD-YEARS, 3/NEQ(=+2); CMPNV(B) MONTH, 2/HI (=+2);: SUBN(S) NBR-DAYS, 1;: MULT NBR-SECONDS, NBR-DAYS, 86400; MULT S, HOUR, 60; ADDN(S) S, MIN; MULT(S) S, 60; ADDN(S) S, SEC; ADDN(S) NBR-SECONDS, S; SUBN(S) NBR-SECONDS, 114955386; /* AUG 23, 1928, 12:03:06 */ MULT TIMESTAMP, NBR-SECONDS, 4096000000; DIVREM BIN-TIME-HI, TIMESTAMP, TWO**32, BIN-TIME-LO; B .DATE-TO-TIMESTAMP;