*DECK OUTREQ
USETEXT COMCBEG 
USETEXT COMADEF 
USETEXT COMACBX 
USETEXT COMAFET 
PROC OUTREQ;
# TITLE OUTREQ - ISSUE REQUIRED OUTPUT I/O.  #
  
      BEGIN  # OUTREQ # 
  
# 
**    OUTREQ - ISSUE REQUIRED OUTPUT I/O. 
* 
*     OUTREQ ISSUES ANY REQUIRED OUTPUT I/O.
* 
*     PROC OUTREQ 
* 
*     ENTRY      <FTTENT> = FWA FTT ENTRY.
* 
*     EXIT
* 
* 
* 
* 
* 
*     PROCESS    IF OUTPUT I/O IS COMPLETE IN FET 
*                THEN 
*                  IF ERROR CODE SET
*                    AND (SENDING FILE OR 1ST ERROR FOR RECEIVER) 
*                  THEN 
*                    IF OUTPUT IS TO RHF
*                    THEN 
*                      CALL RHFERRC TO PROCESS ERROR. 
*                    ELSE 
*                      CALL CIOERRC TO PROCESS ERROR. 
*                  ELSE 
*                    CLEAR ERROR CODE.
*                    CLEAR FUNCTION.
*                    IF I/O STATE IS WRITER IN PROCESS
*                    THEN 
*                      SET I/O STATE TO I/O IN PROGRESS.
*                    IF I/O STATE IS REQUEST WRITER 
*                    THEN 
*                      SET LEVEL NUMBER IN FET. 
*                      FUNCTION = WRITER. 
*                      SET I/O STATE TO WRITER IN PROGRESS. 
*                    IF I/O STATE IS DONE 
*                    THEN 
*                      IF CONVERT MODE ENABLED
*                      THEN 
*                        CALL EXITCM TO EXIT THE CONVERT MODE.
*                      ELSE 
*                        CALL ENDXFR TO TERMINATE THE TRANSFER. 
*                      RETURN.
*                    IF I/O STATE IS IN PROGRESS
*                      OR I/O STATE IS NORMAL REQUEST 
*                      OR I/O STATE IS FLUSH
*                    THEN 
*                      IF MINIMUM REQUIRED DATA IS IN OUTPUT BUFFER 
*                      THEN 
*                        SET I/O STATE TO IN PROGRESS.
*                        FUNCTION = NORMAL WRITE. 
*                      ELSE 
*                        IF INPUT I/O STATE IS DONE 
*                        THEN 
*                          IF OUTPUT BUFFER IS EMPTY
*                            AND INPUT DATA STATE IS NULL 
*                          THEN 
*                            FUNCTION = CLOSE.
*                            IF NOS/BE TAPE FILE: 
*                              FUNCTION = CLOSE, NO REWIND
*                            IF SENDING FILE: 
*                              CALL CIO TO CLOSE FILE.
*                              (NOS/BE: RESET FUNCTION = CLOSE.)
*                            IF RECEIVING NOS/BE RANDOM FILE
*                            THEN 
*                              SET FET RANDOM BIT 
*                              SET FET INDEX LENGTH TO -0.
*                            SET OUTPUT I/O STATE DONE. 
*                          ELSE 
*                            IF I/O STATE IS FLUSH
*                            THEN 
*                              SET OUTPUT I/O STATE = NORMAL
*                              SET EOI INPUT EXTENT.
*                            ELSE 
*                              SET I/O STATE TO FLUSH.
*                              FUNCTION = NORMAL WRITE. 
*                    IF FUNCTION SET
*                    THEN 
*                      IF SENDING FILE
*                      THEN 
*                        IF FIRST BLOCK OF NOS/BE *UH* TRANSFER 
*                        THEN 
*                          SET/CLEAR RANDOM ATTRIBUTE IN FIRST CW 
*                        CALL RHF.
*                      ELSE 
*                        IF QUIT-SENT 
*                          SET FET POINTERS (OUTPUT FINISHED).
*                        ELSE 
*                          IF FIRST BLOCK OF NOS/BE *UH* TRANSFER 
*                          THEN 
*                            SAVE FILE RANDOM ATTRIBUTE FROM FIRST CW 
*                          CALL CIO.
*                RETURN.
* 
****  PROC OUTREQ - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC CALLCIO;                # ISSUE CIO I/O REQUEST #
        PROC CALLRHF;                # ISSUE RHF I/O REQUEST #
        PROC CIOERRC;                # PROCESS CIO READ ERROR # 
        PROC ENDXFR;                 # COMPLETE DATA TRANSFER PHASE # 
        PROC EXITCM;                 # EXIT CONVERT MODE #
        FUNC FREEWDS U;              # OUTPUT FREE WORDS IN BUFFER #
        PROC RHFERRC;                # PROCESS RHF READ ERROR # 
        END 
  
# 
****  PROC OUTREQ - XREF LIST END.
# 
  
  
      ITEM FUNCTION U;               # FUNCTION FOR I/O ISSUE # 
