Attached is the VBSFIX program. 

Thanks

-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On Behalf 
Of Carmen Vitullo
Sent: Monday, April 02, 2018 10:34 AM
To: IBM-MAIN@LISTSERV.UA.EDU
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" <veryl.el...@sungardas.com>
To: IBM-MAIN@LISTSERV.UA.EDU
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 
lists...@listserv.ua.edu with the message: INFO IBM-MAIN 


----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email to 
lists...@listserv.ua.edu 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 lists...@listserv.ua.edu 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 lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to