;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME:createpro ; ; PURPOSE: write an idl procedure, compile it and execute it. ; ; CATEGORY: ; ; CALLING SEQUENCE:createpro, command ; ; INPUTS: ; command: a string array defining the procedure to be created. ; each element will be a line of the created procedure. ; ; KEYWORD PARAMETERS: ; ; FILENAMEIN: name of the procedure to be created. ; 'for_createpro.pro' by default ; ; KWDLIST: a vector string. to specify a list of keywords that ; must be included in the procedure definition. Warning: the string ; must start with a ',' for example: KWDLIST = ', TOTO = toto' ; ; _EXTRA: used to pass your keywords to the created procedure. ; ; OUTPUTS: none ; ; COMMON BLOCKS: none ; ; SIDE EFFECTS: ends the procedure name with '.pro' if needed ; ; RESTRICTIONS:is not working with functions, use createfunc instead. ; arguments can be given only through keywords ; ; EXAMPLE: ; IDL> createpro, ['print,''OK'''], filename='test' ; IDL> createpro, ['if keyword_set(ok) then print,''OK'' else print, ''No'''] $ ; IDL> , filename = 'test', kwdlist =', ok = ok' ; IDL> createpro, ['if keyword_set(ok) then print,''OK'' else print, ''No'''] $ ; IDL> , filename = 'test', kwdlist = ', ok = ok', /ok ; ; ; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr) ; cleaning + new keywords: October 2005 ; Feb. 2006: supress keyword "kwdused" and use call_procedure instead of execute ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ PRO createpro, command, FILENAMEIN = filenamein $ , KWDLIST = kwdlist, KWDUSED = kwdused, _extra = ex ; compile_opt idl2, hidden, strictarrsubs ; IF keyword_set(kwdused) THEN BEGIN dummy = report(['keyword KWDUSED has been suppressed,' $ , 'please pass directly your keywords through _extra,' $ , 'see exaemples in createpro header']) return ENDIF ; define filename if needed if NOT keyword_set(filenamein) then filename = 'for_createpro.pro' $ ELSE filename = filenamein ; get the name of the procedure (not the name of the file containing the procedure) shortfilename = file_basename(filename, '.pro') ; check if the directory exists dirname = isadirectory(file_dirname(filename) $ , title = 'Redefine '+shortfilename+'.pro directory') IF size(dirname, /type) NE 7 THEN return ; filename = dirname + shortfilename + '.pro' ; create the file if NOT keyword_set(kwdlist) then kwdlist = '' kwdlist = kwdlist + ', _extra = ex' kwdlist = strtrim(kwdlist, 2) IF strmid(kwdlist, 0, 1) NE ',' THEN kwdlist = ', ' + kwdlist ; for i = 0, n_elements(command)-1 do print, command[i] putfile, filename, ['pro ' + shortfilename + kwdlist $ , 'compile_opt idl2, hidden, strictarrsubs', command, 'return', 'end'] ; go in dirname directory cd, dirname, current = old_dir ; compile it resolve_routine, shortfilename cd, old_dir ; execute it call_procedure, shortfilename, _extra = ex ; return end