From d8ff87989f616291dcb998670958fd42029796e5 Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Thu, 22 Feb 2024 01:11:01 -0600 Subject: some stuff --- src/nbt/compound.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/nbt/compound.c (limited to 'src/nbt/compound.c') diff --git a/src/nbt/compound.c b/src/nbt/compound.c new file mode 100644 index 0000000..decae6c --- /dev/null +++ b/src/nbt/compound.c @@ -0,0 +1,111 @@ +#include "../nbt.internal.h" +#include "nbt.h" + +#define NBT__RETURN1(_r) return _r +#define NBT__RETURN0() return +#define NBT__CHECK(_tag, _ret) NBT__CHECK_TYPE(_tag, NBT_TAG_COMPOUND, NBT__RETURN1, _ret) +#define NBT__CHECK0(_tag) NBT__CHECK_TYPE(_tag, NBT_TAG_COMPOUND, NBT__RETURN0) + +nbt_size_t nbt_compound_length(nbt_tag_t *compound) +{ + NBT__CHECK(compound, (nbt_size_t)-1); + return nbt__ht_length(compound->value.nbt_compound.hash); +} + +nbt_tag_t *nbt_compound_find(nbt_tag_t *compound, const char *key) +{ + NBT__CHECK(compound, NULL); + bool found = false; + nbt_tag_t *tag = nbt__ht_get(compound->value.nbt_compound.hash, key, &found); + + if (!found) return NULL; + return tag; +} + +nbt_tag_t *nbt_compound_findn(nbt_tag_t *compound, const char *key, nbt_size_t keylen) +{ + NBT__CHECK(compound, NULL); + bool found = false; + nbt_tag_t *tag = nbt__ht_getn(compound->value.nbt_compound.hash, key, keylen, &found); + + if (!found) return NULL; + return tag; +} + +/* returns NBT_TAG_END if there is no value present */ +nbt_type_t nbt_compound_type(nbt_tag_t *compound, const char *key) +{ + nbt_tag_t *tag = nbt_compound_find(compound, key); + if (!tag) return NBT_TAG_END; + return nbt_tag_type(tag); +} + +nbt_type_t nbt_compound_typen(nbt_tag_t *compound, const char *key, nbt_size_t keylen) +{ + nbt_tag_t *tag = nbt_compound_findn(compound, key, keylen); + if (!tag) return NBT_TAG_END; + return nbt_tag_type(tag); +} + +int nbt_compound_put(nbt_tag_t *compound, const char *key, nbt_tag_t *value) +{ + NBT__CHECK(compound, -1); + if (!value) return -1; + + if (nbt__ht_put(compound->value.nbt_compound.hash, key, value) < 0) return -1; + + nbt_incref(value); + return 0; +} + +int nbt_compound_putn(nbt_tag_t *compound, const char *key, nbt_size_t sz, nbt_tag_t *value) +{ + NBT__CHECK(compound, -1); + if (!value) return -1; + + if (nbt__ht_putn(compound->value.nbt_compound.hash, key, sz, value) < 0) + return -1; + + nbt_incref(value); + return 0; +} + +int nbt_compound_remove(nbt_tag_t *compound, const char *key) +{ + NBT__CHECK(compound, -1); + + return nbt__ht_remove(compound->value.nbt_compound.hash, key); +} + +int nbt_compound_removen(nbt_tag_t *compound, const char *key, nbt_size_t sz) +{ + NBT__CHECK(compound, -1); + + return nbt__ht_removen(compound->value.nbt_compound.hash, key, sz); +} + +nbt_tag_t *nbt_compound_pop(nbt_tag_t *compound, const char *key) +{ + NBT__CHECK(compound, NULL); + + return nbt__ht_pop(compound->value.nbt_compound.hash, key, NULL); /* TODO: use found pointer*/ +} + +nbt_tag_t *nbt_compound_popn(nbt_tag_t *compound, const char *key, nbt_size_t sz) +{ + NBT__CHECK(compound, NULL); + + return nbt__ht_popn(compound->value.nbt_compound.hash, key, sz, NULL); +} + +void nbt_compound_clear(nbt_tag_t *compound) +{ + NBT__CHECK0(compound); + nbt__ht_clear(compound->value.nbt_compound.hash); +} + +int nbt_compound_merge(nbt_tag_t *target, nbt_tag_t *srccomp) +{ + /* TODO */ + return -1; +} -- cgit v1.2.3-70-g09d2