Zip: module{ PATH: con "/dis/lib/zip.dis"; dflag: int; init: fn(): string; # compression methods. only plain & deflate supported. Mplain, Mshrunk, Mreduced1, Mreduced2, Mreduced3, Mreduced4, Mimplode, Mtokenize, Mdeflate, Mdeflate64, Mpkwareimplode, Mreserved0, Mbzip2, Mreserved1, Mlzma: con iota+0; Mibmterse, Mlz77z: con iota+18; Mwavpack, Mppmdi1: con iota+97; # general purpose flags Fencrypted: con 1<<0; Flocaldatadescr: con 1<<3; # crc & sizes in fhdr are 0, use "data descriptor" following fhdr Fcompressedpatched: con 1<<5; Fstrongcrypto: con 1<<6; Futf8: con 1<<11; Fcdirencrypted: con 1<<13; # internal file attributes IFArecord: con 1<<1; Version: con 20; # supported for reading Extra: adt { l: list of ref (int, array of byte); parse: fn(d: array of byte): (ref Extra, string); pack: fn(e: self ref Extra): array of byte; text: fn(e: self ref Extra): string; }; Fhdr: adt { versneeded: int; flags: int; comprmethod: int; filemtime: int; filemdate: int; mtime: int; # not in file, unix epoch mtime based on filemtime & filemdate crc32: big; comprsize: big; uncomprsize: big; filename: string; extra: ref Extra; dataoff: big; # not in file mk: fn(f: ref CDFhdr): ref Fhdr; parse: fn(buf: array of byte, off: big): (ref Fhdr, string); read: fn(fd: ref Sys->FD, off: big): (ref Fhdr, string); pack: fn(f: self ref Fhdr): array of byte; text: fn(f: self ref Fhdr): string; }; CDFhdr: adt { versmadeby: int; versneeded: int; flags: int; comprmethod: int; filemtime: int; filemdate: int; mtime: int; # not in file, unix epoch mtime based on filemtime & filemdate crc32: big; comprsize: big; uncomprsize: big; filename: string; extra: ref Extra; comment: string; disknrstart: int; intattr: int; extattr: big; reloffset: big; mk: fn(f: ref Fhdr, off: big): ref CDFhdr; parse: fn(buf: array of byte): (ref CDFhdr, string); read: fn(b: ref Bufio->Iobuf): (ref CDFhdr, string); pack: fn(f: self ref CDFhdr): array of byte; text: fn(f: self ref CDFhdr): string; }; Endofcdir: adt { disknr: int; diskcdir: int; diskcdirentries: int; cdirentries: int; cdirsize: big; cdiroffset: big; comment: array of byte; parse: fn(buf: array of byte): (ref Endofcdir, string); pack: fn(e: self ref Endofcdir): array of byte; text: fn(e: self ref Endofcdir): string; }; comprmethod: fn(m: int): string; open: fn(fd: ref Sys->FD): (ref Endofcdir, array of ref CDFhdr, string); openfile: fn(fd: ref Sys->FD, f: ref CDFhdr): (ref Sys->FD, ref Fhdr, string); readfhdr: fn(fd: ref Sys->FD, f: ref CDFhdr): (ref Fhdr, string); pread: fn(fd: ref Sys->FD, f: ref Fhdr, buf: array of byte, n: int, off: big): int; sanitizepath: fn(s: string): string; crc32: fn(crc: int, buf: array of byte): int;};
Zip: module
{
PATH: con "/dis/lib/zip.dis";
dflag: int;
init: fn(): string;
# compression methods. only plain & deflate supported.
Mplain,
Mshrunk,
Mreduced1, Mreduced2, Mreduced3, Mreduced4,
Mimplode, Mtokenize,
Mdeflate, Mdeflate64,
Mpkwareimplode,
Mreserved0,
Mbzip2,
Mreserved1,
Mlzma: con iota+0;
Mibmterse,
Mlz77z: con iota+18;
Mwavpack,
Mppmdi1: con iota+97;
# general purpose flags
Fencrypted: con 1<<0;
Flocaldatadescr: con 1<<3; # crc & sizes in fhdr are 0, use "data descriptor" following fhdr
Fcompressedpatched: con 1<<5;
Fstrongcrypto: con 1<<6;
Futf8: con 1<<11;
Fcdirencrypted: con 1<<13;
# internal file attributes
IFArecord: con 1<<1;
Version: con 20; # supported for reading
Extra: adt {
l: list of ref (int, array of byte);
parse: fn(d: array of byte): (ref Extra, string);
pack: fn(e: self ref Extra): array of byte;
text: fn(e: self ref Extra): string;
};
Fhdr: adt {
versneeded: int;
flags: int;
comprmethod: int;
filemtime: int;
filemdate: int;
mtime: int; # not in file, unix epoch mtime based on filemtime & filemdate
crc32: big;
comprsize: big;
uncomprsize: big;
filename: string;
extra: ref Extra;
dataoff: big; # not in file
mk: fn(f: ref CDFhdr): ref Fhdr;
parse: fn(buf: array of byte, off: big): (ref Fhdr, string);
read: fn(fd: ref Sys->FD, off: big): (ref Fhdr, string);
pack: fn(f: self ref Fhdr): array of byte;
text: fn(f: self ref Fhdr): string;
};
CDFhdr: adt {
versmadeby: int;
versneeded: int;
flags: int;
comprmethod: int;
filemtime: int;
filemdate: int;
mtime: int; # not in file, unix epoch mtime based on filemtime & filemdate
crc32: big;
comprsize: big;
uncomprsize: big;
filename: string;
extra: ref Extra;
comment: string;
disknrstart: int;
intattr: int;
extattr: big;
reloffset: big;
mk: fn(f: ref Fhdr, off: big): ref CDFhdr;
parse: fn(buf: array of byte): (ref CDFhdr, string);
read: fn(b: ref Bufio->Iobuf): (ref CDFhdr, string);
pack: fn(f: self ref CDFhdr): array of byte;
text: fn(f: self ref CDFhdr): string;
};
Endofcdir: adt {
disknr: int;
diskcdir: int;
diskcdirentries: int;
cdirentries: int;
cdirsize: big;
cdiroffset: big;
comment: array of byte;
parse: fn(buf: array of byte): (ref Endofcdir, string);
pack: fn(e: self ref Endofcdir): array of byte;
text: fn(e: self ref Endofcdir): string;
};
comprmethod: fn(m: int): string;
open: fn(fd: ref Sys->FD): (ref Endofcdir, array of ref CDFhdr, string);
openfile: fn(fd: ref Sys->FD, f: ref CDFhdr): (ref Sys->FD, ref Fhdr, string);
readfhdr: fn(fd: ref Sys->FD, f: ref CDFhdr): (ref Fhdr, string);
pread: fn(fd: ref Sys->FD, f: ref Fhdr, buf: array of byte, n: int, off: big): int;
sanitizepath: fn(s: string): string;
crc32: fn(crc: int, buf: array of byte): int;
};