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