summaryrefslogtreecommitdiffstats
path: root/luni/src/main/java
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2010-06-24 14:52:40 -0700
committerElliott Hughes <enh@google.com>2010-06-24 14:52:40 -0700
commit870b23b3febc851c9cd2321f82a9971a34093e77 (patch)
treeea7196e11cdfca5194adc5f6bea5931ae5b32cc0 /luni/src/main/java
parent095cbb8709ed62713b64f8dfe91164507ac7a65b (diff)
downloadlibcore-870b23b3febc851c9cd2321f82a9971a34093e77.zip
libcore-870b23b3febc851c9cd2321f82a9971a34093e77.tar.gz
libcore-870b23b3febc851c9cd2321f82a9971a34093e77.tar.bz2
Fix String.replace("", _).
Bug: http://code.google.com/p/android/issues/detail?id=8807 Change-Id: Id587df266a547ff17db4dbb32493bed394a7c51e
Diffstat (limited to 'luni/src/main/java')
-rw-r--r--luni/src/main/java/java/lang/String.java53
1 files changed, 34 insertions, 19 deletions
diff --git a/luni/src/main/java/java/lang/String.java b/luni/src/main/java/java/lang/String.java
index d74b19e..df8da94 100644
--- a/luni/src/main/java/java/lang/String.java
+++ b/luni/src/main/java/java/lang/String.java
@@ -1542,7 +1542,6 @@ outer:
* @return a new string with occurrences of oldChar replaced by newChar.
*/
public String replace(char oldChar, char newChar) {
- // BEGIN endroid-changed
char[] buffer = value;
int _offset = offset;
int _count = count;
@@ -1566,7 +1565,6 @@ outer:
}
return copied ? new String(0, count, buffer) : this;
- // END android-changed
}
/**
@@ -1584,30 +1582,47 @@ outer:
*/
public String replace(CharSequence target, CharSequence replacement) {
if (target == null) {
- throw new NullPointerException("target should not be null");
+ throw new NullPointerException("target == null");
}
if (replacement == null) {
- throw new NullPointerException("replacement should not be null");
+ throw new NullPointerException("replacement == null");
}
- String ts = target.toString();
- int index = indexOf(ts, 0);
- if (index == -1)
+ String targetString = target.toString();
+ int matchStart = indexOf(targetString, 0);
+ if (matchStart == -1) {
+ // If there's nothing to replace, return the original string untouched.
return this;
+ }
+
+ String replacementString = replacement.toString();
+
+ // The empty target matches at the start and end and between each character.
+ int targetLength = targetString.length();
+ if (targetLength == 0) {
+ int resultLength = (count + 2) * replacementString.length();
+ StringBuilder result = new StringBuilder(resultLength);
+ result.append(replacementString);
+ for (int i = offset; i < count; ++i) {
+ result.append(value[i]);
+ result.append(replacementString);
+ }
+ return result.toString();
+ }
- String rs = replacement.toString();
- StringBuilder buffer = new StringBuilder(count);
- int tl = target.length();
- int tail = 0;
+ StringBuilder result = new StringBuilder(count);
+ int searchStart = 0;
do {
- buffer.append(value, offset + tail, index - tail);
- buffer.append(rs);
- tail = index + tl;
- } while ((index = indexOf(ts, tail)) != -1);
- //append trailing chars
- buffer.append(value, offset + tail, count - tail);
-
- return buffer.toString();
+ // Copy characters before the match...
+ result.append(value, offset + searchStart, matchStart - searchStart);
+ // Insert the replacement...
+ result.append(replacementString);
+ // And skip over the match...
+ searchStart = matchStart + targetLength;
+ } while ((matchStart = indexOf(targetString, searchStart)) != -1);
+ // Copy any trailing chars...
+ result.append(value, offset + searchStart, count - searchStart);
+ return result.toString();
}
/**