tmca@malama.cfht.hawaii.edu (Tim Abbott) writes:
> Does anyone have the NASA IDL library fixed to work for IDL for windows?
> I thought it'd be fairly straightforward, but I keep running into nagging
> little problems (not least of them the eight-letter limit on filenames, and
> now the writefits programme is belly up).
I've found the following routine useful for converting the procedure filenames
to conform to the DOS eight-character limit. It will concatenate together any
files with names that have the same first eight characters into a single file,
which is what you need to do for IDL for windows.
Undoubtedly there will be other problems, but this should be a good start.
Bill Thompson
PRO CONCAT4DOS, SUBDIRECTORIES=SUBDIRECTORIES
;+
; Project : SOHO - CDS
;
; Name :
; CONCAT4DOS
; Purpose :
; Concatenates IDL procedure files for copying to DOS machine.
; Explanation :
; Concatenates IDL procedure files together into a form suitable for
; copying to a DOS machine.
;
; All the .PRO files in the current directory are copied into a special
; "dos" subdirectory, with the following changes made:
;
; 1. All filenames are truncated to eight characters.
; 2. All procedure files with names beginning with the same
; first eight characters are concatenated together into a
; single file.
;
; Use :
; CD, directory ;(go to desired directory)
; CONCAT4DOS ;or CONCAT4DOS, /SUBDIRECTORIES
; Inputs :
; None.
; Opt. Inputs :
; None.
; Outputs :
; None.
; Opt. Outputs:
; None.
; Keywords :
; SUBDIRECTORIES = If set, then subdirectories are also recursively
; processed.
; Calls :
; FDECOMP
; Common :
; None.
; Restrictions:
; None.
; Side effects:
; A "dos" subdirectory is created. On VMS machines, a temporary command
; file called "CONCAT4DOS.COM" is created and then destroyed. On UNIX
; machines the temporary file is called "concat4dos.sh".
; Category :
; Utilities, Operating_system.
; Prev. Hist. :
; William Thompson, August 1992.
; Written :
; William Thompson, GSFC, August 1992.
; Modified :
; Version 1, William Thompson, GSFC, 9 July 1993.
; Incorporated into CDS library.
; Modified so that a temporary file is created on UNIX machines
; as well, to speed up.
; Version 2, William Thompson, GSFC, 18 April 1994.
; Added SUBDIRECTORIES switch, and copying of documentation (.txt
; or .tex) files.
; Version :
; Version 2, 18 April 1994.
;-
;
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
|