in org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java [1410:1505]
private static String readValue(StringReader in)
throws ConfigInvalidException {
StringBuilder value = new StringBuilder();
StringBuilder trailingSpaces = null;
boolean quote = false;
boolean inLeadingSpace = true;
for (;;) {
int c = in.read();
if (c < 0) {
break;
}
if ('\n' == c) {
if (quote) {
throw new ConfigInvalidException(
JGitText.get().newlineInQuotesNotAllowed);
}
in.reset();
break;
}
if (!quote && (';' == c || '#' == c)) {
if (trailingSpaces != null) {
trailingSpaces.setLength(0);
}
in.reset();
break;
}
char cc = (char) c;
if (Character.isWhitespace(cc)) {
if (inLeadingSpace) {
continue;
}
if (trailingSpaces == null) {
trailingSpaces = new StringBuilder();
}
trailingSpaces.append(cc);
continue;
}
inLeadingSpace = false;
if (trailingSpaces != null) {
value.append(trailingSpaces);
trailingSpaces.setLength(0);
}
if ('\\' == c) {
c = in.read();
switch (c) {
case -1:
throw new ConfigInvalidException(JGitText.get().endOfFileInEscape);
case '\n':
continue;
case 't':
value.append('\t');
continue;
case 'b':
value.append('\b');
continue;
case 'n':
value.append('\n');
continue;
case '\\':
value.append('\\');
continue;
case '"':
value.append('"');
continue;
case '\r': {
int next = in.read();
if (next == '\n') {
continue; // CR-LF
} else if (next >= 0) {
in.reset();
}
break;
}
default:
break;
}
throw new ConfigInvalidException(
MessageFormat.format(JGitText.get().badEscape,
Character.isAlphabetic(c)
? Character.valueOf(((char) c))
: toUnicodeLiteral(c)));
}
if ('"' == c) {
quote = !quote;
continue;
}
value.append(cc);
}
return value.length() > 0 ? value.toString() : null;
}