patterns: Add ASCII CPIO patterns. (#473)

This commit is contained in:
Jarkko Pöyry
2026-01-03 21:24:31 +02:00
committed by GitHub
parent 2d92bfca13
commit 190f9d891b
5 changed files with 89 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
#pragma author gunjambi
#pragma description "New" ASCII CPIO
#pragma magic [ 30 37 30 37 30 31 ] @ 0x00
import std.time;
import std.string;
namespace new_ascii {
fn format_hex_time(str value) {
return std::time::format(std::time::to_utc(std::string::parse_int(value, 16)));
};
fn parse_hex(str field) {
return std::string::parse_int(field, 16);
};
struct Cpio {
char c_magic[6];
if (c_magic != "070701") {
std::error("Invalid CPIO Magic!");
}
char c_ino[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_mode[8];
char c_uid[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_gid[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_nlink[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_mtime[8] [[format("new_ascii::format_hex_time")]];
char c_filesize[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_devmajor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_devminor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_rdevmajor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_rdevminor[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_namesize[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char c_check[8] [[format("new_ascii::parse_hex"), transform("new_ascii::parse_hex")]];
char filename[c_namesize - 1];
padding[1];
if (filename == "TRAILER!!!")
break;
padding[(4 - ((6 + c_namesize) % 4)) % 4];
u8 data[c_filesize];
padding[(4 - (c_filesize % 4)) % 4];
};
}
new_ascii::Cpio cpio[while(true)] @ 0x00;

View File

@@ -0,0 +1,41 @@
#pragma author gunjambi
#pragma description Portable ASCII CPIO
#pragma magic [ 30 37 30 37 30 37 ] @ 0x00
import std.time;
import std.string;
namespace portable_ascii {
fn format_octal_time(str value) {
return std::time::format(std::time::to_utc(std::string::parse_int(value, 8)));
};
fn parse_octal_string(str field) {
return std::string::parse_int(field, 8);
};
struct Cpio {
char c_magic[6];
if (c_magic != "070707") {
std::error("Invalid CPIO Magic!");
}
char c_dev[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_ino[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_mode[6];
char c_uid[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_gid[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_nlink[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_rdev[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_mtime[11] [[format("portable_ascii::format_octal_time")]];
char c_namesize[6] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char c_filesize[11] [[format("portable_ascii::parse_octal_string"), transform("portable_ascii::parse_octal_string")]];
char filename[c_namesize - 1];
padding[1];
if (filename == "TRAILER!!!")
break;
u8 data[c_filesize];
};
}
portable_ascii::Cpio cpio[while(true)] @ 0x00;