package jetbrains.mps.core.properties.util; /*Generated by MPS */ public class PropEscapeUtil { private static final char[] hexDigit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; public PropEscapeUtil() { } public static String escapeKey(String text) { return (text == null ? "" : escape(text, true, true)); } public static String escapeValue(String text) { return (text == null ? "" : escape(text, false, true)); } private static String escape(String text, boolean escapeSpace, boolean escapeUnicode) { int len = text.length(); int bufLen = len * 2; if (bufLen < 0) { bufLen = Integer.MAX_VALUE; } StringBuilder outBuffer = new StringBuilder(bufLen); for (int x = 0; x < len; x++) { char aChar = text.charAt(x); // Handle common case first, selecting largest block that // avoids the specials below if ((aChar > 61) && (aChar < 127)) { if (aChar == '\\') { outBuffer.append('\\'); outBuffer.append('\\'); continue; } outBuffer.append(aChar); continue; } switch (aChar) { case ' ': if (x == 0 || escapeSpace) { outBuffer.append('\\'); } outBuffer.append(' '); break; case '\t': outBuffer.append('\\'); outBuffer.append('t'); break; case '\n': outBuffer.append('\\'); outBuffer.append('n'); break; case '\r': outBuffer.append('\\'); outBuffer.append('r'); break; case '\f': outBuffer.append('\\'); outBuffer.append('f'); break; case '=': // Fall through case ':': // Fall through case '#': // Fall through case '!': outBuffer.append('\\'); outBuffer.append(aChar); break; default: if (((aChar < 32) || (aChar > 126)) & escapeUnicode) { outBuffer.append('\\'); outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 15)); outBuffer.append(toHex((aChar >> 8) & 15)); outBuffer.append(toHex((aChar >> 4) & 15)); outBuffer.append(toHex(aChar & 15)); } else { outBuffer.append(aChar); } } } return outBuffer.toString(); } private static char toHex(int nibble) { return PropEscapeUtil.hexDigit[(nibble & 15)]; } public static String escapeComment(String text) { int len = text.length(); int bufLen = len * 2; if (bufLen < 0) { bufLen = Integer.MAX_VALUE; } StringBuilder outBuffer = new StringBuilder(bufLen); for (int x = 0; x < len; x++) { char aChar = text.charAt(x); switch (aChar) { case '\\': outBuffer.append('\\'); outBuffer.append('\\'); break; case '\n': outBuffer.append('\\'); outBuffer.append('n'); break; case '\r': outBuffer.append('\\'); outBuffer.append('r'); break; case '\f': outBuffer.append('\\'); outBuffer.append('f'); break; default: if (((aChar < 32) || (aChar > 126))) { outBuffer.append('\\'); outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 15)); outBuffer.append(toHex((aChar >> 8) & 15)); outBuffer.append(toHex((aChar >> 4) & 15)); outBuffer.append(toHex(aChar & 15)); } else { outBuffer.append(aChar); } } } return outBuffer.toString(); } }