627 lines · 25.4 KB · Java
RawDownload
             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