diff options
author | dragontamer8740 <dragontamer8740@gmail.com> | 2022-08-13 22:59:08 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-14 02:59:08 +0000 |
commit | fac9f1ba58fae1bc12b57708e3908c74dcce9997 (patch) | |
tree | be26178794b1e24ffa696cc0efb63c0b66728a3d /src | |
parent | 6a5ecb4d9584f7276cf1d592c95811a66943f61c (diff) | |
download | abaddon-portaudio-fac9f1ba58fae1bc12b57708e3908c74dcce9997.tar.gz abaddon-portaudio-fac9f1ba58fae1bc12b57708e3908c74dcce9997.zip |
Big-endian 'emojis.bin' decoding fix (#100)
* Big-endian patch: fixes emojis.bin reading on big-endian systems (tested only on 32-bit PowerPC linux)
Diffstat (limited to 'src')
-rw-r--r-- | src/emojis.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/emojis.cpp b/src/emojis.cpp index 25516d3..dc28310 100644 --- a/src/emojis.cpp +++ b/src/emojis.cpp @@ -1,6 +1,23 @@ #include "emojis.hpp" #include <sstream> #include <utility> +#include <cstdio> + +#ifdef ABADDON_IS_BIG_ENDIAN +/* Allows processing emojis.bin correctly on big-endian systems. */ +int emojis_int32_correct_endian(int little_endian_in) { + /* this does the same thing as __bswap_32() but can be done without + non-standard headers. */ + return ((little_endian_in >> 24) & 0xff) | // move byte 3 to byte 0 + ((little_endian_in << 8) & 0xff0000) | // move byte 1 to byte 2 + ((little_endian_in >> 8) & 0xff00) | // move byte 2 to byte 1 + ((little_endian_in << 24) & 0xff000000); // byte 0 to byte 3 +} +#else +int emojis_int32_correct_endian(int little_endian_in) { + return little_endian_in; +} +#endif EmojiResource::EmojiResource(std::string filepath) : m_filepath(std::move(filepath)) {} @@ -11,18 +28,22 @@ bool EmojiResource::Load() { int index_offset; std::fread(&index_offset, 4, 1, m_fp); + index_offset = emojis_int32_correct_endian(index_offset); std::fseek(m_fp, index_offset, SEEK_SET); int emojis_count; std::fread(&emojis_count, 4, 1, m_fp); + emojis_count = emojis_int32_correct_endian(emojis_count); for (int i = 0; i < emojis_count; i++) { std::vector<std::string> shortcodes; int shortcodes_count; std::fread(&shortcodes_count, 4, 1, m_fp); + shortcodes_count = emojis_int32_correct_endian(shortcodes_count); for (int j = 0; j < shortcodes_count; j++) { int shortcode_length; std::fread(&shortcode_length, 4, 1, m_fp); + shortcode_length = emojis_int32_correct_endian(shortcode_length); std::string shortcode(shortcode_length, '\0'); std::fread(shortcode.data(), shortcode_length, 1, m_fp); shortcodes.push_back(std::move(shortcode)); @@ -30,13 +51,16 @@ bool EmojiResource::Load() { int surrogates_count; std::fread(&surrogates_count, 4, 1, m_fp); + surrogates_count = emojis_int32_correct_endian(surrogates_count); std::string surrogates(surrogates_count, '\0'); std::fread(surrogates.data(), surrogates_count, 1, m_fp); m_patterns.emplace_back(surrogates); int data_size, data_offset; std::fread(&data_size, 4, 1, m_fp); + data_size = emojis_int32_correct_endian(data_size); std::fread(&data_offset, 4, 1, m_fp); + data_offset = emojis_int32_correct_endian(data_offset); m_index[surrogates] = { data_offset, data_size }; for (const auto &shortcode : shortcodes) |