*DECK READRI
      PROC READRI ( (FET),(RECID),(WSA), LENGTH , STATIS ); 
      BEGIN # READRI #
*IF DEF,IMS 
 #
**
* 
*     1. PROC NAME           AUTHOR              DATE 
*        READRI              M. D. PICKARD       77/01/10 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        READRI WILL READ A RECORD BY RECORD IDENT FROM A SUPIO 
*        RANDOM FILE. 
* 
*     3. METHOD USED
*        IF THE FILE IS A SUPIO RANDOM FILE THEN FINDRI IS CALLED TO
*        FIND THE INDEX POSITION ASSOCIATED TO RECID.  IF THE RECID 
*        IS VALID THE FIRST, IN, OUT, AND RANDOM ADDRESS ARE PUT IN 
*        THE FET AND READ IS CALLED TO READ THE RECORD.  THE ACTUAL 
*        LENGTH OF THE RECORD AND THE RETURN STATUS ARE SET, AND
*        THE CURRENT INDEX IS SET AT THIS RECORD. 
* 
*     4. ENTRY PARAMETERS 
*        FET                 ADDRESS OF FET 
*        RECID               RECORD IDENT 
*        WSA                 ADDRESS OF READ BUFFER 
*        LENGTH              LENGTH OF READ BUFFER
*                            MUST BE GREATER THAN MINSIOI 
* 
*     5. EXIT PARAMETERS
*        LENGTH              LENGTH OF RECORD READ
*        STATIS              RETURN STATUS
*                              RDEOR - END-OF-RECORD, READ SUCCESSFUL 
*                              RDEOF - END-OF-FILE, NO RECORD READ
*                              RDEOI - END-OF-INFO., NO RECORD READ 
*                              RDBFULL - BUFFER FULL, PART RECORD READ
*                              CRDEOR - EOR CODED FILE, READ SUCCESSFUL 
*                              CRDEOF - EOF CODED FILE, NO RECORD READ
*                              CRDEOI - EOI CODED FILE, NO RECORD READ
*                              CRDBFULL - BUFFER FULL CODED FILE, 
*                                         PART RECORD READ
*                              BADRI - BAS RECORD IDENT 
*                              NOTSIOF - NOT A SUPIO FILE 
*                              RANRSEQ - RANDOM REQUEST ON SEQ. FILE
* 
*     6. COMDECKS CALLED
*        SIODEFS             SUPIO SYMPL DEFS 
*        SIOBASE             SUPIO BASED ARRAY DEFINITION 
* 
*     7. ROUTINES CALLED
*        FINDRI              FINDS RECORD IDENT IN INDEX
*        READ                MACREL READ SYMPL INTERFACE
*        RECALL              MACREL CPU RECALL SYMPL INTERFACE
* 
*     8. DAYFILE MESSAGES 
*        NONE.
* 
 #
*ENDIF
      CONTROL NOLIST;        # STOPS LIST OF SIODEFS AND SIOBASE       #
*CALL SIODEFS 
*CALL SIOBASE 
      CONTROL LIST; 
      ITEM
           FET U,            # GET ADDRESS                             #
           RECID U,          # RECORD IDENT                            #
           WSA U,            # WORK STORAGE AREA ADDRESS               #
           LENGTH U,         # WSA LENGTH - RECORD LENGTH              #
           STATIS U;         # RETURN STATUS                           #
      XREF
        BEGIN 
        PROC READ;
        PROC RECALL;
        PROC FINDRI;
        END 
      ITEM
           TEMP U,           # TEMPORARY UNSIGNED INTEGER              #
           TEMPB B;          # TEMPORARY BOOLEAN                       #
      P<SIOFET> = FET;       # FORMAT FET                              #
      IF FETRAN[0]
      THEN                   # FET IS RANDOM FILE FET                  #
        BEGIN 
        P<SIOINDX> = FETINDX[0]; # FORMAT INDEX                        #
        IF SIONAME[0] EQ "SUPIOINDEX" 
        THEN                 # FILE IS SUPIO FILE                      #
          BEGIN 
          FINDRI(LOC(SIOINDX),RECID,TEMP,TEMPB); # FIND RI IN INDX     #
          IF TEMPB
          THEN               # RI FOUND                                #
            BEGIN 
            FETRR[0] = RANINDX[TEMP]; # SET RANDOM REQUEST PRU         #
            FETFST[0] = WSA; # SET FIRST                               #
            FETIN[0] = WSA;  # SET IN                                  #
            FETOUT[0] = WSA; # SET OUT                                 #
            FETLMT[0] = WSA + LENGTH + 1; # SET LIMIT                  #
            READ(SIOFET);    # READ THE RECORD                         #
            RECALL(SIOFET);  # WAIT TILL COMPLETE                      #
            STATIS = FETSTAT[0]; # SET RETURN STATUS                   #
            LENGTH = FETIN[0] - FETFST[0]; # SET LENGTH TO AMOUNT READ #
            CINDX[0] = TEMP;
            END 
          ELSE               # RI CAN NOT BE FOUND                     #
            BEGIN 
            CINDX[0] = TEMP - 1; # FOR POSITIONING, SET CURRENT INDEX  #
            STATIS = BADRI;  # BAD RECORD IDENT                        #
            END 
          END 
        ELSE                 # NOT A SUPIO INDEX IN INDEX AREA         #
          STATIS = NOTSIOF;  # NOT A SUPIO FILE                        #
        END 
      ELSE                   # RANDOM READ ON SEQ. FILE                #
        STATIS = RANRSEQ;    # RANDOM REQUEST ON SEQUENTIAL FILE       #
      RETURN; 
      END 
      TERM # READRI # 
