/* Unpack Library Include File */

#ifndef	LIBRARIES_UNPACK_H
#define	LIBRARIES_UNPACK_H

#ifndef	EXEC_TYPES_H
#include <exec/types.h>
#endif
#ifndef	EXEC_IO_H
#include <exec/io.h>
#endif
#ifndef	EXEC_LIBRARIES_H
#include <exec/libraries.h>
#endif
#ifndef	DOS_DOSEXTENS_H
#include <dos/dosextens.h>
#endif

/* Library Name & Version */

#define	UNPACKNAME "unpack.library"
#define	UnpackVersion   42L
#define	UnpackRevision  71L


/* Library Base Structure */

struct UnpackLibrary {
  struct Library LibNode;
  BPTR lib_SegList;
  struct DosLibrary *lib_DosBase;
  struct Library *lib_IntBase;
  struct Library *lib_SysBase;
};


/* Unpack Numbers Structure (V37+) */

struct NumberStruct {
  UWORD ns_Version;                     /* Library Version */
  UWORD ns_Revision;                    /* Library Revision */
  UWORD ns_Types;
  UWORD ns_Unpackers;
};


/* Unpacker List Structure (V42+) */

struct UnpListStruct {
  char *ul_Name;
  UWORD ul_CrunchNum;
  UWORD ul_TypeNum;
  UBYTE ul_Type;
  UBYTE ul_Flags;
  ULONG ul_Reserved;
};

#define ULFB_Encrypted	0


/* Drive Structure (V36+) */

struct DriveStruct {
  struct UnpackInfo *drv_UnpackInfo;
  struct IOStdReq *drv_IOStdReq;
  struct MsgPort *drv_MsgPort;
  UBYTE drv_DevName[48];
  UBYTE drv_DriveName[10];
};


/* Unpack Info Structure */

struct UnpackInfo {
  const char *ui_Filename;
  const char *ui_Path;
  void (*ui_Jump)(void *, void *);
  const char *ui_CruncherName;
  APTR ui_DecrunchAdr;
  LONG ui_DecrunchLen;
  UWORD ui_ErrorNum;
  UWORD ui_CrunchNum;
  UBYTE ui_CrunchType;
  UBYTE ui_Flag;
  char *ui_LoadNamePoi;
  LONG ui_CrunchLen;
  void *ui_UserData;                    /* V35+ */
  void (*ui_TrackJump)(void *, void *); /* V36+ */
  void (*ui_TrkErrJump)(void *, void *);/* V36+ */
  LONG ui_Offset;                       /* V36+ */
  UWORD ui_Track;                       /* V36+ */
  char *ui_ErrorMsg;                    /* V37+ */
  APTR ui_CrunchAdr;                    /* V37+ */
  char *ui_LhaPattern;                  /* V38+ */
  UBYTE ui_UseFilenamePointer;          /* V39+ */
  UBYTE ui_Pad;
  ULONG ui_Address;                     /* V42+ */
  ULONG ui_JumpAdr;                     /* V42+ */
  ULONG (*ui_Password)(void *, void *); /* V42+ */

  UBYTE ui_Private[872];                /* Private Data, Do NOT Touch */
};


/* The ui_Flag Have The Following Definitions: */

#define	UFB_OneFile	0L      /* This Select To Decrunch One File Or
                               All Files In An Archive. */
#define	UFB_Delete	1L      /* Delete Files After Scanning. */
#define	UFB_NoFree	2L      /* Free Memory After Jump (V35+) */
#define UFB_Banner	3L      /* Give Banner (V36+) */
#define UFB_NoLoad	4L      /* Do Not Load File (V37+) */
#define	UFB_Protect	5L      /* Change Protection Bits (V38+) */
#define	UFB_NoA4	6L      /* A4 -> A2 */
#define	UFB_ChipMem	7L	/* Decrunch To Chip Memory (V42+) */

#define UFN_OneFile	(1L<<UFB_OneFile)
#define	UFN_Delete	(1L<<UFB_Delete)
#define	UFN_NoFree	(1L<<UFB_NoFree)
#define	UFN_Banner	(1L<<UFB_Banner)
#define	UFN_NoLoad	(1L<<UFB_NoLoad)
#define	UFN_Protect	(1L<<UFB_Protect)
#define	UFN_NoA4	(1L<<UFB_NoA4)
#define	UFN_chipMem	(1L<<UFB_ChipMem)


/* And Now For The UI_CrunchType Flag: */

