From 263986407cbbc2880f33a678ea1745a02e0ca7bc Mon Sep 17 00:00:00 2001 From: Dexrn ZacAttack <60078656+DexrnZacAttack@users.noreply.github.com> Date: Mon, 13 Oct 2025 01:25:43 -0700 Subject: [PATCH 1/2] APE pattern --- patterns/ape.hexpat | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 patterns/ape.hexpat diff --git a/patterns/ape.hexpat b/patterns/ape.hexpat new file mode 100644 index 00000000..b36af567 --- /dev/null +++ b/patterns/ape.hexpat @@ -0,0 +1,52 @@ +#pragma author DexrnZacAttack +#pragma description APE audio metadata +#pragma magic [ 41 50 45 54 41 47 45 58 ] @ 0x00 + +import std.core; + +namespace APE { + enum ItemType : u8 { + UTF8 = 0, + BINARY = 1, + EXTERNAL = 2, + RESERVED = 3 + }; + + bitfield ItemFlags { + RW : 1; + Type : 2; + Reserved : 25; + IsHeader : 1; + HasNoFooter : 1; + HasHeader : 1; + }; + + struct TagItem { + u32 len; + ItemFlags flags; + char key[]; + + if (flags.Type == ItemType::UTF8) + char value[len]; + else + u8 value[len]; + }; + + struct Block { + char signature[8]; + u32 version; + u32 tagSize; + u32 itemCount; + ItemFlags globalFlags; + u64 reserved; + }; + + struct File { + Block header; + TagItem items[header.itemCount]; + + Block footer; + }; +} + +APE::File ape @ 0x00; From 334ec48c1da22b8bf73ca6a337b2f2d25c0b16a5 Mon Sep 17 00:00:00 2001 From: Dexrn ZacAttack <60078656+DexrnZacAttack@users.noreply.github.com> Date: Mon, 13 Oct 2025 01:42:55 -0700 Subject: [PATCH 2/2] feat: signature verification, allow using as lib --- patterns/ape.hexpat | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/patterns/ape.hexpat b/patterns/ape.hexpat index b36af567..976b6514 100644 --- a/patterns/ape.hexpat +++ b/patterns/ape.hexpat @@ -1,8 +1,10 @@ #pragma author DexrnZacAttack #pragma description APE audio metadata #pragma magic [ 41 50 45 54 41 47 45 58 ] @ 0x00 +#pragma version 1.0.1 import std.core; +import std.sys; namespace APE { enum ItemType : u8 { @@ -34,6 +36,9 @@ namespace APE { struct Block { char signature[8]; + if (signature != "APETAGEX") + std::error("Signature does not match \"APETAGEX\""); + u32 version; u32 tagSize; u32 itemCount; @@ -49,4 +54,6 @@ namespace APE { }; } -APE::File ape @ 0x00; +#ifndef APE_USE_LIB + APE::File ape @ 0x00; +#endif