in maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java [300:385]
private static String unescape(String fileEntry) {
// If there are no escaped characters, just return the input argument
int pos = fileEntry.indexOf('\\');
if (pos == -1) {
return fileEntry;
}
// We have escaped characters
byte[] inba = fileEntry.getBytes();
int inSub = 0; // Input subscript into fileEntry
byte[] outba = new byte[fileEntry.length()];
int outSub = 0; // Output subscript into outba
while (true) {
System.arraycopy(inba, inSub, outba, outSub, pos - inSub);
outSub += pos - inSub;
inSub = pos + 1;
switch ((char) inba[inSub++]) {
case '"':
outba[outSub++] = '"';
break;
case 'a':
outba[outSub++] = 7; // Bell
break;
case 'b':
outba[outSub++] = '\b';
break;
case 't':
outba[outSub++] = '\t';
break;
case 'n':
outba[outSub++] = '\n';
break;
case 'v':
outba[outSub++] = 11; // Vertical tab
break;
case 'f':
outba[outSub++] = '\f';
break;
case 'r':
outba[outSub++] = '\f';
break;
case '\\':
outba[outSub++] = '\\';
break;
case '0':
case '1':
case '2':
case '3':
// This assumes that the octal escape here is valid.
byte b = (byte) ((inba[inSub - 1] - '0') << 6);
b |= (byte) ((inba[inSub++] - '0') << 3);
b |= (byte) (inba[inSub++] - '0');
outba[outSub++] = b;
break;
default:
// This is an invalid escape in a string. Just copy it.
outba[outSub++] = '\\';
inSub--;
break;
}
pos = fileEntry.indexOf('\\', inSub);
if (pos == -1) // No more backslashes; we're done
{
System.arraycopy(inba, inSub, outba, outSub, inba.length - inSub);
outSub += inba.length - inSub;
break;
}
}
try {
// explicit say UTF-8, otherwise it'll fail at least on Windows cmdline
return new String(outba, 0, outSub, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}