From 83e63dab7ac46dfd15209c8975c60838b3bd2355 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 1 Feb 2014 14:43:54 -0800 Subject: [PATCH] Truncate filenames based on their utf-8 length --- .../org/jf/util/ClassFileNameHandler.java | 97 +++++++++++++++++-- .../org/jf/util/ClassFileNameHandlerTest.java | 71 +++++++++++++- 2 files changed, 155 insertions(+), 13 deletions(-) diff --git a/brut.apktool.smali/util/src/main/java/org/jf/util/ClassFileNameHandler.java b/brut.apktool.smali/util/src/main/java/org/jf/util/ClassFileNameHandler.java index aede10e8..7ac77352 100644 --- a/brut.apktool.smali/util/src/main/java/org/jf/util/ClassFileNameHandler.java +++ b/brut.apktool.smali/util/src/main/java/org/jf/util/ClassFileNameHandler.java @@ -33,7 +33,9 @@ import ds.tree.RadixTreeImpl; import javax.annotation.Nonnull; import java.io.*; +import java.nio.ByteBuffer; import java.nio.CharBuffer; +import java.nio.IntBuffer; import java.util.regex.Pattern; /** @@ -87,8 +89,9 @@ public class ClassFileNameHandler { packageElement += "#"; } - if (packageElement.length() > MAX_FILENAME_LENGTH) { - packageElement = shortenPathComponent(packageElement, MAX_FILENAME_LENGTH); + int utf8Length = utf8Length(packageElement); + if (utf8Length > MAX_FILENAME_LENGTH) { + packageElement = shortenPathComponent(packageElement, utf8Length - MAX_FILENAME_LENGTH); } packageElements[elementIndex++] = packageElement; @@ -109,8 +112,9 @@ public class ClassFileNameHandler { packageElement += "#"; } - if ((packageElement.length() + fileExtension.length()) > MAX_FILENAME_LENGTH) { - packageElement = shortenPathComponent(packageElement, MAX_FILENAME_LENGTH - fileExtension.length()); + int utf8Length = utf8Length(packageElement) + utf8Length(fileExtension); + if (utf8Length > MAX_FILENAME_LENGTH) { + packageElement = shortenPathComponent(packageElement, utf8Length - MAX_FILENAME_LENGTH); } packageElements[elementIndex] = packageElement; @@ -118,12 +122,87 @@ public class ClassFileNameHandler { return top.addUniqueChild(packageElements, 0); } - @Nonnull - static String shortenPathComponent(@Nonnull String pathComponent, int maxLength) { - int toRemove = pathComponent.length() - maxLength + 1; + private static int utf8Length(String str) { + int utf8Length = 0; + int i=0; + while (i 0 || secondStart < codePoints.length)) { + if (firstEnd > 0) { + firstEnd--; + bytesRemoved += utf8Length(codePoints[firstEnd]); + } + + if (bytesRemoved < bytesToRemove && secondStart < codePoints.length) { + bytesRemoved += utf8Length(codePoints[secondStart]); + secondStart++; + } + } + + StringBuilder sb = new StringBuilder(); + for (int i=0; i