#define	CRU_Archive	1       /* Archive (Lha, Zoo Etc.) */
#define	CRU_Data	2       /* Data File */
#define	CRU_Object	3       /* Object File */
#define	CRU_Object2	4       /* 2 Segment Object File */
#define	CRU_Track	5       /* Track File (DMS) (V36+) */
#define CRU_Address	6       /* Address File (V42+) */

#define	CRUB_Encryp	7L      /* Encrypted File (If Bit Is Set) */


/* And The Error Flag: */

#define	UERR_Open        1    /* Can't Open File */
#define	UERR_ReadWrite   2    /* Read/Write Error */
#define	UERR_Memory      3    /* Allocation Error (Out Of Memory) */
#define	UERR_Determine   4    /* Can't Determine File */
#define	UERR_Password    5    /* Illegal Password */
#define	UERR_Hunk        6    /* Hunk Error */
#define	UERR_Extern      7    /* Extern File Error */

#define	UERR_Corrupt     8    /* Crunched File Is Corrupt (V35+) */

#define	UERR_Device      9    /* Illegal Device (V36+) */
#define UERR_DevOpen     10   /* Couldn't Opn Dev. Or Create Port V36+ */
#define	UERR_CRC         11   /* CRC Checksum Error (V36+) */
#define	UERR_CheckSum    12   /* Checksum Error (V36+) */
#define	UERR_Old         13   /* Decruncher In Lib. Too Old (V36+) */
#define	UERR_DevErr      14   /* Error From Device (V36+) */

#define	UERR_Protect     15   /* Couldn't Set Protection Bits (V38+) */

#define	UERR_Output      16   /* Output File Error (V39+) */

#define	UERR_OpenLibrary 17   /* Couldn't Open Library (V40+) */
#define	UERR_Unknown     18   /* Unknown Error (V40+) */

#define UERR_Unpack      19   /* Can't Unpack (V42+) */
#define UERR_PasswordReq 20   /* Password Required (V42+) */
#define UERR_Directory   21   /* Can't Make Directory (V42+) */


/* At Last The Cruncher Numbers: */

#define	MaxFilePack	12L

#define	CN_Lha		 1L	/* Lha */
#define	CN_LhaSFX	 2L	/* LhaSFX */
#define	CN_Pak10	 3L	/* Pak 1.0 */
#define	CN_Dms		 4L	/* Dms */
#define CN_Lzx		 5L	/* Lzx */
#define	CN_PCompress	 6L	/* P-Compress */
#define	CN_DmsE		 7L	/* Dms Encrypted */

