From 3b5d84c3ae10f803e0281222e05eab31f8c9d2a6 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 1 Feb 2014 14:43:54 -0800 Subject: Truncate filenames based on their utf-8 length --- .../java/org/jf/util/ClassFileNameHandler.java | 95 ++++++++++++++++++++-- .../java/org/jf/util/ClassFileNameHandlerTest.java | 71 +++++++++++++++- 2 files changed, 154 insertions(+), 12 deletions(-) (limited to 'util') diff --git a/util/src/main/java/org/jf/util/ClassFileNameHandler.java b/util/src/main/java/org/jf/util/ClassFileNameHandler.java index aede10e8..7ac77352 100644 --- a/util/src/main/java/org/jf/util/ClassFileNameHandler.java +++ b/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); } + 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