Forward ported from 2.3-gae: Bug fixed: When string?split(separator) is called with "" as the argument, the string will be split to characters now. Earlier it has thrown an IllegalArgumentException (unless the r flag was specified).
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/421f4747 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/421f4747 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/421f4747 Branch: refs/heads/3 Commit: 421f4747b2668329664bf3506100bcfc4a01259b Parents: 1af2e0c Author: ddekany <ddek...@apache.org> Authored: Tue Mar 20 18:58:37 2018 +0100 Committer: ddekany <ddek...@apache.org> Committed: Tue Mar 20 18:58:37 2018 +0100 ---------------------------------------------------------------------- .../core/BuiltInsForStringsBasic.java | 2 +- .../freemarker/core/util/_StringUtils.java | 56 ++++++++++++-------- 2 files changed, 35 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/421f4747/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java index 80429b8..1a5f1be 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java @@ -617,7 +617,7 @@ class BuiltInsForStringsBasic { : 0; String[] result; if ((flags & RegexpHelper.RE_FLAG_REGEXP) == 0) { - RegexpHelper.checkNonRegexpFlags("split", flags); + RegexpHelper.checkNonRegexpFlags(key, flags); result = _StringUtils.split(s, splitString, (flags & RegexpHelper.RE_FLAG_CASE_INSENSITIVE) != 0); } else { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/421f4747/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtils.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtils.java index e553be1..3adf958 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtils.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_StringUtils.java @@ -464,38 +464,50 @@ public class _StringUtils { /** * Splits a string at the specified string. + * + * @param sep + * The string that separates the items of the resulting array. If this is 0 length, then each character + * will be a separate item in the array. */ public static String[] split(String s, String sep, boolean caseInsensitive) { - String splitString = caseInsensitive ? sep.toLowerCase() : sep; - String input = caseInsensitive ? s.toLowerCase() : s; - int i, b, e; - int cnt; - String res[]; - int ln = s.length(); - int sln = sep.length(); + int sepLn = sep.length(); - if (sln == 0) throw new IllegalArgumentException( - "The separator string has 0 length"); + String convertedS = caseInsensitive ? s.toLowerCase() : s; + int sLn = s.length(); + + if (sepLn == 0) { + String[] res = new String[sLn]; + for (int i = 0; i < sLn; i++) { + res[i] = String.valueOf(s.charAt(i)); + } + return res; + } - i = 0; - cnt = 1; - while ((i = input.indexOf(splitString, i)) != -1) { - cnt++; - i += sln; + String splitString = caseInsensitive ? sep.toLowerCase() : sep; + String res[]; + + { + int next = 0; + int count = 1; + while ((next = convertedS.indexOf(splitString, next)) != -1) { + count++; + next += sepLn; + } + res = new String[count]; } - res = new String[cnt]; - i = 0; - b = 0; - while (b <= ln) { - e = input.indexOf(splitString, b); - if (e == -1) e = ln; - res[i++] = s.substring(b, e); - b = e + sln; + int dst = 0; + int next = 0; + while (next <= sLn) { + int end = convertedS.indexOf(splitString, next); + if (end == -1) end = sLn; + res[dst++] = s.substring(next, end); + next = end + sepLn; } return res; } + /** * Same as {@link #replace(String, String, String, boolean, boolean)} with two {@code false} parameters. */