#define	CN_GnuPack10D	 12L	/* Gnu Packer 1.0 Data */
#define	CN_GnuPack12D	 13L	/* Gnu Packer 1.1/1.2 Data */
#define	CN_GnuPack12Two	 14L	/* Gnu Packer 1.1/1.2 Two Segment */
#define	CN_GnuPack10	 15L	/* Gnu Packer 1.0 */
#define	CN_GnuPack12	 16L	/* Gnu Packer 1.1/1.2 One Segment */
#define	CN_PPData	 17L	/* PowerPacker Data */
#define	CN_PPDataE	 18L	/* PowerPacker Data/Encrypted */
#define	CN_PPLoadSeg	 19L	/* PowerPacker LoadSeg */
#define	CN_PP40Lib	 20L	/* PowerPacker 4.0 Library */
#define	CN_PP40LibE	 21L	/* PowerPacker 4.0 Library/Encrypted */
#define	CN_PP40LibOv	 22L	/* PowerPacker 4.0 Library/Overlayed */
#define	CN_PP2x		 23L	/* PowerPacker 2.x Normal */
#define	CN_PP30		 24L	/* PowerPacker 3.0 */
#define	CN_PP30E	 25L	/* PowerPacker 3.0 Encrypted */
#define	CN_PP30Ov	 26L	/* PowerPacker 3.0 Overlayed */
#define	CN_PP40		 27L	/* PowerPacker 4.0 */
#define	CN_PP40E	 28L	/* PowerPacker 4.0 Encrypted */
#define	CN_PP40Ov	 29L	/* PowerPacker 4.0 Overlayed */
#define	CN_Turtle141	 30L	/* Turtle Smasher 1.3-1.41 */
#define	CN_TSqueeze80	 31L	/* TurboSqueezer 8.0 */
#define	CN_TSqueeze80S	 32L	/* TurboSqueezer 8.0 Small */
#define	CN_TryIt101	 33L	/* TryIt 1.01 */
#define	CN_Titanic11	 34L	/* Titanics Cruncher 1.1 */
#define	CN_Titanic12	 35L	/* Titanics Cruncher 1.2 */
#define	CN_Time22	 36L	/* Time Cruncher 1.7-2.2 */
#define	CN_Tetra21	 37L	/* TetraPack 2.1 */
#define	CN_Tetra21Pro	 38L	/* TetraPack 2.1 Pro */
#define	CN_Tetra22	 39L	/* TetraPack 2.2 */
#define	CN_Tetra22Pro	 40L	/* TetraPack 2.2 Pro */
#define	CN_Tetra102	 41L	/* TetraCrunch 1.02 */
#define	CN_Tetra11	 42L	/* TetraCrunch 1.1 */
#define	CN_Stone299d	 43L	/* Stone Cracker 2.99c-2.99d */
#define	CN_Stone311	 44L	/* Stone Cracker 3.11 */
#define	CN_Stone401A	 45L	/* Stone Cracker 4.01 Address */
#define	CN_Imploder31	 46L	/* Imploder 1.0-3.1 */
#define	CN_Imploder31P	 47L	/* Imploder 1.0-3.1 Protected */
#define	CN_Imploder31L	 48L	/* Imploder 1.0-3.1 Library */
#define	CN_Imploder31LP	 49L	/* Imploder 1.0-3.1 Library/Protected */
#define	CN_Imploder40	 50L	/* Imploder 4.0 */
#define	CN_Imploder40L	 51L	/* Imploder 4.0 Library */
#define	CN_BytKil13	 52L	/* ByteKiller 1.2-1.3 */
#define	CN_BytKil20	 53L	/* ByteKiller 2.0 */
#define	CN_BytKil30	 54L	/* ByteKiller 3.0 */
#define	CN_TNMCrun11	 55L	/* TNM Cruncher 1.1 */
#define	CN_CrunMast10	 56L	/* Crunch Master 1.0 */
#define	CN_CrMania191A	 57L	/* Crunch-Mania 1.4-1.91 Address */
#define	CN_CrMania18AP	 58L	/* Crunch-Mania 1.4-1.8 Address/Pro */
#define	CN_CrMania191D	 59L	/* Crunch-Mania 1.4-1.91 Data */
#define	CN_CrMania191	 60L	/* Crunch-Mania 1.4-1.91 */
#define	CN_CrMania191S	 61L	/* Crunch-Mania 1.4-1.91 Simple */
#define	CN_CrMania191L	 62L	/* Crunch-Mania 1.8-1.91 Library */
#define	CN_CrMania191LH	 63L	/* Crunch-Mania 1.8-1.91 Library/Huffman */
#define	CN_CrMania191H	 64L	/* Crunch-Mania 1.8-1.91 Huffman */
#define	CN_CrMania191DH	 65L	/* Crunch-Mania 1.8-1.91 Data/Huffman */
#define	CN_CrMania191DHS 66L	/* Crunch-Mania 1.8-1.91 Data/Huff/Sample */
#define	CN_CrMania191DS	 67L	/* Crunch-Mania 1.8-1.91 Data/Sample */
#define	CN_DoubAction10	 68L	/* Double Action 1.0 */
#define	CN_DragPack10	 69L	/* DragPack 1.0 */
#define	CN_House14	 70L	/* House 1.4 (RSI-Packer) */
#define	CN_HPC		 71L	/* High Pressure Cruncher */
#define	CN_HPCU		 72L	/* High Pressure Cruncher Unlinked */
#define	CN_IAM10Ice	 73L	/* IAM Packer 1.0 Ice */
#define	CN_IAM10IceD	 74L	/* IAM Packer 1.0 Ice/Data */
#define	CN_IAM10Atm5	 75L	/* IAM Packer 1.0 Atm5 */
#define	CN_IAM10Atm5D	 76L	/* IAM Packer 1.0 Atm5/Data */
#define	CN_ISC15P1	 77L	/* ISC 1.5 Pass 1 */
#define	CN_ISC15P2	 78L	/* ISC 1.5 Pass 2 */
#define	CN_ISC15P3	 79L	/* ISC 1.5 Pass 3 */
#define	CN_MastCrun31A	 80L	/* Master Cruncher 3.0-3.1 Address */
#define	CN_MastCrun31	 81L	/* Master Cruncher 3.0-3.1 */
#define	CN_MegaCrun10	 83L	/* Megacruncher 1.0 */
#define	CN_MegaCrun12A	 84L	/* Megacruncher 1.2 Address */
#define	CN_MegaCrun12	 85L	/* Megacruncher 1.2 */
#define	CN_Defjam36	 86L	/* Defjam 3.2-3.6 */
#define	CN_Defjam36Pro	 87L	/* Defjam 3.2-3.6 Pro */
#define	CN_PackIt10	 88L	/* PackIt 1.0 */
#define	CN_PackIt10D	 89L	/* PackIt 1.0 Data */
#define	CN_Relokit10	 90L	/* Relokit 1.0 */
#define	CN_Spike	 91L	/* Spike Cruncher */
#define	CN_SuperCrun27	 92L	/* Super Cruncher 2.7 */
#define	CN_Syncro46	 93L	/* Syncro Packer 4.6 */
#define	CN_Syncro46P	 94L	/* Syncro Packer 4.6 Pro */
#define	CN_Syncro46R	 95L	/* Syncro Packer 4.6 Raw */
#define	CN_Syncro46RP	 96L	/* Syncro Packer 4.6 Raw/Pro */
#define	CN_Stone400	 97L	/* Stone Cracker 4.00 */
#define	CN_Stone400D	 98L	/* Stone Cracker 4.00 Data */
#define	CN_Stone401	 99L	/* Stone Cracker 4.01 */
#define	CN_Stone401D	 100L	/* Stone Cracker 4.01 Data */

