Taken from the file plugins.h in the Zoom distribution. /* * The Zoom archive format is: * * (char) Magic1 * (char) Magic2 - or - (char) Magic2B * (char) Magic3 * (char) Magic4 * * IF Magic2B was received THEN * (long) logicalEof /* For multi-file archives * / * END IF * * * * The format of is a linked list of * EntryInfo, where "next" points to the next logical address * on disk. "next" as 0 means no more entries. * * For a directory, the "creator" field points to the * first file/folder entry inside the directory. * * For a file, IF the "what" field is ZOOM_PLUGIN, * the EntryInfo is followed by a length byte and that * many characters naming the compression engine. * Right after that (or right after the EntryInfo in the * case of uncompressed files or default compressed files) * follows the data fork compressed, followed by the * resource fork compressed. * * Note that there is no "end of compressed data" marker; * your compressor engine will have to figure that out by * itself. You could for instance do an ftell before * compressing; writing a (long)0 and then write your * compressed data, seek back and write the actual length. * * Note that new entries always are added last in the file, * so you need not worry about overrunning anything else. */ /* * The default compressor in Zoom is the same as used in * "better" compression mode in ZOO 2.10. A Zoo extractor * or convertor could parse the ZOO header format, and use * the built-in engine for "lzh" compressed files. * * The simplest way to do this is to call SetEngine(-1) and * call Encode / Decode. -1 is the default compressor, 0 is * the null compressor (fork copy) * * Likewise, a UNIX zoom packer/unpacker could use the source * for zoo 2.10 functions "lzh_encode" and "lzh_decode" * (they're wrappers) for compression. */ /* * This "EntryInfo" is presently also a file header. * Some fields may be non-obvious. Don't use these. * For instance, "comment" is currently unsupported, * and should be left as 0 */ #ifndef ZOOM_TYPES typedef enum zoomWhatType { ZOOM_NOTHING , ZOOM_FILE , ZOOM_UCFILE , ZOOM_DIR , ZOOM_PLUGIN } ZoomWhatType ; #define ZOOM_TYPES #endif /* * Remember to fill in "hlen" correctly as well. When reading a header, * Zoom checks with this field to see if it should skip some more data * or seek back a little, so as to make future field additions at the * end possible. You should NOT add your own fields to this structure. */ typedef struct EntryInfo { /* "what" is a ZoomWhatType */ char what ; /* Negative if deleted */ unsigned char hlen ; /* Header length */ unsigned short boolFlags ; /* Boolean flags */ long next ; /* Next entry */ long complen ; /* Length of compressed data */ long compdata ; /* Data fork portion of compressed data - for dirs, number of entries */ long uclen ; /* Length of uncompressed entry */ long ucdata ; /* Data fork part of uncompressed */ long type ; /* File type */ long creator ; /* File creator - for dir, offset of file */ long mdate ; /* Modification date */ long comment ; /* Comment offset */ short flags ; /* Macintosh file flags */ short dataCrc ; /* Data fork crc */ short resCrc ; /* Resource fork crc */ unsigned char name [ 32 ] ; /* File/Dir name */ } EntryInfo ;