*DECK FCSRRUC 
USETEXT TEXTFCS;
      PROC FCSRRUC (MBTIDX, DISOUT, RESULT);
*CALL COPYRITE
# TITLE FCSRRUC - READ USER COMMAND.                                   #
  
      BEGIN                            # FCSRRUC                       #
  
# 
**    FCSRRUC - READ USER COMMAND.
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE READS THE NEXT USER COMMAND FROM THE SPECIFIED 
*     FILE. 
* 
*     PROC FCSRRUC (MBTIDX, DISOUT, RESULT) 
* 
*     ENTRY   MBTIDX     = MBT ENTRY INDEX OF FILE TO READ. 
*             DISOUT     = TRUE IF COMMAND IS TO BE DISPLAYED ON THE
*                          OUTPUT FILE. 
* 
*     EXIT    RESULT     = RESULT RETURN BY *READC* MACRO.
*             USC        = BUFFER CONTAINING USER COMMAND READ. 
*             USCLEN     = NUMBER OF OCTETS IN USER COMMAND.
* 
*     NOTES   IF REQUESTED, THE USER COMMAND IS WRITTEN 
*             TO THE OUTPUT FILE. IF THE USER COMMAND IS COMING FROM
*             A TERMINAL THEN THE USER IS PROMPTED FOR INPUT. 
* 
*     METHOD  A USER COMMAND CAN CONSIST OF ZERO OR MORE PHYSICAL 
*             LINES. USER COMMANDS THAT CONTINUE OVER MULTIPLE LINES
*             ARE SPECIFIED BY PLACING AN ELLIPIS (CONSISTING OF
*             TWO OR MORE CONSECUTIVE PERIODS) AT THE END OF EACH 
*             PHYSICAL LINE THAT IS TO BE CONTINUED. THE ELLIPIS, A 
*             TRAILING PERIOD, AND ANY TRAILING SPACES ARE STRIPPED 
*             FROM THE USER COMMAND.
* 
# 
  
# 
****  PROC FCSRRUC - XREF LIST
# 
      XREF
        BEGIN 
        PROC FCSMATS;                  # ALLOCATE TABLE SPACE          #
        PROC FCSOWOF;                  # WRITE TO OUTPUT FILE          #
        PROC FCSRRFF;                  # READ FROM FILE                #
        PROC FCSRSPM;                  # SEND PROMPT MESSAGE           #
        PROC NETUCAC;                  # COPY AN ASCII CHARACTER       #
        PROC NETUCAS;                  # COPY AN ASCII STRING          #
        END 
# 
****
# 
      ITEM MBTIDX        I;            # MBT ENTRY INDEX OF FILE       #
      ITEM DISOUT        B;            # DISPLAY COMMAND ON OUTPUT FILE#
      ITEM RESULT        I;            # RESULT RETURNED BY *READC*    #
  
      ITEM COMPLETE      B;            # USER COMMAND COMPLETE FLAG    #
      ITEM DIND          I;            # DESTINATION INDEX             #
      ITEM I             I;            # LOOP INDUCTION VARIABLE       #
      ITEM SIND          I;            # SOURCE INDEX                  #
      ITEM TOTLEN        I;            # TOTAL LENGTH OF COMMAND       #
      ITEM CRLF          U = X"0D0A00000000000";
      ITEM SPACING       U = O"55550000000000000000"; 
  
      ARRAY THISCHAR [00:00] S(1);     # CURRENT CHARACTER             #
        BEGIN 
        ITEM THISCHR     U(00,00,08); 
        END 
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      USCLEN   = 0;                    # INITIALIZE USER COMMAND LENGTH#
      COMPLETE = FALSE;                # INITIALIZE COMPLETE FLAG      #
# 
*     IF USER COMMANDS ARE COMING FROM THE TERMINAL THEN PROMPT USER
*     FOR NEXT COMMAND. 
# 
      IF FTPBELLM EQ OPTOFF$
      THEN
        BEGIN                          # BELL MODE OFF                 #
        FCSRSPM (PRFTP, MBTIDX);       # SEND FTP/ PROMPT              #
        END 
      ELSE
        BEGIN                          # BELL MODE ON                  #
        FCSRSPM (PRFTPBELL, MBTIDX);   # SEND FTP/ + BELL PROMPT       #
        END 