#define	CN_MaxPacker12	 113L	/* MaxPacker 1.2 */
#define	CN_PMC		 114L	/* PMC */
#define	CN_Stone271	 115L	/* Stone Cracker 2.70-2.71 */
#define	CN_Stone271K	 116L	/* Stone Cracker 2.70-2.71 Kill */
#define	CN_Stone310	 117L	/* Stone Cracker 3.10 */
#define	CN_Stone402	 118L	/* Stone Cracker 4.02a */
#define	CN_Stone402A	 119L	/* Stone Cracker 4.02a Address */
#define	CN_Stone402D	 120L	/* Stone Cracker 4.02a Data */
#define	CN_Stone402L	 121L	/* Stone Cracker 4.02a Library */
#define	CN_Turtle200	 122L	/* Turtle Smasher 2.00 */
#define	CN_Turtle200D	 123L	/* Turtle Smasher 2.00 Data */
#define	CN_ANC		 124L	/* ANC-Cruncher */
#define	CN_DisImp10	 125L	/* Discovery File Imploder 1.0 */
#define	CN_HQC20	 126L	/* HQC Cruncher 2.0 */

#define	CN_Stone292	 130L	/* Stone Cracker 2.92 */
#define	CN_Stone299	 131L	/* Stone Cracker 2.99 */
#define	CN_PCompressD	 132L	/* P-Compress Data */
#define	CN_CrMania191AP	 133L	/* Crunch-Mania 1.9t-1.91 Address/Pro */
#define	CN_CrMania191AH	 134L	/* Crunch-Mania 1.9t-1.91 Address/Huffman */
#define	CN_CrMania19APH	 135L	/* Crunch-Mania 1.9t Address/Pro/Huff */
#define	CN_TSqueeze61	 136L	/* TurboSqueezer 6.1 */
#define	CN_FlashSpeed10	 137L	/* FlashSpeed 1.0 */
#define	CN_BytKilPro10	 138L	/* ByteKiller 1.0 Pro */
#define	CN_BytKilPro10K	 139L	/* ByteKiller 1.0 Pro K */
#define	CN_Stone401bA	 140L	/* Stone Cracker 4.01ß Address */
#define	CN_TrashEli10	 141L	/* Trash Eliminator 1.0 */
#define	CN_Ultimate11	 142L	/* Ultimate Packer 1.1 */
#define	CN_TFA154	 143L	/* TFA Cruncher 1.54 */
#define	CN_SExec11	 144L	/* S-Exec 1.1 */
#define	CN_Stone4103	 145L	/* Stone Cracker 4.10.2-4.10.3 */
#define	CN_Stone4103A	 146L	/* Stone Cracker 4.10.2-4.10.3 Address */
#define	CN_Stone4103APl	 147L	/* Stone Cracker 4.10.2-4.10.3 Adr/Plain */
#define	CN_Stone4103AP	 148L	/* Stone Cracker 4.10.2-4.10.3 Adr/Pro */
#define	CN_Stone4103D	 149L	/* Stone Cracker 4.10.2-4.10.3 Data */
#define	CN_Stone4102L	 150L	/* Stone Cracker 4.10.2 Library */
#define	CN_DragPack252	 151L	/* DragPack 2.52 */
#define	CN_DragPack252D	 152L	/* DragPack 2.52 Data */
#define	CN_Stone300	 153L	/* Stone Cracker 3.00 */
#define	CN_Stone300D	 154L	/* Stone Cracker 3.00 Data */
#define	CN_Stone300K	 155L	/* Stone Cracker 3.00 Kill */

