/******    *****   ******
 **   **  **   **  **   **      unRAR utility version 1.01
 ******   *******  ******       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 **   **  **   **  **   **         FREE portable version
 **   **  **   **  **   **         ~~~~~~~~~~~~~~~~~~~~~

     Definitions header

   UNCOMMENT ONE OF THE INITIAL LINES TO DEFINE YOUR OS TYPE.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/*
    In following generic OS definitions you can define the optional
    macro SETFILETIME in order to allow UNRAR properly handle the time
    format of your operating media.

    The first argument of SETFILETIME is FILE *DestFile, and the
    second one - pointer to the DOS time structure.

    You can disable SETFILETIME by single ';' after the macro name:

    #define SETFILETIME(FPtr,DosTimePtr)  ;
*/


#ifdef AMIGA

typedef unsigned char   UBYTE;
typedef unsigned short  UWORD;
typedef unsigned long   UDWORD;
typedef long            SDWORD;
typedef UBYTE *         HPBYTE;

#define MEMALLOC(Size)                malloc(Size)
#define MEMFREE(Ptr)                  free(Ptr)
#define MAKEDIR(Name)                 mkdir(Name)
#define SETFILETIME(FPtr,DosTimePtr)  ;
#define PATHDIV                       '/'
#define FOPENREADMODE                 "rb"
#define FOPENWRITEMODE                "wb"
#endif

#define  UNP_VER       15       /* current version of unpacking method */

/* DOS specific file atributes flags */
#define DOSFA_RDONLY   0x01
#define DOSFA_HIDDEN   0x02
#define DOSFA_SYSTEM   0x04
#define DOSFA_LABEL    0x08
#define DOSFA_DIREC    0x10
#define DOSFA_ARCH     0x20

/* Exit codes */
enum { SUCCESS=0,WARNING=5,FATAL_ERROR=10,CRC_ERROR=10,LOCK_ERROR=5,WRITE_ERROR=10,
       OPEN_ERROR=10,USER_ERROR,MEMORY_ERROR=103,USER_BREAK=255 };

/* Status for shutdown */
enum { SD_MEMORY=1,SD_FILES=2 };

/* Status for path comparison */
enum { COMPARE_PATH,NOT_COMPARE_PATH };

/* Archive header flags */
#define  MHD_MULT_VOL       1
#define  MHD_COMMENT        2
#define  MHD_LOCK           4
#define  MHD_SOLID          8

/* File header flags */
#define  LHD_SPLIT_BEFORE   1
#define  LHD_SPLIT_AFTER    2
#define  LHD_PASSWORD       4
#define  LHD_COMMENT        8
#define  SKIP_IF_UNKNOWN    0x4000
#define  LONG_BLOCK         0x8000

/* Archive internal block types */
enum { ALL_HEAD=0,MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,
       COMM_HEAD=0x75 };

/* HostOS code */
enum { MS_DOS=0 };

/* Error codes */
enum { EEMPTY = -1,EWRITE = 1,EREAD,EOPEN,ECLOSE,ESEEK,EMEMORY,EARCH };

/* Headers definitions */

struct MarkHeader
{
  UBYTE Mark[5];
  UWORD HeadSize;
};

struct ArchiveHeader
{
  UWORD  HeadCRC;
  UBYTE  HeadType;
  UWORD  Flags;
  UWORD  HeadSize;
  UBYTE  Reserved[6];
};

struct FileHeader
{
  UWORD  HeadCRC;
  UBYTE  HeadType;
  UWORD  Flags;
  UWORD  HeadSize;
  UDWORD PackSize;
  UDWORD UnpSize;
  UBYTE  HostOS;
  UDWORD FileCRC;
  UDWORD FileTime;
  UBYTE  UnpVer;
  UBYTE  Method;
  UWORD  NameSize;
  UDWORD FileAttr;
};
