in freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java [178:252]
static int findTemplatePathSettingAssignmentsStart(String s) {
int pos = s.length() - 1;
// Skip WS
while (pos >= 0 && Character.isWhitespace(s.charAt(pos))) {
pos--;
}
// Skip `)`
if (pos < 0 || s.charAt(pos) != ')') return -1;
pos--;
// Skip `(...`
int parLevel = 1;
int mode = 0;
while (parLevel > 0) {
if (pos < 0) return -1;
char c = s.charAt(pos);
switch (mode) {
case 0: // 0: outside string literal
switch (c) {
case '(': parLevel--; break;
case ')': parLevel++; break;
case '\'': mode = 1; break;
case '"': mode = 2; break;
}
break;
case 1: // 1: inside '...'
if (c == '\'' && !(pos > 0 && s.charAt(pos - 1) == '\\')) {
mode = 0;
}
break;
case 2: // 2: inside "..."
if (c == '"' && !(pos > 0 && s.charAt(pos - 1) == '\\')) {
mode = 0;
}
break;
}
pos--;
}
// Skip WS
while (pos >= 0 && Character.isWhitespace(s.charAt(pos))) {
pos--;
}
int biNameEnd = pos + 1;
// Skip name chars
while (pos >= 0 && Character.isJavaIdentifierPart(s.charAt(pos))) {
pos--;
}
int biNameStart = pos + 1;
if (biNameStart == biNameEnd) {
return -1;
}
String biName = s.substring(biNameStart, biNameEnd);
// Skip WS
while (pos >= 0 && Character.isWhitespace(s.charAt(pos))) {
pos--;
}
// Skip `?`
if (pos < 0 || s.charAt(pos) != '?') return -1;
if (!biName.equals(TEMPLATE_PATH_SETTINGS_BI_NAME)) {
throw new TemplatePathParsingException(
StringUtil.jQuote(biName) + " is unexpected after the \"?\". "
+ "Expected \"" + TEMPLATE_PATH_SETTINGS_BI_NAME + "\".");
}
return pos;
}