code: purgatorio

ref: 60ecd07e6d3f5786c8723dc9172c35d580fdadc8
dir: /module/zip.m/

View raw version
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;
};