*DECK S$FILE
          PROC  S$FILE(NPARMS, SSMO, TTYPE, LFN, AACTION);
  
#**       S$FILE - COLLECT SPECIFICATIONS OF A FILE                    #
#                                                                      #
#     CALLING SEQUENCE-                                                #
#         CALL SMFILE(SMO, TYPE, LFN, ACTION)                          #
#           (THIS CALLS THE MACHINE-DEPENDENT ROUTINE *SMFILE* WHICH   #
#            COUNTS PARAMETERS AND CALLS S$FILE.)                      #
#                                                                      #
#     GIVEN-                                                           #
#         NPARMS = NUMBER OF PARAMETERS ORIGINALLY SUPPLIED.           #
#         SMO = FILE PROCESSING-                                       #
#             "SORT"                                                   #
#             "MERGE"                                                  #
#             "OUTPUT"                                                 #
#         TYPE = TYPE OF INPUT/OUTPUT USED FOR FILE ACCESS-            #
#             "FORMATTED"    FORTRAN FORMATTED                         #
#         "CODED"            (SAME AS "FORMATTED")                     #
#             "BINARY"       FORTRAN BINARY                            #
#             0              (USER-SUPPLIED FIT)                       #
#         LFN = MEANS TO GET FIT                                       #
#             NAME           (LEFT JUSTIFIED, ZERO FILL, TYPE"0)       #
#             TAPE NUMBER    (FORTRAN TAPE<LFN>, TYPE"0)               #
#             ARRAY WITH FIT (TYPE=0)                                  #
#         ACTION = ACTION TO BE TAKEN ON COMPLETION                    #
#             "REWIND"                                                 #
#             "UNLOAD"                                                 #
#             "NONE"         (DEFAULT)                                 #
#                                                                      #
#     DOES-                                                            #
#         IF *SMFILE* WAS NOT CALLED IN THE PROPER ORDER,              #
#             ISSUE A DIAGNOSTIC, AND                                  #
#             RETURN.                                                  #
#         IF EXACTLY 3 OR 4 PARAMETERS WERE NOT ORIGINALLY SUPPLIED,   #
#             ISSUE A DIAGNOSTIC, AND                                  #
#             RETURN.                                                  #
#         IF SPECIFIED KEYWORDS ARE ILLEGAL,                           #
#             ISSUE A DIAGNOSTIC, AND                                  #
#             ASSUME A REASONABLE DEFAULT.                             #
#         IF THE ACTION PARAMETER WAS NOT SPECIFIED,                   #
#             ASSUME "NONE".                                           #
#         SAVE THE "FILESMO", "FILETYPE", "FILEFIT", AND "FILEACT"     #
#          RAW PARAMETERS.                                             #
  
  
          BEGIN 
*CALL NPARMS
          ITEM  SSMO         C(10); 
          ITEM  TTYPE        C(10); 
          ITEM  LFN          I; 
          ITEM  AACTION      C(10); 
  
          XREF
              BEGIN 
              PROC  S$ERROR;           # HANDLE A USER ERROR           #
              PROC  S$GTFIT;           # GET FIT ADDRESS               #
              FUNC  S$INSEQ  B;        # TRUE IFF CALL IN SEQUENCE     #
              ITEM  S$MRL    I;        # MAXIMUM RECORD LENGTH         #
              FUNC  S$NEWGR  I;        # NEW GROUP NUMBER              #
              PROC  S$STORE; # STORE INTO FIT FIELD                    #
              PROC  S$SVREL;           # SAVE PARAM. FROM RELOCATABLE  #
              FUNC  S$ZERO   B;        # TRUE IFF PARAMETER IS ZERO    #
              END 
  
*CALL A 
  
*CALL E$
  
*CALL RP$ 
  
*CALL SQ$ 
  
          ITEM  ACTION       C(10); 
          ITEM  ADDR         I;        # FIT ADDR RETURNED BY S$GTFIT  #
          ITEM  BIN          I;        # 1=BINARY, 0=CODED             #
          ITEM  RMINTERFACE  B;        # IFF RECORD MGR INTERFACE      #
          ITEM  I            I; 
          ITEM  SMO          C(10); 
          ITEM  TYPE         C(10); 
CONTROL DISJOINT; 
  
CONTROL INERT;
  
CONTROL EJECT;
  
#     IF CALLED IN THE WRONG ORDER,                                    #
#         ISSUE A DIAGNOSTIC, AND                                      #
#         RETURN.                                                      #
  
          IF NOT S$INSEQ(SQ$"SMFILE") THEN
              BEGIN 
#***#         S$ERROR(E$110);          # CALL OUT OF SEQUENCE          #
              END 
  
