function s=cosmo_wtf(param)
% return system, toolbox and externals information
%
% s=cosmo_wtf([param])
%
% Parameters
% param optional; if provided it can be 'is_octave' or 'is_matlab'
%
% Output:
%
% s - if param is not provided it returns a string
% representation with system information;
% - if param is 'is_{octave,matlab}' a boolean is returned
% - if param is 'version_number' then a numeric vector with
% version information is returned; for example version
% '8.5.0.197613' results in [8, 5, 0, 197613].
% - if param is one of 'computer', 'environment', version',
% 'toolboxes', 'cosmo_externals', 'cosmo_files', or 'java',
% then the information of that parameter is returned.
%
%
% Examples:
% % print the information to standard out (the command window)
% cosmo_wtf();
%
% % store the information in the variable 'w':
% w=cosmo_wtf();
%
% % see if this environment is octave
% b=cosmo_wtf('is_octave');
%
% Notes:
% - this function is intended to get system information in user support
% situations.
%
% # For CoSMoMVPA's copyright information and license terms, #
% # see the COPYING file distributed with CoSMoMVPA. #
has_param=nargin>=1 && ~isempty(param);
if has_param
s=get_single_param_value(param);
else
s=get_all_param_values();
end
function s=get_all_param_values()
param2func=get_param2func();
keys=fieldnames(param2func);
value_printer=@(key)as_string(helper_get_param_from_func_value(key));
printer=@(key) sprintf('%s: %s',...
key,value_printer(key));
s_cell=cellfun(printer,keys,'UniformOutput',false);
s=cosmo_strjoin(s_cell,'\n');
function s=as_string(v)
if ischar(v)
s=v;
elseif isnumeric(v)
s=sprintf('[ %s]',sprintf('%d ',v));
elseif iscellstr(v)
s=sprintf('\n %s',v{:});
else
assert(false,'unsupported type');
end
function s=get_single_param_value(param)
if ~ischar(param)
error('argument must be a string');
end
switch param
case 'is_matlab'
s=environment_is_matlab();
case 'is_octave'
s=environment_is_octave();
otherwise
s=helper_get_param_from_func_value(param);
end
function s=helper_get_param_from_func_value(key)
param2func=get_param2func();
if ~isfield(param2func,key)
error('Unsupported parameter ''%s''. Supported are:\n ''%s''',...
key, cosmo_strjoin(fieldnames(param2func),'''\n '''));
end
f=param2func.(key);
s=f();
function param2func=get_param2func()
persistent cached_param2func;
if ~isstruct(cached_param2func)
cached_param2func=struct();
cached_param2func.computer=@computer_;
cached_param2func.environment=@environment;
cached_param2func.version=version_;
cached_param2func.version_number=@version_number_;
cached_param2func.java=java_;
cached_param2func.cosmo_externals=@cosmo_externals;
cached_param2func.toolboxes=@toolboxes;
cached_param2func.warnings=@warning_helper;
cached_param2func.cosmo_config=@cosmo_config_helper;
cached_param2func.cosmo_files=@cosmo_files;
cached_param2func.path=@path_;
end
param2func=cached_param2func;
function s=computer_()
[c,m,e]=computer();
s=sprintf('%s (maxsize=%d, endian=%s)',c,m,e);
function s=environment()
if environment_is_octave()
s='octave';
elseif environment_is_matlab()
s='matlab';
end
function tf=environment_is_octave()
tf=logical(exist('OCTAVE_VERSION', 'builtin'));
function tf=environment_is_matlab()
% assume either matlab or octave, no third interpretr
tf=~environment_is_octave();
function s=version_()
if environment_is_matlab()
[version_,date_]=version();
s=sprintf('%s (%s)',version_,date_);
else
s=sprintf('%s',version());
end
function v=version_number_()
v_str=regexp(version(),'^\S*','match');
parts=cosmo_strsplit(v_str{1},'.');
v=cellfun(@str2num,parts);
function s=java_()
if environment_is_matlab()
s=version('-java');
else
s=not_in_this_environment();
end
function s=not_in_this_environment()
s=sprintf('not supported in environment ''%s''',environment());
function s=toolboxes()
v=ver();
formatter=@(x) sprintf(' %s v%s %s [%s]',x.Name,x.Version,...
x.Release,x.Date);
s=dir2str(v,formatter);
function s=cosmo_externals()
s=cosmo_check_external('-list');
function s=cosmo_files()
pth=fileparts(which(mfilename())); % cosmo root directory
d=cosmo_dir(pth,'cosmo_*.m'); % list files
s=dir2str(d);
function s=cosmo_config_helper()
try
c=cosmo_config();
fns=fieldnames(c);
n=numel(fns);
ww=cell(n+1,1);
ww{1}='';
for k=1:n
fn=fns{k};
ww{k+1}=sprintf(' %s: %s',fn,c.(fn));
end
s=cosmo_strjoin(ww,'\n');
catch
caught_error=lasterror();
s=caught_error.message;
end
function s=path_()
s=cosmo_strsplit(path(),pathsep());
function parts=warning_helper()
s=warning();
n=numel(s);
parts=arrayfun(@(i)sprintf('%s: %s', s(i).identifier, s(i).state),...
1:n,'UniformOutput',false);
function s=dir2str(d, formatter)
% d is the result from 'dir' or 'cosmo_dir'
if nargin<2
formatter=@(x)sprintf(' %s % 10d %s',x.date,x.bytes,x.name);
end
n=numel(d);
ww=cell(n+1,1); % allocate space for output
ww{1}=''; % start with newline
pos=1;
for k=1:n
dk=d(k);
% if any value is empty, replace it by the empty string
fns=fieldnames(dk);
for j=1:numel(fns)
fn=fns{j};
v=dk.(fn);
if isempty(v)
dk.(fn)='';
end
end
pos=pos+1;
ww{pos}=formatter(dk);
end
s=cosmo_strjoin(ww(1:pos),'\n');