# 
*     READ FROM FILE UNTIL USER COMMAND COMPLETE. 
*     IF REQUESTED, WRITE THE USER COMMAND TO THE OUTPUT FILE.
# 
      IF DISOUT 
      THEN
        BEGIN                          # WRITE COMMAND TO OUTPUT FILE  #
        FCSOWOF (SPACING, INTERNAL$);  # WRITE BLANK LINE              #
        END 
      FOR I = 0 
        WHILE NOT COMPLETE DO 
        BEGIN                          # LOOP UNTIL COMMAND COMPLETE   #
        COMPLETE = TRUE;               # COMPLETE UNLESS ELLIPIS FOUND #
        FCSRRFF (MBTIDX, RESULT);      # READ FROM SPECIFIED FILE      #
        IF DISOUT 
        THEN
          BEGIN                        # WRITE COMMAND TO OUTPUT FILE  #
          DIND = INPLEN;               # AT END OF USER INPUT          #
          NETUCAS (CRLF, 0, 2,
                   INPBUF, DIND);      # APPEND CR + LF                #
          FCSOWOF (INPBUF, DIND);      # WRITE LINE OF USER COMMAND    #
          END 
# 
*     IF LINE OF USER COMMAND IS TERMINATED BY AN ELLIPIS THEN STRIP
*     THE ELLIPIS AND ANY TRAILING SPACES.
# 
        THISCHR = ASCISPACE;           # FAKE CURRENT CHARACTER        #
        FOR SIND = INPLEN - 1 STEP -1 
          WHILE (SIND GQ 0) AND 
                (THISCHR EQ ASCISPACE) DO 
          BEGIN                        # LOOP BACKWARDS WHILE SPACES   #
          DIND = 0;                    # PICK UP NEXT CHARACTER        #
          NETUCAC (INPBUF, SIND,
                   THISCHAR, DIND); 
          END 
        FOR SIND = SIND STEP -1 
          WHILE (SIND GQ 0) AND 
                (THISCHR EQ ASCIPERIOD) DO
          BEGIN                        # LOOP BACKWARDS WHILE PERIODS  #
          DIND = 0;                    # PICK UP NEXT CHARACTER        #
          NETUCAC (INPBUF, SIND,
                   THISCHAR, DIND); 
          IF THISCHR EQ ASCIPERIOD
          THEN
            BEGIN                      # AT LEAST TWO PERIODS FOUND    #
            COMPLETE = FALSE;          # USER COMMAND NOT COMPLETE     #
            INPLEN   = SIND;           # REMOVE PERIOD FROM COMMAND    #
            END 
          END 
# 
*     COPY DATA TO COMMAND BUFFER.
# 
        FOR TOTLEN = USCLEN + INPLEN
          WHILE ((TOTLEN*10)+70)/75 GR USCL DO
          BEGIN                        # DATA WILL OVERFLOW BUFFER     #
          FCSMATS (P<USC>, USCL,
                   USCSIZ$);           # ALLOCATE MORE SPACE           #
          END 
  
        NETUCAS (INPBUF, 0, INPLEN, 
                 USC[0], USCLEN);      # COPY TO COMMAND BUFFER        #
# 
*     IF USER COMMAND IS NOT COMPLETE AND WE ARE READING IT FROM THE
*     TERMINAL THEN PROMPT THE USER FOR ADDITIONAL INPUT. 
# 
        IF NOT COMPLETE 
        THEN
          BEGIN                        # LINE TERMINATED BY ELLIPIS    #
          FCSRSPM (PRCONT, MBTIDX);    # SEND CONTINUATION PROMPT      #
          END 
        END 
# 
*     IF LAST CHARACTER OF COMMAND IS A PERIOD THEN STRIP IT. 
# 
      IF USCLEN GR 0
      THEN
        BEGIN                          # AT LEAST ONE CHARACTER        #
        DIND = 0;                      # PICK UP LAST CHARACTER        #
        NETUCAC (USC[0], USCLEN - 1,
                 THISCHAR, DIND); 
        IF THISCHR EQ ASCIPERIOD
        THEN
          BEGIN                        # LAST CHARACTER IS A PERIOD    #
          USCLEN = USCLEN - 1;         # STRIP THE CHARACTER           #
          END 
        END 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSRRUC                       #
  
      TERM
