private static String unescape()

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