///|
fn put16(out : Array[Byte], value : Int) -> Unit {
out.push((value & 255).to_byte())
out.push(((value >> 8) & 255).to_byte())
}
///|
fn put32(out : Array[Byte], value : Int) -> Unit {
put16(out, value)
put16(out, value >> 16)
}
///|
fn sample_cab() -> Bytes {
let out : Array[Byte] = []
out.push(0x4D)
out.push(0x53)
out.push(0x43)
out.push(0x46)
put32(out, 0)
put32(out, 78)
put32(out, 0)
put32(out, 44)
put32(out, 0)
out.push(3)
out.push(1)
put16(out, 1)
put16(out, 1)
put16(out, 0)
put16(out, 0)
put16(out, 0)
put32(out, 66)
put16(out, 1)
put16(out, 0)
put32(out, 4)
put32(out, 0)
put16(out, 0)
put16(out, 0)
put16(out, 0)
put16(out, 0)
out.push(0x61)
out.push(0x2E)
out.push(0x74)
out.push(0x78)
out.push(0x74)
out.push(0)
put32(out, 0)
put16(out, 4)
put16(out, 4)
out.push(65)
out.push(66)
out.push(67)
out.push(68)
Bytes::from_array(out)
}
///|
fn main raise {
let data = sample_cab()
let listing = @moonmspack.read_cab(data)
println(@moonmspack.summary(listing))
for entry in listing.entries {
println(entry.name + " (" + entry.size.to_string() + " bytes)")
}
let payload = @moonmspack.extract_cab_entry(data, listing.entries[0])
println("payload: " + payload.to_string())
}