Attached is the VBSFIX program.
Thanks
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[email protected]] On Behalf
Of Carmen Vitullo
Sent: Monday, April 02, 2018 10:34 AM
To: [email protected]
Subject: Re: VBSFIX Program
DFsort and syncsort can correct some bad record formats in SMF
//SYSIN DD *
INCLUDE COND=ALL
OPTION COPY,VLSHRT
Carmen Vitullo
----- Original Message -----
From: "Veryl Ellis" <[email protected]>
To: [email protected]
Sent: Monday, April 2, 2018 10:22:23 AM
Subject: VBSFIX Program
Does anyone have a copy of the IBM module VBSFIX?
I have short record(s) in my SMF dump dataset, which is prohibiting me from
doing my monthly SCRT thing.
I've seen information that this program can resolve this issue.
Anyone out there have this program and are willing to share?
Thanks,
S. Veryl Ellis
Sungard Availability Services.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email to
[email protected] with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email to
[email protected] with the message: INFO IBM-MAIN
*** Disclaimer ***
This communication (including all attachments) is solely for the use of the
person to whom it is addressed and is a confidential AAA communication. If you
are not the intended recipient, any use, distribution, printing, or copying is
prohibited. If you received this email in error, please immediately delete it
and notify the sender.
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN
VBSF TITLE 'PROGRAM TO READ VBS RECORDS AND CLEAN UP BAD SEGMTS'
***********************************************************************
* *
* THIS PROGRAM IS DISTRIBUTED ON AN "AS IS" BASIS. IBM MAKES NO *
* WARRANTIES, EITHER EXPRESSED OR IMPLIED, AS TO ITS USABILITY OR *
* SUITABILITY FOR ANY PURPOSE WHATSOEVER. THE USER OF THIS PROGRAM *
* ACCEPTS FULL RESPONSIBILITY FOR ANY DAMAGES THAT MAY RESULT FROM *
* THE USE OF THIS PROGRAM, AND IBM SHALL NOT BE HELD LIABLE FOR ANY *
* DAMAGES -- EITHER DIRECT OR CONSEQUENTIAL -- WHICH MAY RESULT FROM *
* ITS USE. *
* *
***********************************************************************
* *
* *
* FUNCTION - THIS PROGRAM IS DESIGNED TO READ A VBS DATASET (NON- *
* VSAM) AND CHECK ON VALID SDW'S. *
* INVALID SEGMENTS ARE CONVERTED TO VB OUTPUT IN FILE 'BADRECS'. *
* VALID RECORDS ARE COPIED TO FILE 'OUTPUT'. *
* *
* EXEC PARMS: 'SMF' - THIS CAUSES THE PROGRAM TO DISPLAY THE SMF *
* RECORD ID (BYTE 2) AS PART OF ERROR MESSAGES. *
* *
* INPUT - VBS FILE TO BE CHECKED : 'INPUT' *
* *
* OUTPUT- VBS FILE FOR GOOD RECORDS : 'OUTPUT' *
* V(B) FILE WITH BAD SEGMENTS : 'BADRECS' *
* ERROR MESSAGE FILE : 'SYSPRINT' *
* *
* METHODOLOGY - THE INPUT FILE IS READ IN ONE SEGMENT AT A TIME *
* (LOCATE MODE). *
* SEGMENTS ARE CHECKED MANUALLY, AND A NEW LOGICAL *
* RECORD IS CREATED AND WRITTEN TO OUTPUT. *
* SEGMENTS WHICH DON'T MATCH UP ARE WRITTEN INTACT TO FILE *
* BADRECS FOR LATER ANALYSIS. *
* A DESCRIPTIVE ERROR MESSAGE IS WRITTEN TO SYSPRINT FOR EACH *
* BAD RECORD DETECTED. *
* *
* AUTHOR - B. K. PIERCE, WASHINGTON SYSTEMS CENTER. *
* *
* MAINTENANCE HISTORY - (ORIGINAL DATE - 4/28/80) *
* V1M1 (12/06/81): ERROR IN RECORD UNSTACK ROUTINE. *
* SUPPORT FOR SYNAD EXIT AND ERROR MESSAGES *
* V1M2 (02/05/82): ADD SYNAD SUPPORT FOR OUTPUT DATASET *
* V1M3 (04/22/85): FIXUP SYNAD ROUTINES FOR REG SAVE/RESTORE *
* V1M4 (05/08/85): ADD MISC. COUNTS AND SET MAXCC RETURN CODE *
* V1M5 (09/24/92): FIX RECORD COUNT IN ERROR MESSAGES, ADD A MAX I/O *
* ERROR COUNT, CURRENT IS 6. *
* V1M5A(03/02/93): FIX THE TOTAL RECORD COUNT (WAS COUNTING 2X) *
* V1M6 (04/19/96): DO MORE WORK ON THE SYNAD ROUTINES *
* *
***********************************************************************
SPACE
***********************************************************************
* IN-LINE MACRO TO INCREMENT COUNTERS (USING R15). *
***********************************************************************
SPACE
MACRO
&LABEL ADD1 &FIELD
&LABEL L 15,&FIELD GET CURRENT VALUE
LA 15,1(,15) ADD 1 TO COUNT
ST 15,&FIELD SAVE NEW VALUE
MEND
SPACE
***********************************************************************
* IN-LINE MACRO TO SET MAXCC VALUE (USING R15). *
***********************************************************************
SPACE
MACRO
&LABEL SETCC &CC
&LABEL LA 15,&CC GET CURRENT VALUE
C 15,MAXCC COMPARE AGAINST PREV. VALUE
BNH *+8 IF NOT HIGHER, QUIT
ST 15,MAXCC SAVE NEW VALUE
MEND
SPACE
***********************************************************************
* GENERAL PURPOSE REGISTER USAGE (FP REGS ARE NOT USED) *
***********************************************************************
SPACE
R0 EQU 0 PARM REG
R1 EQU 1 PARM REG
R2 EQU 2 WORK REG
R3 EQU 3 WORK REG
R4 EQU 4 WORK REG
R5 EQU 5 WORK REG
R6 EQU 6 WORK REG
R7 EQU 7 WORK REG
R8 EQU 8 WORK REG
R9 EQU 9 BAD BLOCK COUNTER
R10 EQU 10 LINKAGE REGISTER
R11 EQU 11 RECORD COUNTER
R12 EQU 12 PRIMARY BASE REG
R13 EQU 13 SAVE AREA POINTER/SEC. BASE REG
R14 EQU 14 SYSTEM LINKAGE REG
R15 EQU 15 EP / RETURN CODE REG
SPACE 2
***********************************************************************
* PROGRAM INITIALIZATION CODE: ADDRESSIBILITY, SAVE AREAS, ETC *
***********************************************************************
SPACE
VBSFIX CSECT
SAVE (14,12),,*
LR R12,R15 GET EP ADDRESS
USING VBSFIX,R12 SET BASE ADDRESSING
LA R2,SAVEAREA GET A(SAVE AREA)
ST R13,4(,R2) SAVE A(HSA)
ST R2,8(,R13) AND A(LSA)
LR R13,R2 GET SAVE IN R13
SPACE
L R1,0(,R1) GET A(PARM)
LH R2,0(,R1) GET PARM LENGTH
LTR R2,R2 TEST FOR ZERO
BZ NOPARM YES, NO PARM SUPPLIED
CLC 2(3,R1),=C'SMF' TEST FOR SMF
BNE NOPARM NO, IGNORE IT
OI OPTIONS,SMF SET SMF SWITCH
NOPARM DS 0H
SPACE
***********************************************************************
* OPEN ALL DATASETS, AND ISSUE ERROR MESSAGES IF ANY FAIL TO OPEN. *
***********************************************************************
SPACE
OPEN (SYSPRINT,OUTPUT) OPEN MESSAGES D/S
LA R2,SYSPRINT GET ADDRESS
USING IHADCB,R2 ADDRESSIBILITY
TM DCBOFLGS,DCBOFOPN TEST FOR OPEN
BO HEADER YES, BYPASS ERROR
WTO 'VBSFIX: OPEN FAILED FOR SYSPRINT, ENDED.', X
ROUTCDE=11
LA R15,16 SET RETURN
B RETURN GOTO EXIT
HEADER DS 0H
PUT SYSPRINT,HEADER1 PUT OUT HEADER
PUT SYSPRINT,HEADER2 AND SPACER
OPNALL DS 0H
OPEN (INPUT,INPUT,OUTPUT,OUTPUT,BADRECS,OUTPUT)
LA R2,INPUT GET ADDRESS
TM DCBOFLGS,DCBOFOPN TEST FLAGS
BO OPNCHK1 YES, BYPASS ERROR
PUT SYSPRINT,=CL121'0*** OPEN FAILED FOR INPUT, ENDED.'
SETCC 16
B RETURN
OPNCHK1 DS 0H
LA R2,OUTPUT GET ADDRESS
TM DCBOFLGS,DCBOFOPN TEST FLAGS
BO OPNCHK2 YES, BYPASS ERROR
PUT SYSPRINT,=CL121'0*** OPEN FAILED FOR OUTPUT, ENDED.'
SETCC 16
B RETURN
OPNCHK2 DS 0H
LA R2,BADRECS GET ADDRESS
TM DCBOFLGS,DCBOFOPN TEST FLAGS
BO OPNCHK3 YES, BYPASS ERROR
PUT SYSPRINT,=CL121'0*** OPEN FAILED FOR BADRECS, ENDED.'
SETCC 16
B RETURN
DROP R2
OPNCHK3 DS 0H
SPACE
***********************************************************************
* ALL DATASETS ARE NOW OPEN, PROCEED TO INITIALIZE POINTERS AND READ *
* A RECORD FROM INPUT. *
* IF THERE IS NO SEGMENTATION INVOLVED, SIMPLY MOVE THE RECORD TO *
* OUTPUT AREA. *
* ELSE GO AND PROCESS AS SEGMENTED RECORD. *
***********************************************************************
SPACE
XC ANCHOR,ANCHOR CLEAR ANCHOR POINTER
MVI SEGSW,1 CLEAR SWITCH
READIN DS 0H
GET INPUT READ A SEGMENT
CLC SKIPRECS,ERRMAX CHECK # OF ERRORS
BH ERRINPUT IF TOO HIGH, QUIT
LR R2,R1 SAVE POINTER
ADD1 TOTSEG ADD TO REC COUNT
CLI SEGSW,2 TEST FOR SEGMENTATION
BE PROCSEG YES, GO TO PROCESS
CLI 2(R2),0 TEST FOR SEGMENTED RECORD
BNE FIRSTSEG YES, GO TO PROCESS
PUTOUT DS 0H
ADD1 TOTRECG ADD ONE TO GOOD RECORDS
LA R0,RECORD MOVE OUTPUT POINTER
LH R1,0(,R2) GET LENGTH
LR R3,R1 INTO FIRST & SEC OP REGS
LR R9,R1 SAVE THE CURRENT RECL LENGTH
MVCL R0,R2 MOVE RECORD TO OUTPUT
C R9,MIN TEST AGAINST MINIMUM
BNL *+8 NOT LOW, BYPASS CHANGE
ST R9,MIN SAVE NEW VALUE
C R9,MAX TEST AGAINST MAX
BNH *+8 NOT HIGH, BYPASS CHANGE
ST R9,MAX SAVE NEW VALUE
PUT OUTPUT,RECORD PUT RECORD TO OUTPUT
B READIN GOTO PROCESS NEXT INPUT
SPACE
***********************************************************************
* FIRST SEGMENT OF A RECORD DETECTED: SET SWITCH AND START BUFFER *
* CHAIN. *
***********************************************************************
SPACE
FIRSTSEG DS 0H
CLI 2(R2),1 TEST FOR FIRST SEGMENT
BE F1SEG YES, IT IS AN OK SEGMENT
BAL R10,ERRMSG PUT ERROR MESSAGE
PUT BADRECS,(R2) PUT TO BAD FILE
ADD1 BADSEG BUMP BAD REC COUNTER
B READIN GOTO NEXT RECORD
F1SEG DS 0H
CLC ANCHOR,=F'0' CHECK ANCHOR POINT
BNE ABEND100 NO, LOGIC ERROR 100
MVI SEGSW,2 SET SWITCH TO INDICATE EXPECTED NEXT
ADD1 TOTREC ADD ONE TO TOTAL RECORDS IN
TM OPTIONS,SMF IS SMF OPTION ACTIVE
BZ *+10 NO, BYPASS MOVE
MVC STYPE(1),5(R2) MOVE TYPE BYTE
BAL R10,STACK GOTO ADD SEGMENT TO BUFFER RTN
B READIN GOTO GET NEXT SEGMENT
SPACE
ABEND100 ABEND 100,DUMP ANCHOR SHOULD BE ZERO, IS NOT.
SPACE
***********************************************************************
* PROCESS SUBSEQUENT SEGMENTS: FOR CONTINUING SEGMENTS, ADD TO CHAIN. *
* FOR LAST SEGMENT, CONSTRUCT OUTPUT RECORD FOR OUTPUT DATASET. *
* *
***********************************************************************
SPACE
PROCSEG DS 0H
CLI 2(R2),0 TEST FOR UNSEGMENTED
BE P0SEG YES, GO TO PROCESS
CLI 2(R2),1 TEST FOR UNSEGMENTED
BE P1SEG YES, GO TO PROCESS
CLI 2(R2),2 TEST FOR LAST SEGMENT
BE P2SEG YES GO TO PROCESS
CLI 2(R2),3 TEST FOR CONT SEGMENT
BE P3SEG YES, GO TO PROCESS
SPACE
ABEND 200,DUMP SEGMENT DESC OF OTHER THAN 0,1,2,3
SPACE
***********************************************************************
* UNSEGMENTED RECORD ENCOUNTERED WHEN CONT SEGMENT EXPECTED. *
* FLUSH STACK TO BR FILE *
* RE-INITIALIZE TO NEW RECORD. *
***********************************************************************
SPACE
P0SEG DS 0H
SETCC 0 MFS CHANGED TO ZERO
* SETCC 4
BAL R10,ERRMSG PUT ERROR MESSAGE
BAL R10,FLUSH GO TO FLUSH STACK TO BADRECS
MVI SEGSW,1 RESET SWITCH
B PUTOUT GOTO PUT OUT RECORD
SPACE
***********************************************************************
* FIRST SEGMENT RECORD ENCOUNTERED WHEN CONT SEGMENT EXPECTED. *
* FLUSH STACK TO BAD RECORD FILE. *
* RE-INTIALIZE SEGMENT STACK. *
***********************************************************************
SPACE
P1SEG DS 0H
SETCC 0 MFS CHANGED TO ZERO
* SETCC 4
BAL R10,ERRMSG PUT OUT ERROR MESSAGE
BAL R10,FLUSH FLUSH OUT SEGMENTS TO BADRECS
B F1SEG GO TO PROCESS AS FIRST SEGMENT
SPACE
***********************************************************************
* END SEGMENT FOUND, CONTINUE SEGMENT EXPECTED. THIS IS NORMAL, *
* STACK THIS SEGMENT. THEN CALL UNSTACK ROUTINE TO CONSTRUCT *
* OUTPUT RECORD. *
***********************************************************************
SPACE
P2SEG DS 0H
BAL R10,STACK STACK RECORD
BAL R10,UNSTACK CONSTRUCT OUTPUT RECORD
MVI SEGSW,1 RESET SEGMENT SWITCH
B READIN GO TO NEXT RECORD
SPACE
***********************************************************************
* CONTINUE SEGMENT FOUND, CONTINUE SEGMENT EXPECTED, ADD TO STACK. *
* THEN READ ANOTHER SEGMENT. *
***********************************************************************
SPACE
P3SEG DS 0H
BAL R10,STACK STACK RECORD
B READIN GO AND READ ANOTHER
SPACE
***********************************************************************
* INPUT END OF FILE ROUTINE - CLOSE FILES, WRITE GOODBYE MESSAGE *
* AND RETURN. *
***********************************************************************
SPACE
EOFIN DS 0H
CLC ANCHOR,=F'0' TEST FOR STACK
BE CLOSES NO, CLOSE FILES
PUT SYSPRINT,=CL121'0*** EOF ON INPUT FILE, NOT AT END OF REX
CORD.***'
BAL R10,FLUSH FLUSH THE STACK
B CLOSES GOTO CLOSE FILES
ERRINPUT DS 0H
PUT SYSPRINT,=CL121'0*** MAX. ERRORS EXCEEDED ON INPUT FILE,X
PROGRAM TERMINATED.'
SETCC 16
CLC ANCHOR,=F'0' TEST FOR STACK
BE CLOSES NO, CLOSE FILES
BAL R10,FLUSH FLUSH THE STACK
CLOSES DS 0H
CLOSE (INPUT,,OUTPUT,,BADRECS)
L R11,TOTREC GET TOTAL COUNT
BCTR R11,0 SUBTRACT 'CAUSE I STARTED AT 1
CVD R11,DWORD CONVERT REC NUM
ED TRLNUM,DWORD+3 EDIT ANSWER
L R9,TOTRECB GET BAD RECORDS
CVD R9,DWORD CONVERT BAD REC COUN
ED TRLBNUM,DWORD+4 EDIT RESULT
L R9,SKIPRECS GET BAD RECORDS
CVD R9,DWORD CONVERT BAD REC COUN
ED TRLSKIP,DWORD+4 EDIT RESULT
PUT SYSPRINT,TRAILR1 PUT TRAILER
L R3,MIN GET REC MIN
CVD R3,DWORD CONVERT TO DEC
ED T2MIN,DWORD+5 EDIT RESULT
L R3,MAX GET REC MAX
CVD R3,DWORD CONVERT TO DEC
ED T2MAX,DWORD+5 EDIT RESULT
PUT SYSPRINT,TRAILR2 PUT TRAILER
CLOSE (SYSPRINT)
RETURN DS 0H
L R15,MAXCC GET RETURN CODE
L R13,4(,R13) RESTORE SAVE
RETURN (14,12),RC=(15)
TITLE 'SUBROUTINES CALLED BY MAIN LINE CODE'
***********************************************************************
* STACK: THIS ROUTINE GETMAINS AN AREA AND STACKS THE SEGMENT POINTED *
* TO IN R2 INTO THIS AREA AND CHAINS IT ONTO THE END OF THE EXISTING *
* CHAIN. *
***********************************************************************
SPACE
STACK DS 0H
LH R3,0(,R2) GET SEGMENT SIZE
LA R3,4(,R3) ADD 4 FOR CHAIN FIELD
GETMAIN R,LV=(R3),SP=100 GET STORAGE FOR BUFFER
LA R3,ANCHOR GET ANCHOR POINT
STLOOP DS 0H
L R4,0(,R3) GET CHAIN VALUE
LTR R4,R4 TEST FOR ZERO
BZ STEND YES, END OF CHAIN
LR R3,R4 MOVE VALUE TO POINTER
B STLOOP GO TO NEXT POINTER
STEND DS 0H
ST R1,0(,R3) STORE NEW BUFFER IN CHAIN
XC 0(4,R1),0(R1) CLEAR CHAIN PTR IN NEW BUFFER (EOL)
LA R0,4(,R1) SET R0 TO POINT TO 4 PAST START
LH R3,0(,R2) GET SEGMENT LENGTH AGAIN
LR R1,R3 PUT IN BOTH LENGTH REGS
MVCL R0,R2 MOVE SEGMENT
STRTRN BR R10 RETURN TO CALLER
SPACE
***********************************************************************
* FLUSH: THIS ROUTINE TAKES SEGMENTS FROM THE STACK AND PUTS THEM TO *
* THE BADRECS FILE, AND FREES THE STORAGE USED FOR BUFFERS. *
***********************************************************************
SPACE
FLUSH DS 0H
CLC ANCHOR,=F'0' TEST FOR ZERO POINTER
BE ABEND300 WHOOPS, THIS SHOULDNT HAPPEN
ADD1 TOTRECB ADD ONE TO BAD RECORD COUNT
L R4,ANCHOR GET SEGMENT
FLLOOP DS 0H
LA R0,4(,R4) POINT TO START OF SEGMENT
PUT BADRECS,(0) PUT TO BAD RECS FILE
ADD1 BADSEG ADD ONE TO BAD SEG COUNT
LH R3,4(,R4) GET SEG SIZE
LA R3,4(,R3) ADD 4 FOR CHAIN POINTER
CLC =F'0',0(R4) CHECK CHAIN FIELD
BE FLRTRN ZERO, GO TO END
L R4,0(,R4) GET NEXT POINTER
B FLLOOP NO, GO TO PROCESS NEXT
FLRTRN DS 0H
FREEMAIN R,SP=100 FREE WHOLE SUBPOOL
XC ANCHOR,ANCHOR CLEAR POINTER
BR R10
SPACE
ABEND300 ABEND 300,DUMP FLUSH WITHOUT A STACK
SPACE
***********************************************************************
* UNSTACK: THIS ROUTINE TAKES THE SEGMENTS STACKED IN BUFFERS, AND *
* PUTS THEM INTO A NEW OUTPUT RECORD. *
***********************************************************************
SPACE
UNSTACK DS 0H
CLC ANCHOR,=F'0' TEST FOR ZERO POINTER
BE ABEND400 WHOOPS, THIS SHOULDNT HAPPEN
XR R6,R6 CLEAR LENGTH REGISTER
LA R8,RECORD SET START POINTER
LA R4,4(,R8) LOAD START POINTER OF DATA
L R7,ANCHOR GET SEGMENT
UNLOOP DS 0H
LA R2,8(,R7) POINT TO START OF DATA (CHAIN+SDW)
LH R3,4(,R7) GET SEG SIZE
S R3,=F'4' SUB SDW LENGTH
AR R6,R3 BUMP TOTAL LENGTH
LR R5,R3 MOVE TO OTHER LENGTH REG
MVCL R4,R2 MOVE DATA
CLC =F'0',0(R7) CHECK FOR ZERO CHIAN
BE UNEND YES, GO TO ENDUP
L R7,0(,R7) GET CHAIN POINTER
B UNLOOP NO, GO TO NEXT
SPACE
UNEND DS 0H
XC 0(4,R8),0(R8) CLEAR NEW RDW
LA R6,4(,R6) ADD 4 TO DATA LENGTH
STH R6,0(R8) STORE LENGTH IN RDW
C R6,MIN TEST AGAINST MINIMUM
BNL *+8 NOT LOW, BYPASS CHANGE
ST R6,MIN SAVE NEW VALUE
C R6,MAX TEST AGAINST MAX
BNH *+8 NOT HIGH, BYPASS CHANGE
ST R6,MAX SAVE NEW VALUE
C R6,=F'32760' TEST AGAINST MAX REC
BNH *+10 NOT TOO HIGH, BYPASS DECREASE
MVC 0(2,R8),=H'32760' DECREASE TO MAX REC LENGTH
PUT OUTPUT,RECORD PUT REBUILD LOG REC TO OUTPUT
ADD1 TOTRECG ADD ONE TO OUTPUT REC COUNT
FREEMAIN R,SP=100 FREE ALL STORAGE
XC ANCHOR,ANCHOR CLEAR ANCHOR POINTER
UNRTRN BR R10 RETURN TO CALLER
SPACE
ABEND400 ABEND 400,DUMP UNSTACK WITHOUT A STACK
SPACE
***********************************************************************
* ERRMSG: THIS ROUTINE PUTS OUT A GENERALIZED ERROR MESSAGE TO THE *
* SYSPRINT DATASET. *
***********************************************************************
SPACE
ERRMSG DS 0H
L R11,TOTREC GET CURRENT COUNT
CVD R11,DWORD CONVERT CURR REC COUNT
MVC OHNUM(12),=X'402020206B2020206B202120'
ED OHNUM,DWORD+3 EDIT NUMBER
MVC OHEXPT,SEGSW MOVE SWITCH SET
OI OHEXPT,C'0' FORCE SIGN
MVC OHRECV,2(R2) MOVE SDW TYPE
OI OHRECV,C'0' FORCE SIGN
TM OPTIONS,SMF TEST FOR SMF OPTION
BZ ERRPUT NO, BYPASS CHANGE
XR R3,R3 CLEAR REG
IC R3,STYPE GET TYPE
CVD R3,DWORD CVT TO DEC
UNPK DWORD(3),DWORD+6(2)
MVC SMFTYPE(2),DWORD+1 MOVE TO MSG
OI SMFTYPE+1,C'0' FORCE SIGN
MVC OHSMF(12),SMFOVLY MOVE OVERLAY TO MSG
ERRPUT PUT SYSPRINT,OHOHMSG
ERRTRN BR R10 RETURN TO CALLER
TITLE 'SYNAD ROUTINES'
***********************************************************************
* THIS ROUTINE GETS CONTROL AS A SYNAD EXIT FOR THE INPUT DCB. *
* IT USES THE SYNADAF SERVICE TO FORMAT AND DISPLAY AN ERROR MESSAGE *
***********************************************************************
DROP R12
USING INERROR,R15 ADDRESSABILITY
INERROR DS 0H
STM R13,R15,SYNADSAV
SYNADAF ACSMETH=QSAM ISSUE SYNADAF MACRO
STM R14,R12,12(R13) SAVE REGS
BALR R12,0 GET A NEW SAVE AREA
DROP R15
USING *,R12 USE IT
LA R2,7(,R1) BUMP PAST BDW+RDW-1
MVC 0(30,R2),=CL30'0I/O ERROR ON DDNAME=INPUT'
* PUT SYSPRINT,(2) PUT MESSAGE
ADD1 SKIPRECS COUNT IT
SETCC 8
LM R14,R12,12(13) RESTORE REGS
DROP R12
USING INERROR,R15 ADDRESSABILITY
SYNADRLS , RELEASE BUFFER ETC
LM R13,R15,SYNADSAV
BR R14 RETURN TO SYSTEM
DROP R15
SPACE 2
***********************************************************************
* THIS ROUTINE GETS CONTROL AS A SYNAD EXIT FOR THE OUTPUT DCB. *
* IT USES THE SYNADAF SERVICE TO FORMAT AND DISPLAY AN ERROR MESSAGE *
***********************************************************************
USING OUTERROR,R15
OUTERROR DS 0H
STM R13,R15,SYNADSAV
SYNADAF ACSMETH=QSAM ISSUE SYNADAF MACRO
STM R14,R12,12(R13) SAVE REGS
BALR R12,0 GET A NEW SAVE AREA
DROP R15
USING *,R12 USE IT
* IGNORE RETURN CODES AND PRINT MESSAGE
LA R2,7(,R1) BUMP PAST BDW+RDW-1
MVC 0(30,R2),=CL30'0I/O ERROR ON DDNAME=OUTPUT'
PUT SYSPRINT,(2) PUT MESSAGE
SETCC 16
LM R14,R12,12(13) RESTORE REGS
DROP R12
USING OUTERROR,R15 ADDRESSABILITY
SYNADRLS , RELEASE BUFFER ETC
LM R13,R15,SYNADSAV
BR R14 RETURN TO SYSTEM
DROP R15
USING VBSFIX,R12 SET BASE ADDRESSING
TITLE 'DCBEXIT ROUTINE(S)'
***********************************************************************
* DCB EXIT ROUTINE TO FILL IN BLOCKSIZE FROM LRECL IF BLKSIZE IS NOT *
* OTHERWISE SUPPLIED. *
***********************************************************************
SPACE
DCBEXIT1 DS 0H
USING IHADCB,R1
CLC DCBBLKSI(2),=H'0' TEST FOR BLKSIZE FILLED IN
BNER R14 YES, RETURN TO CALLER
MVC DCBBLKSI(2),DCBLRECL NO, MOVE IN LRECL
BR R14 RETURN TO CALLER
SPACE 2
TITLE 'DCB''S AND CONSTANTS AREA'
PUSH PRINT
PRINT NOGEN
INPUT DCB DSORG=PS,MACRF=(GL),DDNAME=INPUT,RECFM=VBS,LRECL=X, X
EODAD=EOFIN,EROPT=SKP
SPACE 2
OUTPUT DCB DSORG=PS,MACRF=PM,RECFM=VBS,DDNAME=OUTPUT, X
SYNAD=OUTERROR
SPACE 2
BADRECS DCB DSORG=PS,MACRF=PM,DDNAME=BADRECS
SPACE 2
SYSPRINT DCB DSORG=PS,MACRF=PM,RECFM=FBA,LRECL=121,DDNAME=SYSPRINT, X
EXLST=EXLST1
POP PRINT
SPACE 3
HEADER1 DC CL121'1 **** VBS FIXUP PROGRAM - V1M6 ***'
HEADER2 DC CL121'0'
TRAILR1 DS 0CL121
DC C'0*** END OF JOB,'
TRLNUM DC X'402020206B2020206B202120'
DC C' RECORDS PROCESSED,'
TRLBNUM DC X'40206B2020206B202120'
DC C' RECORDS IN ERROR,'
TRLSKIP DC X'40206B2020206B202120'
DC C' RECORDS SKIPPED.'
DC (TRAILR1+121-*)C' '
TRAILR2 DS 0CL121
DC C' *** MINIMUM SIZE='
T2MIN DC X'4020206B202120'
DC C', MAXIMUM SIZE='
T2MAX DC X'4020206B202120'
DC C'.'
DC (TRAILR2+121-*)C' '
OHOHMSG DS 0CL121
DC C'0*** ERROR RECORD #'
OHNUM DC X'402020206B2020206B202120'
DC C', EXPECTED: '
OHEXPT DC C' '
DC C', RECEIVED: '
OHRECV DC C' '
DC C'. '
OHSMF DC CL12'.'
DC (OHOHMSG+121-*)C' '
EXLST1 DS 0F
DC X'85'
DC AL3(DCBEXIT1)
SMFOVLY DS 0CL12
DC C'(SMFTYPE='
SMFTYPE DC C' '
DC C')'
LTORG
TITLE 'WORKING STORAGE SECTION'
SAVEAREA DS 18F REGULAR SAVE AREA
SYNADSAV DS 4F SYNAD SAVE AREA
ANCHOR DC F'0'
MIN DC F'999999'
MAX DC F'0'
TOTREC DC F'1' COUNT OF TOTAL SEGMENTS READ
TOTSEG DC F'0' COUNT OF TOTAL SEGMENTS READ
TOTRECG DC F'0' TOTAL GOOD RECORDS
TOTRECB DC F'0' TOTAL BAD RECORDS
BADSEG DC F'0' NUMBER OF BAD SEGMENTS
SKIPRECS DC F'0' NUMBER OF SKIPPED (I/O ERR) RECS
ERRMAX DC F'6' MAX NUMBER OF I/O ERRORS ALLOWED
MAXCC DC F'0' RETURN CODE
DWORD DS D
SEGSW DC X'00'
OPTIONS DC X'00'
SMF EQU 128
STYPE DC C' '
RECORD DS 32767C LOGICAL RECORD BUILD AREA
PRINT NOGEN
DCBD DSORG=QS
END VBSFIX
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN