summaryrefslogtreecommitdiff
path: root/src/nbt/read.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/nbt/read.c (renamed from src/tag_read.c)52
1 files changed, 30 insertions, 22 deletions
diff --git a/src/tag_read.c b/src/nbt/read.c
index 5f43e7c..d5dd827 100644
--- a/src/tag_read.c
+++ b/src/nbt/read.c
@@ -1,10 +1,13 @@
-#include "tag.h"
-#include "lib.h"
+#include "nbt.h"
+#include "../lib.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-bool tag_read_header(tag_t *tag, stream_t *stream, bool named) {
+static bool nbt_read_data(tag_t *tag, const stream_t *stream);
+
+static bool nbt_read_header(tag_t *tag, const stream_t *stream, bool named) {
bool ok = true;
if (stream_read_i8(stream, &tag->type) == false)
@@ -34,7 +37,7 @@ bool tag_read_header(tag_t *tag, stream_t *stream, bool named) {
}
-static bool tag_read_byte_array(tagdata_t *data, stream_t *stream) {
+static bool nbt_read_byte_array(tagdata_t *data, const stream_t *stream) {
if (stream_read_i32(stream, &data->b_arr.size) == false)
return false;
if (data->b_arr.size == 0) {
@@ -48,7 +51,7 @@ static bool tag_read_byte_array(tagdata_t *data, stream_t *stream) {
return true;
}
-static bool tag_read_int_array(tagdata_t *data, stream_t *stream) {
+static bool nbt_read_int_array(tagdata_t *data, const stream_t *stream) {
if (stream_read_i32(stream, &data->i_arr.size) == false)
return false;
if (data->i_arr.size == 0) {
@@ -62,7 +65,7 @@ static bool tag_read_int_array(tagdata_t *data, stream_t *stream) {
return true;
}
-static bool tag_read_long_array(tagdata_t *data, stream_t *stream) {
+static bool nbt_read_long_array(tagdata_t *data, const stream_t *stream) {
if (stream_read_i32(stream, &data->l_arr.size) == false)
return false;
if (data->l_arr.size == 0) {
@@ -76,7 +79,7 @@ static bool tag_read_long_array(tagdata_t *data, stream_t *stream) {
return true;
}
-static bool tag_read_string(tagdata_t *data, stream_t *stream) {
+static bool nbt_read_string(tagdata_t *data, const stream_t *stream) {
if (stream_read_u16(stream, &data->string.size) == false)
return false;
if (data->string.size < 1) {
@@ -89,7 +92,7 @@ static bool tag_read_string(tagdata_t *data, stream_t *stream) {
return true;
}
-static bool tag_read_list(tagdata_t *data, stream_t *stream) {
+static bool nbt_read_list(tagdata_t *data, const stream_t *stream) {
if (stream_read_i8(stream, &data->list.type) == false)
return false;
if (stream_read_i32(stream, &data->list.size) == false)
@@ -107,14 +110,14 @@ static bool tag_read_list(tagdata_t *data, stream_t *stream) {
tag.type = data->list.type;
tag.name = "";
tag.name_len = 0;
- if (tag_read_data(&tag, stream) == false)
+ if (nbt_read_data(&tag, stream) == false)
return false;
data->list.tags[i] = tag;
}
return true;
}
-static bool tag_read_compound(tagdata_t *data, stream_t *stream) {
+static bool nbt_read_compound(tagdata_t *data, const stream_t *stream) {
int32_t size = 0;
int32_t capacity = 8;
tag_t *tags = xalloc(capacity * sizeof(tag_t));
@@ -123,14 +126,18 @@ static bool tag_read_compound(tagdata_t *data, stream_t *stream) {
tag_t tag;
- if (tag_read_header(&tag, stream, true) == false)
+ if (nbt_read_header(&tag, stream, true) == false) {
+ free(tags);
return false;
+ }
if (tag.type == TAG_END)
break;
- if (tag_read_data(&tag, stream) == false)
+ if (nbt_read_data(&tag, stream) == false) {
+ free(tags);
return false;
+ }
if (size == capacity) {
capacity *= 2;
@@ -147,7 +154,8 @@ static bool tag_read_compound(tagdata_t *data, stream_t *stream) {
return true;
}
-bool tag_read_data(tag_t *tag, stream_t *stream) {
+
+static bool nbt_read_data(tag_t *tag, const stream_t *stream) {
bool ok = true;
switch (tag->type) {
@@ -169,33 +177,33 @@ bool tag_read_data(tag_t *tag, stream_t *stream) {
ok = stream_read_i64(stream, &tag->data.l);
break;
case TAG_BYTE_ARRAY:
- ok = tag_read_byte_array(&tag->data, stream);
+ ok = nbt_read_byte_array(&tag->data, stream);
break;
case TAG_STRING:
- ok = tag_read_string(&tag->data, stream);
+ ok = nbt_read_string(&tag->data, stream);
break;
case TAG_LIST:
- ok = tag_read_list(&tag->data, stream);
+ ok = nbt_read_list(&tag->data, stream);
break;
case TAG_COMPOUND:
- ok = tag_read_compound(&tag->data, stream);
+ ok = nbt_read_compound(&tag->data, stream);
break;
case TAG_INT_ARRAY:
- ok = tag_read_int_array(&tag->data, stream);
+ ok = nbt_read_int_array(&tag->data, stream);
break;
case TAG_LONG_ARRAY:
- ok = tag_read_long_array(&tag->data, stream);
+ ok = nbt_read_long_array(&tag->data, stream);
break;
break;
};
return ok;
}
-bool tag_read(tag_t *tag, stream_t *stream, bool named) {
+bool nbt_read(tag_t *tag, const stream_t *stream) {
memset(tag, 0, sizeof(tag_t));
- if (tag_read_header(tag, stream, named) == false)
+ if (nbt_read_header(tag, stream, true) == false)
return false;
- if (tag_read_data(tag, stream) == false)
+ if (nbt_read_data(tag, stream) == false)
return false;
return true;
}