Skip to content

Commit

Permalink
Escape unprintable characters.
Browse files Browse the repository at this point in the history
  • Loading branch information
JakeWharton committed Oct 7, 2014
1 parent de768ac commit 54f5eab
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
2 changes: 0 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ before_script:
- android-wait-for-emulator
- adb shell input keyevent 82 &

script: ./gradlew build

branches:
except:
- gh-pages
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ public void testString() {
assertEquals("\"String\"", Strings.toString("String"));
}

public void testUnprintableCharacters() {
assertEquals("\"Str\\ning\"", Strings.toString("Str\ning"));
assertEquals("\"\\n\\r\\t\\f\\b\\u202C\"", Strings.toString("\n\r\t\f\b\u202C"));
}

public void testObjects() {
assertEquals("1", Strings.toString(new BigInteger("1")));
}
Expand Down
43 changes: 42 additions & 1 deletion hugo-runtime/src/main/java/hugo/weaving/internal/Strings.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ static String toString(Object obj) {
return "null";
}
if (obj instanceof CharSequence) {
return '"' + obj.toString() + '"';
return '"' + printableToString(obj.toString()) + '"';
}

Class<?> cls = obj.getClass();
Expand All @@ -25,6 +25,47 @@ static String toString(Object obj) {
return obj.toString();
}

private static String printableToString(String string) {
int length = string.length();
StringBuilder builder = new StringBuilder(length);
for (int i = 0; i < length;) {
int codePoint = string.codePointAt(i);
switch (Character.getType(codePoint)) {
case Character.CONTROL:
case Character.FORMAT:
case Character.PRIVATE_USE:
case Character.SURROGATE:
case Character.UNASSIGNED:
switch (codePoint) {
case '\n':
builder.append("\\n");
break;
case '\r':
builder.append("\\r");
break;
case '\t':
builder.append("\\t");
break;
case '\f':
builder.append("\\f");
break;
case '\b':
builder.append("\\b");
break;
default:
builder.append("\\u").append(String.format("%04x", codePoint).toUpperCase(Locale.US));
break;
}
break;
default:
builder.append(Character.toChars(codePoint));
break;
}
i += Character.charCount(codePoint);
}
return builder.toString();
}

private static String arrayToString(Class<?> cls, Object obj) {
if (byte.class == cls) {
return byteArrayToString((byte[]) obj);
Expand Down

0 comments on commit 54f5eab

Please sign in to comment.