Overgram/generator/src/main/java/io/github/lonamiwebs/overgram/parser/TLReader.java

105 lines
3.6 KiB
Java

package io.github.lonamiwebs.overgram.parser;
import io.github.lonamiwebs.overgram.utils.CharacterIterator;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TLReader {
public static int readTlObjects(final Map<String, List<TLObject>> result, final File file) {
final int[] layer = new int[1];
for (final Map.Entry<String, List<String>> entry : readTl(file, layer).entrySet()) {
final List<TLObject> objects = result.computeIfAbsent(entry.getKey(), k -> new ArrayList<>());
for (final String string : entry.getValue()) {
objects.add(TLObject.fromString(string));
}
}
return layer[0];
}
private static void scanCommentForLayer(final CharacterIterator iter, final int[] layer) {
final String target = "/ LAYER ";
int i = 0;
char c = '\0';
while (iter.hasNext() && (c = iter.next()) != '\n') {
if (c != target.charAt(i)) {
break;
}
++i;
if (i == target.length()) {
final StringBuilder builder = new StringBuilder();
while (iter.hasNext() && Character.isDigit(c = iter.next())) {
builder.append(c);
}
layer[0] = Integer.parseInt(builder.toString());
break;
}
}
while (iter.hasNext() && c != '\n') {
c = iter.next();
}
}
private static Map<String, List<String>> readTl(final File file, final int[] layer) {
final Map<String, List<String>> result = new HashMap<>();
String section = "types";
try (final CharacterIterator iter = new CharacterIterator(new FileReader(file))) {
String tmp;
final StringBuilder builder = new StringBuilder();
for (char c : iter) {
switch (c) {
// Assume '/' only occurs in "// comments...\n"
case '/':
scanCommentForLayer(iter, layer);
break;
// Assume '-' only occurs in "---sections---\n"
case '-':
if (builder.length() != 0) {
tmp = builder.toString().trim();
if (!tmp.isEmpty()) {
result.computeIfAbsent(section, k -> new ArrayList<>()).add(tmp);
}
builder.setLength(0);
}
do {
c = iter.next();
if (c != '-') {
builder.append(c);
}
} while (iter.hasNext() && c != '\n');
section = builder.toString().trim();
builder.setLength(0);
break;
// Definitions are separated by ';'
case ';':
tmp = builder.toString().trim();
if (!tmp.isEmpty()) {
result.computeIfAbsent(section, k -> new ArrayList<>()).add(tmp);
}
builder.setLength(0);
break;
default:
builder.append(c);
break;
}
}
} catch (IOException ignored) {
}
return result;
}
}