;$Id: sourceroot.pro 3454 2008-09-05 21:15:37Z cgoethel $ ;+ ; The SOURCEROOT function, in combination with ; FILEPATH, allows a program to locate other ; files within a routine source file's related ; directory tree. ;

; ; For example, an IDL routine file named ; C:\myapp\abc.pro calls SOURCEROOT as in ;

;

;    PRO ABC
;    PRINT, SOURCEROOT()
;    END
; 
; the resulting output will be the string "C:\myapp". ;

; ; If data associated with the application are in ; C:\myapp\mydata, a data file in this directory ; can be located via ;

;

;    IDL> datafile = FilePath('data.dat',$
;    IDL>   ROOT=SourceRoot(), $
;    IDL>   SUBDIR=['data'])
; 
; The programmer can distribute the application ; to another user who may install the original directory tree ; into "D:\app". ; No code modifications would be required for this ; user to successfully locate the data.dat file. ;

; ; If the routine ABC were compiled and saved to ; an IDL SAVE file and distributed, the SOURCEROOT ; function will return the path to the SAVE file ; instead. ; ; @author Jim Pendleton ;- Function SourceRoot Help, Calls = Calls UpperRoutine = (StrTok(Calls[1], ' ', /Extract))[0] Skip = 0 Catch, ErrorNumber If (ErrorNumber ne 0) then Begin Catch, /Cancel ThisRoutine = Routine_Info(UpperRoutine, /Functions, /Source) Skip = 1 EndIf If (Skip eq 0) then Begin ThisRoutine = Routine_Info(UpperRoutine, /Source) EndIf Case StrUpCase(!version.os_family) of 'WINDOWS' : DirSep = '\' 'UNIX' : DirSep = '/' 'MACOS' : DirSep = ':' 'VMS' : DirSep = ']' Else : DirSep = '' EndCase Root = StrMid(ThisRoutine.Path, 0, StrPos(ThisRoutine.Path, DirSep, /Reverse_Search) + 1) Return, Root End