*DECK FCSUGUL 
USETEXT TEXTFCS 
      FUNC FCSUGUL (LFNSEED) U; 
*CALL COPYRITE
# TITLE FCSUGUL - UTILITY TO GENERATE UNIQUE LOCAL FILE NAME.          #
  
      BEGIN                            # FCSUGUL                       #
  
# 
**    FCSUGUL - UTILITY TO GENERATE UNIQUE LOCAL FILE NAME. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS FUNCTION GENERATES A LOCAL FILE NAME THAT IS UNIQUE FROM 
*     ANY LOCAL FILE NAMES CURRENTLY BEING USED BY THE FTP CONTROL
*     STATEMENT.
* 
*     FUNC FCSUGUL (LFNSEED)
* 
*     ENTRY   LFNSEED    = LOCAL FILE NAME SEED BLANK FILLED. 
*             FTPINPUT   = FTP INPUT FILE NAME. 
*             FTPOUTPUT  = FTP OUTPUT FILE NAME.
*             FTPPROLOG  = FTP PROLOG FILE NAME.
* 
*     EXIT    FCSUGUL    = UNIQUE LOCAL FILE NAME ZERO FILLED.
* 
*     NOTES   THE LOCAL FILE NAME SEED MUST BE 7 CHARACTERS IN LENGTH.
* 
*     METHOD  STARTING WITH THE LOCAL FILE NAME SEED, LOCAL FILE NAMES
*             ARE GENERATED UNTIL ONE IS GENERATED THAT IS UNIQUE FROM
*             FROM THE INPUT, OUTPUT AND PROLOG FILE NAME AND ANY 
*             EXISTING MANAGED BUFFER TABLE ENTRY.
*             EACH SUCCESSIVE LOCAL FILE NAME IS GENERATED AS FOLLOWS : 
*             STARTING WITH THE RIGHTMOST CHARACTER ADVANCE THE 
*             CHARACTER IN THE RANGE *A* - *9*. IF THE CHARACTER WRAPS
*             AROUND TO *A* THEN REPEAT THIS PROCEDURE WITH THE NEXT
*             CHARACTER TO THE LEFT UNTIL NO WRAPAROUND OCCURS. 
*             THE LAST UNIQUE LOCAL FILE NAME (*9999999*) WILL
*             BE FOLLOWED BY THE FIRST LOCAL FILE NAME (*AAAAAAA*). 
* 
*             EXAMPLE 
*             ------- 
* 
*             ZZZZZXF , ZZZZZXG , .. , ZZZZZX9 , ZZZZZYA , .. , 
*             ZZZZZY9 , ZZZZZZA , .. , 9999999 , AAAAAAA , AAAAAAB , .. 
* 
# 
  
# 
****  FUNC FCSUGUL - XREF LIST
# 
      XREF
        BEGIN 
        FUNC CBTZ U;                   # CONVERT BLANKS TO ZEROES      #
        END 
# 
****
# 
      ITEM LFNSEED       U;            # SEED FOR GENERATING LFN       #
  
      DEF LFNRESET$      # "AAAAAAA   " #;
  
      ITEM CBIT          I;            # CURRENT BIT POSITION          #
      ITEM CCHR          U;            # CURRENT CHARACTER OF LFN      #
      ITEM I             I;            # LOOP INDUCTION VARIABLE       #
      ITEM J             I;            # LOOP INDUCTION VARIABLE       #
      ITEM NBIT          I;            # NUMBER OF BITS TO RESET TO *A*#
      ITEM UNIQUE        B;            # UNIQUE LOCAL FILE NAME FLAG   #
  
      ARRAY LFN [00:00] S(1); 
        BEGIN 
        ITEM LFN$WORD    U(00,00,60); 
        ITEM LFN$CHAR    C(00,00,10); 
        ITEM LFN$LFN     C(00,00,07); 
        END 
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      LFN$WORD[0] = LFNSEED;           # INITIALIZE LOCAL FILE NAME    #
      UNIQUE = FALSE;                  # ASSUME NON-UNIQUE LFN         #
      FOR I = 0 
        WHILE NOT UNIQUE DO 
        BEGIN                          # LOOP TILL UNIQUE LFN          #
# 
*     VALIDATE LOCAL FILE NAME IS NOT THE INPUT, OUTPUT OR PROLOG FILE. 
*     IF NOT THEN SEARCH MBT ENTRIES FOR MATCHING LOCAL FILE NAME.
# 
        UNIQUE = (LFN$CHAR NQ FTPINPUT) AND 
                 (LFN$CHAR NQ FTPOUTPUT) AND
                 (LFN$CHAR NQ FTPPROLOG); 
        FOR J = 0 STEP 1               # LOOP THRU ALL ENTRIES         #
          WHILE (J LS MBTL / MBTESIZ$) AND
                (UNIQUE) DO 
          BEGIN                        # LOOP TILL END OR NON-UNIQUE   #
          UNIQUE = MBT$LFN[J] NQ
                   LFN$LFN[0];         # SET IF UNIQUE LFN             #
          END 
# 
*     IF LOCAL FILE NAME NOT UNIQUE THEN GENERATE NEXT LOCAL FILE NAME. 
# 
        IF NOT UNIQUE 
        THEN
          BEGIN                        # NON-UNIQUE LOCAL FILE NAME    #
          FOR CBIT = 36 STEP -6        # LOOP THRU CHARACTER POSITIONS #
            WHILE CBIT GQ 0 DO
            BEGIN 
            CCHR = B<CBIT,6>LFN$WORD[0] 
                   + 1;                # GENERATE NEXT CHARACTER VALUE #
            IF CCHR LQ O"44"
            THEN
              BEGIN                    # CHARACTER WITHIN RANGE A - 9  #
              B<CBIT,6>LFN$WORD[0] =
                CCHR;                  # STORE NEW CHARACTER VALUE     #
              GOTO ENDLOOP;            # EXIT ANY MORE ADVANCING       #
              END;
            END;
  
ENDLOOP:  
          CBIT = CBIT + 6;             # POSITION TO RESET TO *A*      #
          NBIT = 60 - CBIT;            # NUMBER OF BITS TO RESET       #
          B<CBIT,NBIT>LFN$WORD[0] = 
            LFNRESET$;                 # STORE NEEDED NUMBER OF *A*    #
          END 
        END 
# 
*     RETURN UNIQUE LOCAL FILE NAME.
# 
      FCSUGUL = CBTZ (LFN$WORD[0]);    # RETURN UNIQUE LOCAL FILE NAME #
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSUGUL                       #
  
      TERM
