patterns/includes: More misc cleanups (#353)

* patterns/zip: simplify find_sequence_in_range check

hex(340282366920938463463374607431768211455) =
0xffffffffffffffffffffffffffffffff

* patterns/7z: use Magic<> for signature, add pragma

* patterns/{nro, ogg}: use Magic<> for signature

* patterns/ttf: refactor, check magic

Use the "Field field @ position;" syntax instead of saving and restoring
the cursor position.

* readme: fix copy-paste error in pattern listing
This commit is contained in:
Mrmaxmeier
2025-03-22 13:46:06 +01:00
committed by GitHub
parent 3ad263783d
commit df97fc7257
6 changed files with 21 additions and 45 deletions

View File

@@ -43,7 +43,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi
| BSON | `application/bson` | [`patterns/bson.hexpat`](patterns/bson.hexpat) | BSON (Binary JSON) format |
| bplist | `application/x-bplist` | [`patterns/bplist.hexpat`](patterns/bplist.hexpat) | Apple's binary property list format (bplist) |
| BSP | | [`patterns/bsp_goldsrc.hexpat`](patterns/bsp_goldsrc.hexpat) | GoldSrc engine maps format (used in Half-Life 1) |
| BZIP3 | | [`patterns/bzip3.hexpat`](patterns/bzip3.hexpat) | GoldSrc engine maps format (used in Half-Life 1) |
| BZIP3 | | [`patterns/bzip3.hexpat`](patterns/bzip3.hexpat) | Parses BZip3 compression (file format) by Kamila Szewczyk |
| CAB | | [`patterns/cab.hexpat`](patterns/cab.hexpat) | Microsoft Cabinet (CAB) Files |
| CCHVA | | [`patterns/cchva.hexpat`](patterns/cchva.hexpat) | Command and Conquer Voxel Animation |
| CCVXL | | [`patterns/ccvxl.hexpat`](patterns/ccvxl.hexpat) | Command and Conquer Voxel Model |

View File

@@ -1,9 +1,11 @@
#pragma description 7z Archive
#pragma MIME application/x-7z-compressed
#pragma magic [ 37 7A BC AF 27 1C ] @ 0x00
import std.io;
import std.mem;
import std.math;
import type.magic;
enum Type:u8{
@@ -11,13 +13,9 @@ enum Type:u8{
sizeStartHeader = 0x20, // Size of start Header
};
enum TypeB:u48{
sevenZipSignature = 0x1C27AFBC7A37, // Defining 7z signature
};
struct StartHeader {
// File signature
u48 signature [[color("FF0000")] ];
type::Magic<"7z\xBC\xAF\x27\x1C"> signature [[color("FF0000")] ];
// Version format
u16 formatVersion [[color("00FF00")]];
// CRC start header
@@ -62,13 +60,6 @@ struct EndHeader {
EndHeader endheader @ Type::sizeStartHeader;
// Check 7z type
if(startheader.signature == TypeB::sevenZipSignature){
std::print("It is a 7z File Type");
}else{
std::print("The file is not 7z type");
}
std::print("Format Version {} ",startheader.formatVersion);
// Version verification

View File

@@ -4,6 +4,7 @@
import std.io;
import std.sys;
import type.magic;
struct MOD0 {
char magic[4];
@@ -27,7 +28,7 @@ struct SegmentHeader {
};
struct Header {
char magic[4];
type::Magic<"NRO0"> magic;
u32 version;
u32 file_size;
u32 flags;
@@ -67,7 +68,6 @@ fn is_homebrew() {
Start start @ 0x00;
Header header @ $;
std::assert(header.magic == "NRO0", "Invalid NRO File!");
AssetHeader assets @ header.file_size;

View File

@@ -5,6 +5,7 @@
import std.core;
import std.mem;
import type.magic;
bitfield HeaderType {
Continuation : 1;
@@ -17,7 +18,7 @@ struct SegmentData {
};
struct Ogg {
char capturePattern[4];
type::Magic<"OggS"> capturePattern;
u8 version;
HeaderType headerType;
u64 granulePosition;
@@ -29,4 +30,4 @@ struct Ogg {
SegmentData data[pageSegments];
};
Ogg ogg[while(!std::mem::eof())] @ 0x00;
Ogg ogg[while(!std::mem::eof())] @ 0x00;

View File

@@ -10,6 +10,7 @@ import std.mem;
import std.string;
import std.time;
import std.io;
import type.magic;
struct TableDirectory {
char tag[4];
@@ -47,7 +48,6 @@ struct LongDatetime {
s64 time;
} [[format("format_longdatetime")]];
using HeadTable;
u64 currentOffset;
u64 currentLength;
@@ -55,7 +55,7 @@ u64 glyfStart;
bool hasPostScriptOutlines = false;
u16 numHMetrics;
u16 gNumGlyphs;
HeadTable headTable;
s16 indexToLocFormat;
// begin avar
@@ -185,12 +185,7 @@ struct EncodingRecord {
u16 encodingId;
u32 offset;
u64 endEncodingRecord = $;
$ = startOfCmapTable + offset;
CmapSubtable subtable;
$ = endEncodingRecord;
CmapSubtable subtable @ startOfCmapTable + offset;
};
struct CmapTable {
@@ -397,7 +392,7 @@ struct HeadTable {
FixedPoint32 version;
FixedPoint32 fontRevision;
u32 checksumAdjustment;
u32 magic;
type::Magic<"\x5f\x0f\x3c\xf5"> magicNumber;
HeadFlag flags;
u16 unitsPerEm;
LongDatetime created;
@@ -467,16 +462,13 @@ struct GlyfWithOffset<auto longOffset> {
u32 nextOff = u32(std::mem::read_unsigned($, 2, std::mem::Endian::Big)) * 2;
}
curGlyfSize = nextOff - realOffset;
u64 prev = $;
$ = glyfStart + realOffset;
if (curGlyfSize != 0) {
GlyfTable glyf;
GlyfTable glyf @ glyfStart + realOffset;
}
$ = prev;
};
struct LocaTable {
if (headTable.indexToLocFormat == 1) {
if (indexToLocFormat == 1) {
//u32 offsets[gNumGlyphs + 1];
GlyfWithOffset<true> glyfs[gNumGlyphs];
} else {
@@ -522,19 +514,13 @@ struct NameRecord {
u16 nameId;
u16 length;
u16 stringOffset;
u64 cur = $;
$ = curStorageOffset + stringOffset;
char16 string[length / 2];
$ = cur;
char16 string[length / 2] @ curStorageOffset + stringOffset;
};
struct LangTagRecord {
u16 length;
u16 langTagOffset;
u64 cur = $;
$ = curStorageOffset + langTagOffset;
char16 langTag[length / 2];
$ = cur;
char16 langTag[length / 2] @ curStorageOffset + langTagOffset;
};
struct NameTableV0 {
@@ -670,7 +656,7 @@ struct HiddenForPreprocessing {
("maxp"): MaxpTable table;
("head"): {
HeadTable table;
headTable = table;
indexToLocFormat = table.indexToLocFormat;
}
("glyf"): {
glyfStart = $;
@@ -716,9 +702,7 @@ struct TTF {
u16 entrySelector;
u16 rangeShift;
u64 start = $;
HiddenForPreprocessing hidden[numTables] [[hidden]];
$ = start;
HiddenForPreprocessing hidden[numTables] @ $ [[hidden]];
Table tables[numTables];
};

View File

@@ -102,10 +102,10 @@ fn find_eocd() {
u128 offset_search_from = std::math::max(0, std::mem::size()-65536-22);
u128 prev_address;
while(1){
u128 current_address = std::mem::find_sequence_in_range(0, offset_search_from, std::mem::size(), 0x50,0x4B,0x05,0x06);
s128 current_address = std::mem::find_sequence_in_range(0, offset_search_from, std::mem::size(), 0x50,0x4B,0x05,0x06);
//Reached EOF and did not find valid eocd.
if (current_address == 340282366920938463463374607431768211455){
if (current_address == -1) {
std::error("Could not find EOCD.");
}