private String encodeName()

in xstream/src/java/com/thoughtworks/xstream/io/xml/XmlFriendlyNameCoder.java [480:531]


    private String encodeName(final String name) {
        String s = escapeCache.get(name);
        if (s == null) {
            final int length = name.length();

            // First, fast (common) case: nothing to escape
            int i = 0;

            for (; i < length; i++) {
                final char c = name.charAt(i);
                if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z') {
                    break;
                }
            }

            if (i == length) {
                return name;
            }

            // Otherwise full processing
            final StringBuffer result = new StringBuffer(length + 8);

            // We know first N chars are safe
            if (i > 0) {
                result.append(name.substring(0, i));
            }

            for (; i < length; i++) {
                final char c = name.charAt(i);
                if (c == '$') {
                    result.append(dollarReplacement);
                } else if (c == '_') {
                    result.append(escapeCharReplacement);
                } else if (i == 0 && !isXmlNameStartChar(c) || i > 0 && !isXmlNameChar(c)) {
                    result.append(hexPrefix);
                    if (c < 16) {
                        result.append("000");
                    } else if (c < 256) {
                        result.append("00");
                    } else if (c < 4096) {
                        result.append("0");
                    }
                    result.append(Integer.toHexString(c));
                } else {
                    result.append(c);
                }
            }
            s = result.toString();
            escapeCache.put(name, s);
        }
        return s;
    }