bend-kit-archive Releases (8): 0.5.1.0 0xb03a6159aa2131a6271ae6f2503d02f4 indexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.5.1.0 0.5.0.2 0x598a1293fb2cca49a1f1ad2f1a06d1ef unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.5.0.2 0.5.0.1 0xd3058c375b178593eab6a5a3a751f7ad unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.5.0.1 0.5.0.0 0xf9272821ba2bd848c1143b98ce70ffab unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.5.0.0 0.4.0.0 0xfc8d719d423092fcf68bc98f6a7b436e unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.4.0.0 0.3.0.0 0x22226aa8b65383514c82a18a1e2da820 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.3.0.0 0.2.0.1 0x401661cec94425d3b4ef13a3c64b1e57 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.2.0.1 0.2.0.0 0x1165a11c4b59570a35a777cf76f3a6f4 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-archive@0.2.0.0 Definitions (56): Archive.Entry (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=Entry) # One member: its name and contents as raw bytes, its method (0 stored, 8 DEFLATE), and its CRC-32. type Entry is Type: Entry{name: Bytes.Bytes, data: Bytes.Bytes, method: U32, crc: U32} Archive.Header (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=Header) # A checked central directory entry. name and data are byte offsets into the input; # packed is the stored or compressed length, size the length after decoding. type Header is Data: Header{name: U32, name_len: U32, method: U32, crc: U32, packed: U32, size: U32, data: U32} Archive.supported (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=supported) # The methods read: 0 (stored) and 8 (DEFLATE). def supported(+method: U32) -> Bool: Archive.crc.bytes (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=crc.bytes) def crc.bytes(b: Bytes.Bytes) -> Bytes.Bytes & U32: Archive.crc.value (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=crc.value) def crc.value(r: Bytes.Bytes & U32) -> U32: Archive.crc32 (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=crc32) def crc32(b: Bytes.Bytes) -> U32: Archive.grab.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=grab.go) # n bytes from i as a list. Callers keep i + n within the buffer. def grab.go(k: Nat, r: Array & U32, +j: U32, acc: List<&2, U32>) -> Array & List<&2, U32>: Archive.grab (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=grab) def grab(a: Array, +i: U32, +n: U32) -> Array & List<&2, U32>: Archive.at (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=at) def at(xs: List<&2, U32>, +i: U32) -> U32: Archive.u16 (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=u16) # Little-endian fields of a grabbed record. def u16(+xs: List<&2, U32>, +o: U32) -> U32: Archive.u32 (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=u32) def u32(+xs: List<&2, U32>, +o: U32) -> U32: Archive.why (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=why) # The first failed check's message, outermost first. def why(+ok: Bool, +msg: String, +rest: Maybe<&2, String>) -> Maybe<&2, String>: Archive.encrypted (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=encrypted) # General purpose flags: encrypted (bit 0), strong encryption (bit 6), masked headers (bit 13). def encrypted(+flags: U32) -> Bool: Archive.same.at3 (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=same.at3) # Do n bytes at x and at y match? r holds the previous byte's answer. def same.at3(r: Array & U32, +u: U32) -> Array & Bool: Archive.same.at2 (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=same.at2) def same.at2(r: Array & U32, +y: U32) -> Array & Bool: Archive.same.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=same.go) def same.go(n: Nat, r: Array & Bool, +x: U32, +y: U32) -> Array & Bool: Archive.eocd.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.of) # End of central directory (APPNOTE 4.3.16): the last signature whose comment length reaches the end exactly. def eocd.of(r: Array & List<&2, U32>, +len: U32, +p: U32) -> Array & Bool: Archive.eocd.win (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.win) def eocd.win(a: Array, +len: U32, +p: U32) -> Array & Bool: Archive.eocd.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.go) # f counts the positions left below p; a comment is at most 65535 bytes. def eocd.go(f: Nat, r: Array & Bool, +len: U32, +p: U32) -> Array & Maybe<&2, U32>: Archive.cd.fin.end (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.fin.end) def cd.fin.end(ok: Bool, acc: List<&2, Header>) -> Result<&1, &1, U32 & String, List<&2, Header>>: Archive.cd.fin (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.fin) def cd.fin(res: Result<&1, &1, U32 & String, U32 & List<&2, Header>>, +end: U32) -> Result<&1, &1, U32 & String, List<&2, Header>>: Archive.lh.push (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=lh.push) def lh.push(ok: Bool, a: Array, +hd: Header, +next: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.lh.same (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=lh.same) def lh.same(r: Array & Bool, +hd: Header, +next: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.lh.name (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=lh.name) def lh.name(err: Maybe<&2, String>, a: Array, +lname: U32, +hd: Header, +next: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.lh.err (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=lh.err) # Local file header (APPNOTE 4.3.7): it must agree with the central directory, and its data must end before the directory. def lh.err(+l: List<&2, U32>, +method: U32, +nlen: U32, +packed: U32, +cdoff: U32, +lname: U32, +extra: U32) -> Maybe<&2, String>: Archive.lh.head (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=lh.head) def lh.head(r: Array & List<&2, U32>, +h: List<&2, U32>, +p: U32, +next: U32, +cdoff: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.lh.at (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=lh.at) def lh.at(ok: Bool, a: Array, +h: List<&2, U32>, +p: U32, +next: U32, +cdoff: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.cd.err (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.err) # Central directory file header (APPNOTE 4.3.12) at p, with the directory ending at end. def cd.err(+h: List<&2, U32>, +p: U32, +end: U32) -> Maybe<&2, String>: Archive.cd.head.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.head.of) def cd.head.of(err: Maybe<&2, String>, a: Array, +h: List<&2, U32>, +p: U32, +cdoff: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.cd.head (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.head) def cd.head(r: Array & List<&2, U32>, +p: U32, +end: U32, +cdoff: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.cd.entry (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.entry) def cd.entry(ok: Bool, a: Array, +p: U32, +end: U32, +cdoff: U32, acc: List<&2, Header>) -> Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>: Archive.cd.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=cd.go) # k entries left; r holds the next header's offset and the headers so far, reversed. def cd.go(k: Nat, r: Array & Result<&1, &1, U32 & String, U32 & List<&2, Header>>, +end: U32, +cdoff: U32) -> Array & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.eocd.err (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.err) def eocd.err(+x: List<&2, U32>, +e: U32) -> Maybe<&2, String>: Archive.eocd.checked (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.checked) def eocd.checked(err: Maybe<&2, String>, a: Array, +x: List<&2, U32>) -> Array & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.eocd.parse (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.parse) def eocd.parse(r: Array & List<&2, U32>, +e: U32) -> Array & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.eocd.found (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=eocd.found) def eocd.found(r: Array & Maybe<&2, U32>) -> Array & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.headers.at (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=headers.at) def headers.at(short: Bool, a: Array, +len: U32) -> Array & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.headers.fin (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=headers.fin) def headers.fin(+len: U32, r: Array & Result<&1, &1, U32 & String, List<&2, Header>>) -> Bytes.Bytes & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.headers (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=headers) # The input back, and its central directory with every bound, local header, and method checked. Pure: no data is decoded. def headers(input: Bytes.Bytes) -> Bytes.Bytes & Result<&1, &1, U32 & String, List<&2, Header>>: Archive.inflated (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=inflated) def inflated(r: Result<&1, &1, U32 & String, Bytes.Bytes>) -> Result<&1, &1, U32 & String, Bytes.Bytes>: Archive.inflate.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=inflate.of) # Output past size is refused inside libz, so a bomb never grows beyond its declared size. def inflate.of(+size: U32, b: Bytes.Bytes) -> IO(Result<&1, &1, U32 & String, Bytes.Bytes>): Archive.decode (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=decode) def decode(stored: Bool, +size: U32, raw: Bytes.Bytes) -> IO(Result<&1, &1, U32 & String, Bytes.Bytes>): Archive.check.crc.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=check.crc.of) def check.crc.of(ok: Bool, b: Bytes.Bytes) -> Result<&1, &1, U32 & String, Bytes.Bytes>: Archive.check.crc (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=check.crc) def check.crc(r: Bytes.Bytes & U32, +crc: U32) -> Result<&1, &1, U32 & String, Bytes.Bytes>: Archive.check.len.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=check.len.of) def check.len.of(ok: Bool, b: Bytes.Bytes, +crc: U32) -> Result<&1, &1, U32 & String, Bytes.Bytes>: Archive.check.len (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=check.len) def check.len(r: Bytes.Bytes & U32, +size: U32, +crc: U32) -> Result<&1, &1, U32 & String, Bytes.Bytes>: Archive.check (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=check) def check(+size: U32, +crc: U32, r: Result<&1, &1, U32 & String, Bytes.Bytes>) -> Result<&1, &1, U32 & String, Bytes.Bytes>: Archive.one.put (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=one.put) def one.put(r: Result<&1, &1, U32 & String, Bytes.Bytes>, nm: Bytes.Bytes, +method: U32, +crc: U32, +left: U32, +size: U32, acc: List<&1, Entry>) -> Result<&1, &1, U32 & String, U32 & List<&1, Entry>>: Archive.one.data (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=one.data) def one.data(r: Bytes.Bytes & Bytes.Bytes, nm: Bytes.Bytes, +method: U32, +crc: U32, +size: U32, +left: U32, acc: List<&1, Entry>) -> IO(Bytes.Bytes & Result<&1, &1, U32 & String, U32 & List<&1, Entry>>): Archive.one.name (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=one.name) def one.name(r: Bytes.Bytes & Bytes.Bytes, +method: U32, +crc: U32, +packed: U32, +size: U32, +data: U32, +left: U32, acc: List<&1, Entry>) -> IO(Bytes.Bytes & Result<&1, &1, U32 & String, U32 & List<&1, Entry>>): Archive.one.cap (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=one.cap) # left: the output still allowed under the caller's max. def one.cap(over: Bool, input: Bytes.Bytes, +hd: Header, +left: U32, acc: List<&1, Entry>) -> IO(Bytes.Bytes & Result<&1, &1, U32 & String, U32 & List<&1, Entry>>): Archive.one (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=one) def one(+hd: Header, input: Bytes.Bytes, +left: U32, acc: List<&1, Entry>) -> IO(Bytes.Bytes & Result<&1, &1, U32 & String, U32 & List<&1, Entry>>): Archive.run.fin (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=run.fin) def run.fin(res: Result<&1, &1, U32 & String, U32 & List<&1, Entry>>) -> Result<&1, &1, U32 & String, List<&1, Entry>>: Archive.run (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=run) def run(xs: List<&2, Header>, st: Bytes.Bytes & Result<&1, &1, U32 & String, U32 & List<&1, Entry>>) -> IO(Result<&1, &1, U32 & String, List<&1, Entry>>): Archive.read.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=read.of) def read.of(r: Bytes.Bytes & Result<&1, &1, U32 & String, List<&2, Header>>, +max: U32) -> IO(Result<&1, &1, U32 & String, List<&1, Entry>>): Archive.read (https://jend.leeeet.dev/definition.txt?path=bend-kit-archive@0.5.1.0/archive.bend&name=read) # Every entry of a ZIP archive, in central directory order, or the first problem found. # Stored (0) and DEFLATE (8) entries only; no ZIP64, encryption, or multi-disk archives. # Output past max bytes in total fails with 27 (EFBIG). Malformed ZIP fails with 22 (EINVAL); libz load and allocation errors keep their host codes. def read(max: U32, input: Bytes.Bytes) -> IO(Result<&1, &1, U32 & String, List<&1, Entry>>):