2022-05-04 12:19:34 +00:00
|
|
|
package com.moandjiezana.toml;
|
2022-05-04 12:18:07 +00:00
|
|
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
|
|
public class IdentifierConverter {
|
|
|
|
|
|
|
|
static final IdentifierConverter IDENTIFIER_CONVERTER = new IdentifierConverter();
|
|
|
|
|
2022-05-04 12:19:34 +00:00
|
|
|
Identifier convert(String s, AtomicInteger index, Context context) {
|
2022-05-04 12:18:07 +00:00
|
|
|
boolean quoted = false;
|
|
|
|
StringBuilder name = new StringBuilder();
|
|
|
|
boolean terminated = false;
|
|
|
|
boolean isKey = s.charAt(index.get()) != '[';
|
|
|
|
boolean isTableArray = !isKey && s.length() > index.get() + 1 && s.charAt(index.get() + 1) == '[';
|
|
|
|
boolean inComment = false;
|
|
|
|
|
|
|
|
for (int i = index.get(); i < s.length(); i = index.incrementAndGet()) {
|
|
|
|
char c = s.charAt(i);
|
2022-05-04 12:19:34 +00:00
|
|
|
if (Keys.isQuote(c) && (i == 0 || s.charAt(i - 1) != '\\')) {
|
2022-05-04 12:18:07 +00:00
|
|
|
quoted = !quoted;
|
|
|
|
name.append(c);
|
|
|
|
} else if (c == '\n') {
|
|
|
|
index.decrementAndGet();
|
|
|
|
break;
|
|
|
|
} else if (quoted) {
|
|
|
|
name.append(c);
|
|
|
|
} else if (c == '=' && isKey) {
|
|
|
|
terminated = true;
|
|
|
|
break;
|
|
|
|
} else if (c == ']' && !isKey) {
|
|
|
|
if (!isTableArray || s.length() > index.get() + 1 && s.charAt(index.get() + 1) == ']') {
|
|
|
|
terminated = true;
|
|
|
|
name.append(']');
|
|
|
|
if (isTableArray) {
|
|
|
|
name.append(']');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (terminated && c == '#') {
|
|
|
|
inComment = true;
|
|
|
|
} else if (terminated && !Character.isWhitespace(c) && !inComment) {
|
|
|
|
terminated = false;
|
|
|
|
break;
|
|
|
|
} else if (!terminated) {
|
|
|
|
name.append(c);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!terminated) {
|
|
|
|
if (isKey) {
|
|
|
|
context.errors.unterminatedKey(name.toString(), context.line.get());
|
|
|
|
} else {
|
|
|
|
context.errors.invalidKey(name.toString(), context.line.get());
|
|
|
|
}
|
|
|
|
|
2022-05-04 12:19:34 +00:00
|
|
|
return Identifier.INVALID;
|
2022-05-04 12:18:07 +00:00
|
|
|
}
|
|
|
|
|
2022-05-04 12:19:34 +00:00
|
|
|
return Identifier.from(name.toString(), context);
|
2022-05-04 12:18:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private IdentifierConverter() {}
|
|
|
|
}
|