Implement basic SNBT reader and testsuite

This commit is contained in:
zontreck 2024-06-06 14:14:13 -07:00
parent 396c660113
commit a0f372693b
17 changed files with 352 additions and 2 deletions

View file

@ -40,6 +40,79 @@ enum TagType {
return TagType.End;
}
static TagType getStringifiedTagType(StringReader reader) {
reader.startSeek();
TagType ret = TagType.End;
// Start to determine the next tag type
while (reader.canRead && ret == TagType.End) {
var val = reader.next().toUpperCase();
switch (val) {
case "{":
{
ret = TagType.Compound;
break;
}
case "[":
{
// Check for a type Prefix
var X = reader.readUntil(";");
switch (X.toUpperCase()) {
case "B":
{
ret = TagType.ByteArray;
break;
}
case "I":
{
ret = TagType.IntArray;
break;
}
case "L":
{
ret = TagType.LongArray;
break;
}
default:
{
ret = TagType.List;
break;
}
}
break;
}
case "B":
{
ret = TagType.Byte;
break;
}
case "D":
{
ret = TagType.Double;
break;
}
case "F":
{
ret = TagType.Float;
break;
}
case "L":
{
ret = TagType.Long;
break;
}
case "S":
{
ret = TagType.Short;
break;
}
}
}
reader.endSeek();
return ret;
}
}
abstract class Tag {
@ -100,6 +173,23 @@ abstract class Tag {
}
}
static Tag readStringifiedNamedTag(StringReader string) {
String name = "";
if (string.peek() == "{" || string.peek() == "[") {
// No name
name = "";
} else {
name = string.readString();
string.expect(":");
}
TagType type = TagType.getStringifiedTagType(string);
Tag tag = Tag.makeTagOfType(type);
tag._key = name;
tag.readStringifiedValue(string);
return tag;
}
bool shouldQuoteName() {
if (getKey() == "") {
return false;
@ -116,6 +206,7 @@ abstract class Tag {
}
void writeStringifiedValue(StringBuilder builder, int indent, bool isList);
void readStringifiedValue(StringReader reader);
bool equals(dynamic object) {
if (object == null || object is! Tag) return false;