DSN8EP2

USING THE INSTRUMENTATION FACILITY INTERFACE (IFI), PROCESS A Db2 COMMAND WHICH IS PASSED FROM THE DSN8EP1 REQUESTER PROGRAM.

 DSN8EP2:   PROCEDURE(INPUTCMD, IFCA_RET_HEX, IFCA_RES_HEX,             00010000
            BUFF_OVERFLOW, RETURN_BUFF, NULL_ARRAY)                     00020000
            OPTIONS(MAIN NOEXECOPS);                                    00030000
                                                                        00040000
 /********************************************************************  00050000
  *   MODULE NAME = DSN8EP2 (SAMPLE PROGRAM)                         *  00060000
  *                                                                  *  00070000
  *   DESCRIPTIVE NAME = STORED PROCEDURE SERVER PROGRAM             *  00080000
  *                                                                  *  00090000
  *    LICENSED MATERIALS - PROPERTY OF IBM                          *  00100000
  *    5675-DB2                                                      *  00110000
  *    (C) COPYRIGHT 1982, 2000 IBM CORP.  ALL RIGHTS RESERVED.      *  00120000
  *                                                                  *  00130000
  *    STATUS = VERSION 7                                            *  00140000
  *                                                                  *  00150000
  *   FUNCTION =                                                     *  00160000
  *      USING THE INSTRUMENTATION FACILITY INTERFACE (IFI),         *  00170000
  *      PROCESS A DB2 COMMAND WHICH IS PASSED FROM THE DSN8EP1      *  00180000
  *      REQUESTER PROGRAM.                                          *  00190000
  *                                                                  *  00200000
  *   NOTES =                                                        *  00210000
  *      DEPENDENCIES = NONE                                         *  00220000
  *                                                                  *  00230000
  *      RESTRICTIONS =                                              *  00240000
  *         1.  THE INSTRUMENTATION FACILITY COMMUNICATION AREA      *  00250000
  *             (IFCA) CONTAINS INFORMATION REGARDING THE SUCCESS    *  00260000
  *             OF THE CALL AND PROVIDES FEEDBACK.                   *  00270000
  *             THIS AREA MUST BE MAINTAINED TO INCLUDE ANY CHANGES  *  00280000
  *             TO THE MAPPING MACRO DSNDIFCA.                       *  00290000
  *                                                                  *  00300000
  *   MODULE TYPE  = PROCEDURE                                       *  00310000
  *      PROCESSOR =                                                 *  00320000
  *         ADMF PRECOMPILER                                         *  00330000
  *         PL/I MVS/VM (FORMERLY PL/I SAA AD/CYCLE)                 *  00340000
  *      MODULE SIZE = 1K                                            *  00350000
  *      ATTRIBUTES = RE-ENTERABLE                                   *  00360000
  *                                                                  *  00370000
  *   ENTRY POINT = DSN8EP2                                          *  00380000
  *      PURPOSE  = SEE FUNCTION                                     *  00390000
  *      LINKAGE  = INVOKED VIA EXEC SQL CALL.                       *  00400000
  *      INPUT    = PARAMETERS EXPLICITLY PASSED TO THIS FUNCTION:   *  00410000
  *         SYMBOLIC LABEL/NAME = INPUTCMD                           *  00420000
  *         DESCRIPTION = DB2 COMMAND TO BE PROCESSED BY IFI.        *  00430000
  *                       INPUT STATEMENTS FROM THE INPUTCMD         *  00440000
  *                       PARAMETER WILL BE PASSED TO THE            *  00450000
  *                       TEXT_OR_COMMAND FIELD OF THE OUTPUT_AREA   *  00460000
  *                       IN THE DSN8EP1 PROGRAM.                    *  00470000
  *                                                                  *  00480000
  *      OUTPUT   = PARAMETERS EXPLICITLY RETURNED:                  *  00490000
  *         SYMBOLIC LABEL/NAME = IFCA_RET_HEX                       *  00500000
  *         SYMBOLIC LABEL/NAME = IFCA_RES_HEX                       *  00510000
  *         SYMBOLIC LABEL/NAME = IFCA_BYTES_MOVED                   *  00520000
  *         DESCRIPTION = COMMUNICATION AREAS BETWEEN THE            *  00530000
  *                       APPLICATION PROGRAM AND IFI                *  00540000
  *         SYMBOLIC LABEL/NAME = RETURN_BUFF                        *  00550000
  *         DESCRIPTION = DB2 COMMAND RESPONSE FROM IFI              *  00560000
  *                       THE RETURN CODE, REASON CODE, AND THE      *  00570000
  *                       BYTES MOVED FROM THE IFCA AND THE          *  00580000
  *                       RTRN_BUFF FIELD FROM THE IFI RETURN AREA   *  00590000
  *                       WILL BE PASSED VIA THE IFCA_RET_HEX,       *  00600000
  *                       IFCA_RES_HEX, IFCA_BYTES_MOVED, AND        *  00610000
  *                       RETURN_BUFF PARAMETERS.                    *  00620000
  *                                                                  *  00630000
  *   EXIT NORMAL =                                                  *  00640000
  *      NO ERRORS WERE FOUND IN THE SOURCE AND NO                   *  00650000
  *      ERRORS OCCURRED DURING PROCESSING.                          *  00660000
  *                                                                  *  00670000
  *   NORMAL MESSAGES =                                              *  00680000
  *                                                                  *  00690000
  *   EXIT-ERROR =                                                   *  00700000
  *      ERRORS WERE FOUND IN THE SOURCE, OR OCCURRED DURING         *  00710000
  *      PROCESSING.                                                 *  00720000
  *                                                                  *  00730000
  *      RETURN CODE =  4 - WARNING-LEVEL ERRORS DETECTED.           *  00740000
  *         WARNING FOUND DURING EXECUTION.                          *  00750000
  *         REASON CODE = NONE OR FROM IFI                           *  00760000
  *                                                                  *  00770000
  *      RETURN CODE =  8 - ERRORS DETECTED.                         *  00780000
  *         ERROR FOUND DURING EXECUTION.                            *  00790000
  *         REASON CODE = NONE OR FROM IFI                           *  00800000
  *                                                                  *  00810000
  *      RETURN CODE = 12 - SEVERE ERRORS DETECTED.                  *  00820000
  *         UNABLE TO OPEN FILES.                                    *  00830000
  *         INTERNAL ERROR, ERROR MESSAGE ROUTINE RETURN CODE.       *  00840000
  *         STATEMENT IS TOO LONG.                                   *  00850000
  *         BUFFER OVERFLOW.                                         *  00860000
  *         REASON CODE = NONE OR FROM IFI                           *  00870000
  *                                                                  *  00880000
  *      ABEND CODES = NONE                                          *  00890000
  *                                                                  *  00900000
  *   ERROR MESSAGES =                                               *  00910000
  *                                                                  *  00920000
  *   EXTERNAL REFERENCES =                                          *  00930000
  *      ROUTINES/SERVICES = NONE                                    *  00940000
  *      DATA-AREAS        = NONE                                    *  00950000
  *      CONTROL-BLOCKS    = NONE                                    *  00960000
  *                                                                  *  00970000
  *   PSEUDOCODE      =                                              *  00980000
  *     DSN8EP2: PROCEDURE.                                          *  00990000
  *     GET THE RETURN AREA SIZE FOR COMMAND REQUESTS.               *  01000000
  *     ALLOCATE THE REQUESTED RETURN AREA.                          *  01010000
  *     FORMAT THE OUTPUT AREA WITH THE REQUESTED COMMAND.           *  01020000
  *     ISSUE COMMAND REQUEST.                                       *  01030000
  *     PASS RESULTS TO THE OUTPUT PARAMETERS.                       *  01040000
  *                                                                  *  01050000
  *  CHANGE ACTIVITY =                                               *  01060000
  *   7/05/95  CHANGED THE OUTPUT STRING LENGTH FROM VARYING         *  01070000
  *            TO FIXED 80 BYTE STRINGS          PN72035  @47 KFF0347*  01080000
  *  04/17/00  INITIALIZE STORAGE TO PREVENT RETURN CODE=04,         *  01090000
  *            REASON CODE=00E60804 FROM IFI                  PQ36800*  01100000
  *  05/22/03  FIX CODE HOLE CLOSED BY VA AND ENTERPRISE PL/I PQ44916*  01101000
  ********************************************************************/ 01110000
 %PAGE;                                                                 01120000
 /********************************************************************/ 01130000
 /* VARIABLE DECLARATIONS                                            */ 01140000
 /********************************************************************/ 01150000
                                                                        01160000
 DCL COMMAND     CHAR(8) INIT(' '); /* USER SPECIFIED DB2 COMMAND    */ 01170000
 /********************************************************************/ 01180000
 /* BUILT-IN VARIABLES                                            @47*/ 01190000
 /********************************************************************/ 01200000
                                                                        01210000
  DCL                                                           /*@47*/ 01220000
     ADDR         BUILTIN,        /* ADDRESS OF A DATA AREA       @47*/ 01230000
     LENGTH       BUILTIN,        /* RETURNS LENGTH OF A STRING   @47*/ 01240000
     MOD          BUILTIN,        /* RETURNS MODULO VALUE         @47*/ 01250000
     STORAGE      BUILTIN,        /* FUNCTION TO GET SOME SPACE   @47*/ 01260000
     SUBSTR       BUILTIN,        /* FUNCTION TO RETURN SUBSTRING @47*/ 01270000
     UNSPEC       BUILTIN;        /* IGNORES VARIABLE TYPING      @47*/ 01280000
 /***********************************************************/          01290000
 /*       DECLARATION FOR INPUT AND OUTPUT PARAMETERS       */          01300000
 /***********************************************************/          01310000
                                                                        01320000
   DCL                                                                  01330000
    FUNCTION          CHAR(8) INIT(' '),     /* FUNC PARM FOR IFI @47*/ 01340000
    INPUTCMD          CHAR(4096) VARYING,    /* DB2 COMMAND       @47*/ 01350000
    IFCA_RET_HEX      FIXED BIN(31),         /* IFI RETURN CODE   @47*/ 01360000
    IFCA_RES_HEX      FIXED BIN(31),         /* IFI REASON CODE   @47*/ 01370000
    BUFF_OVERFLOW     FIXED BIN(31),         /* RETURN BUFF BYTES @47*/ 01380000
                                             /* RETURNED FROM CALL   */ 01390000
    NULL_ARRAY(5)     FIXED BIN(15),         /* INDICATOR ARRAY   @47*/ 01400000
    RETURN_BUFF       CHAR(8320) VARYING,    /* PASSED BUFFER     @47*/ 01410000
    RETURN_LEN        FIXED BIN(15) INIT(8320) STATIC;  /* LENGTH @47*/ 01420000
                                             /* OF PASSED BUFFER     */ 01430000
 /***********************************************************/          01440000
 /*       WORKING VARIABLES                              @47*/          01450000
 /***********************************************************/          01460000
   DCL                                                                  01470000
    REMBYTES          FIXED BIN(15) INIT(0), /* NUM BYTES TO BE   @47*/ 01480000
                                             /* PROCESSED IN RTRN AREA*/01490000
    CMDLEN            FIXED BIN(15) INIT(0), /* NUM BYTES IN A    @47*/ 01500000
                                             /* RETURNED CMD STRING  */ 01510000
                                             /* RETURN AREA          */ 01520000
    01 FIXED_BUFF     BASED(ADDR(RETURN_BUFF)),                         01530000
       02 FIXED_LEN   FIXED BIN(15),                                    01540000
       02 FIXED_TEXT  CHAR(4160),                                       01550000
                                     /* OVERLAY OF PASSED BUF FOR @47*/ 01560000
                                     /* MOVING DATA FROM RETURN AREA */ 01570000
    FILLBYTS          FIXED BIN(15)  /* NUMBER OF FILL BYTES NEED @47*/ 01580000
                        INIT(0),     /* TO MAKE RECORD LENGTHS IN    */ 01590000
                                     /* OUTPUT EQUAL TO BUFROWLN     */ 01600000
    NUMFULL           FIXED BIN(15)  /* NUMBER OF FULL LINES IN   @47*/ 01610000
                        INIT(0),     /* PASSED AREA                  */ 01620000
    PARTROW           FIXED BIN(15)  /* LENGTH OF NON-FULL LINE   @47*/ 01630000
                        INIT(0),                                        01640000
    J                 FIXED BIN(15)  /* LOOP COUNTER              @47*/ 01650000
                        INIT(0),                                        01660000
    BUFPOSI           FIXED BIN(15)  /* POSITION IN RETURN BUFFER @47*/ 01670000
                        INIT(0),                                        01680000
    BUFPOSO           FIXED BIN(15)  /* POSITION IN PASSED BUFFER @47*/ 01690000
                        INIT(0),                                        01700000
    LEN_CHAR          CHAR(2)        /* LENGTH BYTES IN COMMAND   @47*/ 01710000
                        INIT(' '),   /* RESULT STRING                */ 01720000
    LEN_BIT           BIT(16)        /* LENGTH IN BITS FOR        @47*/ 01730001
                        INIT('0'B),  /* CONVERSION                   */ 01740000
    LEN_BIN           FIXED BIN(15)  /* LENGTH IN BINARY          @47*/ 01750000
                        INIT(0),                                        01760000
    SPACE_LEFT        FIXED BIN(15)  /* BYTES LEFT IN BUFFER      @47*/ 01770000
                        INIT(0);                                        01780000
 /***********************************************************/          01790000
 /*       CONSTANTS                                      @47*/          01800000
 /***********************************************************/          01810000
  DCL                                                                   01820000
    BLANK       CHAR(1) INIT(' ') STATIC,      /* BUFFER PADDING  @47*/ 01830000
    BUFROWLN    FIXED BIN(15) INIT(80) STATIC; /* LNGTH OF A LINE @47*/ 01840000
                                            /* PASSED TO INVOKER     */ 01850000
 /***********************************************************/          01860000
 /*       DECLARE IFI CALL MACRO DSNWLI                     */          01870000
 /***********************************************************/          01880000
                                                                        01890000
   DCL                                                                  01900000
    DSNWLI         ENTRY EXTERNAL OPTIONS(ASM INTER RETCODE);           01910000
                             /* ENTRY POINT IN LANGUAGE INTERFACE    */ 01920000
                             /* MODULES TO HANDLE IFC API CALLS.     */ 01930000
 %PAGE;                                                                 01940000
 /****************************************************/                 01950000
 /*  IFCA - (INSTRUMENTATION FACILITY COMMUNICATION  */                 01960000
 /*         AREA) CONTAINS INFORMATION REGARDING THE */                 01970000
 /*         SUCCESS OF THE CALL AND PROVIDES FEEDBACK*/                 01980000
 /*         INFORMATION TO THE APPLICATION PROGRAM.  */                 01990000
 /*                                                  */                 02000000
 /* WARNING:  THIS AREA MUST BE MAINTAINED TO INCLUDE*/                 02010000
 /*           ANY CHANGES TO THE MAPPING MACRO       */                 02020000
 /*           DSNDIFCA                               */                 02030000
 /*                                                  */                 02040000
 /****************************************************/                 02050000
                                                                        02060000
                                                                        02070000
   DCL 01 IFCA,                                                         02080000
          02 LNGTH               /* LENGTH OF IFCA, INCL LENGTH FIELD*/ 02090000
               FIXED BIN(15) INIT(0),                                   02100000
          02 UNUSED                                                     02110000
               FIXED BIN(15) INIT(0),                                   02120000
          02 EYE_CATCHER         /* USED TO VERIFY THE IFCA BLOCK.   */ 02130000
               CHAR(4)       INIT( 'IFCA' ),                            02140000
          02 OWNER_ID            /* TO ESTAB OWNERSHIP OF AN OPN DEST*/ 02150000
               CHAR(4)       INIT(' '),                                 02160000
          02 IFCARC1             /* RETURN CODE FOR THE IFC API CALL.*/ 02170000
               FIXED BIN(31) INIT(0),                                   02180000
          02 IFCARC2             /* REASON CODE FOR THE IFC API CALL.*/ 02190000
               FIXED BIN(31) INIT(0),                                   02200000
          02 BYTES_MOVED         /* BYTES OF RECORD WHICH WERE MOVED.*/ 02210000
               FIXED BIN(31) INIT(0),                                   02220000
          02 EXCESS_RECDS        /* BYTES OF RECORD WHICH DID NOT FIT*/ 02230000
               FIXED BIN(31) INIT(0),                                   02240000
          02 OPN_WRIT_SEQ_NUM    /* LAST OPN WRTR SEQ# FOR READA FUNC*/ 02250000
               FIXED BIN(31) INIT(0),                                   02260000
          02 NUM_RECDS_LOST      /* RECORDS LOST INDICATOR.          */ 02270000
               FIXED BIN(31) INIT(0),                                   02280000
          02 OPN_NAME_FOR_READA  /* OPN NAME USED FOR READA REQUEST  */ 02290000
               CHAR(4)       INIT(' '),                                 02300000
          02 OPN_NAMES_AREA,     /* AREA CONTAINING UP TO 8 OPN NAMES*/ 02310000
             03 OPN_LNGTH        /* LENGTH OF OPN NAMES RETURNED + 4.*/ 02320000
                  FIXED BIN(15) INIT(0),                                02330000
             03 UNUSED_2                                                02340000
                  FIXED BIN(15) INIT(0),                                02350000
             03 ARRAY_OPN_NAMES(8) /* AREA FOR OPN NAMES RETURNED    */ 02360000
                  CHAR(4)       INIT(' '),                              02370000
          02 TRACE_NOS_AREA,     /* AREA CONTAINING UP TO 8 TRACE #'S*/ 02380000
             03 TRACE_LNGTH      /* LENGTH OF TRACE NO.S RETURNED + 4*/ 02390000
                  FIXED BIN(15) INIT(0),                                02400000
             03 UNUSED_3                                                02410000
                  FIXED BIN(15) INIT(0),                                02420000
             03 ARRAY_TRACE_NOS(8)/* AREA FOR TRACE NUMBERS RETURNED */ 02430000
                  CHAR(2)       INIT(' '),                              02440000
          02 DIAGNOS_AREA,       /* DIAGNOSTIC AREA.                 */ 02450000
             03 DIAGNOS_LNGTH    /* DIAGNOSTIC LENGTH.               */ 02460000
                  FIXED BIN(15) INIT(0),                                02470000
             03 UNUSED_4                                                02480000
                  FIXED BIN(15) INIT(0),                                02490000
             03 DIAGNOS_DATA     /* DIAGNOSTIC DATA.                 */ 02500000
                  CHAR(80) INIT(' ');                                   02510000
                                                                        02520000
   DCL 01 OUTPUT_AREA,                                                  02530000
          02 LNGTH               /* LENGTH OF APPL PGM REC TO WRITE  */ 02540000
               FIXED BIN(15) INIT(0),                                   02550000
          02 UNUSED                                                     02560000
               FIXED BIN(15) INIT(0),                                   02570000
          02 TEXT_OR_COMMAND     /* ACTUAL COMMAND OR RECORD TEXT.   */ 02580000
               CHAR(254) INIT(' ');                                     02590000
                                                                        02600000
   DCL 01 RETURN_AREA    CTL,    /* COMMAND RESULT AREA              */ 02610000
          02 LNGTH               /*   NUMBER OF BYTES                */ 02620000
             FIXED BIN(31),                                             02630000
          02 RTRN_BUFF           /*   OUTPUT BUFFER                  */ 02640000
             CHAR(*);                                                   02650000
                                                                        02660000
 /***********************************************************/          02670000
 /* GENERAL INITIALIZATION                                  */          02680000
 /***********************************************************/          02690000
                                                                        02700000
   FUNCTION   = 'COMMAND';          /* SET FUNCTION FOR IFI CALL     */ 02710000
   IFCA.LNGTH = STORAGE(IFCA);      /* BYTES USED IN MEMORY          */ 02720000
   IFCA.EYE_CATCHER = 'IFCA';       /* EYE CATCHER                   */ 02730000
   IFCA.OWNER_ID = 'LOC2';          /* DB2 LOCATION 1=LOCAL, 2=REMOTE*/ 02740000
   FREE RETURN_AREA;                /* FREE STORAGE AND THEN         */ 02750000
                                    /* ALLOCATE STORAGE FOR THE      */ 02760000
   ALLOCATE 1 RETURN_AREA,          /* RETURN AREA                   */ 02770000
              2 LNGTH,                                                  02780000
              2 RTRN_BUFF CHAR(4096);                                   02790000
                                                                        02800000
   RTRN_BUFF = ' ';                     /* CLEAR THE RETURN BUFFER   */ 02810000
   RETURN_AREA.LNGTH = 4096;            /* LENGTH OF RETURN BUFFER   */ 02820000
   TEXT_OR_COMMAND=BLANK;               /* CLEAR THE DB2 COMMAND AREA*/ 02830000
   OUTPUT_AREA.UNUSED = '00000000'B;        /* CLEAR THE UNUSED AREA */ 02840000
   OUTPUT_AREA.LNGTH = LENGTH(INPUTCMD)+4;  /* GET REAL LENGTH OF    */ 02850000
   OUTPUT_AREA.TEXT_OR_COMMAND = INPUTCMD;  /* ACTUAL DB2 COMMAND    */ 02860000
                                                                        02870000
   /******************************************/                         02880000
   /* MAKE THE IFI CALL VIA THE DSNWLI MACRO */                         02890000
   /******************************************/                         02900000
                                                                        02910000
   CALL DSNWLI (FUNCTION, IFCA, RETURN_AREA, OUTPUT_AREA);              02920000
                                                                        02930000
 /********************************************************************/ 02940000
 /* COPY SELECTED VARIABLES FROM IFI COMMAND RESULTS TO OUTPUT       */ 02950000
 /* PARAMETER VARIABLES TO PASS TO REQUESTER PROGRAM FOR PROCESSING. */ 02960000
 /********************************************************************/ 02970000
                                                                        02980000
   IFCA_RET_HEX = IFCA.IFCARC1;             /* RETURN CODE IN BINARY */ 02990000
   IFCA_RES_HEX = IFCA.IFCARC2;             /* REASON CODE IN BINARY */ 03000000
   BUFF_OVERFLOW = 0;            /* PLENTY OF ROOM IN BUFF SO FAR @47*/ 03010000
   BUFPOSI = 1;                  /* INIT POSITION IN RETURN AREA  @47*/ 03020000
   BUFPOSO = 1;                  /* INIT POSITION IN PASSED BUFF  @47*/ 03030000
   /******************************************************************/ 03040000
   /* COPY RECORDS FROM THE RETURN AREA TO THE CALLER'S BUFFER.   @47*/ 03050000
   /* PAD EACH RECORD IN THE CALLER'S BUFFER WITH BLANKS SO ITS   @47*/ 03060000
   /* LENGTH IS A MULTIPLE OF BUFROWLN.                           @47*/ 03070000
   /******************************************************************/ 03080000
                                                                        03090000
   IF IFCA.BYTES_MOVED ^= 0 THEN                                /*@47*/ 03100000
    DO;                                /* IF ANYTHING TO COPY     @47*/ 03110000
     DO WHILE (BUFPOSI <= IFCA.BYTES_MOVED - 2);                /*@47*/ 03120000
                                       /* COPY TEXT TO PASSED BUF @47*/ 03130000
       LEN_CHAR = (SUBSTR(RETURN_AREA.RTRN_BUFF,BUFPOSI,2));    /*@47*/ 03140000
                                       /* GET LENGTH BYTES        @47*/ 03150000
       LEN_BIT  = UNSPEC(LEN_CHAR);                             /*@47*/ 03160000
                                       /* CONVERT TO BIT STRING   @47*/ 03170000
       LEN_BIN  = LEN_BIT;                                      /*@47*/ 03180000
                                      /* THEN CONVERT TO BINARY   @47*/ 03190000
                                      /* CALC BYTES LEFT IN PASSED@47*/ 03200000
       LEN_BIN = LEN_BIN - 4;         /* TAKE LENGTH BYTES OFF LEN@47*/ 03210000
       SPACE_LEFT = (LEN_BIN / BUFROWLN) * BUFROWLN;            /*@47*/ 03220000
       IF MOD(LEN_BIN,BUFROWLN) > 0 THEN                        /*@47*/ 03230000
         SPACE_LEFT = SPACE_LEFT + BUFROWLN;                    /*@47*/ 03240000
       IF BUFPOSO + SPACE_LEFT - 1 > RETURN_LEN THEN            /*@47*/ 03250000
         BUFF_OVERFLOW = 1;           /* INDICATE BUFFER IS FULL  @47*/ 03260000
       IF BUFF_OVERFLOW = 1 THEN                                /*@47*/ 03270000
         LEAVE;                       /* CAN'T COPY MORE, GET OUT @47*/ 03280000
       BUFPOSI = BUFPOSI + 4;         /* MOVE PAST LENGTH BYTES   @47*/ 03290000
       IF BUFPOSI + LEN_BIN - 1 > IFCA.BYTES_MOVED THEN         /*@47*/ 03300000
         LEAVE;                       /* AT END OF BUFFER         @47*/ 03310000
       NUMFULL = LEN_BIN / BUFROWLN;  /* NUMBER OF FULL LINES     @47*/ 03320000
       PARTROW = MOD(LEN_BIN,BUFROWLN); /* LENGTH OF PARTIAL LINE @47*/ 03330000
       FILLBYTS = BUFROWLN - PARTROW;  /* NUMBER OF PAD BYTES NEED@47*/ 03340000
       IF NUMFULL > 0 THEN             /* MOVE ALL COMPLETE LINES @47*/ 03350000
         DO J = 1 TO NUMFULL;                                   /*@47*/ 03360000
           SUBSTR(FIXED_BUFF.FIXED_TEXT,BUFPOSO,BUFROWLN) =     /*@47*/ 03370000
             SUBSTR(RETURN_AREA.RTRN_BUFF,BUFPOSI,BUFROWLN);    /*@47*/ 03380000
           BUFPOSO = BUFPOSO + BUFROWLN; /* MOVE PAST STRG IN OUTP@47*/ 03390000
           BUFPOSI = BUFPOSI + BUFROWLN; /* MOVE PAST STRG IN INPT@47*/ 03400000
           REMBYTES = REMBYTES - BUFROWLN; /* CALCULATE BYTES LEFT@47*/ 03410000
         END;                                                   /*@47*/ 03420000
       IF PARTROW > 0 THEN                                      /*@47*/ 03430000
         DO;                             /* MOVE PARTIAL LINE     @47*/ 03440000
           SUBSTR(FIXED_BUFF.FIXED_TEXT,BUFPOSO,PARTROW) =      /*@47*/ 03450000
             SUBSTR(RETURN_AREA.RTRN_BUFF,BUFPOSI,PARTROW);     /*@47*/ 03460000
           BUFPOSI = BUFPOSI + PARTROW;  /* MOVE PAST STR IN INPUT@47*/ 03470000
           BUFPOSO = BUFPOSO + PARTROW - 1; /* MOVE TO END OF     @47*/ 03480000
                                            /* STRING IN OUTPUT   @47*/ 03490000
           SUBSTR(FIXED_BUFF.FIXED_TEXT,BUFPOSO,1) = BLANK;     /*@47*/ 03500000
                                         /* REPLACE THE NEW LINE  @47*/ 03510000
                                         /* CHARACTER IN THE LAST    */ 03520000
                                         /* POSITION WITH A BLANK    */ 03530000
           BUFPOSO = BUFPOSO + 1;        /* MOVE PAST STRG IN OUTP@47*/ 03540000
           REMBYTES = REMBYTES - PARTROW; /* CALCULATE BYTES LEFT @47*/ 03550000
         END;                                                   /*@47*/ 03560000
       IF PARTROW > 0 THEN               /* FILL UP SPACE WITH BLK@47*/ 03570000
         DO;                                                    /*@47*/ 03580000
           DO J = BUFPOSO TO (BUFPOSO + FILLBYTS - 1);          /*@47*/ 03590000
            SUBSTR(FIXED_BUFF.FIXED_TEXT,J,1) = ' ';            /*@47*/ 03600000
           END;                                                 /*@47*/ 03610000
           BUFPOSO = BUFPOSO + FILLBYTS; /* MOVE PAST BLANKS      @47*/ 03620000
         END;                                                   /*@47*/ 03630000
     END;                              /* COPY TEXT TO PASSED BUF @47*/ 03640000
     FIXED_BUFF.FIXED_LEN = BUFPOSO - 1;                        /*@47*/ 03650000
                                       /* GET BYTES IN PASSED BUF @47*/ 03660000
   END;                                /* IF ANYTHING TO COPY     @47*/ 03670000
 END DSN8EP2;                          /* END PROGRAM                */ 03680000