package org.smoothbuild.util; public class StringUnescaper { private static final char TAB = '\t'; private static final char BACKSPACE = '\b'; private static final char NEW_LINE = '\n'; private static final char CARRIAGE_RETURN = '\r'; private static final char FORM_FEED = '\f'; private static final char DOUBLE_QUOTE = '\"'; private static final char BACKSLASH = '\\'; private static final String BACKSLASH_STRING = "\\"; /** * Unescapes Smooth string. Replaces all escaped characters according to * following rules: * * <pre> * \t is replaced with a tab * \b is replaced with a backspace * \n is replaced with a newline * \r is replaced with a carriage return * \f is replaced with a formfeed * \" is replaced with a double quote character * \\ is replaced with a backslash character * </pre> */ public static String unescaped(String string) { if (string.contains(BACKSLASH_STRING)) { return unescapedImpl(string); } else { return string; } } private static String unescapedImpl(String string) { char[] result = new char[string.length()]; int stringIndex = 0; int resultIndex = 0; while (stringIndex < string.length()) { char current = string.charAt(stringIndex); if (current == BACKSLASH) { stringIndex++; if (stringIndex == string.length()) { throw new UnescapingFailedException(stringIndex - 1, "Missing escape code after backslash \\"); } result[resultIndex] = convertEscapeCodeToChar(string.charAt(stringIndex), stringIndex); } else { result[resultIndex] = current; } stringIndex++; resultIndex++; } return new String(result, 0, resultIndex); } private static char convertEscapeCodeToChar(char code, int charIndex) { switch (code) { case 't': return TAB; case 'b': return BACKSPACE; case 'n': return NEW_LINE; case 'r': return CARRIAGE_RETURN; case 'f': return FORM_FEED; case '"': return DOUBLE_QUOTE; case '\\': return BACKSLASH; default: throw new UnescapingFailedException(charIndex, "Illegal escape sequence. Legal sequences are: \\t \\b \\n \\r \\f \\\" \\\\."); } } }