*DECK FCSXPES 
USETEXT TEXTFCS;
      PROC FCSXPES; 
*CALL COPYRITE
# TITLE FCSXPES - PROGRAM EXECUTION SEQUENCER.                         #
  
      BEGIN                            # FCSXPES                       #
  
# 
**    FCSXPES - PROGRAM EXECUTION SEQUENCER.
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE SERVES AS THE MAINLINE PROCEDURE FOR THE FTP 
*     CONTROL STATEMENT PROCESSOR.
* 
*     PROC FCSXPES
* 
*     ENTRY   FTP CONTROL STATEMENT PROCESSOR INITIALIZED.
* 
*     EXIT    FTP CONTROL STATEMENT PROCESSOR COMPLETE. 
*             CONTROL RETURNED TO THE OPERATING SYSTEM. 
* 
*     METHOD  RETURN THE OVERLAY AREA TO THE MANANGED TABLE AREA. 
*             REPEAT
*               DEALLOCATE ANY COMMAND OR REPLY BUFFER EXPANSION. 
*               ATTEMPT TO REDUCE FIELD LENGTH. 
*               PROMPT, READ, PARSE, AND PROCESS THE NEXT USER COMMAND. 
*             UNTIL *QUIT* USER COMMAND PROCESSED.
*             END CONTROL STATEMENT PROCESSOR.
*             RETURN CONTROL TO THE OPERATING SYSTEM. 
* 
# 
  
# 
****  PROC FCSXPES - XREF LIST
# 
      XREF
        BEGIN 
        PROC FCSCPES;                  # COMMAND SEQUENCER             #
        PROC FCSEPES;                  # EXIT SEQUENCER                #
        PROC FCSMDTS;                  # DEALLOCATE TABLE SPACE        #
        PROC FCSMRFL;                  # REQUEST FIELD LENGTH CHANGE   #
        PROC FCSMRMT;                  # RELOCATE MANAGED TABLES       #
        PROC FCSOFTO;                  # FLUSH TERMINAL OUTPUT         #
        PROC FCSRPUC;                  # PARSE USER COMMAND            #
        PROC FCSRRUC;                  # READ USER COMMAND             #
        FUNC MODULO I;                 # PERFORM MODULUS FUNCTION      #
        PROC NETUCDA;                  # CONVERT DISPLAY CODE TO ASCII #
        END 
# 
****
# 
      ITEM EXTRA         I;            # NUMBER OF EXTRA TABLE WORDS   #
      ITEM QUITCMD       C(10) = "QUIT      ";
      ITEM RESULT        I;            # RESULT FROM *READC* MACRO     #
      ITEM SPARE         I;            # NUMBER OF SPARE TABLE WORDS   #
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      EXTRA = TSTART - LOADBASE;       # SIZE OF OVERLAY AREA          #
      AVAIL = AVAIL + EXTRA;           # UPDATE AVAILABLE TABLE WORDS  #
      TSTART = LOADBASE;               # GIVE OVERLAY AREA TO TABLES   #
      FCSMRMT (AVAIL, 1, 0);           # RELOCATE MANAGED TABLES       #
# 
*     SINCE THE MBT ENTRIES HAVE BEEN MOVED, UPDATE THE FET POINTERS OF 
*     ALL MBT ENTRIES.
# 
      FOR MBTX = 0 STEP 1 
        WHILE MBTX LS MBTL / MBTESIZ$ DO
        BEGIN                          # LOOP THRU ALL MANAGED TABLES  #
        MBT$FIRST[MBTX] = 
          MBT$FIRST[MBTX] - EXTRA;     # UPDATE FIRST POINTER          #
        MBT$IN[MBTX] =
          MBT$IN[MBTX] - EXTRA;        # UPDATE IN POINTER             #
        MBT$OUT[MBTX] = 
          MBT$OUT[MBTX] - EXTRA;       # UPDATE OUT POINTER            #
        MBT$LIMIT[MBTX] = 
          MBT$LIMIT[MBTX] - EXTRA;     # UPDATE LIMIT POINTER          #
        END 
