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