123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- function varargout = spm_changepath(Sf, oldp, newp, verbose)
- % Recursively replace all occurences of a text pattern in a MATLAB variable.
- % FORMAT S = spm_changepath(Sf, oldp, newp)
- %
- % Sf - MATLAB variable to fix, or char array of MAT filenames,
- % or directory name (all found MAT files will be analysed)
- % oldp - old string to replace
- % newp - new string replacing oldp
- %
- % S - updated MATLAB variable (only if Sf is one)
- %
- % If the pattern is found in a string, any occurence of an invalid file
- % separator is replaced to match that of the current system.
- %
- % If MAT filenames are specified, they will be overwritten with the new
- % version. A backup of the initial version is made with a ".old" suffix.
- %__________________________________________________________________________
- % Copyright (C) 2009-2016 Wellcome Trust Centre for Neuroimaging
- % Guillaume Flandin
- % $Id: spm_changepath.m 6948 2016-11-24 10:34:01Z guillaume $
- %-Input arguments
- %--------------------------------------------------------------------------
- if ~nargin
- Sf = spm_select(Inf,'mat','Select MAT files to fix');
- end
- if nargin <= 1
- oldp = spm_input('Old pattern','+1','s');
- end
- if nargin <= 2
- newp = spm_input('New pattern','+1','s');
- end
- if nargin <= 3
- verbose = true;
- end
- %-Replace pattern in given MAT-files
- %--------------------------------------------------------------------------
- if ischar(Sf)
- if nargout
- error('Output argument only valid for MATLAB variable input');
- end
- if exist(Sf,'dir')
- Sf = spm_select('FPList',Sf,'^.*\.mat$'); % FPListRec for recursive
- end
- if isempty(Sf), Sf = {}; else Sf = cellstr(Sf); end
- for i=1:numel(Sf)
- f = Sf{i};
- try
- S = load(f);
- catch
- error('Cannot load "%s".',f);
- end
- tmp = changepath(S,oldp,newp,verbose);
- if ~isequalwithequalnans(tmp,S)
- if verbose, fprintf('=> Fixing %s\n',f); end
- [sts, msg] = movefile(f,[f '.old']);
- if ~sts, error(msg); end
- save(f ,'-struct','tmp', spm_get_defaults('mat.format'));
- end
- end
- else
- varargout = { changepath(Sf,oldp,newp,verbose) };
- end
- %==========================================================================
- function S = changepath(S,oldp,newp,verbose)
- check = false;
- switch class(S)
- case {'double','single','logical','int8','uint8','int16','uint16',...
- 'int32','uint32','int64','uint64','function_handle'}
-
- case 'cell'
- for i=1:numel(S)
- S{i} = changepath(S{i},oldp,newp,verbose);
- end
-
- case 'struct'
- for i=1:numel(S)
- fn = fieldnames(S);
- for j=1:length(fn)
- S(i).(fn{j}) = changepath(S(i).(fn{j}),oldp,newp,verbose);
- end
- end
-
- case 'char'
- f = {'\' '/'};
- if ispc, f = fliplr(f); end
- tmp = cellstr(S);
- for i=1:numel(tmp)
- t = strrep(tmp{i},oldp,newp);
- if ~isequal(tmp{i},t)
- t = strrep(t,f{1},f{2});
- if check
- if spm_existfile(t)
- sts = ' (OK) ';
- else
- sts = ' (NOT FOUND) ';
- end
- else
- sts = '';
- end
- if verbose, fprintf('%s%s\n',t,sts); end
- end
- tmp{i} = t;
- end
- S = char(tmp);
-
- case 'nifti'
- for i=1:numel(S)
- S(i).dat = changepath(S(i).dat,oldp,newp,verbose);
- end
-
- case 'file_array'
- S.fname = changepath(S.fname,oldp,newp,verbose);
-
- case 'gifti'
- if isfield(S,'cdata') && isa(S.cdata,'file_array')
- fa = struct(S.cdata);
- fa.fname = changepath(fa.fname,oldp,newp,verbose);
- S.cdata = file_array(fa);
- end
-
- otherwise
- warning('Unknown class "%s".',class(S));
- end
|