Implement basic SNBT reader and testsuite
This commit is contained in:
parent
396c660113
commit
a0f372693b
17 changed files with 352 additions and 2 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue