summaryrefslogtreecommitdiff
path: root/src/tag.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/tag.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/tag.c b/src/tag.c
new file mode 100644
index 0000000..25d9d32
--- /dev/null
+++ b/src/tag.c
@@ -0,0 +1,66 @@
+#include "tag.h"
+#include "nbt/nbt.h"
+#include "json/json.h"
+
+#include <stdlib.h>
+
+void tag_free(tag_t *tag) {
+ if (tag->name_len > 0 && tag->name != NULL)
+ free(tag->name);
+ switch(tag->type) {
+ case TAG_END:
+ case TAG_BYTE:
+ case TAG_SHORT:
+ case TAG_INT:
+ case TAG_LONG:
+ case TAG_FLOAT:
+ case TAG_DOUBLE:
+ break;
+ case TAG_BYTE_ARRAY:
+ free(tag->data.b_arr.data);
+ break;
+ case TAG_STRING:
+ free(tag->data.string.data);
+ break;
+ case TAG_LIST:
+ for (int32_t i = 0; i < tag->data.list.size; i++)
+ tag_free(&tag->data.list.tags[i]);
+ free(tag->data.list.tags);
+ break;
+ case TAG_COMPOUND:
+ for (int32_t i = 0; i < tag->data.compound.size; i++)
+ tag_free(&tag->data.compound.tags[i]);
+ free(tag->data.compound.tags);
+ break;
+ case TAG_INT_ARRAY:
+ free(tag->data.i_arr.data);
+ break;
+ case TAG_LONG_ARRAY:
+ free(tag->data.l_arr.data);
+ break;
+ }
+}
+
+bool tag_read(tag_t *tag, const stream_t *stream, format_t format) {
+ switch (format) {
+ case JSON:
+ return json_read(tag, stream);
+ case NBT:
+ return nbt_read(tag, stream);
+ case SNBT:
+ default:
+ return false;
+ }
+}
+
+bool tag_print(tag_t *tag, const stream_t *stream, format_t format) {
+ switch (format) {
+ case JSON:
+ return json_print(tag, stream);
+ case NBT:
+ return nbt_print(tag, stream);
+ case SNBT:
+ default:
+ return false;
+ }
+}