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();
}
}