From 7366c9a749310e8774e4f0303db1d836d84a84fc Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 19 Sep 2022 22:20:29 +1000 Subject: [PATCH] WIP on making NBT tag parsing soft instead of hard error when encountering unexpected tag type, begins to address #966 --- src/Errors.h | 5 +++++ src/Formats.c | 30 ++++++++++++++++++++---------- src/Logger.c | 5 +++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/Errors.h b/src/Errors.h index b37a56dc7..4c1121a87 100644 --- a/src/Errors.h +++ b/src/Errors.h @@ -115,5 +115,10 @@ enum CC_ERRORS { ERR_NO_AUDIO_OUTPUT = 0xCCDED05DUL, /* No audio output devices are connected */ ERR_INVALID_DATA_URL = 0xCCDED05EUL, /* Invalid URL provided to download from */ ERR_INVALID_OPEN_URL = 0xCCDED05FUL, /* Invalid URL provided to open in new tab */ + + NBT_ERR_EXPECTED_I8 = 0xCCDED060UL, /* Expected I8 NBT tag */ + NBT_ERR_EXPECTED_I16 = 0xCCDED061UL, /* Expected I16 NBT tag */ + NBT_ERR_EXPECTED_I32 = 0xCCDED062UL, /* Expected I32 NBT tag */ + NBT_ERR_EXPECTED_F32 = 0xCCDED063UL, /* Expected F32 NBT tag */ }; #endif diff --git a/src/Formats.c b/src/Formats.c index 05a9fb8fe..bac1d5e20 100644 --- a/src/Formats.c +++ b/src/Formats.c @@ -330,28 +330,38 @@ struct NbtTag { }; static cc_uint8 NbtTag_U8(struct NbtTag* tag) { - if (tag->type != NBT_I8) Logger_Abort("Expected I8 NBT tag"); - return tag->value.u8; + if (tag->type == NBT_I8) return tag->value.u8; + + tag->result = NBT_ERR_EXPECTED_I8; + return 0; } static cc_int16 NbtTag_I16(struct NbtTag* tag) { - if (tag->type != NBT_I16) Logger_Abort("Expected I16 NBT tag"); - return tag->value.i16; + if (tag->type == NBT_I16) return tag->value.i16; + + tag->result = NBT_ERR_EXPECTED_I16; + return 0; } static cc_uint16 NbtTag_U16(struct NbtTag* tag) { - if (tag->type != NBT_I16) Logger_Abort("Expected I16 NBT tag"); - return tag->value.u16; + if (tag->type == NBT_I16) return tag->value.u16; + + tag->result = NBT_ERR_EXPECTED_I16; + return 0; } static int NbtTag_I32(struct NbtTag* tag) { - if (tag->type != NBT_I32) Logger_Abort("Expected I32 NBT tag"); - return tag->value.i32; + if (tag->type == NBT_I32) return tag->value.i32; + + tag->result = NBT_ERR_EXPECTED_I32; + return 0; } static float NbtTag_F32(struct NbtTag* tag) { - if (tag->type != NBT_F32) Logger_Abort("Expected F32 NBT tag"); - return tag->value.f32; + if (tag->type == NBT_F32) return tag->value.f32; + + tag->result = NBT_ERR_EXPECTED_F32; + return 0; } static cc_uint8* NbtTag_U8_Array(struct NbtTag* tag, int minSize) { diff --git a/src/Logger.c b/src/Logger.c index ad1357c0d..59000d233 100644 --- a/src/Logger.c +++ b/src/Logger.c @@ -84,6 +84,11 @@ static const char* GetCCErrorDesc(cc_result res) { case ERR_NO_AUDIO_OUTPUT: return "No audio output devices plugged in"; case ERR_INVALID_DATA_URL: return "Cannot download from invalid URL"; case ERR_INVALID_OPEN_URL: return "Cannot navigate to invalid URL"; + + case NBT_ERR_EXPECTED_I8: return "Expected I8 NBT tag"; + case NBT_ERR_EXPECTED_I16: return "Expected I16 NBT tag"; + case NBT_ERR_EXPECTED_I32: return "Expected I32 NBT tag"; + case NBT_ERR_EXPECTED_F32: return "Expected F32 NBT tag"; } return NULL; }