if (!needEscape) { if (sb != null) sb.append(c); continue; } // build sb if this is the first escape if (sb == null) { sb = new StringBuilder(s.length()+10); // mangled names must begin with a backslash: if (s.charAt(0) != ESCAPE_C && i > 0) sb.append(NULL_ESCAPE); // append the string so far, which is unremarkable: sb.append(s.substring(0, i)); } // rewrite \ to \-, / to \|, etc. sb.append(ESCAPE_C); sb.append(replacementOf(c)); } if (sb != null) return sb.toString(); return s; } private static String demangle(String s) { // build this lazily, when we first meet an escape: StringBuilder sb = null; int stringStart = 0; if (s.startsWith(NULL_ESCAPE)) stringStart = 2; for (int i = stringStart, slen = s.length(); i < slen; i++) { char c = s.charAt(i); if (c == ESCAPE_C && i+1 < slen) { // might be an escape sequence char rc = s.charAt(i+1); char oc = originalOfReplacement(rc); if (oc != rc) { // build sb if this is the first escape if (sb == null) { sb = new StringBuilder(s.length()); // append the string so far, which is unremarkable: sb.append(s.substring(stringStart, i)); } ++i; // skip both characters c = oc; } } if (sb != null) sb.append(c); } if (sb != null) return sb.toString(); return s.substring(stringStart); } static char ESCAPE_C = '\\'; // empty escape sequence to avoid a null name or illegal prefix static char NULL_ESCAPE_C = '='; static String NULL_ESCAPE = ESCAPE_C+""+NULL_ESCAPE_C; static final String DANGEROUS_CHARS = "\\/.;:$[]<>"; // \\ must be first static final String REPLACEMENT_CHARS = "-|,?!%{}^_"; static final int DANGEROUS_CHAR_FIRST_INDEX = 1; // index after \\ static char[] DANGEROUS_CHARS_A = DANGEROUS_CHARS.toCharArray(); static char[] REPLACEMENT_CHARS_A = REPLACEMENT_CHARS.toCharArray(); static final Character[] DANGEROUS_CHARS_CA; static { Character[] dcca = new Character[DANGEROUS_CHARS.length()]; for (int i = 0; i < dcca.length; i++) dcca[i] = Character.valueOf(DANGEROUS_CHARS.charAt(i)); DANGEROUS_CHARS_CA = dcca; } static final long[] SPECIAL_BITMAP = new long[2]; // 128 bits static { String SPECIAL = DANGEROUS_CHARS + REPLACEMENT_CHARS; //System.out.println("SPECIAL = "+SPECIAL); for (char c : SPECIAL.toCharArray()) { SPECIAL_BITMAP[c >>> 6] |= 1L << c; } } static boolean isSpecial(char c) { if ((c >>> 6) < SPECIAL_BITMAP.length) return ((SPECIAL_BITMAP[c >>> 6] >> c) & 1) != 0; else return false; } static char replacementOf(char c) { if (!isSpecial(c)) return c; int i = DANGEROUS_CHARS.indexOf(c); if (i < 0) return c; return REPLACEMENT_CHARS.charAt(i); } static char originalOfReplacement(char c) { if (!isSpecial(c)) return c; int i = REPLACEMENT_CHARS.indexOf(c); if (i < 0) return c; return DANGEROUS_CHARS.charAt(i); } static boolean isDangerous(char c) { if (!isSpecial(c)) return false; return (DANGEROUS_CHARS.indexOf(c) >= DANGEROUS_CHAR_FIRST_INDEX); } static int indexOfDangerousChar(String s, int from) { for (int i = from, slen = s.length(); i < slen; i++) { if (isDangerous(s.charAt(i))) return i; } return -1; } static int lastIndexOfDangerousChar(String s, int from) { for (int i = Math.min(from, s.length()-1); i >= 0; i--) { if (isDangerous(s.charAt(i))) return i; } return -1; } }Lines 501–627 of 627. Previous lines
if (!needEscape) { if (sb != null) sb.append(c); continue; } // build sb if this is the first escape if (sb == null) { sb = new StringBuilder(s.length()+10); // mangled names must begin with a backslash: if (s.charAt(0) != ESCAPE_C && i > 0) sb.append(NULL_ESCAPE); // append the string so far, which is unremarkable: sb.append(s.substring(0, i)); } // rewrite \ to \-, / to \|, etc. sb.append(ESCAPE_C); sb.append(replacementOf(c)); } if (sb != null) return sb.toString(); return s; } private static String demangle(String s) { // build this lazily, when we first meet an escape: StringBuilder sb = null; int stringStart = 0; if (s.startsWith(NULL_ESCAPE)) stringStart = 2; for (int i = stringStart, slen = s.length(); i < slen; i++) { char c = s.charAt(i); if (c == ESCAPE_C && i+1 < slen) { // might be an escape sequence char rc = s.charAt(i+1); char oc = originalOfReplacement(rc); if (oc != rc) { // build sb if this is the first escape if (sb == null) { sb = new StringBuilder(s.length()); // append the string so far, which is unremarkable: sb.append(s.substring(stringStart, i)); } ++i; // skip both characters c = oc; } } if (sb != null) sb.append(c); } if (sb != null) return sb.toString(); return s.substring(stringStart); } static char ESCAPE_C = '\\'; // empty escape sequence to avoid a null name or illegal prefix static char NULL_ESCAPE_C = '='; static String NULL_ESCAPE = ESCAPE_C+""+NULL_ESCAPE_C; static final String DANGEROUS_CHARS = "\\/.;:$[]<>"; // \\ must be first static final String REPLACEMENT_CHARS = "-|,?!%{}^_"; static final int DANGEROUS_CHAR_FIRST_INDEX = 1; // index after \\ static char[] DANGEROUS_CHARS_A = DANGEROUS_CHARS.toCharArray(); static char[] REPLACEMENT_CHARS_A = REPLACEMENT_CHARS.toCharArray(); static final Character[] DANGEROUS_CHARS_CA; static { Character[] dcca = new Character[DANGEROUS_CHARS.length()]; for (int i = 0; i < dcca.length; i++) dcca[i] = Character.valueOf(DANGEROUS_CHARS.charAt(i)); DANGEROUS_CHARS_CA = dcca; } static final long[] SPECIAL_BITMAP = new long[2]; // 128 bits static { String SPECIAL = DANGEROUS_CHARS + REPLACEMENT_CHARS; //System.out.println("SPECIAL = "+SPECIAL); for (char c : SPECIAL.toCharArray()) { SPECIAL_BITMAP[c >>> 6] |= 1L << c; } } static boolean isSpecial(char c) { if ((c >>> 6) < SPECIAL_BITMAP.length) return ((SPECIAL_BITMAP[c >>> 6] >> c) & 1) != 0; else return false; } static char replacementOf(char c) { if (!isSpecial(c)) return c; int i = DANGEROUS_CHARS.indexOf(c); if (i < 0) return c; return REPLACEMENT_CHARS.charAt(i); } static char originalOfReplacement(char c) { if (!isSpecial(c)) return c; int i = REPLACEMENT_CHARS.indexOf(c); if (i < 0) return c; return DANGEROUS_CHARS.charAt(i); } static boolean isDangerous(char c) { if (!isSpecial(c)) return false; return (DANGEROUS_CHARS.indexOf(c) >= DANGEROUS_CHAR_FIRST_INDEX); } static int indexOfDangerousChar(String s, int from) { for (int i = from, slen = s.length(); i < slen; i++) { if (isDangerous(s.charAt(i))) return i; } return -1; } static int lastIndexOfDangerousChar(String s, int from) { for (int i = Math.min(from, s.length()-1); i >= 0; i--) { if (isDangerous(s.charAt(i))) return i; } return -1; } }