diff options
Diffstat (limited to '')
-rw-r--r-- | src/tag.c | 66 |
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; + } +} |