From 2eb84062277959f3f548d0ff55e7b786176086d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Wed, 18 Sep 2019 17:20:41 +0200 Subject: [PATCH] Compatibility fix: strsplit was introduced in MATLAB R2013a Provide alternative implementations, taken from Dynare. --- src/initialize_dseries_class.m | 4 + .../missing/strsplit/private/ischarint.m | 27 ++++++ .../missing/strsplit/private/ischarnum.m | 35 ++++++++ src/utilities/missing/strsplit/strsplit.m | 90 +++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 src/utilities/missing/strsplit/private/ischarint.m create mode 100644 src/utilities/missing/strsplit/private/ischarnum.m create mode 100644 src/utilities/missing/strsplit/strsplit.m diff --git a/src/initialize_dseries_class.m b/src/initialize_dseries_class.m index 7da176a..5e4d1d5 100644 --- a/src/initialize_dseries_class.m +++ b/src/initialize_dseries_class.m @@ -124,6 +124,10 @@ if ~exist('iscolumn','file') p{end+1} = 'utilities/missing/iscolumn'; end +if ~exist('strsplit','file') + p{end+1} = 'utilities/missing/strsplit'; +end + % Set path P = cellfun(@(c)[dseries_src_root c], p, 'uni', false); addpath(P{:}); diff --git a/src/utilities/missing/strsplit/private/ischarint.m b/src/utilities/missing/strsplit/private/ischarint.m new file mode 100644 index 0000000..d325015 --- /dev/null +++ b/src/utilities/missing/strsplit/private/ischarint.m @@ -0,0 +1,27 @@ +function l = ischarint(x) + +% Returns true if and only if char x represents an integer. + +% Copyright © 2018 DynareTeam +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <http://www.gnu.org/licenses/>. + +s = warning; +warning off; + +l = isint(str2double(x)); + +warning(s); \ No newline at end of file diff --git a/src/utilities/missing/strsplit/private/ischarnum.m b/src/utilities/missing/strsplit/private/ischarnum.m new file mode 100644 index 0000000..57b7c7e --- /dev/null +++ b/src/utilities/missing/strsplit/private/ischarnum.m @@ -0,0 +1,35 @@ +function l = ischarnum(x) + +% Returns true if and only if char x represents a real number. + +% Copyright © 2018 DynareTeam +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <http://www.gnu.org/licenses/>. + +l = false; + +s = warning; +warning off; + +number = str2double(x); + +warning(s); + +if ~isempty(number) + if isreal(number) + l = true; + end +end \ No newline at end of file diff --git a/src/utilities/missing/strsplit/strsplit.m b/src/utilities/missing/strsplit/strsplit.m new file mode 100644 index 0000000..926bb50 --- /dev/null +++ b/src/utilities/missing/strsplit/strsplit.m @@ -0,0 +1,90 @@ +function tok = strsplit(str, delimiters) + +% Splits a string into multiple terms. +% +% INPUTS +% - str [char] String to be splitted. +% - delimiters [char, cell(char)] Delimiters. +% +% OUTPUTS +% - tok [cell(char)] Terms. + +% Copyright © 2018 DynareTeam +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <http://www.gnu.org/licenses/>. + +remove_empty = true; +remove_numbers = false; + +% Check first input arguments +assert(ischar(str) && ndims(str)==2 && size(str,1)<=1, 'The first arugment has to be a row char array!'); + +% Set default value for second input arguments +if nargin<2 + delimiters = {' '}; +end + +% If second input argument is a char transform it into a sigleton cell of char +if nargin>1 + if ischar(delimiters) + assert(ndims(delimiters)==2 && size(delimiters,1)==1, 'The second input argument has to be be a char string!'); + delimiters = {delimiters}; + end +end + +% Check that `delimiters` is a one dimensional cell +assert(ndim(delimiters)<=1, 'The second input argument has to be a one dimensional cell array!') + +% Check that `delimiters` is a cell of row char arrays +assert(all(cellfun(@ischar, delimiters)) && all(cellfun(@rows, delimiters)==1), 'The second input argument has to be a cell of row char arrays!') + +% If space is one of the delimiters obtain the index in `delimiters` +idspace = strmatch(' ', delimiters); + +% Get the number of delimiters +n = length(delimiters); + +% Remove unnecessary spaces +delimiters(setdiff(1:n, idspace)) = strtrim(delimiters(setdiff(1:n, idspace))); + +% Join all the delimiters (strjoin is not available with matlab version less than R2013a) +if n>1 + delimiter = ''; + for i=1:n + if isspace(delimiters{i}) + delimiter = horzcat(delimiter, '\s'); + else + delimiter = horzcat(delimiter, delimiters{i}); + end + delimiter = horzcat(delimiter,'|'); + end + delimiter = horzcat(delimiter, '\W'); +else + delimiter = delimiters{1}; +end + +% Get tokens +tok = regexp(str, delimiter, 'split'); + +if remove_empty + % Remove empty tokens + tok = tok(find(~cellfun(@isempty, tok))); +end + +if remove_numbers + % Remove numbers + tok = tok(find(~cellfun(@ischarnum, tok))); +end \ No newline at end of file -- GitLab