From 7ad9cd4f413c3c38e92ce15be5fa4547c69ecae3 Mon Sep 17 00:00:00 2001 From: David Schneider Date: Sat, 10 May 2025 13:49:02 +0200 Subject: [PATCH] patterns: Added support for GNU MO files (#383) --- README.md | 1 + patterns/mo.hexpat | 37 ++++++++++++++++++++++++++ tests/patterns/test_data/mo.hexpat.mo | Bin 0 -> 182 bytes 3 files changed, 38 insertions(+) create mode 100644 patterns/mo.hexpat create mode 100644 tests/patterns/test_data/mo.hexpat.mo diff --git a/README.md b/README.md index 2447330..dd2d676 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | MBR & GPT | | [`patterns/partition_table.hexpat`](patterns/partition_table.hexpat) | Partition tables with primary focus on GPT | | MIDI | `audio/midi` | [`patterns/midi.hexpat`](patterns/midi.hexpat) | MIDI header, event fields provided | | MiniDump | `application/x-dmp` | [`patterns/minidump.hexpat`](patterns/minidump.hexpat) | Windows MiniDump files | +| MO | | [`patterns/mo.hexpat`](patterns/mo.hexpat) | GNU Machine Object (MO) files containing translations for gettext | | mp4 | `video/mp4` | [`patterns/mp4.hexpat`](patterns/mp4.hexpat) | MPEG-4 Part 14 digital multimedia container format | | msgpack | `application/x-msgpack` | [`patterns/msgpack.hexpat`](patterns/msgpack.hexpat) | MessagePack binary serialization format | | MSSCMP | | [`patterns/msscmp.hexpat`](patterns/msscmp.hexpat) | Miles Sound System Compressed Archive | diff --git a/patterns/mo.hexpat b/patterns/mo.hexpat new file mode 100644 index 0000000..2636548 --- /dev/null +++ b/patterns/mo.hexpat @@ -0,0 +1,37 @@ +#pragma author dvob +#pragma description GNU Machine Object (MO) files containing translations for gettext + +// https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html + +import std.core; +import std.io; + +struct strPtr { + u32 length; + u32 offset; + char string[length] @ offset; +}; + +struct file { + be u32 magic; + if ( magic == 0x950412de ) + std::core::set_endian(std::mem::Endian::Big); + else if ( magic == 0xde120495) + std::core::set_endian(std::mem::Endian::Little); + else + std::error("Invalid MO Magic!"); + + u16 majorVersion; + u16 minorVersion; + u32 count; + u32 msgIdOffset; + u32 msgStrOffset; + u32 hashSize; + u32 hashOffset; + + u32 hashTable[hashSize] @ hashOffset; + strPtr msgIDTable[count] @ msgIdOffset; + strPtr msgStrTable[count] @ msgStrOffset; +}; + +file moFile @ 0x0; diff --git a/tests/patterns/test_data/mo.hexpat.mo b/tests/patterns/test_data/mo.hexpat.mo new file mode 100644 index 0000000000000000000000000000000000000000..fe9844cfaa7f4489d70c7bcf90154d15d77483a4 GIT binary patch literal 182 zcmca7#4?ou2$+Ca28eZlm=%a^fEWY