Skip to content

Commit 190f9d8

Browse files
authored
patterns: Add ASCII CPIO patterns. (#473)
1 parent 2d92bfc commit 190f9d8

File tree

5 files changed

+89
-0
lines changed

5 files changed

+89
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi
6060
| Chromium Pak | | [`patterns/chromium_pak.hexpat`](patterns/chromium_pak.hexpat) | Chromium pak file |
6161
| COFF | `application/x-coff` | [`patterns/coff.hexpat`](patterns/coff.hexpat) | Common Object File Format (COFF) executable |
6262
| CPIO | `application/x-cpio` | [`patterns/cpio.hexpat`](patterns/cpio.hexpat) | Old Binary CPIO Format |
63+
| CPIO | | [`patterns/cpio_portable_ascii.hexpat`](patterns/cpio_portable_ascii.hexpat) | Portable ASCII CPIO Format |
64+
| CPIO | | [`patterns/cpio_new_ascii.hexpat`](patterns/cpio_new_ascii.hexpat) | "New" ASCII CPIO Format |
6365
| CrashLvl | | [`patterns/Crashlvl.hexpat`](patterns/Crashlvl.hexpat) | Crash Bandicoot - Back in Time (fan game) User created level format |
6466
| CREDHIST | | [`patterns/credhist.hexpat`](patterns/credhist.hexpat) | CREDHIST Format |
6567
| DDS | `image/vnd-ms.dds` | [`patterns/dds.hexpat`](patterns/dds.hexpat) | DirectDraw Surface |

patterns/cpio_new_ascii.hexpat

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma author gunjambi
2+
#pragma description "New" ASCII CPIO
3+
#pragma magic [ 30 37 30 37 30 31 ] @ 0x00
4+
5+
import std.time;
6+
import std.string;
7+
8+
namespace new_ascii {
9+
fn format_hex_time(str value) {
10+
return std::time::format(std::time::to_utc(std::string::parse_int(value, 16)));
11+
};
12+
fn parse_hex(str field) {
13+
return std::string::parse_int(field, 16);
14+
};
15+
16+
struct Cpio {
17+
char c_magic[6];
18+
if (c_magic != "070701") {
19+
std::error("Invalid CPIO Magic!");
20+
}
21+
22+
char c_ino[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
23+
char c_mode[8];
24+
char c_uid[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
25+
char c_gid[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
26+
char c_nlink[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
27+
char c_mtime[8] [[format("new_ascii::format_hex_time")]];
28+
char c_filesize[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
29+
char c_devmajor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
30+
char c_devminor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
31+
char c_rdevmajor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
32+
char c_rdevminor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
33+
char c_namesize[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
34+
char c_check[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
35+
36+
char filename[c_namesize - 1];
37+
padding[1];
38+
if (filename == "TRAILER!!!")
39+
break;
40+
padding[(4 - ((6 + c_namesize) % 4)) % 4];
41+
42+
u8 data[c_filesize];
43+
padding[(4 - (c_filesize % 4)) % 4];
44+
};
45+
}
46+
new_ascii::Cpio cpio[while(true)] @ 0x00;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#pragma author gunjambi
2+
#pragma description Portable ASCII CPIO
3+
#pragma magic [ 30 37 30 37 30 37 ] @ 0x00
4+
5+
import std.time;
6+
import std.string;
7+
8+
namespace portable_ascii {
9+
fn format_octal_time(str value) {
10+
return std::time::format(std::time::to_utc(std::string::parse_int(value, 8)));
11+
};
12+
fn parse_octal_string(str field) {
13+
return std::string::parse_int(field, 8);
14+
};
15+
16+
struct Cpio {
17+
char c_magic[6];
18+
if (c_magic != "070707") {
19+
std::error("Invalid CPIO Magic!");
20+
}
21+
22+
char c_dev[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
23+
char c_ino[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
24+
char c_mode[6];
25+
char c_uid[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
26+
char c_gid[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
27+
char c_nlink[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
28+
char c_rdev[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
29+
char c_mtime[11] [[format("portable_ascii::format_octal_time")]];
30+
char c_namesize[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
31+
char c_filesize[11] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
32+
33+
char filename[c_namesize - 1];
34+
padding[1];
35+
if (filename == "TRAILER!!!")
36+
break;
37+
38+
u8 data[c_filesize];
39+
};
40+
}
41+
portable_ascii::Cpio cpio[while(true)] @ 0x00;
512 Bytes
Binary file not shown.
289 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)