#     IF OTHER THAN 3 OR 4 PARAMETERS WERE ORIGINALLY SUPPLIED,        #
#         ISSUE A DIAGNOSTIC, AND                                      #
#         RETURN.                                                      #
  
          IF NPARMS LS 3
           OR NPARMS GR 4 THEN
              BEGIN 
#***#         S$ERROR(E$108);          # TOO FEW/MANY PARAMETERS       #
              END 
  
#     IF ILLEGAL FILE TYPE,                                            #
#         ISSUE A DIAGNOSTIC, AND                                      #
#         ASSUME "SORT".                                               #
  
          SMO = SSMO; 
          FOR I = 0 STEP 1 UNTIL 9 DO 
              BEGIN 
              IF C<I,1>SMO EQ 0 THEN
                  C<I,1>SMO = " ";
              END 
          IF SMO EQ "SORT" THEN 
              BEGIN 
              RP$TYPE = RP$T"INFIT";
              RP$GROUP = S$NEWGR;      # REMEMBER THE SEQUENCE OF FILES#
              END 
          ELSE
          IF SMO EQ "MERGE" THEN
              BEGIN 
              RP$TYPE = RP$T"INFIT";   # FORCE MERGE TO SORT #
              RP$GROUP = S$NEWGR; 
              END 
          ELSE
          IF SMO EQ "OUTPUT" THEN 
              BEGIN 
              RP$TYPE = RP$T"OUTFIT"; 
              RP$GROUP = S$NEWGR; 
              END 
          ELSE
              BEGIN 
              S$ERROR(E$151);          # NOT "SORT","MERGE" OR "OUTPUT #
                                       # "SORT" ASSUMED                #
              RP$TYPE = RP$T"INFIT";
              RP$GROUP = S$NEWGR; 
              END 
  
#     IF ILLEGAL TYPE,                                                 #
#         ISSUE A DIAGNOSTIC, AND                                      #
#         RETURN                                                       #
#     ELSE                                                             #
#         REMEMBER TYPE OF FILE AND                                    #
#         WHETHER RECORD MANAGER INTERFACE                             #
  
          TYPE = TTYPE; 
          IF TYPE NQ 0 THEN    # DO NOT DESTROY ZERO PARAMETER #
              FOR I = 0 STEP 1 UNTIL 9 DO 
                  IF C<I,1>TYPE EQ 0 THEN 
                      C<I,1>TYPE = " ";  # CONVERT ZEROS TO SPACES #
          IF TYPE EQ "FORMATTED"
           OR TYPE EQ "CODED" THEN
              BEGIN 
              RMINTERFACE = FALSE;
              BIN = 0;                 # CODED                         #
              END 
          ELSE
          IF TYPE EQ "BINARY" THEN
              BEGIN 
              RMINTERFACE = FALSE;
              BIN = 1;                 # BINARY                        #
              END 
          ELSE
          IF S$ZERO(TYPE) THEN
              RMINTERFACE = TRUE; 
          ELSE
              BEGIN 
#***#         S$ERROR(E$107);          # ILLEGAL PARAMETER VALUE       #
              END 
  
#     GET A FIT ADDRESS                                                #
  
          IF RMINTERFACE THEN 
              ADDR = LOC(LFN);
          ELSE
              BEGIN 
              IF RP$TYPE EQ RP$T"OUTFIT" THEN 
                  S$GTFIT(0, BIN, LFN, ADDR); 
              ELSE
                  S$GTFIT(1, BIN, LFN, ADDR); 
              END 
  
#     SAVE DISPOSAL ACTION                                             #
  
          IF NPARMS EQ 4 THEN 
              BEGIN 
              ACTION = AACTION; 
              FOR I = 0 STEP 1 UNTIL 9 DO 
                  BEGIN 
                  IF C<I,1>ACTION EQ 0 THEN 
                      C<I,1>ACTION = " "; 
                  END 
              IF ACTION EQ "REWIND" THEN
                  S$STORE(ADDR, "CF", 1); 
              ELSE
              IF ACTION EQ "UNLOAD" THEN
                  S$STORE(ADDR, "CF", 3); 
              ELSE
              IF ACTION EQ "NONE" THEN
                  S$STORE(ADDR, "CF", 2); 
              ELSE
                  BEGIN 
                  S$ERROR(E$107);      # ILLEGAL PARAMETER VALUE       #
#***#             RETURN; 
                  END 
              END 
          ELSE
              S$STORE(ADDR, "CF", 2);  # ASSUME "NONE"                 #
  
#     SAVE THE RAW PARAMETER                                           #
  
          RP$VALUE = ADDR;
          S$SVREL(RP$); 
  
          END  # S$FILE # 
          TERM