CONTROL EJECT;
  
      IF PFETCOMPL
      THEN
        BEGIN 
        IF  PFETEC NE 0            # IF OUTPUT ERROR #
          AND (FTTDIRECN EQ SEND   #   AND (SENDING FILE #
              OR NOT FTTQRSENT)    #        OR 1ST RECEIVE ERROR) # 
        THEN
          BEGIN 
          IF FTTDIRECN EQ SEND     # IF SENDING FILE #
          THEN
            BEGIN 
            RHFERRC;
            END 
  
          ELSE
            BEGIN 
            CIOERRC;
            END 
          END 
  
        ELSE
          BEGIN 
          PFETEC = 0;              # CLEAR ERROR FLAG # 
          FUNCTION = 0; 
          IF OTIOSTATE EQ IOINPGWRTR
          THEN
            BEGIN 
            OTIOSTATE = IOINPROG; 
            END 
  
          IF OTIOSTATE EQ IOREQWRTR 
          THEN
            BEGIN 
            PFETLEVEL = OTLEVEL;
            FUNCTION = CIO$WRITER LOR (OTFUNC LAN CIO$BMODE); 
            OTIOSTATE = IOINPGWRTR; 
            END 
  
          IF OTIOSTATE EQ IODONE
          THEN
            BEGIN 
            IF FTTCMA 
            THEN
              BEGIN 
              EXITCM; 
              END 
  
            ELSE
              BEGIN 
              ENDXFR; 
              END 
  
            RETURN; 
            END 
  
          IF OTIOSTATE EQ IOINPROG
            OR OTIOSTATE EQ IOREQNRML 
            OR OTIOSTATE EQ IOFLUSH 
          THEN
            BEGIN 
            IF OTMINDATA LE (OTBUFSIZE - FREEWDS - 1) 
            THEN
              BEGIN 
              OTIOSTATE = IOINPROG; 
              FUNCTION = OTFUNC;
              END 
  
            ELSE
              BEGIN 
              IF INIOSTATE EQ IODONE
              THEN
                BEGIN 
                IF INDATSTATE EQ DSNULL 
                  AND (OTBUFSIZE-1) EQ FREEWDS
                THEN
                  BEGIN 
                  FUNCTION = CIO$CLOSE; 
  
                CONTROL IFEQ OS$NOSBE;
                  IF    LFETDEVTP GE MT     # IF TAPE FILE #
                    AND LFETDEVTP LE NTMF 
                  THEN
                    BEGIN 
                    FUNCTION = CIO$CLOSNR;  # CLOSE, NO REWIND #
                    END 
                CONTROL ENDIF;
  
                  IF FTTDIRECN EQ SEND  # IF SENDING FILE # 
                  THEN
                    BEGIN 
                    CIORECALL = TRUE; 
                    CALLCIO (FUNCTION);  # CLOSE LOCAL FILE # 
                    CIORECALL = FALSE;
                    LFETEC = EOI;        # SET EOI #
  
                  CONTROL IFEQ OS$NOSBE;
                    FUNCTION = CIO$CLOSE;  # RESET FUNCTION # 
                  CONTROL ENDIF;
  
                    END 
  
  
                CONTROL IFEQ OS$NOSBE;
                  IF OTRANDOM 
                  THEN
                    BEGIN 
                    LFETRNDM = TRUE;
                    LFETIDXLEN = O"777777"; 
                    END 
  
                CONTROL ENDIF;
  
                  OTIOSTATE = IODONE; 
                  END 
  
                ELSE
                  BEGIN 
                  IF OTIOSTATE EQ IOFLUSH 
                  THEN
                    BEGIN 
                    INDATSTATE = DSEOI; 
                    OTIOSTATE = IOREQNRML;
                    END 
  
                  ELSE
                    BEGIN 
                    OTIOSTATE = IOFLUSH;
                    FUNCTION = OTFUNC;
                    END 
                  END 
                END 
              END 
            END 
  
          IF FUNCTION NE 0
          THEN
            BEGIN 
            IF FTTDIRECN EQ SEND
            THEN
              BEGIN 
  
            CONTROL IFEQ OS$NOSBE;
              IF OTPUTRNDA         # IF SENDING FIRST UH BLOCK #
              THEN
                BEGIN 
                OTPUTRNDA = FALSE;
                P<CW> = PFETOUT;
                CWRNDA = INRANDOM;
                END 
  
            CONTROL ENDIF;
  
              CALLRHF(FUNCTION);
              END 
  
            ELSE
              BEGIN 
              IF FTTQRSENT
              THEN
                BEGIN 
                PFETOUT = PFETIN; 
                END 
  
              ELSE
                BEGIN 
  
              CONTROL IFEQ OS$NOSBE;
                IF OTGETRNDA         # IF RECEIVING FIRST UH BLOCK #
                THEN
                  BEGIN 
                  OTGETRNDA = FALSE;
                  P<CW> = PFETOUT;
                  OTRANDOM = CWRNDA;
                  CWRNDA = FALSE; 
                  END 
  
              CONTROL ENDIF;
  
                CALLCIO(FUNCTION);
                END 
              END 
            END 
          END 
        END 
  
      RETURN; 
  
      END  # OUTREQ # 
  
      TERM
