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. 
      */

Reply via email to