/TITLE RTVDB2 - Build DDS member
      *--------------------------------------------------------------*
      *  Programmers Group & Management Resources   Copyright  1998  *
      *                                                              *
      *                           \\\\\\\                            *
      *                          ( o   o )                           *
      *---------------------oOOO----(_)----OOOo----------------------*
      *                                                              *
      *  System name. . :  Programmer Tool                           *
      *  Program name . :  RTVDB2                                    *
      *  Text . . . . . :  Build DDS member                          *
      *                                                              *
      *  Author . . . . :  Alex Nubla                                *
      *                                                              *
      *  Description. . :  This program builds the temporary DDS     *
      *                    member requested for the entry file       *
      *                    using the RTVDBSRC command.               *
      *                                                              *
      *                    Return Codes:                             *
      *                    *Blank = Good Retrieval                   *
      *                        99 = No *ACCPTH record in QAFDACCP    *
      *                                                              *
      *                                                              *
      *                   OOOOO              OOOOO                   *
      *                   (    )             (    )                  *
      *--------------------(   )-------------(   )-------------------*
      *                     (_)               (_)                    *
      * Modules:                                                     *
      *                                                              *
      * 1. RTVDB1     CLLE     Build temporary files                 *
      * 2. RTVDB2     RPGLE    Build DDS member                      *
      *                                                              *
      * Programs:                                                    *
      *                                                              *
      * 1. *none                                                     *
      *                                                              *
      *--------------------------------------------------------------*
      * Modification Log :                                           *
      *                                                              *
      *            Task   Programmer/                                *
      *   Date      No.   Description                                *
      * --------  ------  ------------------------------------------ *
      *                   Alex Nubla                                 *
      *                   Creation Date                              *
      *                                                              *
      *--------------------------------------------------------------*
      *  APIs Used:                                                  *
      *                                                              *
      *  QUSDLTUS  Ä   Delete user space                             *
      *  QUSCRTUS  Ä   Create user space                             *
      *  QUSCUSAT  Ä   Change user space attributes                  *
      *  QUSPTRUS  Ä   Retrieve pointer to user space                *
      *  QUSLRCD   Ä   List Record Formats                           *
      *  QUSLFLD   Ä   List Fields                                   *
      *  QUSRTVUS  Ä   Retrieve user space                           *
      *                                                              *
      *--------------------------------------------------------------*
      /EJECT
     H COPYRIGHT('(C) Alex Nubla of PGMR, Inc.  1998')
      ****************************************************************
      *  F I L E   D E S C R I P T I O N   S P E C I F I C A T I O N *
      ****************************************************************
     FQAFDACCP  IF   E             DISK
      *
      *  File Access Path (built in RTVDB1)
      *
      *--------------------------------------------------------------*
     FQAFDJOIN  IF   E             DISK    UsrOpn
      *
      *  *Join File description (built in RTVDB1)
      *
      *--------------------------------------------------------------*
     FQAFDSELO  IF   E             DISK    UsrOpn
      *
      *  *Select / *Omit fields (built in RTVDB1)
      *
      *--------------------------------------------------------------*
     FQDDSSRC   UF A F   92        DISK
      *
      *  New member (built in RTVDB1)
      *
      *--------------------------------------------------------------*

      ****************************************************************
      *       D E F I N I T I O N     S P E C I F I C A T I O N      *
      ****************************************************************
      *
      *  Program Status Data Structure
      *
     D PGMDS          SDS
     D  Pgmq##           *PROC
     D  ErrorSts         *STATUS
     D  PrvStatus             16     20S 0
     D  SrcLinNum             21     28
     D  Routine          *ROUTINE
     D  NumParms         *PARMS
     D  ExcpType              40     42
     D  ExcpNum               43     46
      *
     D  PgmLib                81     90
     D  ExcpData              91    170
     D  ExcpId               171    174
     D  LastFile             201    208
     D  FileErr              209    243
     D  JobName              244    253
     D  User                 254    263
     D  JobNumA              264    269
     D  JobNum               264    269S 0
     D  JobDate              270    275S 0
     D  RunDate              276    281S 0
     D  RunTime              282    287S 0
     D  PgmCrtDt             288    293
     D  PgmCrtTm             294    299
     D  CmplrLvl             300    303
     D  SrcFile              304    313
     D  SrcLib               314    323
     D  SrcMbr               324    333
     D  ProcPgm              334    343
     D  ProcMod              344    353

      *--------------------------------------------------------------*
      *
      *  User space parameters
      *
      *       @ prefix - names
      *       # prefix - pointers
      *
      * ==========
      * Space name
      * ==========
      *
     D @SpcName        S             10    Based(#SpcName)
     D #SpcName        S               *
      *
      * =============
      * Space library
      * =============
      *
     D @SpcLib         S             10    Based(#SpcLib)
     D #SpcLib         S               *
      *
      * ==========
      * Space size
      * ==========
      *
     D @SpcSize        S              9B 0 Based(#SpcSize)
     D #SpcSize        S               *
      *
      * =============
      * Space pointer
      * =============
      *
     D @SpcPtr         S               *   Based(#SpcPtr)
     D #SpcPtr         S               *
      *
      * ================
      * Error message id
      * ================
      *
     D @MsgId          S              7    Based(#MsgId)
     D #MsgId          S               *
      *
      * ==================
      * Error message data
      * ==================
      *
     D @MsgDta         S            184    Based(#MsgDta)
     D #MsgDta         S               *

      *--------------------------------------------------------------*
      *
      *  Initial User Space Name & Library
      *
     D @UsNameLib      DS            20
     D  @UsName                      10    Inz('DBSPACE')
     D  @UsLib                       10    Inz('QTEMP')

      *--------------------------------------------------------------*
      *
      *  Fields used in List Record Formats (QUSLRCD) API
      *    and List Field (QUSLFLD) API
      *
     D @FormatR        S              8    Inz('RCDL0200')                      QUSLRCD Format name
     D @FormatF        S              8    Inz('FLDL0100')                      QUSLFLD Format name
     D @RecFmt         S             10    Inz                                  Record Format
     D @OvrdPrc        S              1    Inz('1')                             Override Processing
     D @QFile          S             20    Inz                                  Qualified File name
     D @RecText        S             50    Inz                                  Record Format Text
      *
      *  Format RCDL0200 List Data Section
      *
     D @Receiver1      DS            82
     D  @200Name                     10
     D  @200Id                       13
     D  @200Res1                      1
     D  @200RecLen                    9B 0
     D  @200NoFld                     9B 0
     D  @200Text                     50
      *
      *  Format FLDL0100 List Data Section
      *
     D @Receiver2      DS           268
     D  @100Field                    10
     D  @100Type                      1
     D  @100Use                       1
     D  @100OutBuf                    9B 0
     D  @100InBuf                     9B 0
     D  @100FldLen                    9B 0
     D  @100Digits                    9B 0
     D  @100DecPos                    9B 0
     D  @100FldTxt                   50
     D  @100EdtCde                    2
     D  @100EdwLen                    9B 0
     D  @100EdtWrd                   64
     D  @100ColHdg1                  20
     D  @100ColHdg2                  20
     D  @100ColHdg3                  20
     D  @100IntFld                   10
     D  @100Alias                    30
     D  @100AliasLn                   9B 0
     D  @100NoDBCS                    9B 0
     D  @100AlwNull                   1
     D  @100Host                      1
     D  @100DTFmt                     4
     D  @100DTSep                     1
     D  @100MIMap                     1

      *--------------------------------------------------------------*
      *
      *  Additional User Space parameters
      *
     D @ExtAttr        S             10    Inz('RTVDBSRC')
     D @InitValue      S              1    Inz(X'00')
     D @PubAut         S             10    Inz('*ALL')
     D @Text           S             50    Inz('User space for RTVDBSRC')
     D @Replace        S             10    Inz('*NO')
     D @FrcToAux       S              1    Inz('1')
     D @StartPos       S              9B 0 Inz(1)
     D @StartEnt       S              9B 0 Inz(1)
     D @DataLen        S              9B 0 Inz(192)
     D @Size           S              9B 0 Inz(4096)
     D @Loop           S              5P 0
     D @BasePtr        S               *

      *--------------------------------------------------------------*
      *
      *  Record structure for error code parameter
      *
     D@ErrData         DS
     D  @BytesProv                    9B 0 Inz(200)
     D  @BytesAval                    9B 0
     D  @ExcpId                       7
     D  @Reserved1                    1
     D  @ExcpData                   184

      *--------------------------------------------------------------*
      *
      *  Change attribute parameters
      *
     D@ChgAttr         DS
     D  @NbrAttr                      9B 0 Inz(2)
      *
     D  @Attr2                        9B 0 Inz(2)
     D  @Attr2Len                     9B 0 Inz(1)
     D  @Attr2Dta                     1    Inz(X'00')
      *
     D  @Attr3                        9B 0 Inz(3)
     D  @Attr3Len                     9B 0 Inz(1)
     D  @Attr3Dta                     1    Inz('1')

      *--------------------------------------------------------------*
      *
      *  Generic Header Format 0100
      *
     D@GenHeader       DS                  Based(@SpcPtr)
     D  @QUserArea             1     64
     D  @QSzGenHdr            65     68B 0
     D  @QStrRelLv            69     72
     D  @QFmtName             73     80
     D  @QApiUsed             81     90
     D  @QDtTmCrtd            91    103
     D  @QInfoSts            104    104
     D  @QUsSize             105    108B 0
     D  @QOfstInp            109    112B 0
     D  @QSizeInp            113    116B 0
     D  @QOfstHdr            117    120B 0
     D  @QSzHdrSec           121    124B 0
     D  @QOfstLst            125    128B 0
     D  @QSizeLst            129    132B 0
     D  @QNoLstEnt           133    136B 0
     D  @QLstEntSz           137    140B 0
     D  @QCCSIdLst           141    144B 0
     D  @QCntryId            145    146
     D  @QLangId             147    149
     D  @QSubLstIn           150    150
     D  @QUsResrvd           151    192

      *--------------------------------------------------------------*
      *
      *  New source date
      *
     D                 ds
     D DateRtn                       32A
     D  NewDat                        6S 0 overlay(DateRtn:  1)

      *--------------------------------------------------------------*
      *
      *  New source record
      *
     DNewSource        ds                  Inz
     D  NsSeqNo                1      5    Inz
     D  NsFormType             6      6    Inz
     D  NsComment              7      7    Inz
     D  NsConditn              8     16    Inz
     D  NsNameType            17     17    Inz
     D  NsReservd1            18     18    Inz
     D  NsName                19     28    Inz
     D  NsRef                 29     29    Inz
     D  NsLen                 30     34    Inz
     D  NsDataType            35     35    Inz
     D  NsDec                 36     37    Inz
     D  NsUsage               38     38    Inz
     D  NsLocation            39     44    Inz
     D  NsKeyword             45     80    Inz
     D  NsLen#         S              5S 0 Inz
     D  NsDec#         S              2S 0 Inz

      *--------------------------------------------------------------*
      *
      *  Record Format array and information
      *
     D RfArray         DS
     D  RfInfo                       60    dim(99)
     D   RfName                      10    overlay(RfInfo:  1)
     D   RfText                      50    overlay(RfInfo: 11)
     D Rf#             S              3  0 Inz EXPORT
     D Lf#             S              3  0 Inz

      *--------------------------------------------------------------*
      *
      *  Physical File array - for logical file only
      *
     D PfArray         DS                  EXPORT
     D  PfInfo                       10    dim(32)
     D Pf#             S              3  0 Inz EXPORT
     D PfAccess        S              3  0 Inz EXPORT

      *--------------------------------------------------------------*
      *
      *  Join File array - for logical file only
      *
     D JfArray         DS                  EXPORT
     D  JfInfo                       10    dim(32)
     D Jf#             S              3  0 Inz EXPORT

      *--------------------------------------------------------------*
      *
      *  Text Line array
      *
     D LnArray         DS                  Inz
     D  Line1                        36
     D  Line2                        36
     D  Line3                        36
     D  Line4                        36
     D  Line5                        36
     D  Line6                        36
     D  Line7                        36
     D  Line8                        36
     D  Line9                        36
     D  Line10                       36
     D Lin             S             36    Inz Dim(10)
     D Ln#             S              3  0 Inz

      *--------------------------------------------------------------*
      *
      *  From & To file for Join
      *
     D CurJFiles       DS
     D  JNJFNM                       10
     D  JNJTNM                       10
      *
     D SavJFiles       DS
     D  SVJFNM                       10
     D  SVJTNM                       10

      *--------------------------------------------------------------*
      *
      *  Constants
      *
     D @Yes            C                   const('Y')
     D @No             C                   const('N')
     D @PF             C                   const('Physical File  . . :')
     D @LF             C                   const('Logical file . . . :')
     D @Unique         C                   const('UNIQUE')
     D @Minus          C                   const('-')
     D @Plus           C                   const('+')
     D @Descend        C                   const('DESCEND')
     D @Ascend         C                   const(' ')
     D @Signed         C                   const('SIGNED')
     D @Unsigned       C                   const(' ')
     D @Zone           C                   const('ZONE')
     D @NotZone        C                   const(' ')

      *--------------------------------------------------------------*
      *
      *  Standalone fields
      *
     D Lilian          S              9B 0 Inz
     D Second          S              8A   Inz
     D GregDt          S             17A   Inz
     D Picture         S             32A   Inz('Mmmmmmmmmz ZD, YYYY')
     D Picture2        S             32A   Inz('MM/DD/YY')
     D DateTxt         S             32A   Inz
     D DateMDY         S             32A   Inz
     D Lbl             S             80    Dim(24) CtData PerRcd(1)             Std comments
     D Lbl#            S              3  0
     D Fil#            S              3  0
     D Maint           S              8
     D KeyOrder        S              8
     D Unique          S              1
     D Keyed           S              1
     D SelOmt          S              1
     D Join            S              1
     D Key#            S                   Inz Like(APNKYF)
     D KeyFld          S                   Inz Like(APKEYF)
     D LFFormat        S                   Inz Like(APBOLF)
     D Pfile           S                   Inz Like(APBOF)
     D Jfile           S                   Inz Like(JNDNAM)
     D KeySeq          S              8    Inz
     D KeySign         S              8    Inz
     D KeyZone         S              4    Inz
     D TstTxt          S            360    Inz
     D Txt34           S             34    Inz
     D Cont            S              1    Inz
     D TxtLen          S              3  0 Inz
     D Remain          S              3  0 Inz
     D Scan            S              3  0 Inz
     D BrkPos          S              3  0 Inz

      /EJECT
      ****************************************************************
      *           I N P U T     S P E C I F I C A T I O N            *
      ****************************************************************
     IQDDSSRC   NS
     I                             S    1    6 2SRCSEQ
     I                             S    7   12 0SRCDAT
     I                                 13   92  SRCDTA
      /EJECT
      ****************************************************************
      *     C A L C U L A T I O N     S P E C I F I C A T I O N      *
      ****************************************************************
      *
      *  Entry parameter list
      *
     C     *Entry        plist
     C                   parm                    File             10
     C                   parm                    FileL            10
     C                   parm                    ObjAtr           10
     C                   parm                    Mbr              10
     C                   parm                    Text             50
     C                   parm                    Rtncde            2
      *
     C                   Eval      %Subst(@QFile: 1: 10) = File
     C                   Eval      %Subst(@QFile:11: 10) = FileL

      *----------------------------------------------------*
      *  Get the local date                                *
      *----------------------------------------------------*
     C                   Callb(d)  'CEELOCT'
     C                   Parm                    Lilian
     C                   Parm                    Second
     C                   Parm                    GregDt
     C                   Parm                    *Omit
      *
     C                   Callb(d)  'CEEDATE'
     C                   Parm                    Lilian
     C                   Parm      'YYMMDD'      Picture
     C                   Parm                    DateRtn
     C                   Parm                    *Omit
      *
     C                   Reset                   Picture
     C                   Callb(d)  'CEEDATE'
     C                   Parm                    Lilian
     C                   Parm                    Picture
     C                   Parm                    DateTxt
     C                   Parm                    *Omit
      *
     C                   Reset                   Picture2
     C                   Callb(d)  'CEEDATE'
     C                   Parm                    Lilian
     C                   Parm                    Picture2
     C                   Parm                    DateMDY
     C                   Parm                    *Omit
      *
      *----------------------------------------------------*
      *  Initialize pointers                               *
      *----------------------------------------------------*
     C                   Eval      #SpcName    = %addr(@UsName)
     C                   Eval      #SpcLib     = %addr(@UsLib)
     C                   Eval      #SpcSize    = %addr(@Size)
     C                   Eval      #SpcPtr     = %addr(@BasePtr)
      *----------------------------------------------------*
      *  Create a new user space                           *
      *----------------------------------------------------*
     C                   Exsr      $CrtUs
      *
     C                   Eval      SRCSEQ      = 0
     C                   Eval      SRCDAT      = NewDat
      *----------------------------------------------------*
      *  Retrieve list of Record formats for the file      *
      *----------------------------------------------------*
     C                   Exsr      $RecFmt
      *
      *----------------------------------------------------*
      *  Write the standard label & file level keywords    *
      *----------------------------------------------------*
     C                   Exsr      $StdLbl
      *
      *----------------------------------------------------*
      *  Write record & field level source                 *
      *----------------------------------------------------*
     C                   If        RtnCde      = *Blanks
     C     1             Do        Rf#           Lf#
     C                   Exsr      $CrtUs
     C                   Eval      @RecFmt     = RfName(Lf#)
     C                   Eval      @RecText    = RfText(Lf#)
     C                   Eval      LnArray     = *Blanks
      *
     C                   Eval      NsComment   = '*'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *         *------------------------------------------*
      *         *  Write the Record Level                  *
      *         *------------------------------------------*
     C                   Eval      TstTxt      = %Trimr('TEXT(''')   +
     C                                           %Trim(@RecText)     +
     C                                           ''')'
     C                   Eval      Cont        = @Plus
     C     @RecText      CasNe     *Blanks       $BrkLin
     C                   EndCs
      *
     C                   If        Line1      <> *Blanks
     C                   Eval      NsKeyword   = Line1
     C                   EndIf
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsNameType  = 'R'
     C                   Eval      NsName      = @RecFmt
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *
     C     2             Do        9             Ln#
     C                   If        Lin(Ln#)   <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = Lin(Ln#)
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
     C                   Leave
     C                   EndIf
     C                   EndDo
      *
      *         *------------------------------------------*
      *         *  Write PFILE keyword                     *
      *         *------------------------------------------*
     C                   If        Pfile      <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = %Trimr('PFILE(')    +
     C                                           %Trimr(Pfile)       +
     C                                           ')'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
      *         *------------------------------------------*
      *         *  Write Join logical keywords             *
      *         *------------------------------------------*
     C     Join          CasEq     @Yes          $LstJoin
     C                   EndCs
     C                   EndIf
      *         *------------------------------------------*
      *         *  Write the Field Level                   *
      *         *------------------------------------------*
     C                   Eval      NsComment   = '*'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Exsr      $LstFld
      *         *------------------------------------------*
      *         *  Write the Key fields (if any)           *
      *         *------------------------------------------*
     C                   Exsr      $LstKFld
      *         *------------------------------------------*
      *         *  Write the Select/Omit fields (if any)   *
      *         *------------------------------------------*
     C     SelOmt        CasEq     @Yes          $LstSelO
     C                   EndCs
     C                   EndDo
     C                   EndIf

     C                   Eval      *InLr       = *On
     C                   Return
      /EJECT
      ****************************************************************
      *                    S U B R O U T I N E S                     *
      ****************************************************************
      /SPACE
      *==============================================================*
      *                                                              *
      *  Create a new user space for this job                        *
      *                                                              *
      *  Parameters:  All parameters used in this routine are based  *
      *               on pointers -- names prefix by #. (E.g. If you *
      *               use @SpaceName, the pointer used is called     *
      *               #SpaceName.  Prior to executing the routine,   *
      *               you should have initialized the pointer using  *
      *               Eval #SpaceName = %addr(@SpaceName).)          *
      *                                                              *
      *  Input:                                                      *
      *               @SpcName    Name of the user space to be used  *
      *                           by this routine.  This field is    *
      *                           based on #SpcName.  Prior to       *
      *                           running this routine, it is assumed*
      *                           that #SpcName has been initialized.*
      *               @SpcLib     Name of the library used by the    *
      *                           space name.                        *
      *               @SpcSize    Initial size of the user space to  *
      *                           be allocated by the job.           *
      *                                                              *
      *  Output:                                                     *
      *               @SpcPtr     Pointer used by the user space     *
      *               @MsgId      Error id received when using the   *
      *                           API's.  This will be blank If all  *
      *                           executions are sucessful.          *
      *               @MsgDta     Message data associated with the   *
      *                           Message Id.                        *
      *                                                              *
     C     $CrtUs        BEGSR
      *==============================================================*
      *
      *----------------------------------------------------*
      *  Delete any existing user space                    *
      *----------------------------------------------------*
     C                   Call      'QUSDLTUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @ErrData
      *----------------------------------------------------*
      *  Create the user space                             *
      *----------------------------------------------------*
     C                   Eval      @ExcpId     = *Blanks
     C                   Eval      @BytesProv  = 200
      *
     C                   Call      'QUSCRTUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @ExtAttr
     C                   Parm                    @SpcSize
     C                   Parm                    @InitValue
     C                   Parm                    @PubAut
     C                   Parm                    @Text
     C                   Parm                    @Replace
     C                   Parm                    @ErrData
      *
     C                   If        @BytesAval  > 0
     C                   Eval      @MsgId      = @ExcpId
     C                   Eval      @MsgDta     = @ExcpData
     C                   Else
      *
      *----------------------------------------------------*
      *  Change the user space & expand the size           *
      *----------------------------------------------------*
     C                   Eval      @ExcpId     = *Blanks
     C                   Eval      @BytesProv  = 200
      *
     C                   Call      'QUSCUSAT'
     C                   Parm                    @UsLib
     C                   Parm                    @UsName
     C                   Parm                    @ChgAttr
     C                   Parm                    @ErrData
      *
     C                   If        @BytesAval  > 0
     C                   Eval      @MsgId      = @ExcpId
     C                   Eval      @MsgDta     = @ExcpData
     C                   Else
      *
      *----------------------------------------------------*
      *  Retrieve pointer to user space                    *
      *----------------------------------------------------*
     C                   Call      'QUSPTRUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @SpcPtr
     C                   Parm                    @ErrData
      *
     C                   EndIf
     C                   EndIf
      *
     C     #CrtUs        ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  Get all record format for the file                          *
      *                                                              *
     C     $RecFmt       BEGSR
      *==============================================================*
     C                   Eval      @ExcpId     = *Blanks
     C                   Eval      @BytesProv  = 200
      *----------------------------------------------------*
      *  List Record Formats (QUSLRCD) API                 *
      *----------------------------------------------------*
     C                   Call      'QUSLRCD'
     C                   Parm                    @UsNameLib
     C                   Parm                    @FormatR
     C                   Parm                    @QFile
     C                   Parm                    @OvrdPrc
      *         *------------------------------------------*
      *         *  Look for the generic header format to   *
      *         *  determine how info will be retrieved    *
      *         *  in the user space.                      *
      *         *------------------------------------------*
     C                   Eval      @BytesProv  = 200
      *
     C                   Call      'QUSRTVUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @StartPos
     C                   Parm                    @DataLen
     C                   Parm                    @GenHeader
     C                   Parm                    @ErrData
      *
     C                   If        @BytesAval  > 0
     C                   Eval      @MsgId      = @ExcpId
     C                   Eval      @MsgDta     = @ExcpData
     C                   EndIf
      *
      *         *------------------------------------------*
      *         *  Determine the size of each entries      *
      *         *------------------------------------------*
     C                   If        @QLstEntSz  < 82
     C                   Eval      @DataLen    = @QLstEntSz
     C                   Else
     C                   Eval      @DataLen    = 82
     C                   EndIf
      *         *------------------------------------------*
      *         *  Retrieve the number of entries          *
      *         *------------------------------------------*
     C                   Eval      @Loop       = @QNoLstEnt
      *         *------------------------------------------*
      *         *  Get the starting position and increased *
      *         *  the offset by 1 (user space is based on *
      *         *  base 0, we compute under base 1)        *
      *         *------------------------------------------*
     C                   Eval      @StartEnt   = @QOfstLst + 1

      *----------------------------------------------------*
      *  Loop thru the list of record format entries       *
      *----------------------------------------------------*
     C                   Dow       @Loop       > 0
      *
     C                   Call      'QUSRTVUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @StartEnt
     C                   Parm                    @DataLen
     C                   Parm                    @Receiver1
     C                   Parm                    @ErrData
      *
     C                   If        @200Name    = *Blanks
     C                   Leave
     C                   EndIf
      *
     C                   If        @BytesAval  > 0
     C                   Eval      @MsgId      = @ExcpId
     C                   Eval      @MsgDta     = @ExcpData
     C                   EndIf
      *         *------------------------------------------*
      *         *  Store info into array - up to 99 elem   *
      *         *------------------------------------------*
     C                   Eval      Rf#         = Rf# + 1
     C                   Eval      RfName(Rf#) = @200Name
     C                   Eval      RfText(Rf#) = @200Text
      *
     C                   If        Rf#         = 99
     C                   Leave
     C                   EndIf
      *
      *         *------------------------------------------*
      *         *  Position to the record format entry     *
      *         *------------------------------------------*
     C                   Eval      @StartEnt   = @StartEnt + @QLstEntSz
     C                   Eval      @Loop       = @Loop - 1
     C                   EndDo
      *
     C     #RecFmt       ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  List all the fields per record format & write to source     *
      *                                                              *
     C     $LstFld       BEGSR
      *==============================================================*
     C                   Eval      @ExcpId     = *Blanks
     C                   Eval      @BytesProv  = 200
      *----------------------------------------------------*
      *  List Fields (QUSLFLD) API                         *
      *----------------------------------------------------*
     C                   Call      'QUSLFLD'
     C                   Parm                    @UsNameLib
     C                   Parm                    @FormatF
     C                   Parm                    @QFile
     C                   Parm                    @RecFmt
     C                   Parm                    @OvrdPrc
      *         *------------------------------------------*
      *         *  Look for the generic header format to   *
      *         *  determine how info will be retrieved    *
      *         *  in the user space.                      *
      *         *------------------------------------------*
     C                   Eval      @BytesProv  = 200
      *
     C                   Call      'QUSRTVUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @StartPos
     C                   Parm                    @DataLen
     C                   Parm                    @GenHeader
     C                   Parm                    @ErrData
      *
     C                   If        @BytesAval  > 0
     C                   Eval      @MsgId      = @ExcpId
     C                   Eval      @MsgDta     = @ExcpData
     C                   EndIf
      *
      *         *------------------------------------------*
      *         *  Determine the size of each entries      *
      *         *------------------------------------------*
     C                   If        @QLstEntSz  < 268
     C                   Eval      @DataLen    = @QLstEntSz
     C                   Else
     C                   Eval      @DataLen    = 268
     C                   EndIf
      *         *------------------------------------------*
      *         *  Retrieve the number of entries          *
      *         *------------------------------------------*
     C                   Eval      @Loop       = @QNoLstEnt
      *         *------------------------------------------*
      *         *  Get the starting position and increased *
      *         *  the offset by 1 (user space is based on *
      *         *  base 0, we compute under base 1)        *
      *         *------------------------------------------*
     C                   Eval      @StartEnt   = @QOfstLst + 1

      *----------------------------------------------------*
      *  Loop thru the list of record format entries       *
      *----------------------------------------------------*
     C                   Dow       @Loop       > 0
      *
     C                   Call      'QUSRTVUS'
     C                   Parm                    @UsNameLib
     C                   Parm                    @StartEnt
     C                   Parm                    @DataLen
     C                   Parm                    @Receiver2
     C                   Parm                    @ErrData
      *
     C                   If        @100Field   = *Blanks
     C                   Leave
     C                   EndIf
      *
     C                   If        @BytesAval  > 0
     C                   Eval      @MsgId      = @ExcpId
     C                   Eval      @MsgDta     = @ExcpData
     C                   EndIf

     C                   Eval      LnArray     = *Blanks

      *         *------------------------------------------*
      *         *  Field Name, Length, Type, Decimal & Text*
      *         *------------------------------------------*
     C                   Eval      TstTxt      = %Trimr('TEXT(''')   +
     C                                           %Trim(@100FldTxt)   +
     C                                           ''')'
     C                   Eval      Cont        = @Plus
     C     @100FldTxt    CasNe     *Blanks       $BrkLin
     C                   EndCs
      *
     C                   If        Line1      <> *Blanks
     C                   Eval      NsKeyword   = Line1
     C                   EndIf
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsName      = @100Field
     C                   Eval      NsDataType  = @100Type
      *         *--Time/Date/Timestamp---------------------*
     C                   If        @100Type    = 'L' or                         Date
     C                             @100Type    = 'T' or                         Time
     C                             @100Type    = 'Z'                            TimeStamp
     C                   Eval      NsLen       = *Blanks
     C                   Else
      *         *--Other data type-------------------------*
     C                   Eval      NsLen#      = @100FldLen
     C                   Eval      NsLen       = %Editc(NsLen#:'Z')
      *         *--Packed/Zoned/Binary---------------------*
     C                   If        @100Type    = 'P' or                         Packed
     C                             @100Type    = 'Z' or                         Zoned
     C                             @100Type    = 'B'                            Binary
     C                   Eval      NsLen#      = @100Digits
     C                   Eval      NsLen       = %Editc(NsLen#:'Z')
     C                   Eval      NsDec#      = @100DecPos
     C                   Eval      NsDec       = %Editc(NsDec#:'Z')
     C                   EndIf
     C                   EndIf
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *
     C     2             Do        9             Ln#
     C                   If        Lin(Ln#)   <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = Lin(Ln#)
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
     C                   Leave
     C                   EndIf
     C                   EndDo

      *         *------------------------------------------*
      *         *  Column Heading                          *
      *         *------------------------------------------*
     C                   If        @100ColHdg1<> *Blanks or
     C                             @100ColHdg2<> *Blanks or
     C                             @100ColHdg3<> *Blanks
      *
     C                   Eval      TstTxt      = %Trimr('COLHDG(''')
     C                   If        @100ColHdg1<> *Blanks
     C                   Eval      TstTxt      = %Trimr(TstTxt)      +
     C                                           %Trim(@100ColHdg1)  +
     C                                           ''''
     C                   EndIf
     C                   If        @100ColHdg2<> *Blanks
     C                   Eval      TstTxt      = %Trimr(TstTxt)      +
     C                                           ' '''               +
     C                                           %Trim(@100ColHdg2)  +
     C                                           ''''
     C                   EndIf
     C                   If        @100ColHdg3<> *Blanks
     C                   Eval      TstTxt      = %Trimr(TstTxt)      +
     C                                           ' '''               +
     C                                           %Trim(@100ColHdg3)  +
     C                                           ''''
     C                   EndIf
     C                   Eval      TstTxt      = %Trimr(TstTxt)      +
     C                                           ')'
     C                   Eval      Cont        = @Plus
     C                   Exsr      $BrkLin
      *
     C                   Do        10            Ln#
     C                   If        Lin(Ln#)   <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = Lin(Ln#)
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
     C                   Leave
     C                   EndIf
     C                   EndDo
      *
     C                   EndIf

      *         *------------------------------------------*
      *         *  Alternative field name                  *
      *         *------------------------------------------*
     C                   If        @100Alias  <> *Blanks
      *
     C                   Eval      TstTxt      = %Trimr('ALIAS(')    +
     C                                           %Trim(@100Alias)    +
     C                                           ')'
     C                   Eval      Cont        = @Minus
     C                   Exsr      $BrkLin
      *
     C                   Do        10            Ln#
     C                   If        Lin(Ln#)   <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = Lin(Ln#)
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
     C                   Leave
     C                   EndIf
     C                   EndDo
      *
     C                   EndIf

      *         *------------------------------------------*
      *         *  Edit Code                               *
      *         *------------------------------------------*
     C                   If        @100EdtCde <> *Blanks
      *
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = %Trimr('EDTCDE')    +
     C                                           %Trimr(@100EdtCde)  +
     C                                           ')'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *
     C                   EndIf

      *         *------------------------------------------*
      *         *  Date Format                             *
      *         *------------------------------------------*
      *
      *         *--Time/Date/Timestamp---------------------*
     C                   If        @100Type    = 'L' or                         Date
     C                             @100Type    = 'T' or                         Time
     C                             @100Type    = 'Z'                            TimeStamp
      *
     C                   If        @100DTFmt  <> *Blanks
      *
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = %Trimr('DATFMT(')    +
     C                                           %Trimr(@100DTFmt)   +
     C                                           ')'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *
     C                   EndIf

      *         *------------------------------------------*
      *         *  Date Seperator                          *
      *         *------------------------------------------*
      *
      *         *--Time/Date-------------------------------*
     C                   If        NsDataType  = 'L' or                         Date
     C                             NsDataType  = 'T'                            Time
     C                   If        @100DTSep  <> *Blanks
      *
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = %Trimr('DATSEP(')    +
     C                                           %Trimr(@100DTSep)   +
     C                                           ')'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *
      *
     C                   EndIf
     C                   EndIf                                                  Type = L,T
      *
     C                   EndIf                                                  Type = L,T,Z

      *         *------------------------------------------*
      *         *  Allow Null                              *
      *         *------------------------------------------*
     C                   If        @100AlwNull = '1'
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = 'ALWNULL'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   EndIf
      *
      *         *------------------------------------------*
      *         *  Position to the record format entry     *
      *         *------------------------------------------*
     C                   Eval      @StartEnt   = @StartEnt + @QLstEntSz
     C                   Eval      @Loop       = @Loop - 1
     C                   EndDo
      *
     C     #LstFld       ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  List all the key fields per record format & write to source *
      *                                                              *
     C     $LstKFld      BEGSR
      *==============================================================*
     C                   If        Key#        > 0
     C                   Eval      NsComment   = '*'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   EndIf
      *
     C                   Do        Key#
      *----------------------------------------------------*
      *  Write key field & keywords to source              *
      *----------------------------------------------------*
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsNameType  = 'K'
     C                   Eval      NsName      = KeyFld
     C                   Eval      NsKeyword   = %Trimr(KeySeq)  + ' ' +
     C                                           %Trimr(KeySign) + ' ' +
     C                                           %Trimr(KeyZone)
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *----------------------------------------------------*
      *  Read the next key from QAFDACCP                   *
      *----------------------------------------------------*
     C                   Read      QAFDACCP                               90
     C                   If        *In90
     C                   Leave
     C                   EndIf
      *         *------------------------------------------*
      *         *  Get Key information                     *
      *         *------------------------------------------*
     C                   Eval      KeyFld      = APKEYF
     C                   If        APKSEQ      = 'A'
     C                   Eval      KeySeq      = @Ascend
     C                   Else
     C                   Eval      KeySeq      = @Descend
     C                   EndIf
     C                   If        APKSIN      = @Yes
     C                   Eval      KeySign     = @Signed
     C                   Else
     C                   Eval      KeySign     = @Unsigned
     C                   EndIf
     C                   If        APKZD       = @Yes
     C                   Eval      KeyZone     = @Zone
     C                   Else
     C                   Eval      KeyZone     = @NotZone
     C                   EndIf
      *         *------------------------------------------*
      *         *  Get Pfile info if different             *
      *         *------------------------------------------*
     C                   If        APJOIN      = @No   and
     C                             APFATR      = 'LF'
     C                   If        Pfile      <> APBOF
     C                   Eval      Pfile       = APBOF
     C                   Eval      Pf#         = Pf# + 1
     C                   Eval      PfInfo(Pf#) = APBOF
     C                   EndIf
     C                   EndIf
      *         *------------------------------------------*
      *         *  Make sure the same record format        *
      *         *------------------------------------------*
     C                   If        APBOLF     <> *Blanks  and
     C                             LFFormat   <> @RecFmt
     C                   Eval      LFFormat    = APBOLF
     C                   Leave
     C                   EndIf
      *
     C                   Enddo
      *
     C     #LstKFld      ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  List Join keywords                                          *
      *                                                              *
     C     $LstJoin      BEGSR
      *==============================================================*
     C                   Eval      LnArray     = *Blanks
      *----------------------------------------------------*
      *  Write JFILE keyword                               *
      *----------------------------------------------------*
     C                   Eval      TstTxt      = %Trimr('JFILE(')
     C                   Do        Jf#           Fil#
     C                   If        Fil#        = 1
     C                   Eval      TstTxt      = %Trimr(TstTxt) + JfInfo(Fil#)
     C                   Else
     C                   Eval      TstTxt      = %Trimr(TstTxt) + ' ' +
     C                                           JfInfo(Fil#)
     C                   EndIf
     C                   Enddo
     C                   Eval      TstTxt      = %Trimr(TstTxt) + ')'
     C                   Eval      Cont        = @Plus
     C                   Exsr      $BrkLin
      *
     C                   Do        10            Ln#
     C                   If        Lin(Ln#)   <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = Lin(Ln#)
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
     C                   Leave
     C                   EndIf
     C                   EndDo
      *----------------------------------------------------*
      *  Write JOIN & JFLD keywords                        *
      *----------------------------------------------------*
     C     1             Chain     QAFDJOIN                           92
     C                   Dow       Not *In92
     C                   If        JNJFRM      > *Zero    and
     C                             JNJTO       > *Zero
     C                   If        CurJFiles  <> SavJFiles
     C                   Eval      SVJFNM      = JNJFNM
     C                   Eval      SVJTNM      = JNJTNM
      *         *------------------------------------------*
      *         *  JOIN keyword                            *
      *         *------------------------------------------*
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsNameType  = 'J'
     C                   Eval      NsKeyword   = %Trimr('JOIN(') +
     C                                           %Trimr(JNJFNM)  +  ' ' +
     C                                           %Trimr(JNJTNM)  +  ')'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
      *         *------------------------------------------*
      *         *  JFLD keyword                            *
      *         *------------------------------------------*
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = %Trimr('JFLD(') +
     C                                           %Trimr(JNJFD1)  +  ' ' +
     C                                           %Trimr(JNJFD2)  +  ')'
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   EndIf
     C                   EndIf
     C                   Read      QAFDJOIN                               92
     C                   EndDo
      *
     C     #LstJoin      ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  List all select / omit fields per record format & write     *
      *                                                              *
     C     $LstSelO      BEGSR
      *==============================================================*
      *
     C     1             Chain     QAFDSELO                           91
     C                   Dow       Not *In91
     C                   If        SORFMT      = @RecFmt
      *----------------------------------------------------*
      *  Write select / omit keywords to source            *
      *----------------------------------------------------*
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsNameType  = SORULE
     C                   Eval      NsName      = SOFLD
     C                   If        SOCOMP      = 'AL'
     C                   Eval      NsKeyword   = 'ALL'
     C                   Else
     C                   Eval      NsKeyword   = %Trimr('COMP(')     +
     C                                           %Trimr(SOCOMP)      +
     C                                           ' '                 +
     C                                           %Trimr(SOVALU)      +
     C                                           ')'
     C                   EndIf
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   EndIf
     C                   Read      QAFDSELO                               91
     C                   EndDo
      *
     C     #LstSelO      ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  Print Standard DDS Labels                                   *
      *                                                              *
     C     $StdLbl       BEGSR
      *==============================================================*
     C     1             Do        24            Lbl#
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = Lbl(Lbl#)
     C                   Select
      *         *------------------------------------------*
      *         *  Database Label                          *
      *         *------------------------------------------*
     C                   When      Lbl#        = 8
     C                   If        ObjAtr      = 'PF'
     C                   Eval      %Subst(SRCDTA: 10: 20) = @PF
     C                   Else
     C                   Eval      %Subst(SRCDTA: 10: 20) = @LF
     C                   EndIf
     C                   Eval      %Subst(SRCDTA: 32: 10) = File
      *         *------------------------------------------*
      *         *  Text Label                              *
      *         *------------------------------------------*
     C                   When      Lbl#        = 9
     C                   Eval      %Subst(SRCDTA: 32: 34) = Text
      *         *------------------------------------------*
      *         *  Date Label                              *
      *         *------------------------------------------*
     C                   When      Lbl#        = 10
     C                   Eval      %Subst(SRCDTA: 32: 32) = DateTxt
     C                   When      Lbl#        = 22
     C                   Eval      %Subst(SRCDTA:  9:  8) = DateMDY
     C                   EndSl
     C                   Except    WrtSrc
     C                   Enddo

      *----------------------------------------------------*
      *  Build fields used for file level keywords. Read   *
      *  the first record of QAFDACCP for this info.       *
      *----------------------------------------------------*
     C                   Read      QAFDACCP                               90
     C                   If        *In90
     C                   Eval      RtnCde      = '99'
     C                   Else
      *
      *         *------------------------------------------*
      *         *  Get Access path order of key            *
      *         *------------------------------------------*
     C                   Select
     C                   When      APKEYO      = 'L'
     C                   Eval      KeyOrder    = 'LIFO'
     C                   When      APKEYO      = 'F'
     C                   Eval      KeyOrder    = 'FIFO'
     C                   When      APKEYO      = 'C'
     C                   Eval      KeyOrder    = 'FCFO'
     C                   EndSl
      *         *------------------------------------------*
      *         *  Is key UNIQUE                           *
      *         *------------------------------------------*
     C                   Eval      Unique      = APUNIQ
      *         *------------------------------------------*
      *         *  Access path: A-Arrival, K-Keyed         *
      *         *------------------------------------------*
     C                   Eval      Keyed       = APACCP
      *         *------------------------------------------*
      *         *  Select/Omit file: Y-Yes, N-No           *
      *         *------------------------------------------*
     C                   Eval      SelOmt      = APSELO
     C                   If        SelOmt      = @Yes
     C                   Open      QAFDSELO
     C                   EndIf
      *         *------------------------------------------*
      *         *  Join logical file: Y-Yes, N-No          *
      *         *------------------------------------------*
     C                   Eval      Join        = APJOIN
     C                   If        APJOIN      = @Yes
     C                   Open      QAFDJOIN
     C                   Eval      *In92       = *Off
     C                   Eval      JFile       = *Blanks
      *
     C                   Dow       Not *In92
     C                   Read      QAFDJOIN                               92
     C                   If        Not *In92   and
     C                             JFile      <> JNDNAM
     C                   Eval      JFile       = JNDNAM
     C                   Eval      Jf#         = Jf# + 1
     C                   Eval      JfInfo(Jf#) = JNDNAM
     C                   EndIf
     C                   EndDo
     C                   Else
      *         *------------------------------------------*
      *         *  Based on Physical File - for LF only    *
      *         *------------------------------------------*
     C                   If        APFATR      = 'LF'
     C                   Eval      PfAccess    = APNSCO
     C                   Eval      Pfile       = APBOF
     C                   Eval      Pf#         = Pf# + 1
     C                   Eval      PfInfo(Pf#) = APBOF
     C                   EndIf
     C                   EndIf
      *         *------------------------------------------*
      *         *  Get Key information (& First Key Field) *
      *         *------------------------------------------*
     C                   Eval      Key#        = APNKYF
     C                   Eval      KeyFld      = APKEYF
     C                   Eval      LFFormat    = APBOLF
     C                   If        APKSEQ      = 'A'
     C                   Eval      KeySeq      = @Ascend
     C                   Else
     C                   Eval      KeySeq      = @Descend
     C                   EndIf
     C                   If        APKSIN      = @Yes
     C                   Eval      KeySign     = @Signed
     C                   Else
     C                   Eval      KeySign     = @Unsigned
     C                   EndIf
     C                   If        APKZD       = @Yes
     C                   Eval      KeyZone     = @Zone
     C                   Else
     C                   Eval      KeyZone     = @NotZone
     C                   EndIf
      *         *------------------------------------------*
      *         *  Get Access path maintenance             *
      *         *------------------------------------------*
     C                   Select
     C                   When      APMANT      = 'R'
     C                   Eval      Maint       = '*REBLD'
     C                   When      APMANT      = 'D'
     C                   Eval      Maint       = '*DLY'
     C                   Other
     C                   Eval      Maint       = '*IMMED'
     C                   EndSl
      *
      *----------------------------------------------------*
      *  File Level Keywords                               *
      *----------------------------------------------------*
     C                   Reset                   NewSource
      *         *------------------------------------------*
      *         *  UNIQUE                                  *
      *         *------------------------------------------*
     C                   If        Unique      = @Yes
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = @Unique
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   Else
      *         *------------------------------------------*
      *         *  FCFO, FIFO or LIFO                      *
      *         *------------------------------------------*
     C                   If        KeyOrder   <> *Blanks
     C                   Eval      NsFormType  = 'A'
     C                   Eval      NsKeyword   = KeyOrder
     C                   Eval      SRCSEQ      = SRCSEQ + 1
     C                   Eval      SRCDTA      = NewSource
     C                   Except    WrtSrc
     C                   Reset                   NewSource
     C                   EndIf
     C                   EndIf
      *
     C                   EndIf
      *
     C     #StdLbl       ENDSR
      /EJECT
      *==============================================================*
      *                                                              *
      *  Break Text Line to Line 1, 2 & 3                            *
      *                                                              *
     C     $BrkLin       BEGSR
      *==============================================================*
     C                   Eval      LnArray     = *Blanks
     C     ' '           Checkr    TstTxt        TxtLen
     C                   MoveA     '1000000000'  *In(21)
      *----------------------------------------------------*
      *  Continuation tag is minus                         *
      *----------------------------------------------------*
     C                   If        Cont        = @Minus
     C                   Dow       TxtLen      > 0
      *         *------------------------------------------*
      *         *  Check if TstTxt is less than / equal 36 *
      *         *------------------------------------------*
     C                   If        TxtLen     <= 36
     C   21              Eval      Line1       = TstTxt
     C   22              Eval      Line2       = TstTxt
     C   23              Eval      Line3       = TstTxt
     C   24              Eval      Line4       = TstTxt
     C   25              Eval      Line5       = TstTxt
     C   26              Eval      Line6       = TstTxt
     C   27              Eval      Line7       = TstTxt
     C   28              Eval      Line8       = TstTxt
     C   29              Eval      Line9       = TstTxt
     C   30              Eval      Line10      = TstTxt
     C                   Leave
     C                   Else
      *         *------------------------------------------*
      *         *  Greater than 36, break text             *
      *         *------------------------------------------*
     C                   Eval      TstTxt      = %Trim(TstTxt)
     C                   Eval      Remain      = 1
     C                   Eval      Scan        = 1
     C                   Dow       Remain      < 36
     C     ' '           Scan      TstTxt:Scan   Scan
     C                   If        Scan        = 0
     C                   Leave
     C                   Else
     C                   Eval      Remain      = Scan - 1
     C                   Eval      Scan        = Scan + 1
     C                   EndIf
     C                   EndDo

     C                   If        Remain     <= 36
     C   21              Eval      Line1       = TstTxt
     C   22              Eval      Line2       = TstTxt
     C   23              Eval      Line3       = TstTxt
     C   24              Eval      Line4       = TstTxt
     C   25              Eval      Line5       = TstTxt
     C   26              Eval      Line6       = TstTxt
     C   27              Eval      Line7       = TstTxt
     C   28              Eval      Line8       = TstTxt
     C   29              Eval      Line9       = TstTxt
     C   30              Eval      Line10      = TstTxt
     C                   Leave
     C                   Else
     C   21              Eval      Line1       = %Subst(TstTxt: 1: 35) + '-'
     C   22              Eval      Line2       = %Subst(TstTxt: 1: 35) + '-'
     C   23              Eval      Line3       = %Subst(TstTxt: 1: 35) + '-'
     C   24              Eval      Line4       = %Subst(TstTxt: 1: 35) + '-'
     C   25              Eval      Line5       = %Subst(TstTxt: 1: 35) + '-'
     C   26              Eval      Line6       = %Subst(TstTxt: 1: 35) + '-'
     C   27              Eval      Line7       = %Subst(TstTxt: 1: 35) + '-'
     C   28              Eval      Line8       = %Subst(TstTxt: 1: 35) + '-'
     C   29              Eval      Line9       = %Subst(TstTxt: 1: 35) + '-'
     C   30              Eval      Line10      = TstTxt
     C                   EndIf
     C                   EndIf
      *
     C                   Select
     C                   When      *In21
     C                   MoveA     '0100000000'  *In(21)
     C                   When      *In22
     C                   MoveA     '0010000000'  *In(21)
     C                   When      *In23
     C                   MoveA     '0001000000'  *In(21)
     C                   When      *In24
     C                   MoveA     '0000100000'  *In(21)
     C                   When      *In25
     C                   MoveA     '0000010000'  *In(21)
     C                   When      *In26
     C                   MoveA     '0000001000'  *In(21)
     C                   When      *In27
     C                   MoveA     '0000000100'  *In(21)
     C                   When      *In28
     C                   MoveA     '0000000010'  *In(21)
     C                   When      *In29
     C                   MoveA     '0000000001'  *In(21)
     C                   When      *In30
     C                   Leave
     C                   EndSl
     C                   Eval      TxtLen      = TxtLen - 35
     C                   Eval      TstTxt      = %Subst(TstTxt: 36: TxtLen)
     C                   Enddo
     C                   Else
      *
      *----------------------------------------------------*
      *  Continuation tag is plus                          *
      *----------------------------------------------------*
     C                   Eval      BrkPos      = 1
     C                   Dow       TxtLen      > 0
      *         *------------------------------------------*
      *         *  Check if TstTxt is less than / equal 34 *
      *         *------------------------------------------*
     C                   If        TxtLen     <= 34
     C   21              Eval      Line1       = TstTxt
     C   22              Eval      Line2       = TstTxt
     C   23              Eval      Line3       = TstTxt
     C   24              Eval      Line4       = TstTxt
     C   25              Eval      Line5       = TstTxt
     C   26              Eval      Line6       = TstTxt
     C   27              Eval      Line7       = TstTxt
     C   28              Eval      Line8       = TstTxt
     C   29              Eval      Line9       = TstTxt
     C   30              Eval      Line10      = TstTxt
     C                   Leave
     C                   Else
      *         *------------------------------------------*
      *         *  Greater than 34, break text             *
      *         *------------------------------------------*
     C                   Eval      Txt34       = %Subst(TstTxt:  1: 34)
     C                   Eval      Txt34       = %Trim(Txt34)
     C                   Eval      Remain      = 1
     C                   Eval      Scan        = 1
     C                   Dow       Remain      < 34
     C     ' '           Scan      Txt34:Scan    Scan
     C                   If        Scan        = 0
     C                   Leave
     C                   Else
     C                   Eval      Remain      = Scan - 1
     C                   Eval      Scan        = Scan + 1
     C                   EndIf
     C                   EndDo

     C   21              Eval      Line1       = %Subst(Txt34: 1: Remain) + ' +'
     C   22              Eval      Line2       = %Subst(Txt34: 1: Remain) + ' +'
     C   23              Eval      Line3       = %Subst(Txt34: 1: Remain) + ' +'
     C   24              Eval      Line4       = %Subst(Txt34: 1: Remain) + ' +'
     C   25              Eval      Line5       = %Subst(Txt34: 1: Remain) + ' +'
     C   26              Eval      Line6       = %Subst(Txt34: 1: Remain) + ' +'
     C   27              Eval      Line7       = %Subst(Txt34: 1: Remain) + ' +'
     C   28              Eval      Line8       = %Subst(Txt34: 1: Remain) + ' +'
     C   29              Eval      Line9       = %Subst(Txt34: 1: Remain) + ' +'
     C   30              Eval      Line10      = TstTxt
     C                   EndIf
      *
     C                   Select
     C                   When      *In21
     C                   MoveA     '0100000000'  *In(21)
     C                   When      *In22
     C                   MoveA     '0010000000'  *In(21)
     C                   When      *In23
     C                   MoveA     '0001000000'  *In(21)
     C                   When      *In24
     C                   MoveA     '0000100000'  *In(21)
     C                   When      *In25
     C                   MoveA     '0000010000'  *In(21)
     C                   When      *In26
     C                   MoveA     '0000001000'  *In(21)
     C                   When      *In27
     C                   MoveA     '0000000100'  *In(21)
     C                   When      *In28
     C                   MoveA     '0000000010'  *In(21)
     C                   When      *In29
     C                   MoveA     '0000000001'  *In(21)
     C                   When      *In30
     C                   Leave
     C                   EndSl
     C                   Eval      BrkPos      = Remain + 2
     C                   Eval      TxtLen      = TxtLen - Remain
     C                   Eval      TstTxt      = %Subst(TstTxt: BrkPos: TxtLen)
     C                   EndDo
      *
     C                   EndIf
      *
     C                   MoveA     LnArray       Lin
      *
     C     #BrkLin       ENDSR
      /EJECT
      ****************************************************************
      *          O U T P U T     S P E C I F I C A T I O N           *
      ****************************************************************
     OQDDSSRC   EADD         WRTSRC
     O                       SRCSEQ
     O                       SRCDAT
     O                       SRCDTA
** LBL Source label
     A*--------------------------------------------------------------*
     A*  Source Retrieval from Retrieve Database Source (RTVDBSRC)   *
     A*                                                              *
     A*                           \\\\\\\                            *
     A*                          ( o   o )                           *
     A*---------------------oOOO----(_)----OOOo----------------------*
     A*                                                              *
     A*  Database File. . . :                                        *
     A*  Text . . . . . . . :                                        *
     A*  Date . . . . . . . :                                        *
     A*                                                              *
     A*                   OOOOO              OOOOO                   *
     A*                   (    )             (    )                  *
     A*--------------------(   )-------------(   )-------------------*
     A*                     (_)               (_)                    *
     A*                                                              *
     A* MODIFICATION LOG :                                           *
     A*                                                              *
     A*            Task   Programmer/                                *
     A*   Date      No.   Description                                *
     A* ========  ======  ========================================== *
     A*                   Creation Date                              *
     A*                                                              *
     A*--------------------------------------------------------------*


    Source: geocities.com/~alex_nubla