PROC  GETLNK ( WS$AREA, (WS$LENGTH), TRANSFER$CNT, ( SKIP$OPTION),
      (   PARTIAL), BITS, RSTATUS);
      BEGIN  # GETLNK #
*copyc ICS$ICSZCOM
      ARRAY WS$AREA [1%1] S(1);
        BEGIN
        ITEM FWA        U;
        END

      ITEM WS$LENGTH  U;
      ITEM TRANSFER$CNT U;
      ITEM SKIP$OPTION U;
      ITEM PARTIAL    B;
      ITEM BITS       U;
      ITEM RSTATUS    U;
      ITEM BUSY$COUNT U;

      ARRAY BUFFER [1%MAX$MSG$LEN] S(1);
        BEGIN
        ITEM BUFF       U;
        END

      ITEM LOOP$1     U;
      ITEM LOOP$2     U;
      ITEM RECEIVE$LOOP U;
      ITEM OFFSET     U;
      ITEM LIMIT      U;
      ITEM I          U;
      ITEM MSG$LEN    U;
      ITEM FETCH$CNT  U;
      ITEM ZLR        B;
      ITEM BUFF$IN    U;
      ITEM BUFF$OUT   U;
      ITEM SIGNAL     B = TRUE;
      ITEM STAT       U;
      ITEM PARTNER$SAVE U;
      XREF
        BEGIN
        PROC ABORT;
        PROC CONFIRM;
        PROC PAUSE;
        PROC RECEIVE;
        END

                                               CONTROL EJECT;
#  RECEIVE THE NEXT MESSAGE INTO THE MESSAGE BUFFER                   #

PROC RECEIVER;
        BEGIN  # RECEIVER #
        BUSY$COUNT = BUSY$CNT;
        FOR RECEIVE$LOOP = 0
        DO
          BEGIN  # RECEIVE LOOP #
          RECEIVE (APPL$NAME, ARB$INFO, (SIGNAL), BUFFER[1], MSG$LEN,
            MAX$MSG$LEN, 0, PARTNER$SAVE, STAT);
          IF  (STAT EQ MLSOK) OR (STAT EQ MLSSF)
            THEN
            BEGIN
            GOTO LOOPEND;
            END

          ELSE
            BEGIN
            IF (STAT EQ MLSBI) OR (STAT EQ MLSII)
            THEN
              BEGIN
              PAUSE(PAUS$CNT);
              IF (BUSY$COUNT EQ 0)
              THEN
                BEGIN
                CONFIRM (APPL$NAME, PARTNER$NAME, STAT);
                IF (STAT EQ MLSRN)
                THEN
                  BEGIN
                  STAT = PARTNER$QUIT;
                  RETURN;
                  END

                ELSE
                  BEGIN
                  BUSY$COUNT = BUSY$CNT;
                  END


                END

              BUSY$COUNT = BUSY$COUNT - 1;
              TEST RECEIVE$LOOP;
              END

            ELSE
              BEGIN
              ABORT;
              END


            END

          END  # RECEIVE LOOP #

LOOPEND%
        ZLR = (MSG$LEN EQ 0);
        BUFF$IN = MSG$LEN;
        BUFF$OUT = 0;

        END  # RECEIVER #

                                               CONTROL EJECT;
#  BODY OF GETLNK                                                     #

#  INITIALIZE                                                         #


      RSTATUS = MLSOK;
      BITS = 0;
      ZLR = FALSE;
      OFFSET = 0;
      IF NOT OPENED
      THEN
        BEGIN
        RSTATUS = NOT$OPENED;
        RETURN;
        END

#  SKIP PAST ANY PARTIAL RECORDS UNTIL THE BEGINNING OF A             #
#  RECORD IS FOUND                                                    #

      IF (NOT PARTIAL) OR (SKIP$OPTION EQ SKIP$TO$EOR)
      THEN
        BEGIN
        RECORD$LEN = 0;
        FIRST$MSG = FALSE;
        FOR LOOP$1 = 0 WHILE NOT FIRST$MSG
        DO
          BEGIN
          RECEIVER;
          IF (STAT EQ PARTNER$QUIT)
          THEN
            BEGIN
            RSTATUS = STAT;
            RETURN;
            END

          END

        END

#  TRANSFER DATA FROM THE BUFFER UNTIL THE END OF A RECORD            #
#  IS REACHED OR THE USERS RECORD AREA IS FILLED.  CALL               #
#  PROCEDURE RECEIVER TO FILL OR REPLENISH THE BUFFER AS              #
#  NEEDED                                                             #

      FOR LOOP$2 = 0
      DO
        BEGIN  # LOOP 2 #
        IF (BUFF$OUT GQ BUFF$IN) AND (OFFSET LS WS$LENGTH) AND (NOT
          ZLR)
          THEN
          BEGIN
          RECEIVER;
          IF (STAT EQ PARTNER$QUIT)
          THEN
            BEGIN
            RSTATUS = STAT;
            RETURN;
            END

          END

        IF (OFFSET LQ WS$LENGTH) AND (BUFF$OUT LS BUFF$IN)
        THEN
          BEGIN
          IF (WS$LENGTH - OFFSET) LS (BUFF$IN - BUFF$OUT)
          THEN
            BEGIN
            LIMIT = WS$LENGTH - OFFSET;
            END

          ELSE
            BEGIN
            LIMIT = BUFF$IN - BUFF$OUT;
            END

          FOR I=1 STEP 1 UNTIL LIMIT
          DO
            BEGIN
            FWA[OFFSET + I] = BUFF[BUFF$OUT + I];
            END

          OFFSET = OFFSET + LIMIT;
          BUFF$OUT= BUFF$OUT + LIMIT;
          END

        IF (OFFSET GQ WS$LENGTH) OR ((BUFF$OUT GQ BUFF$IN) AND
          LAST$MSG)
          THEN
          BEGIN
          GOTO LOOP2END;
          END

        END  # LOOP 2 #

LOOP2END%
      TRANSFER$CNT = OFFSET;

#  STORE THE FILE POSITION INFORMATION                                #

      IF LAST$MSG
      THEN
        BEGIN
        IF AI$EOI
        THEN
          BEGIN
          POSITION = EOI;
          END

        ELSE
          BEGIN
          IF AI$EOP
          THEN
            BEGIN
            POSITION = EOP;
            END

          ELSE
            BEGIN
            IF BUFF$OUT LS BUFF$IN
            THEN
              BEGIN
              POSITION = MID$RECORD;
              END

            ELSE
              BEGIN
              BITS = UNUSED$BITS;
              POSITION = EOR;
              END

            END

          END

        END

      ELSE
        BEGIN
        POSITION = MID$RECORD;
        END


      END  # GETLNK #

    TERM