#define	CN_PP23Master	 157L	/* PowerPacker 2.3 Master */
#define	CN_XPK		 158L	/* XPK */
#define	CN_XPKE		 159L	/* XPK Encrypted */

#define	CN_CrMania191DE	 160L	/* Crunch-Mania 1.9t-1.91 Data/Encrypted */
#define	CN_CrMania191DSE 161L	/* Crunch-Mania 1.9t-1.91 Data/Samp/Encr */
#define	CN_CrMania191DHE 162L	/* Crunch-Mania 1.9t-1.91 Data/Huff/Encr */
#define	CN_CrMania191DHSE 163L	/* Crunch-Mania 1.9t-1.91 Dat/Huf/Sam/Enc */
#define	CN_CrMania191APH 164L	/* Crunch-Mania 1.91 Address/Pro/Huff */
#define	CN_CrMatic10D	 165L	/* Crunch-o-Matic 1.0 Data */
#define	CN_CrMatic10E	 166L	/* Crunch-o-Matic 1.0 Execute */
#define	CN_CrMatic10M	 167L	/* Crunch-o-Matic 1.0 Module */
#define	CN_CrMatic10P	 168L	/* Crunch-o-Matic 1.0 Picture */
#define	CN_CrMatic10T	 169L	/* Crunch-o-Matic 1.0 Text */
#define	CN_Stone4103L	 170L	/* Stone Cracker 4.10.3 Library */
#define	CN_Chryseis09	 171L	/* Chryseis Cruncher 0.9 */
#define	CN_TUC116d	 172L	/* TUC Cruncher 1.16d */
#define	CN_TUC116dD	 173L	/* TUC Cruncher 1.16d Data */
#define	CN_SoundTrkPack	 174L	/* ST-Packer */
#define	CN_PHD		 175L	/* PHD Compressor */
#define	CN_LightPack15	 176L	/* LightPack 1.5 */
#define	CN_PPRNC1	 177L	/* ProPack (RNC) Mode 1 */
#define	CN_PPRNC1V	 178L	/* ProPack (RNC) Validate Mode 1 */
#define	CN_PPRNC1K	 179L	/* ProPack (RNC) Key Mode 1 */
#define	CN_PPRNC1VK	 180L	/* ProPack (RNC) Validate Key Mode 1 */
#define	CN_PPRNC168000	 181L	/* ProPack (RNC) 68000 Mode 1 */
#define	CN_PPRNC168000V	 182L	/* ProPack (RNC) 68000 Validate Mode 1 */
#define	CN_PPRNC168000K	 183L	/* ProPack (RNC) 68000 Key Mode 1 */
#define	CN_PPRNC168000VK 184L	/* ProPack (RNC) 68000 Valid. Key Mode 1 */
#define	CN_PPRNC1D	 185L	/* ProPack (RNC) Data Mode 1 */
#define	CN_PPRNC1DK	 186L	/* ProPack (RNC) Data Key Mode 1 */
#define	CN_PPRNC2	 187L	/* ProPack (RNC) Mode 2 */
#define	CN_PPRNC2V	 188L	/* ProPack (RNC) Validate Mode 2 */
#define	CN_PPRNC2K	 189L	/* ProPack (RNC) Key Mode 2 */
#define	CN_PPRNC2VK	 190L	/* ProPack (RNC) Validate Key Mode 2 */
#define	CN_PPRNC268000	 191L	/* ProPack (RNC) 68000 Mode 2 */
#define	CN_PPRNC268000V	 192L	/* ProPack (RNC) 68000 Validate Mode 2 */
#define	CN_PPRNC268000K	 193L	/* ProPack (RNC) 68000 Key Mode 2 */
#define	CN_PPRNC268000VK 194L	/* ProPack (RNC) 68000 Valid. Key Mode 2 */
#define	CN_PPRNC2D	 195L	/* ProPack (RNC) Data Mode 2 */
#define	CN_PPRNC2DK	 196L	/* ProPack (RNC) Data Key Mode 2 */
#define	CN_Imploder31O	 197L	/* Imploder 1.0-3.1 Overlayed */
#define	CN_Imploder31OP	 198L	/* Imploder 1.0-3.1 Overlayed Protected */
#define	CN_Imploder40O	 199L	/* Imploder 4.0 Overlayed */
#define	CN_PP30Master	 200L	/* PowerPacker 3.0 Master */
#define	CN_PP30MasterE	 201L	/* PowerPacker 3.0 Master Encrypted */
#define	CN_PP30MasterOv	 202L	/* PowerPacker 3.0 Master Overlayed */

#endif
