PROC PUTLNK (WS$AREA, WS$LENGTH, (TERM$OPTION), ( PARTIAL   ),
      RSTATUS   ) ;
      BEGIN  # PUTLNK #
*copyc ICS$ICSZCOM

ARRAY WS$AREA [0] S(1);;
      ITEM WS$LENGTH  U;
      ITEM TERM$OPTION U;
      ITEM PARTIAL    B;
      ITEM RSTATUS    U;

      ITEM OUTER$LOOP U;
      ITEM INNER$LOOP U;
      ITEM OFFSET     U;
      ITEM MSG$LEN    U;
      ITEM STAT       U;
      ITEM SIGNAL     B = TRUE;

      XREF
        BEGIN
        PROC ABORT;
        PROC PAUSE;
        PROC SEND;
        END

#  INITIALIZE                                                         #

      RSTATUS = 0;
      IF NOT OPENED
      THEN
        BEGIN
        RSTATUS = NOT$OPENED;
        RETURN;
        END

      OFFSET = 0;
      ANY$PUTS = TRUE;

#  SEND DATA UNTIL THE USERS RECORD AREA IS EMPTY                     #

CONTROL FASTLOOP;
      FOR OUTER$LOOP = 0 WHILE OFFSET LS WS$LENGTH
      DO
        BEGIN  # OUTER LOOP #
        IF (WS$LENGTH - OFFSET) LS MAX$MSG$LEN
        THEN
          BEGIN
          MSG$LEN = (WS$LENGTH - OFFSET);
          END

        ELSE
          BEGIN
          MSG$LEN = MAX$MSG$LEN;
          END

        FIRST$MSG = (OFFSET EQ 0) AND ((NOT PARTIAL) OR (PARTIAL AND (
          TERM$OPTION EQ START)) OR (PARTIAL AND (
          POSITION NQ MID$RECORD)));
        LAST$MSG = ((OFFSET + MSG$LEN) GQ WS$LENGTH) AND (NOT PARTIAL
          OR (PARTIAL AND ( TERM$OPTION EQ TERMINATE)));
        AI$EOI = FALSE;
        AI$EOP = FALSE;
        UNUSED$BITS = 0;
        IF FIRST$MSG
        THEN
          BEGIN
          RECORD$LEN = 0;
          END

        FOR INNER$LOOP = 0
        DO
          BEGIN  # INNER LOOP #
          SEND (APPL$NAME, ARB$INFO, (SIGNAL), WS$AREA[OFFSET],
            MSG$LEN, PARTNER$NAME, STAT);

          IF (STAT EQ MLSOK) OR (STAT EQ MLSSF)
          THEN
            BEGIN
            GOTO INNEREND;
            END

          ELSE
            BEGIN
            IF (STAT EQ MLSBI) OR (STAT EQ MLSBA) OR (STAT EQ MLSPN)
              OR (STAT EQ MLSRF)
            THEN
              BEGIN
              PAUSE(PAUS$CNT);
              TEST INNER$LOOP;
              END

            ELSE
              BEGIN
              IF (STAT EQ MLSRN)
              THEN
                BEGIN
                RSTATUS = PARTNER$QUIT;
                RETURN;
                END

              ELSE
                BEGIN
                ABORT;
                END

              END

            END

          END  # INNER LOOP #

 INNEREND%
        OFFSET = OFFSET + MSG$LEN;
        RECORD$LEN = RECORD$LEN + MSG$LEN;
        END  # OUTER LOOP #

#  STORE THE FILE POSITION INFORMATION                                #


      IF LAST$MSG
      THEN
        BEGIN
        POSITION = EOR;
        END

      ELSE
        BEGIN
        POSITION = MID$RECORD;
        END

      END  # PUTLNK #

    TERM
