PRO CONCAT4DOS, SUBDIRECTORIES=SUBDIRECTORIES
;
    ON_ERROR,2
;
;  If the SUBDIRECTORIES switch was set, then first process the current
;  directory.  Make sure that a "dos" subdirectory is created.
;
    IF KEYWORD_SET(SUBDIRECTORIES) THEN BEGIN
        CONCAT4DOS
        IF !VERSION.OS EQ 'vms' THEN BEGIN
            DOSDIRFILE = FINDFILE('DOS.DIR',COUNT=N_FOUND)
            IF N_FOUND EQ 0 THEN SPAWN, $
                'CREATE/DIRECTORY [.DOS]'
        END ELSE BEGIN
            DOSDIRFILE = FINDFILE('dos',COUNT=N_FOUND)
            IF N_FOUND EQ 0 THEN SPAWN, 'mkdir dos'
        ENDELSE
;
;  Next find all the subdirectories under the current directory.
;
        IF !VERSION.OS EQ 'vms' THEN BEGIN
            DIR_FILES = FINDFILE('*.dir')
            BREAK_FILE, DIR_FILES, D1, D2, DIRS, D3, D4, D5
        END ELSE SPAWN, 'find * -type d -print -prune', DIRS
;
;  Process each subdirectory, and move its "dos" file under the one for the
;  current directory.
;
        FOR I_DIR = 0,N_ELEMENTS(DIRS)-1 DO BEGIN
            DIR = DIRS(I_DIR)
            DIR8 = STRMID(DIR,0,8)
            IF (DIR NE '') AND (DIR NE 'dos') THEN BEGIN
                CD,DIR
                CONCAT4DOS, /SUBDIRECTORIES
                IF !VERSION.OS EQ 'vms' THEN BEGIN
                    SPAWN,'RENAME DOS.DIR [-.DOS]' + $
                        DIR8 + '.DIR'
                END ELSE BEGIN
                    SPAWN,'mv dos ../dos/' + DIR8
                ENDELSE
                CD,'..'
            ENDIF
        ENDFOR
        RETURN
    ENDIF
;
;  Start of the section that processes the current directory.  First make sure
;  there are procedure files in the current directory.
;
    FILES = FINDFILE('*.pro',COUNT=N_FILES)
    IF N_FILES EQ 0 THEN BEGIN
        MESSAGE,'No procedure files found',/INFORMATIONAL
        RETURN
    ENDIF
;
;  Next, look for an existing "dos" directory.  Depending on whether the OS is
;  VMS or Unix, open up a command file to store all subsequent commands.  All
;  the commands will then be executed at the end with a single spawn.
;
    IF !VERSION.OS EQ 'vms' THEN BEGIN
        OPENW,UNIT,'CONCAT4DOS.COM',/GET_LUN
        PRINTF,UNIT,'$ SET VERIFY'
        DOSDIR = 'DOS.DIR'
    END ELSE BEGIN
        OPENW,UNIT,'concat4dos.sh',/GET_LUN
        PRINTF,UNIT,'set echo'
        DOSDIR = 'dos'
    ENDELSE
    DOSDIRFILE = FINDFILE(DOSDIR,COUNT=N_FOUND)
;
;  If an existing directory was found, then warn the user that all the ".pro"
;  files in that subdirectory will be deleted, and ask if the user wants to
;  continue.  If yes, then delete the files.
;
    IF N_FOUND NE 0 THEN BEGIN
        PRINT,'DOS directory already found'
        PRINT,'All .PRO files in the DOS directory will be deleted.'
        ASK,'Continue? ',ANSWER,'YN'
        IF ANSWER EQ 'Y' THEN BEGIN
            IF !VERSION.OS EQ 'vms' THEN BEGIN
                PRINTF,UNIT,'$ DELETE/NOLOG/NOCONFIRM ' + $
                    '[.DOS]*.PRO;*'
            END ELSE BEGIN
                PRINTF,UNIT,'rm dos/*.pro'
            ENDELSE
        END ELSE GOTO, FINISH
;
;  Otherwise, create the subdirectory.
;
    END ELSE BEGIN
        IF !VERSION.OS EQ 'vms' THEN BEGIN
            PRINTF,UNIT,'$ CREATE/DIRECTORY [.DOS]'
        END ELSE BEGIN
            PRINTF,UNIT,'mkdir dos'
        ENDELSE
    ENDELSE
;
;  For each file, determine the eight character equivalent, and copy all files
;  beginning with those eight characters into a single file.
;
    LAST = ''
    FOR I=0,N_FILES-1 DO BEGIN
        FDECOMP,FILES(I),DISK,DIR,NAME,EXT,VER
        NAME8 = STRMID(NAME,0,8)
        IF NAME8 NE LAST THEN BEGIN
            IF STRLEN(NAME8) EQ 8 THEN NAME9 = NAME8 + '*' ELSE $
                NAME9 = NAME8
            IF !VERSION.OS EQ 'vms' THEN BEGIN
                PRINTF,UNIT,'$ COPY ' + NAME9 + $
                    '.PRO [.DOS]' + NAME8 + '.PRO'
            END ELSE BEGIN
                PRINTF,UNIT,'cat ' + NAME9 + '.pro > dos/' + $
                    NAME8 + '.pro'
            ENDELSE
        ENDIF
        LAST = NAME8
    ENDFOR
;
;  If there are any documentation files (.txt or .tex), then copy them as well.
;
    FILES = FINDFILE('*.t*', COUNT=N_FILES)
    IF N_FILES NE 0 THEN FOR I=0,N_FILES-1 DO BEGIN
        FDECOMP,FILES(I),DISK,DIR,NAME,EXT,VER
        NAME8 = STRMID(NAME,0,8)
        EXT3 = STRMID(EXT,0,3)
        IF !VERSION.OS EQ 'vms' THEN BEGIN
            PRINTF,UNIT,'$ COPY ' + FILES(I) + ' [.DOS]' +  $
                NAME8 + '.' + EXT3
        END ELSE BEGIN
            PRINTF,UNIT,'cat ' + FILES(I) + ' > dos/' + $
                NAME8 + '.' + EXT3
        ENDELSE
    ENDFOR
;
;  Tell the command file to delete itself after processing, and execute it.
;
FINISH:
    IF !VERSION.OS EQ 'vms' THEN BEGIN
        PRINTF,UNIT,'$ DELETE/NOLOG/NOCONFIRM CONCAT4DOS.COM;*'
        FREE_LUN,UNIT
        SPAWN,'@CONCAT4DOS.COM'
    END ELSE BEGIN
        PRINTF,UNIT,'rm concat4dos.sh'
        FREE_LUN,UNIT
        SPAWN,'source concat4dos.sh'
    ENDELSE
;
    RETURN
    END