# 
*     WHILE QUIT COMMAND NOT PROCESSED
*       DEALLOCATE ANY COMMAND OR REPLY BUFFER EXPANSION. 
*       ATTEMPT TO REDUCE FIELD LENGTH. 
*       PROMPT, READ, PARSE AND PROCESS NEXT USER COMMAND.
# 
      FOR FTPSTATE = FTPSTATE 
        WHILE FTPSTATE LAN FTPUQUIT EQ 0 DO 
        BEGIN 
        IF USCL GR USCSIZ$
        THEN
          BEGIN                        # COMMAND BUFFER EXPANDED       #
          FCSMDTS (P<USC>, USCSIZ$, 
                   USCL - USCSIZ$);    # DEALLOCATE EXTRA EXPANSION    #
          END 
        IF LRBL GR RPYSIZ$
        THEN
          BEGIN                        # LOCAL REPLY BUFFER EXPANDED   #
          FCSMDTS (P<LRB>, RPYSIZ$, 
                   LRBL - RPYSIZ$);    # DEALLOCATE EXTRA EXPANSION    #
          END 
        IF RRBL GR RPYSIZ$
        THEN
          BEGIN                        # REMOTE REPLY BUFFER EXPANDED  #
          FCSMDTS (P<RRB>, RPYSIZ$, 
                   RRBL - RPYSIZ$);    # DEALLOCATE EXTRA EXPANSION    #
          END 
        IF ERBL GR RPYSIZ$
        THEN
          BEGIN                        # ERROR REPLY BUFFER EXPANDED   #
          FCSMDTS (P<ERB>, RPYSIZ$, 
                   ERBL - RPYSIZ$);    # DEALLOCATE EXTRA EXPANSION    #
          END 
# 
*     ATTEMPT TO REDUCE FIELD LENGTH. 
# 
        SPARE = MODULO (AVAIL, FLMUL); # SPARE WORDS FOR EXPANSION     #
        EXTRA = AVAIL - SPARE;         # NUMBER OF EXTRA WORDS         #
        IF EXTRA GR 0 
        THEN
          BEGIN                        # NEED TO DECREASE FIELD LENGTH #
          FCSMRMT (SPARE, 1, 0);       # RELOCATE MANAGED TABLES       #
          FCSMRFL ( -EXTRA );          # REQUEST FIELD LENGTH CHANGE   #
          END 
# 
*     PROMPT, READ, PARSE AND PROCESS THE NEXT USER COMMAND.
# 
        IF FTPINPUT NQ "0"
        THEN
          BEGIN                        # INPUT FILE EXISTS             #
          FCSRRUC (MBIX, NOT FTPINTER, # READ USER COMMAND FROM INPUT  #
                   RESULT);            # BATCH MODE WRITES TO OUTPUT   #
          IF (RESULT NQ 0) AND
             (MBT$DT[MBIX] NQ "TT") 
          THEN
            BEGIN                      # EOR/EOF/EOI AND NOT TERMINAL  #
            USCLEN = 0;                # INITIALIZE COMMAND LENGTH     #
            NETUCDA (QUITCMD, 0, 4, USC,
                     USCLEN, FALSE);   # FAKE A QUIT COMMAND           #
            END 
          END 
        ELSE
          BEGIN                        # NO INPUT FILE EXISTS          #
          USCLEN = 0;                  # INITIALIZE COMMAND LENGTH     #
          NETUCDA (QUITCMD, 0, 4, USC,
                   USCLEN, FALSE);     # FAKE A QUIT COMMAND           #
          END 
        FCSRPUC;                       # PARSE USER COMMAND            #
        FCSCPES;                       # PROCESS FTP USER COMMAND      #
        FCSOFTO;                       # FLUSH TERMINAL OUTPUT         #
        END 
# 
*     QUIT COMMAND PROCESSED. 
# 
      FTPABORT = ENORMAL;              # GO DOWN GRACEFULLY            #
      FCSEPES;                         # EXIT FTP CONTROL STATEMENT    #
  
      STOP;                            # THATS ALL FOLKS               #
  
      END                              # FCSXPES                       #
  
      TERM
