changeset 25440:ae7399c268fe

Remove internal unrarlib copy, the new unrarexec code is a strict superset.
author diego
date Thu, 20 Dec 2007 10:10:26 +0000
parents 17098467fc9b
children 3744685df066
files Copyright Makefile configure unrar_exec.h unrarlib.c unrarlib.h vobsub.c
diffstat 7 files changed, 18 insertions(+), 2985 deletions(-) [+]
line wrap: on
line diff
--- a/Copyright	Thu Dec 20 10:08:36 2007 +0000
+++ b/Copyright	Thu Dec 20 10:10:26 2007 +0000
@@ -136,14 +136,6 @@
 Copyright:  2001 Jason Carter
 License:    GNU General Public License
 
-Name:       unrarlib
-Version:    0.4.0 + patches
-Homepage:   http://www.unrarlib.org/
-Directory:  unrarlib.[ch]
-Copyright:  2000-2002 Christian Scheurer (www.ChristianScheurer.ch)
-            2000-2002 by Johannes Winkelmann (jw@tks6.net)
-License:    GNU General Public License / UniquE RAR File Library License
-
 Name:       FreeSDP
 Version:    0.4.1
 Homepage:   https://savannah.nongnu.org/projects/freesdp/
--- a/Makefile	Thu Dec 20 10:08:36 2007 +0000
+++ b/Makefile	Thu Dec 20 10:10:26 2007 +0000
@@ -34,7 +34,6 @@
               subreader.c \
               vobsub.c \
 
-SRCS_COMMON-$(UNRARLIB) += unrarlib.c
 SRCS_COMMON-$(UNRAR_EXEC) += unrar_exec.c
 
 SRCS_MPLAYER = mplayer.c \
--- a/configure	Thu Dec 20 10:08:36 2007 +0000
+++ b/configure	Thu Dec 20 10:10:26 2007 +0000
@@ -255,7 +255,6 @@
   --disable-bitmap-font  disable bitmap font support [enable]
   --disable-freetype     disable FreeType 2 font rendering [autodetect]
   --disable-fontconfig   disable fontconfig font lookup [autodetect]
-  --disable-unrarlib     disable Unique RAR File Library [enabled]
   --disable-unrarexec    disable using of UnRAR executable [enabled]
   --enable-menu          enable OSD menu (not DVD menu) [disabled]
   --disable-sortsub      disable subtitle sorting [enabled]
@@ -592,7 +591,6 @@
 _sunaudio=auto
 _alsa=auto
 _fastmemcpy=yes
-_unrarlib=yes
 _unrar_exec=auto
 _win32dll=auto
 _select=yes
@@ -1097,8 +1095,6 @@
   --disable-freetype)   _freetype=no    ;;
   --enable-fontconfig)  _fontconfig=yes ;;
   --disable-fontconfig) _fontconfig=no  ;;
-  --enable-unrarlib)	_unrarlib=yes	;;
-  --disable-unrarlib)	_unrarlib=no	;;
   --enable-unrarexec)   _unrar_exec=yes ;;
   --disable-unrarexec)  _unrar_exec=no  ;;
   --enable-ftp)         _ftp=yes        ;;
@@ -6711,13 +6707,6 @@
 fi
 echores "$_fastmemcpy"
 
-echocheck "UniquE RAR File Library"
-if test "$_unrarlib" = yes ; then
-    _def_unrarlib='#define USE_UNRARLIB 1'
-else
-    _def_unrarlib='#undef USE_UNRARLIB'
-fi
-echores "$_unrarlib"
 
 echocheck "UnRAR executable"
 if test "$_unrar_exec" = auto ; then
@@ -7626,7 +7615,6 @@
 SPEEX = $_speex
 MUSEPACK = $_musepack
 
-UNRARLIB = $_unrarlib
 UNRAR_EXEC = $_unrar_exec
 PNG = $_png
 JPEG = $_jpeg
@@ -8179,9 +8167,6 @@
 /* Use 3dnow/mmxext/sse/mmx optimized fast memcpy() [maybe buggy... signal 4]*/
 $_def_fastmemcpy
 
-/* Use unrarlib for Vobsubs */
-$_def_unrarlib
-
 /* Use UnRAR executable for Vobsubs */
 $_def_unrar_exec
 
--- a/unrar_exec.h	Thu Dec 20 10:08:36 2007 +0000
+++ b/unrar_exec.h	Thu Dec 20 10:10:26 2007 +0000
@@ -24,7 +24,23 @@
 #ifndef UNRAR_EXEC_H
 #define UNRAR_EXEC_H
 
-#include "unrarlib.h"
+struct RAR_archive_entry
+{
+  char           *Name;
+  unsigned long  PackSize;
+  unsigned long  UnpSize;
+  unsigned long  FileCRC;
+  unsigned long  FileTime;
+  unsigned char  UnpVer;
+  unsigned char  Method;
+  unsigned long  FileAttr;
+};
+
+typedef struct  archivelist
+{
+  struct RAR_archive_entry item;
+  struct archivelist         *next;
+} ArchiveList_struct;
 
 extern char* unrar_executable;
 
--- a/unrarlib.c	Thu Dec 20 10:08:36 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2729 +0,0 @@
-/* ***************************************************************************
- **
- **  This file is part of the UniquE RAR File Library.
- **
- **  Copyright (C) 2000-2002 by Christian Scheurer (www.ChristianScheurer.ch)
- **  UNIX port copyright (c) 2000-2002 by Johannes Winkelmann (jw@tks6.net)
- **
- ** Modified for use with MPlayer, detailed changelog at
- ** http://svn.mplayerhq.hu/mplayer/trunk/
- ** $Id$
- **
- **  The contents of this file are subject to the UniquE RAR File Library
- **  License (the "unrarlib-license.txt"). You may not use this file except
- **  in compliance with the License. You may obtain a copy of the License
- **  at http://www.unrarlib.org/license.html.
- **  Software distributed under the License is distributed on an "AS IS"
- **  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied warranty.
- **
- **  Alternatively, the contents of this file may be used under the terms
- **  of the GNU General Public License Version 2 or later (the "GPL"), in
- **  which case the provisions of the GPL are applicable instead of those
- **  above. If you wish to allow use of your version of this file only
- **  under the terms of the GPL and not to allow others to use your version
- **  of this file under the terms of the UniquE RAR File Library License,
- **  indicate your decision by deleting the provisions above and replace
- **  them with the notice and other provisions required by the GPL. If you
- **  do not delete the provisions above, a recipient may use your version
- **  of this file under the terms of the GPL or the UniquE RAR File Library
- **  License.
- **
- ************************************************************************** */
-
-/* ***************************************************************************
- **
- **                           UniquE RAR File Library
- **                     The free file lib for the demoscene
- **                   multi-OS version (Win32, Linux and SunOS)
- **
- *****************************************************************************
- **
- **   ==> Please configure the program in "unrarlib.h". <==
- **
- **   RAR decompression code:
- **    (C) Eugene Roshal
- **   Modifications to a FileLib:
- **    (C) 2000-2002 Christian Scheurer aka. UniquE/Vantage (cs@unrarlib.org)
- **   Linux port:
- **    (C) 2000-2002 Johannes Winkelmann (jw@tks6.net)
- **
- **  The UniquE RAR File Library gives you the ability to access RAR archives
- **  (any compression method supported in RAR v2.0 including Multimedia
- **  Compression and encryption) directly from your program with ease an by
- **  adding only 12kB (6kB UPX-compressed) additional code to your program.
- **  Both solid and normal (recommended for fast random access to the files!)
- **  archives are supported. This FileLib is made for the Demo scene, so it's
- **  designed for easy use within your demos and intros.
- **  Please read "licence.txt" to learn more about how you may use URARFileLib
- **  in your productions.
- **
- *****************************************************************************
- **
- **  ==> see the "CHANGES" file to see what's new
- **
- ************************************************************************** */
-
-/* -- include files ------------------------------------------------------- */
-#include "unrarlib.h"                       /* include global configuration */
-/* ------------------------------------------------------------------------ */
-
-
-
-/* -- global stuff -------------------------------------------------------- */
-#ifdef _WIN_32
-
-#include <windows.h>                        /* WIN32 definitions            */
-#include <stdio.h>
-#include <string.h>
-
-
-#define ENABLE_ACCESS
-
-#define HOST_OS     WIN_32
-
-#define FM_NORMAL   0x00
-#define FM_RDONLY   0x01
-#define FM_HIDDEN   0x02
-#define FM_SYSTEM   0x04
-#define FM_LABEL    0x08
-#define FM_DIREC    0x10
-#define FM_ARCH     0x20
-
-#define PATHDIVIDER  "\\"
-#define CPATHDIVIDER '\\'
-#define MASKALL      "*.*"
-
-#define READBINARY   "rb"
-#define READTEXT     "rt"
-#define UPDATEBINARY "r+b"
-#define CREATEBINARY "w+b"
-#define CREATETEXT   "w"
-#define APPENDTEXT   "at"
-
-#endif
-
-#ifdef _UNIX
-
-#include <stdio.h>                          /* LINUX/UNIX definitions       */
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-
-#define ENABLE_ACCESS
-
-#define HOST_OS     UNIX
-
-#define FM_LABEL    0x0000
-#define FM_DIREC    0x4000
-
-#define PATHDIVIDER  "/"
-#define CPATHDIVIDER '/'
-#define MASKALL      "*.*"
-
-#define READBINARY   "r"
-#define READTEXT     "r"
-#define UPDATEBINARY "r+"
-#define CREATEBINARY "w+"
-#define CREATETEXT   "w"
-#define APPENDTEXT   "a"
-
-
-/* emulation of the windows API and data types                              */
-/* 20-08-2000 Johannes Winkelmann, jw@tks6.net                              */
-
-typedef long    DWORD;
-typedef short   BOOL;
-#define TRUE    1
-#define FALSE   0
-
-
-#ifdef _DEBUG_LOG                           /* define macros for debugging  */
-#include <unistd.h>
-#include <sys/time.h>
-
-DWORD GetTickCount()
-{
-    struct timeval tv;
-    gettimeofday( &tv, 0 );
-    return (tv.tv_usec / 1000);
-}
-#endif
-
-#endif
-
-
-
-
-
-#ifdef _DEBUG_LOG                           /* define macros for debugging  */
-
-BOOL debug_log_first_start = TRUE;
-
-#define debug_log(a); debug_log_proc(a, __FILE__, __LINE__);
-#define debug_init(a); debug_init_proc(a);
-
-void debug_log_proc(char *text, char *sourcefile, int sourceline);
-void debug_init_proc(char *file_name);
-
-#else
-#define debug_log(a);   /* no debug this time */
-#define debug_init(a);  /* no debug this time */
-#endif
-
-
-
-
-
-#define MAXWINSIZE      0x100000
-#define MAXWINMASK      (MAXWINSIZE-1)
-#define UNP_MEMORY      MAXWINSIZE
-#define Min(x,y) (((x)<(y)) ? (x):(y))
-#define Max(x,y) (((x)>(y)) ? (x):(y))
-#define NM  260
-
-#define SIZEOF_MARKHEAD         7
-#define SIZEOF_OLDMHD           7
-#define SIZEOF_NEWMHD          13
-#define SIZEOF_OLDLHD          21
-#define SIZEOF_NEWLHD          32
-#define SIZEOF_SHORTBLOCKHEAD   7
-#define SIZEOF_LONGBLOCKHEAD   11
-#define SIZEOF_COMMHEAD        13
-#define SIZEOF_PROTECTHEAD     26
-
-
-#define PACK_VER       20                   /* version of decompression code*/
-#define UNP_VER        20
-#define PROTECT_VER    20
-
-
-enum { M_DENYREAD,M_DENYWRITE,M_DENYNONE,M_DENYALL };
-enum { FILE_EMPTY,FILE_ADD,FILE_UPDATE,FILE_COPYOLD,FILE_COPYBLOCK };
-enum { SUCCESS,WARNING,FATAL_ERROR,CRC_ERROR,LOCK_ERROR,WRITE_ERROR,
-       OPEN_ERROR,USER_ERROR,MEMORY_ERROR,USER_BREAK=255,IMM_ABORT=0x8000 };
-enum { EN_LOCK=1,EN_VOL=2 };
-enum { SD_MEMORY=1,SD_FILES=2 };
-enum { NAMES_DONTCHANGE };
-enum { LOG_ARC=1,LOG_FILE=2 };
-enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 };
-enum { OLD_UNPACK,NEW_UNPACK };
-
-
-#define MHD_COMMENT        2
-#define MHD_LOCK           4
-#define MHD_PACK_COMMENT   16
-#define MHD_AV             32
-#define MHD_PROTECT        64
-
-#define LHD_SPLIT_BEFORE   1
-#define LHD_SPLIT_AFTER    2
-#define LHD_PASSWORD       4
-#define LHD_COMMENT        8
-#define LHD_SOLID          16
-
-#define LHD_WINDOWMASK     0x00e0
-#define LHD_WINDOW64       0
-#define LHD_WINDOW128      32
-#define LHD_WINDOW256      64
-#define LHD_WINDOW512      96
-#define LHD_WINDOW1024     128
-#define LHD_DIRECTORY      0x00e0
-
-#define LONG_BLOCK         0x8000
-#define READSUBBLOCK       0x8000
-
-enum { ALL_HEAD=0,MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,
-       COMM_HEAD=0x75,AV_HEAD=0x76,SUB_HEAD=0x77,PROTECT_HEAD=0x78};
-enum { EA_HEAD=0x100 };
-enum { MS_DOS=0,OS2=1,WIN_32=2,UNIX=3 };
-
-
-struct MarkHeader
-{
-  UBYTE Mark[7];
-};
-
-
-struct NewMainArchiveHeader
-{
-  UWORD HeadCRC;
-  UBYTE HeadType;
-  UWORD Flags;
-  UWORD HeadSize;
-  UWORD Reserved;
-  UDWORD Reserved1;
-};
-
-
-struct NewFileHeader
-{
-  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;
-};
-
-
-struct BlockHeader
-{
-  UWORD HeadCRC;
-  UBYTE HeadType;
-  UWORD Flags;
-  UWORD HeadSize;
-  UDWORD DataSize;
-};
-
-
-struct Decode
-{
-  unsigned int MaxNum;
-  unsigned int DecodeLen[16];
-  unsigned int DecodePos[16];
-  unsigned int DecodeNum[2];
-};
-
-
-struct MarkHeader MarkHead;
-struct NewMainArchiveHeader NewMhd;
-struct NewFileHeader NewLhd;
-struct BlockHeader BlockHead;
-
-static UBYTE *TempMemory = NULL;                          /* temporary unpack-buffer      */
-static char *CommMemory = NULL;
-
-
-static UBYTE *UnpMemory = NULL;
-static char* ArgName = NULL;                           /* current file in rar archive  */
-static char* ArcFileName = NULL;                       /* file to decompress           */
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION  /* mem-to-mem decompression     */
-  static MemoryFile *MemRARFile;                   /* pointer to RAR file in memory*/
-#else
-  static char* ArcName = NULL;                        /* RAR archive name             */
-  static FILE *ArcPtr;                             /* input RAR file handler       */
-#endif
-static char *Password = NULL;                         /* password to decrypt files    */
-
-static unsigned char *temp_output_buffer;          /* extract files to this pointer*/
-static unsigned long *temp_output_buffer_offset;   /* size of temp. extract buffer */
-
-static BOOL FileFound;                             /* TRUE=use current extracted   */
-                                            /* data FALSE=throw data away,  */
-                                            /* wrong file                   */
-static int MainHeadSize;
-static long CurBlockPos,NextBlockPos;
-
-static unsigned long CurUnpRead, CurUnpWrite;
-static long UnpPackedSize;
-static long DestUnpSize;
-
-static UDWORD HeaderCRC;
-static int Encryption;
-
-//static unsigned int UnpWrSize;
-//static unsigned char *UnpWrAddr;
-static unsigned int UnpPtr,WrPtr;
-
-static unsigned char PN1,PN2,PN3;
-static unsigned short OldKey[4];
-
-
-
-/* function header definitions                                              */
-static int ReadHeader(int BlockType);
-static BOOL ExtrFile(void);
-//BOOL ListFile(void);
-static int tread(void *stream,void *buf,unsigned len);
-static int tseek(void *stream,long offset,int fromwhere);
-static BOOL UnstoreFile(void);
-static int IsArchive(void);
-static int ReadBlock(int BlockType);
-static unsigned int UnpRead(unsigned char *Addr,unsigned int Count);
-static void UnpInitData(void);
-static void Unpack(unsigned char *UnpAddr);
-static UBYTE DecodeAudio(int Delta);
-static void DecodeNumber(struct Decode *Dec);
-static void UpdKeys(UBYTE *Buf);
-static void SetCryptKeys(char *Password);
-static void SetOldKeys(char *Password);
-static void DecryptBlock(unsigned char *Buf);
-static void InitCRC(void);
-static UDWORD CalcCRC32(UDWORD StartCRC,UBYTE *Addr,UDWORD Size);
-static void UnpReadBuf(int FirstBuf);
-static void ReadTables(void);
-static void ReadLastTables(void);
-static void MakeDecodeTables(unsigned char *LenTab,
-                             struct Decode *Dec,
-                             int Size);
-static int my_stricomp(char *Str1,char *Str2);
-/* ------------------------------------------------------------------------ */
-
-
-/* -- global functions ---------------------------------------------------- */
-
-int urarlib_get(void *output,
-                unsigned long *size,
-                char *filename,
-                void *rarfile,
-                char *libpassword)
-/* Get a file from a RAR file to the "output" buffer. The UniquE RAR FileLib
- * does everything from allocating memory, decrypting and unpacking the file
- * from the archive. TRUE is returned if the file could be successfully
- * extracted, else a FALSE indicates a failure.
- */
-{
-  BOOL  retcode = FALSE;
-
-#ifdef _DEBUG_LOG
-  int  str_offs;                            /* used for debug-strings       */
-  char DebugMsg[500];                       /* used to compose debug msg    */
-
-  if(debug_log_first_start)
-  {
-    debug_log_first_start=FALSE;            /* only create a new log file   */
-    debug_init(_DEBUG_LOG_FILE);            /* on startup                   */
-  }
-
-#endif
-
-  InitCRC();                                /* init some vars               */
-
-  if(ArgName) free(ArgName);
-  ArgName = strdup(filename);                /* set file(s) to extract       */
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  MemRARFile = rarfile;                     /* set pointer to mem-RAR file  */
-#else
-  if(ArcName) free(ArcName);
-  ArcName = strdup(rarfile);                 /* set RAR file name            */
-#endif
-  if(Password) free(Password);
-  if(libpassword != NULL)
-    Password = strdup(libpassword);          /* init password                */
-  else
-    Password = strdup("");
-
-  temp_output_buffer = NULL;
-  temp_output_buffer_offset=size;           /* set size of the temp buffer  */
-
-#ifdef _DEBUG_LOG
-  sprintf(DebugMsg, "Extracting >%s< from >%s< (password is >%s<)...",
-          filename, (char*)rarfile, libpassword);
-  debug_log(DebugMsg);
-#endif
-
-  retcode = ExtrFile();                     /* unpack file now!             */
-
-  //memset(Password,0,sizeof(Password));      /* clear password               */
-
-#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  if (ArcPtr!=NULL){
-      fclose(ArcPtr);
-      ArcPtr = NULL;
-  }
-#endif
-
-  if(UnpMemory) free(UnpMemory);           /* free memory                  */
-  if(TempMemory) free(TempMemory);
-  if(CommMemory) free(CommMemory);
-  UnpMemory=NULL;
-  TempMemory=NULL;
-  CommMemory=NULL;
-
-
-  if(retcode == FALSE)
-  {
-    if(temp_output_buffer)                  /* free memory and return NULL  */
-      free(temp_output_buffer);
-    temp_output_buffer=NULL;
-    *(DWORD*)output=0;                      /* pointer on errors            */
-    *size=0;
-#ifdef _DEBUG_LOG
-
-
-   /* sorry for this ugly code, but older SunOS gcc compilers don't support */
-   /* white spaces within strings                                           */
-   str_offs  = sprintf(DebugMsg, "Error - couldn't extract ");
-   str_offs += sprintf(DebugMsg + str_offs, ">%s<", filename);
-   str_offs += sprintf(DebugMsg + str_offs, " and allocated ");
-   str_offs += sprintf(DebugMsg + str_offs, "%u Bytes", (unsigned int)*size);
-   str_offs += sprintf(DebugMsg + str_offs, " of unused memory!");
-
-  } else
-  {
-    sprintf(DebugMsg, "Extracted %u Bytes.", (unsigned int)*size);
-  }
-  debug_log(DebugMsg);
-#else
-  }
-#endif
-  *(DWORD*)output=(DWORD)temp_output_buffer;/* return pointer for unpacked*/
-                                            /* data                       */
-
-  return retcode;
-}
-
-
-int urarlib_list(void *rarfile, ArchiveList_struct *list)
-{
-  ArchiveList_struct *tmp_List = NULL;
-  int NoOfFilesInArchive       = 0;         /* number of files in archive   */
-
-#ifdef _DEBUG_LOG
-  if(debug_log_first_start)
-  {
-    debug_log_first_start=FALSE;            /* only create a new log file   */
-    debug_init(_DEBUG_LOG_FILE);            /* on startup                   */
-  }
-#endif
-
-  InitCRC();                                /* init some vars               */
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  MemRARFile         = rarfile;             /* assign pointer to RAR file   */
-  MemRARFile->offset = 0;
-  if (!IsArchive())
-  {
-    debug_log("Not a RAR file");
-    return NoOfFilesInArchive;              /* error => exit!               */
-  }
-#else
-  /* open and identify archive                                              */
-  if ((ArcPtr=fopen(rarfile,READBINARY))!=NULL)
-  {
-    if (!IsArchive())
-    {
-      debug_log("Not a RAR file");
-      fclose(ArcPtr);
-      ArcPtr = NULL;
-      return NoOfFilesInArchive;            /* error => exit!               */
-    }
-  }
-  else {
-    debug_log("Error opening file.");
-    return NoOfFilesInArchive;
-  }
-#endif
-
-  if ((UnpMemory=malloc(UNP_MEMORY))==NULL)
-  {
-    debug_log("Can't allocate memory for decompression!");
-    return NoOfFilesInArchive;
-  }
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  MemRARFile->offset+=NewMhd.HeadSize-MainHeadSize;
-#else
-  tseek(ArcPtr,NewMhd.HeadSize-MainHeadSize,SEEK_CUR);
-#endif
-  (*(DWORD*)list) = (DWORD)NULL;            /* init file list               */
-  /* do while file is not extracted and there's no error                    */
-  while (TRUE)
-  {
-    if (ReadBlock(FILE_HEAD | READSUBBLOCK) <= 0) /* read name of the next  */
-    {                                       /* file within the RAR archive  */
-      debug_log("Couldn't read next filename from archive (I/O error).");
-      break;                                /* error, file not found in     */
-    }                                       /* archive or I/O error         */
-    if (BlockHead.HeadType==SUB_HEAD)
-    {
-      debug_log("Sorry, sub-headers not supported.");
-      break;                                /* error => exit                */
-    }
-
-    if((void*)(*(DWORD*)list) == NULL)      /* first entry                  */
-    {
-      tmp_List = malloc(sizeof(ArchiveList_struct));
-      tmp_List->next = NULL;
-
-      (*(DWORD*)list) = (DWORD)tmp_List;
-
-    } else                                  /* add entry                    */
-    {
-      tmp_List->next = malloc(sizeof(ArchiveList_struct));
-      tmp_List = (ArchiveList_struct*) tmp_List->next;
-      tmp_List->next = NULL;
-    }
-
-    tmp_List->item.Name = malloc(NewLhd.NameSize + 1);
-    strcpy(tmp_List->item.Name, ArcFileName);
-    tmp_List->item.NameSize = NewLhd.NameSize;
-    tmp_List->item.PackSize = NewLhd.PackSize;
-    tmp_List->item.UnpSize = NewLhd.UnpSize;
-    tmp_List->item.HostOS = NewLhd.HostOS;
-    tmp_List->item.FileCRC = NewLhd.FileCRC;
-    tmp_List->item.FileTime = NewLhd.FileTime;
-    tmp_List->item.UnpVer = NewLhd.UnpVer;
-    tmp_List->item.Method = NewLhd.Method;
-    tmp_List->item.FileAttr = NewLhd.FileAttr;
-
-    NoOfFilesInArchive++;                   /* count files                  */
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-    MemRARFile->offset = NextBlockPos;
-#else
-    if (ArcPtr!=NULL) tseek(ArcPtr,NextBlockPos,SEEK_SET);
-#endif
-
-  };
-
-  /* free memory, clear password and close archive                          */
-  memset(Password,0,sizeof(Password));      /* clear password               */
-#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  if (ArcPtr!=NULL){
-      fclose(ArcPtr);
-      ArcPtr = NULL;
-  }
-#endif
-
-  free(UnpMemory);                          /* free memory                  */
-  free(TempMemory);
-  free(CommMemory);
-  UnpMemory=NULL;
-  TempMemory=NULL;
-  CommMemory=NULL;
-
-  return NoOfFilesInArchive;
-}
-
-
-
-/* urarlib_freelist:
- * (after the suggestion and code of Duy Nguyen, Sean O'Blarney
- * and Johannes Winkelmann who independently wrote a patch)
- * free the memory of a ArchiveList_struct created by urarlib_list.
- *
- *    input: *list          pointer to an ArchiveList_struct
- *    output: -
- */
-
-void urarlib_freelist(ArchiveList_struct *list)
-{
-    ArchiveList_struct* tmp = list;
-
-    while ( list ) {
-        tmp = list->next;
-        free( list->item.Name );
-        free( list );
-        list = tmp;
-    }
-}
-
-
-/* ------------------------------------------------------------------------ */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/****************************************************************************
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- *******                    B L O C K   I / O                         *******
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************/
-
-
-
-#define GetHeaderByte(N) Header[N]
-
-#define GetHeaderWord(N) (Header[N]+((UWORD)Header[N+1]<<8))
-
-#define GetHeaderDword(N) (Header[N]+((UWORD)Header[N+1]<<8)+\
-                          ((UDWORD)Header[N+2]<<16)+\
-                          ((UDWORD)Header[N+3]<<24))
-
-
-int ReadBlock(int BlockType)
-{
-  struct NewFileHeader SaveFileHead;
-  int Size=0,ReadSubBlock=0;
-  static int LastBlock;
-  memcpy(&SaveFileHead,&NewLhd,sizeof(SaveFileHead));
-  if (BlockType & READSUBBLOCK)
-    ReadSubBlock=1;
-  BlockType &= 0xff;
-  {
-    while (1)
-    {
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-      CurBlockPos=MemRARFile->offset;       /* get offset of mem-file       */
-#else
-      CurBlockPos=ftell(ArcPtr);
-#endif
-      Size=ReadHeader(FILE_HEAD);
-      if (Size!=0)
-      {
-        if (NewLhd.HeadSize<SIZEOF_SHORTBLOCKHEAD)
-          return(0);
-        NextBlockPos=CurBlockPos+NewLhd.HeadSize;
-        if (NewLhd.Flags & LONG_BLOCK)
-          NextBlockPos+=NewLhd.PackSize;
-        if (NextBlockPos<=CurBlockPos)
-          return(0);
-      }
-
-      if (Size > 0 && BlockType!=SUB_HEAD)
-        LastBlock=BlockType;
-      if (Size==0 || BlockType==ALL_HEAD || NewLhd.HeadType==BlockType ||
-          (NewLhd.HeadType==SUB_HEAD && ReadSubBlock && LastBlock==BlockType))
-        break;
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-      MemRARFile->offset = NextBlockPos;
-#else
-      tseek(ArcPtr, NextBlockPos, SEEK_SET);
-#endif
-    }
-  }
-
-  BlockHead.HeadCRC=NewLhd.HeadCRC;
-  BlockHead.HeadType=NewLhd.HeadType;
-  BlockHead.Flags=NewLhd.Flags;
-  BlockHead.HeadSize=NewLhd.HeadSize;
-  BlockHead.DataSize=NewLhd.PackSize;
-
-  if (BlockType!=NewLhd.HeadType) BlockType=ALL_HEAD;
-
-  if((FILE_HEAD == BlockType) && (Size>0))
-  {
-    ArcFileName=realloc(ArcFileName,NewLhd.NameSize+1);
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-    tread(MemRARFile, ArcFileName, NewLhd.NameSize);
-#else
-    tread(ArcPtr,ArcFileName,NewLhd.NameSize);
-#endif
-    ArcFileName[NewLhd.NameSize]=0;
-#ifdef _DEBUG_LOG
-    if (NewLhd.HeadCRC!=(UWORD)~CalcCRC32(HeaderCRC,(UBYTE*)&ArcFileName[0],
-                                          NewLhd.NameSize))
-    {
-      debug_log("file header broken");
-    }
-#endif
-    Size+=NewLhd.NameSize;
-  } else
-  {
-    memcpy(&NewLhd,&SaveFileHead,sizeof(NewLhd));
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-    MemRARFile->offset = CurBlockPos;
-#else
-    tseek(ArcPtr,CurBlockPos,SEEK_SET);
-#endif
-  }
-
-
-  return(Size);
-}
-
-
-int ReadHeader(int BlockType)
-{
-  int Size = 0;
-  unsigned char Header[64];
-  switch(BlockType)
-  {
-    case MAIN_HEAD:
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-        Size=tread(MemRARFile, Header, SIZEOF_NEWMHD);
-#else
-        Size=tread(ArcPtr,Header,SIZEOF_NEWMHD);
-#endif
-        NewMhd.HeadCRC=(unsigned short)GetHeaderWord(0);
-        NewMhd.HeadType=GetHeaderByte(2);
-        NewMhd.Flags=(unsigned short)GetHeaderWord(3);
-        NewMhd.HeadSize=(unsigned short)GetHeaderWord(5);
-        NewMhd.Reserved=(unsigned short)GetHeaderWord(7);
-        NewMhd.Reserved1=GetHeaderDword(9);
-        HeaderCRC=CalcCRC32(0xFFFFFFFFL,&Header[2],SIZEOF_NEWMHD-2);
-      break;
-    case FILE_HEAD:
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-        Size=tread(MemRARFile, Header, SIZEOF_NEWLHD);
-#else
-        Size=tread(ArcPtr,Header,SIZEOF_NEWLHD);
-#endif
-        NewLhd.HeadCRC=(unsigned short)GetHeaderWord(0);
-        NewLhd.HeadType=GetHeaderByte(2);
-        NewLhd.Flags=(unsigned short)GetHeaderWord(3);
-        NewLhd.HeadSize=(unsigned short)GetHeaderWord(5);
-        NewLhd.PackSize=GetHeaderDword(7);
-        NewLhd.UnpSize=GetHeaderDword(11);
-        NewLhd.HostOS=GetHeaderByte(15);
-        NewLhd.FileCRC=GetHeaderDword(16);
-        NewLhd.FileTime=GetHeaderDword(20);
-        NewLhd.UnpVer=GetHeaderByte(24);
-        NewLhd.Method=GetHeaderByte(25);
-        NewLhd.NameSize=(unsigned short)GetHeaderWord(26);
-        NewLhd.FileAttr=GetHeaderDword(28);
-        HeaderCRC=CalcCRC32(0xFFFFFFFFL,&Header[2],SIZEOF_NEWLHD-2);
-      break;
-
-#ifdef _DEBUG_LOG
-  case COMM_HEAD:                           /* log errors in case of debug  */
-        debug_log("Comment headers not supported! "\
-                  "Please create archives without comments.");
-      break;
-  case PROTECT_HEAD:
-        debug_log("Protected headers not supported!");
-      break;
-  case ALL_HEAD:
-        debug_log("ShortBlockHeader not supported!");
-      break;
-  default:
-        debug_log("Unknown//unsupported !");
-#else
-  default:                                  /* else do nothing              */
-        break;
-#endif
-  }
-  return(Size);
-}
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- *******                  E X T R A C T   L O O P                     *******
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-int IsArchive(void)
-{
-#ifdef _DEBUG_LOG
-  int  str_offs;                            /* used for debug-strings       */
-  char DebugMsg[500];                       /* used to compose debug msg    */
-#endif
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  if (tread(MemRARFile, MarkHead.Mark, SIZEOF_MARKHEAD) != SIZEOF_MARKHEAD)
-    return(FALSE);
-#else
-  if (tread(ArcPtr,MarkHead.Mark,SIZEOF_MARKHEAD)!=SIZEOF_MARKHEAD)
-    return(FALSE);
-#endif
-  /* Old archive => error                                                   */
-  if (MarkHead.Mark[0]==0x52 && MarkHead.Mark[1]==0x45 &&
-      MarkHead.Mark[2]==0x7e && MarkHead.Mark[3]==0x5e)
-  {
-    debug_log("Attention: format as OLD detected! Can't handel archive!");
-  }
-  else
-      /* original RAR v2.0                                                  */
-      if ((MarkHead.Mark[0]==0x52 && MarkHead.Mark[1]==0x61 && /* original  */
-           MarkHead.Mark[2]==0x72 && MarkHead.Mark[3]==0x21 && /* RAR header*/
-           MarkHead.Mark[4]==0x1a && MarkHead.Mark[5]==0x07 &&
-           MarkHead.Mark[6]==0x00) ||
-     /* "UniquE!" - header                                                  */
-          (MarkHead.Mark[0]=='U' && MarkHead.Mark[1]=='n' &&   /* "UniquE!" */
-           MarkHead.Mark[2]=='i' && MarkHead.Mark[3]=='q' &&   /* header    */
-           MarkHead.Mark[4]=='u' && MarkHead.Mark[5]=='E' &&
-           MarkHead.Mark[6]=='!'))
-
-    {
-      if (ReadHeader(MAIN_HEAD)!=SIZEOF_NEWMHD)
-        return(FALSE);
-    } else
-    {
-
-#ifdef _DEBUG_LOG
-     /* sorry for this ugly code, but older SunOS gcc compilers don't       */
-     /* support white spaces within strings                                 */
-     str_offs  = sprintf(DebugMsg, "unknown archive type (only plain RAR ");
-     str_offs += sprintf(DebugMsg + str_offs, "supported (normal and solid ");
-     str_offs += sprintf(DebugMsg + str_offs, "archives), SFX and Volumes ");
-     str_offs += sprintf(DebugMsg + str_offs, "are NOT supported!)");
-
-     debug_log(DebugMsg);
-#endif
-
-    }
-
-
-  MainHeadSize=SIZEOF_NEWMHD;
-
-  return(TRUE);
-}
-
-
-BOOL ExtrFile(void)
-{
-  BOOL ReturnCode=TRUE;
-  FileFound=FALSE;                          /* no file found by default     */
-
-#ifdef  _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  MemRARFile->offset = 0;                   /* start reading from offset 0  */
-  if (!IsArchive())
-  {
-    debug_log("Not a RAR file");
-    return FALSE;                           /* error => exit!               */
-  }
-
-#else
-  /* open and identify archive                                              */
-  if ((ArcPtr=fopen(ArcName,READBINARY))!=NULL)
-  {
-    if (!IsArchive())
-    {
-      debug_log("Not a RAR file");
-      fclose(ArcPtr);
-      ArcPtr = NULL;
-      return FALSE;                         /* error => exit!               */
-    }
-  } else
-  {
-    debug_log("Error opening file.");
-    return FALSE;
-  }
-#endif
-
-
-  if ((UnpMemory=malloc(UNP_MEMORY))==NULL)
-  {
-    debug_log("Can't allocate memory for decompression!");
-    return FALSE;
-  }
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  MemRARFile->offset+=NewMhd.HeadSize-MainHeadSize;
-#else
-  tseek(ArcPtr,NewMhd.HeadSize-MainHeadSize,SEEK_CUR);
-#endif
-
-  /* do while file is not extracted and there's no error                    */
-  do
-  {
-
-    if (ReadBlock(FILE_HEAD | READSUBBLOCK) <= 0) /* read name of the next  */
-    {                                       /* file within the RAR archive  */
-/*
- *
- * 21.11.2000  UnQ  There's a problem with some linux distros when a file
- *                  can not be found in an archive.
- *
- *    debug_log("Couldn't read next filename from archive (I/O error).");
- *
-*/
-      ReturnCode=FALSE;
-      break;                                /* error, file not found in     */
-    }                                       /* archive or I/O error         */
-    if (BlockHead.HeadType==SUB_HEAD)
-    {
-      debug_log("Sorry, sub-headers not supported.");
-      ReturnCode=FALSE;
-      break;                                /* error => exit                */
-    }
-
-
-    if(TRUE == (FileFound=(my_stricomp(ArgName, ArcFileName) == 0)))
-    /* *** file found! ***                                                  */
-    {
-      {
-        temp_output_buffer=malloc(NewLhd.UnpSize);/* allocate memory for the*/
-      }
-      *temp_output_buffer_offset=0;         /* file. The default offset     */
-                                            /* within the buffer is 0       */
-
-      if(temp_output_buffer == NULL)
-      {
-        debug_log("can't allocate memory for the file decompression");
-        ReturnCode=FALSE;
-        break;                              /* error, can't extract file!   */
-      }
-
-
-    }
-
-    /* in case of a solid archive, we need to decompress any single file till
-     * we have found the one we are looking for. In case of normal archives
-     * (recommended!!), we skip the files until we are sure that it is the
-     * one we want.
-     */
-    if((NewMhd.Flags & 0x08) || FileFound)
-    {
-      if (NewLhd.UnpVer<13 || NewLhd.UnpVer>UNP_VER)
-      {
-        debug_log("unknown compression method");
-        ReturnCode=FALSE;
-        break;                              /* error, can't extract file!   */
-      }
-
-      CurUnpRead=CurUnpWrite=0;
-      if ((*Password!=0) && (NewLhd.Flags & LHD_PASSWORD))
-        Encryption=NewLhd.UnpVer;
-      else
-        Encryption=0;
-      if (Encryption) SetCryptKeys(Password);
-
-      UnpPackedSize=NewLhd.PackSize;
-      DestUnpSize=NewLhd.UnpSize;
-
-      if (NewLhd.Method==0x30)
-      {
-        UnstoreFile();
-      } else
-      {
-        Unpack(UnpMemory);
-      }
-
-
-
-#ifdef _DO_CRC32_CHECK                      /* calculate CRC32              */
-      if((UBYTE*)temp_output_buffer != NULL)
-      {
-        if(NewLhd.FileCRC!=~CalcCRC32(0xFFFFFFFFL,
-                                      (UBYTE*)temp_output_buffer,
-                                      NewLhd.UnpSize))
-        {
-          debug_log("CRC32 error - file couldn't be decompressed correctly!");
-          ReturnCode=FALSE;
-          break;                              /* error, can't extract file! */
-        }
-      }
-#endif
-
-    }
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-    MemRARFile->offset = NextBlockPos;
-#else
-    if (ArcPtr!=NULL) tseek(ArcPtr,NextBlockPos,SEEK_SET);
-#endif
-  } while(my_stricomp(ArgName, ArcFileName) != 0);/* exit if file is extracted */
-
-  /* free memory, clear password and close archive                          */
-  free(UnpMemory);
-  UnpMemory=NULL;
-#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-  if (ArcPtr!=NULL){
-      fclose(ArcPtr);
-      ArcPtr = NULL;
-  }
-#endif
-
-  return ReturnCode;                        /* file extracted successful!   */
-}
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- *******             G L O B A L   F U N C T I O N S                  *******
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-int tread(void *stream,void *buf,unsigned len)
-{
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-
-  if(((MemRARFile->offset + len) > MemRARFile->size) || (len == 0))
-     return 0;
-
-  memcpy(buf,
-         (BYTE*)(((MemoryFile*)stream)->data)+((MemoryFile*)stream)->offset,
-         len % ((((MemoryFile*)stream)->size) - 1));
-
-  MemRARFile->offset+=len;                  /* update read pointer          */
-  return len % ((((MemoryFile*)stream)->size) - 1);
-#else
-  return(fread(buf,1,len,(FILE*)stream));
-#endif
-}
-
-
-#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-int tseek(void *stream,long offset,int fromwhere)
-{
-  return(fseek((FILE*)stream,offset,fromwhere));
-}
-#endif
-
-
-static char* my_strupper(char *Str)
-{
-  char *ChPtr;
-  for (ChPtr=Str;*ChPtr;ChPtr++)
-    *ChPtr=(char)toupper(*ChPtr);
-  return(Str);
-}
-
- 
-static int my_stricomp(char *Str1,char *Str2)
-/* compare strings without regard of '\' and '/'                            */
-{
-  char S1[512],S2[512];
-  char *chptr;
-
-  strncpy(S1,Str1,sizeof(S1));
-  strncpy(S2,Str2,sizeof(S2));
-
-  while((chptr = strchr(S1, '\\')) != NULL) /* ignore backslash             */
-  {
-    *chptr = '_';
-  }
-
-  while((chptr = strchr(S2, '\\')) != NULL) /* ignore backslash             */
-  {
-    *chptr = '_';
-  }
-
-  while((chptr = strchr(S1, '/')) != NULL)  /* ignore slash                 */
-  {
-    *chptr = '_';
-  }
-
-  while((chptr = strchr(S2, '/')) != NULL)  /* ignore slash                 */
-  {
-    *chptr = '_';
-  }
-
-  return(strcmp(my_strupper(S1),my_strupper(S2)));
-}
-
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- *******                   U N P A C K   C O D E                      *******
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-/* *****************************
- * ** unpack stored RAR files **
- * *****************************/
-
-BOOL UnstoreFile(void)
-{
-  if ((long)(*temp_output_buffer_offset=UnpRead(temp_output_buffer,
-                                                NewLhd.UnpSize))==-1)
-  {
-    debug_log("Read error of stored file!");
-    return FALSE;
-  }
-  return TRUE;
-}
-
-
-
-
-/* ****************************************
- * ** RAR decompression code starts here **
- * ****************************************/
-
-#define NC 298                              /* alphabet = {0,1,2, .,NC - 1} */
-#define DC 48
-#define RC 28
-#define BC 19
-#define MC 257
-
-enum {CODE_HUFFMAN=0,CODE_LZ=1,CODE_LZ2=2,CODE_REPEATLZ=3,CODE_CACHELZ=4,
-      CODE_STARTFILE=5,CODE_ENDFILE=6,CODE_STARTMM=8,CODE_ENDMM=7,
-      CODE_MMDELTA=9};
-
-struct AudioVariables
-{
-  int K1,K2,K3,K4,K5;
-  int D1,D2,D3,D4;
-  int LastDelta;
-  unsigned int Dif[11];
-  unsigned int ByteCount;
-  int LastChar;
-};
-
-
-#define NC 298  /* alphabet = {0, 1, 2, ..., NC - 1} */
-#define DC 48
-#define RC 28
-#define BC 19
-#define MC 257
-
-
-struct AudioVariables AudV[4];
-
-#define GetBits()                                                 \
-        BitField = ( ( ( (UDWORD)InBuf[InAddr]   << 16 ) |        \
-                       ( (UWORD) InBuf[InAddr+1] <<  8 ) |        \
-                       (         InBuf[InAddr+2]       ) )        \
-                       >> (8-InBit) ) & 0xffff;
-
-
-#define AddBits(Bits)                          \
-        InAddr += ( InBit + (Bits) ) >> 3;     \
-        InBit  =  ( InBit + (Bits) ) &  7;
-
-static unsigned char *UnpBuf;
-static unsigned int BitField;
-static unsigned int Number;
-
-unsigned char InBuf[8192];                  /* input read buffer            */
-
-unsigned char UnpOldTable[MC*4];
-
-unsigned int InAddr,InBit,ReadTop;
-
-unsigned int LastDist,LastLength;
-static unsigned int Length,Distance;
-
-unsigned int OldDist[4],OldDistPtr;
-
-
-struct LitDecode
-{
-  unsigned int MaxNum;
-  unsigned int DecodeLen[16];
-  unsigned int DecodePos[16];
-  unsigned int DecodeNum[NC];
-} LD;
-
-struct DistDecode
-{
-  unsigned int MaxNum;
-  unsigned int DecodeLen[16];
-  unsigned int DecodePos[16];
-  unsigned int DecodeNum[DC];
-} DD;
-
-struct RepDecode
-{
-  unsigned int MaxNum;
-  unsigned int DecodeLen[16];
-  unsigned int DecodePos[16];
-  unsigned int DecodeNum[RC];
-} RD;
-
-struct MultDecode
-{
-  unsigned int MaxNum;
-  unsigned int DecodeLen[16];
-  unsigned int DecodePos[16];
-  unsigned int DecodeNum[MC];
-} MD[4];
-
-struct BitDecode
-{
-  unsigned int MaxNum;
-  unsigned int DecodeLen[16];
-  unsigned int DecodePos[16];
-  unsigned int DecodeNum[BC];
-} BD;
-
-static struct MultDecode *MDPtr[4]={&MD[0],&MD[1],&MD[2],&MD[3]};
-
-int UnpAudioBlock,UnpChannels,CurChannel,ChannelDelta;
-
-
-void Unpack(unsigned char *UnpAddr)
-/* *** 38.3% of all CPU time is spent within this function!!!               */
-{
-  static unsigned char LDecode[]={0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,
-                                  40,48,56,64,80,96,112,128,160,192,224};
-  static unsigned char LBits[]=  {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,
-                                  3,3,3,4,4,4,4,5,5,5,5};
-  static int DDecode[]={0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,
-                        512,768,1024,1536,2048,3072,4096,6144,8192,12288,
-                        16384,24576,32768U,49152U,65536,98304,131072,196608,
-                        262144,327680,393216,458752,524288,589824,655360,
-                        720896,786432,851968,917504,983040};
-  static unsigned char DBits[]=  {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,
-                                  9,10,10,11,11,12,12,13,13,14,14,15,15,16,
-                                  16,16,16,16,16,16,16,16,16,16,16,16,16};
-  static unsigned char SDDecode[]={0,4,8,16,32,64,128,192};
-  static unsigned char SDBits[]={2,2,3, 4, 5, 6,  6,  6};
-  unsigned int Bits;
-
-
-  UnpBuf=UnpAddr;                           /* UnpAddr is a pointer to the  */
-  UnpInitData();                            /* unpack buffer                */
-  UnpReadBuf(1);
-  if (!(NewLhd.Flags & LHD_SOLID))
-     ReadTables();
-   DestUnpSize--;
-
-  while (DestUnpSize>=0)
-  {
-    UnpPtr&=MAXWINMASK;
-
-    if (InAddr>sizeof(InBuf)-30)
-      UnpReadBuf(0);
-    if (((WrPtr-UnpPtr) & MAXWINMASK)<270 && WrPtr!=UnpPtr)
-    {
-
-
-      if (FileFound)
-      {
-
-        if (UnpPtr<WrPtr)
-        {
-                        if((*temp_output_buffer_offset + UnpPtr) > NewLhd.UnpSize)
-                        {
-                           debug_log("Fatal! Buffer overrun during decompression!");
-                          DestUnpSize=-1;
-
-                    } else
-                        {
-              /* copy extracted data to output buffer                         */
-              memcpy(temp_output_buffer + *temp_output_buffer_offset,
-                     &UnpBuf[WrPtr], (0-WrPtr) & MAXWINMASK);
-              /* update offset within buffer                                  */
-              *temp_output_buffer_offset+= (0-WrPtr) & MAXWINMASK;
-              /* copy extracted data to output buffer                         */
-              memcpy(temp_output_buffer + *temp_output_buffer_offset, UnpBuf,
-                     UnpPtr);
-              /* update offset within buffer                                  */
-              *temp_output_buffer_offset+=UnpPtr;
-                        }
-        } else
-        {
-                        if((*temp_output_buffer_offset + (UnpPtr-WrPtr)) > NewLhd.UnpSize)
-                        {
-                           debug_log("Fatal! Buffer overrun during decompression!");
-                          DestUnpSize=-1;
-                    } else
-                        {
-                  /* copy extracted data to output buffer                       */
-              memcpy(temp_output_buffer + *temp_output_buffer_offset,
-                     &UnpBuf[WrPtr], UnpPtr-WrPtr);
-              *temp_output_buffer_offset+=UnpPtr-WrPtr;                                                /* update offset within buffer */
-                    }
-
-            }
-      }
-
-      WrPtr=UnpPtr;
-    }
-
-    if (UnpAudioBlock)
-    {
-      DecodeNumber((struct Decode *)MDPtr[CurChannel]);
-      if (Number==256)
-      {
-        ReadTables();
-        continue;
-      }
-      UnpBuf[UnpPtr++]=DecodeAudio(Number);
-      if (++CurChannel==UnpChannels)
-        CurChannel=0;
-      DestUnpSize--;
-      continue;
-    }
-
-    DecodeNumber((struct Decode *)&LD);
-    if (Number<256)
-    {
-      UnpBuf[UnpPtr++]=(UBYTE)Number;
-      DestUnpSize--;
-      continue;
-    }
-    if (Number>269)
-    {
-      Length=LDecode[Number-=270]+3;
-      if ((Bits=LBits[Number])>0)
-      {
-        GetBits();
-        Length+=BitField>>(16-Bits);
-        AddBits(Bits);
-      }
-
-      DecodeNumber((struct Decode *)&DD);
-      Distance=DDecode[Number]+1;
-      if ((Bits=DBits[Number])>0)
-      {
-        GetBits();
-        Distance+=BitField>>(16-Bits);
-        AddBits(Bits);
-      }
-
-      if (Distance>=0x40000L)
-        Length++;
-
-      if (Distance>=0x2000)
-        Length++;
-
-       LastDist=OldDist[OldDistPtr++ & 3]=Distance;
-       DestUnpSize-=(LastLength=Length);
-       while (Length--)
-       {
-         UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK];
-         UnpPtr=(UnpPtr+1) & MAXWINMASK;
-       }
-
-      continue;
-    }
-    if (Number==269)
-    {
-      ReadTables();
-      continue;
-    }
-    if (Number==256)
-    {
-      Length=LastLength;
-      Distance=LastDist;
-       LastDist=OldDist[OldDistPtr++ & 3]=Distance;
-       DestUnpSize-=(LastLength=Length);
-       while (Length--)
-       {
-         UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK];
-         UnpPtr=(UnpPtr+1) & MAXWINMASK;
-       }
-      continue;
-    }
-    if (Number<261)
-    {
-      Distance=OldDist[(OldDistPtr-(Number-256)) & 3];
-      DecodeNumber((struct Decode *)&RD);
-      Length=LDecode[Number]+2;
-      if ((Bits=LBits[Number])>0)
-      {
-        GetBits();
-        Length+=BitField>>(16-Bits);
-        AddBits(Bits);
-      }
-      if (Distance>=0x40000)
-        Length++;
-      if (Distance>=0x2000)
-        Length++;
-      if (Distance>=0x101)
-        Length++;
-       LastDist=OldDist[OldDistPtr++ & 3]=Distance;
-       DestUnpSize-=(LastLength=Length);
-       while (Length--)
-       {
-         UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK];
-         UnpPtr=(UnpPtr+1) & MAXWINMASK;
-       }
-      continue;
-    }
-    if (Number<270)
-    {
-      Distance=SDDecode[Number-=261]+1;
-      if ((Bits=SDBits[Number])>0)
-      {
-        GetBits();
-        Distance+=BitField>>(16-Bits);
-        AddBits(Bits);
-      }
-      Length=2;
-       LastDist=OldDist[OldDistPtr++ & 3]=Distance;
-       DestUnpSize-=(LastLength=Length);
-       while (Length--)
-       {
-         UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK];
-         UnpPtr=(UnpPtr+1) & MAXWINMASK;
-       }
-      continue;
-   }
-  }
-  ReadLastTables();
-
-  if (FileFound)                            /* flush buffer                 */
-  {
-
-    if (UnpPtr<WrPtr)
-    {
-          if((*temp_output_buffer_offset + UnpPtr) > NewLhd.UnpSize)
-          {
-            debug_log("Fatal! Buffer overrun during decompression!");
-                DestUnpSize=-1;
-          } else
-          {
-        /* copy extracted data to output buffer                             */
-        memcpy(temp_output_buffer + *temp_output_buffer_offset, &UnpBuf[WrPtr],
-               (0-WrPtr) & MAXWINMASK);
-        /* update offset within buffer                                      */
-        *temp_output_buffer_offset+= (0-WrPtr) & MAXWINMASK;
-        /* copy extracted data to output buffer                             */
-        memcpy(temp_output_buffer + *temp_output_buffer_offset, UnpBuf, UnpPtr);
-        /* update offset within buffer                                      */
-        *temp_output_buffer_offset+=UnpPtr;
-          }
-    } else
-    {
-          if((*temp_output_buffer_offset + (UnpPtr-WrPtr)) > NewLhd.UnpSize)
-          {
-                 debug_log("Fatal! Buffer overrun during decompression!");
-                DestUnpSize=-1;
-          } else
-          {
-        /* copy extracted data to output buffer                             */
-        memcpy(temp_output_buffer + *temp_output_buffer_offset, &UnpBuf[WrPtr],
-               UnpPtr-WrPtr);
-        /* update offset within buffer                                      */
-        *temp_output_buffer_offset+=UnpPtr-WrPtr;
-          }
-    }
-  }
-
-  WrPtr=UnpPtr;
-}
-
-
-unsigned int UnpRead(unsigned char *Addr,unsigned int Count)
-{
-  int RetCode=0;
-  unsigned int I,ReadSize,TotalRead=0;
-  unsigned char *ReadAddr;
-  ReadAddr=Addr;
-  while (Count > 0)
-  {
-    ReadSize=(unsigned int)((Count>(unsigned long)UnpPackedSize) ?
-                                                  (unsigned int)UnpPackedSize : Count);
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-    if(MemRARFile->data == NULL)
-      return(0);
-    RetCode=tread(MemRARFile, ReadAddr, ReadSize);
-#else
-    if (ArcPtr==NULL)
-      return(0);
-    RetCode=tread(ArcPtr,ReadAddr,ReadSize);
-#endif
-    CurUnpRead+=RetCode;
-    ReadAddr+=RetCode;
-    TotalRead+=RetCode;
-    Count-=RetCode;
-    UnpPackedSize-=RetCode;
-      break;
-  }
-  if (RetCode!= -1)
-  {
-    RetCode=TotalRead;
-    if (Encryption)
-    {
-      if (Encryption<20)
-          {
-            debug_log("Old Crypt() not supported!");
-          }
-      else
-      {
-        for (I=0;I<(unsigned int)RetCode;I+=16)
-          DecryptBlock(&Addr[I]);
-      }
-    }
-  }
-  return(RetCode);
-}
-
-
-void UnpReadBuf(int FirstBuf)
-{
-  int RetCode;
-  if (FirstBuf)
-  {
-    ReadTop=UnpRead(InBuf,sizeof(InBuf));
-    InAddr=0;
-  }
-  else
-  {
-    memcpy(InBuf,&InBuf[sizeof(InBuf)-32],32);
-    InAddr&=0x1f;
-    RetCode=UnpRead(&InBuf[32],sizeof(InBuf)-32);
-    if (RetCode>0)
-      ReadTop=RetCode+32;
-    else
-      ReadTop=InAddr;
-  }
-}
-
-
-void ReadTables(void)
-{
-  UBYTE BitLength[BC];
-  unsigned char Table[MC*4];
-  int TableSize,N,I;
-  if (InAddr>sizeof(InBuf)-25)
-    UnpReadBuf(0);
-  GetBits();
-  UnpAudioBlock=(BitField & 0x8000);
-
-  if (!(BitField & 0x4000))
-    memset(UnpOldTable,0,sizeof(UnpOldTable));
-  AddBits(2);
-
-
-  if (UnpAudioBlock)
-  {
-    UnpChannels=((BitField>>12) & 3)+1;
-    if (CurChannel>=UnpChannels)
-      CurChannel=0;
-    AddBits(2);
-    TableSize=MC*UnpChannels;
-  }
-  else
-    TableSize=NC+DC+RC;
-
-
-  for (I=0;I<BC;I++)
-  {
-    GetBits();
-    BitLength[I]=(UBYTE)(BitField >> 12);
-    AddBits(4);
-  }
-  MakeDecodeTables(BitLength,(struct Decode *)&BD,BC);
-  I=0;
-  while (I<TableSize)
-  {
-    if (InAddr>sizeof(InBuf)-5)
-      UnpReadBuf(0);
-    DecodeNumber((struct Decode *)&BD);
-    if (Number<16)
-    {
-      Table[I]=(Number+UnpOldTable[I]) & 0xf;
-      I++;
-    }
-    else
-      if (Number==16)
-      {
-        GetBits();
-        N=(BitField >> 14)+3;
-        AddBits(2);
-        while (N-- > 0 && I<TableSize)
-        {
-          Table[I]=Table[I-1];
-          I++;
-        }
-      }
-      else
-      {
-        if (Number==17)
-        {
-          GetBits();
-          N=(BitField >> 13)+3;
-          AddBits(3);
-        }
-        else
-        {
-          GetBits();
-          N=(BitField >> 9)+11;
-          AddBits(7);
-        }
-        while (N-- > 0 && I<TableSize)
-          Table[I++]=0;
-      }
-  }
-  if (UnpAudioBlock)
-    for (I=0;I<UnpChannels;I++)
-      MakeDecodeTables(&Table[I*MC],(struct Decode *)MDPtr[I],MC);
-  else
-  {
-    MakeDecodeTables(&Table[0],(struct Decode *)&LD,NC);
-    MakeDecodeTables(&Table[NC],(struct Decode *)&DD,DC);
-    MakeDecodeTables(&Table[NC+DC],(struct Decode *)&RD,RC);
-  }
-  memcpy(UnpOldTable,Table,sizeof(UnpOldTable));
-}
-
-
-static void ReadLastTables(void)
-{
-  if (ReadTop>=InAddr+5)
-  {
-    if (UnpAudioBlock)
-    {
-      DecodeNumber((struct Decode *)MDPtr[CurChannel]);
-      if (Number==256)
-        ReadTables();
-    }
-    else
-    {
-      DecodeNumber((struct Decode *)&LD);
-      if (Number==269)
-        ReadTables();
-    }
-  }
-}
-
-
-static void MakeDecodeTables(unsigned char *LenTab,
-                             struct Decode *Dec,
-                             int Size)
-{
-  int LenCount[16],TmpPos[16],I;
-  long M,N;
-  memset(LenCount,0,sizeof(LenCount));
-  for (I=0;I<Size;I++)
-    LenCount[LenTab[I] & 0xF]++;
-
-  LenCount[0]=0;
-  for (TmpPos[0]=Dec->DecodePos[0]=Dec->DecodeLen[0]=0,N=0,I=1;I<16;I++)
-  {
-    N=2*(N+LenCount[I]);
-    M=N<<(15-I);
-    if (M>0xFFFF)
-      M=0xFFFF;
-    Dec->DecodeLen[I]=(unsigned int)M;
-    TmpPos[I]=Dec->DecodePos[I]=Dec->DecodePos[I-1]+LenCount[I-1];
-  }
-
-  for (I=0;I<Size;I++)
-    if (LenTab[I]!=0)
-      Dec->DecodeNum[TmpPos[LenTab[I] & 0xF]++]=I;
-  Dec->MaxNum=Size;
-}
-
-
-static void DecodeNumber(struct Decode *Deco)
-/* *** 52.6% of all CPU time is spent within this function!!!               */
-{
-  unsigned int I;
-  register unsigned int N;
-  GetBits();
-
-#ifdef _USE_ASM
-
-#ifdef _WIN_32
- __asm {
-
-    xor eax, eax
-    mov eax, BitField                       // N=BitField & 0xFFFE;
-    and eax, 0xFFFFFFFE
-    mov [N], eax
-    mov edx, [Deco]                         // EAX=N, EDX=Deco
-
-          cmp  eax, dword ptr[edx + 8*4 + 4]// if (N<Dec->DecodeLen[8])
-          jae  else_G
-
-             cmp  eax, dword ptr[edx + 4*4 + 4]// if (N<Dec->DecodeLen[4])
-             jae  else_F
-
-
-                cmp  eax, dword ptr[edx + 2*4 + 4]// if (N<Dec->DecodeLen[2])
-                jae  else_C
-
-                   cmp  eax, dword ptr[edx + 1*4 + 4]// if (N<Dec->DecodeLen[1])
-                   jae  else_1
-                   mov  I, 1                         //  I=1;
-                   jmp  next_1
-                 else_1:                             // else
-                   mov  I, 2                         //  I=2;
-                 next_1:
-
-                jmp  next_C
-              else_C:                             // else
-
-                   cmp  eax, dword ptr[edx + 3*4 + 4]// if (N<Dec->DecodeLen[3])
-                   jae  else_2
-                   mov  I, 3                         //  I=3;
-                   jmp  next_2
-                 else_2:                             // else
-                   mov  I, 4                         //  I=4;
-                 next_2:
-
-              next_C:                             // else
-
-             jmp  next_F
-           else_F:
-
-
-             cmp  eax, dword ptr[edx + 6*4 + 4]// if (N<Dec->DecodeLen[6])
-             jae  else_E
-
-                cmp  eax, dword ptr[edx + 5*4 + 4]// if (N<Dec->DecodeLen[5])
-                jae  else_3
-                mov  I, 5                         //  I=5;
-                jmp  next_3
-              else_3:                             // else
-                mov  I, 6                         //  I=6;
-              next_3:
-
-             jmp  next_E
-           else_E:                             // else
-
-                cmp  eax, dword ptr[edx + 7*4 + 4]// if (N<Dec->DecodeLen[7])
-                jae  else_4
-                mov  I, 7                         //  I=7;
-                jmp  next_4
-              else_4:                             // else
-                mov  I, 8                         //  I=8;
-              next_4:
-
-           next_E:
-
-           next_F:
-
-          jmp  next_G
-        else_G:
-
-          cmp  eax, dword ptr[edx + 12*4 + 4] // if (N<Dec->DecodeLen[12])
-          jae  else_D
-
-             cmp  eax, dword ptr[edx + 10*4 + 4]// if (N<Dec->DecodeLen[10])
-             jae  else_B
-
-                cmp  eax, dword ptr[edx + 9*4 + 4]// if (N<Dec->DecodeLen[9])
-                jae  else_5
-                mov  I, 9                         //  I=9;
-                jmp  next_5
-              else_5:                             // else
-                mov  I, 10                         //  I=10;
-              next_5:
-
-             jmp  next_B
-           else_B:                             // else
-
-                cmp  eax, dword ptr[edx + 11*4 + 4]// if (N<Dec->DecodeLen[11])
-                jae  else_6
-                mov  I, 11                         //  I=11;
-                jmp  next_6
-              else_6:                             // else
-                mov  I, 12                         //  I=12;
-              next_6:
-
-           next_B:
-
-
-          jmp  next_D
-        else_D:                             // else
-
-               cmp  eax, dword ptr[edx + 14*4 + 4]// if (N<Dec->DecodeLen[14])
-               jae  else_A
-
-                  cmp  eax, dword ptr[edx + 13*4 + 4]// if (N<Dec->DecodeLen[13])
-                  jae  else_7
-                  mov  I, 13                         //  I=13;
-                  jmp  next_7
-                 else_7:                             // else
-                  mov  I, 14                         //  I=14;
-                 next_7:
-
-               jmp  next_A
-              else_A:                             // else
-               mov  I, 15                         //  I=15;
-              next_A:
-
-        next_D:
-    next_G:
-}
-#else
- __asm__ __volatile__ (
-     "andl $0xFFFFFFFE, %%eax"
-"      movl %%eax, %1"
-"          cmpl 8*4(%%edx), %%eax /* 5379 */"
-"          jae  else_G"
-""
-"             cmpl 4*4(%%edx), %%eax"
-"             jae  else_F"
-""
-"                cmpl 2*4(%%edx), %%eax"
-"                jae  else_C"
-""
-"                   cmpl 1*4(%%edx), %%eax"
-""
-"                   jae  else_1"
-"                   movl $1, %0"
-"                   jmp  next_1"
-"                 else_1:       "
-"                   movl  $2, %0"
-"                 next_1:"
-"                "
-"                jmp  next_C"
-"              else_C:          "
-""
-"                   cmpl 3*4(%%edx), %%eax "
-"                   jae  else_2"
-"                   movl  $3, %0"
-"                   jmp  next_2"
-"                 else_2:       "
-"                   movl  $4, %0"
-"                 next_2:"
-""
-"              next_C:          "
-""
-"             jmp  next_F"
-"           else_F:"
-""
-"             cmpl 6*4(%%edx), %%eax"
-"             jae  else_E"
-""
-"                cmpl 5*4(%%edx), %%eax"
-"                jae  else_3"
-"                movl  $5, %0   "
-"                jmp  next_3"
-"              else_3:          "
-"                movl  $6, %0   "
-"              next_3:"
-""
-"             jmp  next_E"
-"           else_E:             "
-""
-"                cmpl 7*4(%%edx), %%eax"
-"                jae  else_4"
-"                movl  $7, %0   "
-"                jmp  next_4"
-"              else_4:          "
-"                movl  $8, %0   "
-"              next_4:"
-""
-"           next_E:"
-""
-"           next_F:"
-""
-"          jmp  next_G"
-"        else_G:"
-""
-"          cmpl 12*4(%%edx), %%eax"
-"          jae  else_D"
-""
-"             cmpl 10*4(%%edx), %%eax"
-"             jae  else_B"
-""
-"                cmpl 9*4(%%edx), %%eax"
-"                jae  else_5"
-"                movl  $9, %0   "
-"                jmp  next_5"
-"              else_5:          "
-"                movl  $10, %0  "
-"              next_5:"
-""
-"             jmp  next_B"
-"           else_B:             "
-""
-"                cmpl 11*4(%%edx), %%eax"
-" "
-"                jae  else_6"
-"                movl  $11, %0  "
-"                jmp  next_6"
-"              else_6:          "
-"                movl  $12, %0  "
-"              next_6:"
-""
-"           next_B:"
-"      "
-"        "
-"          jmp  next_D"
-"        else_D:                "
-""
-"               cmpl 14*4(%%edx), %%eax"
-"               jae  else_A"
-""
-"                  cmpl 13*4(%%edx), %%eax"
-"                  jae  else_7"
-"                  movl  $13, %0"
-"                  jmp  next_7"
-"                 else_7:       "
-"                  movl  $14, %0"
-"                 next_7:"
-""
-"               jmp  next_A"
-"              else_A:          "
-"               movl  $15, %0   "
-"              next_A:"
-"          "
-"        next_D:                             "
-"    next_G:"
-     : "=g" (I), "=r"(N)
-     : "eax" ((long)BitField), "edx"((long)Deco->DecodeLen)
-      : "memory"
-     );
-#endif /* #ifdef _WIN_32 ... #elif defined _X86_ASM_ */
-
-#else
-  N=BitField & 0xFFFE;
-  if (N<Deco->DecodeLen[8])  {
-    if (N<Deco->DecodeLen[4]) {
-      if (N<Deco->DecodeLen[2]) {
-        if (N<Deco->DecodeLen[1])
-          I=1;
-        else
-          I=2;
-      } else {
-        if (N<Deco->DecodeLen[3])
-          I=3;
-        else
-          I=4;
-      }
-    } else {
-      if (N<Deco->DecodeLen[6])  {
-        if (N<Deco->DecodeLen[5])
-          I=5;
-        else
-          I=6;
-      } else {
-        if (N<Deco->DecodeLen[7])
-          I=7;
-        else
-          I=8;
-      }
-   }
-  } else {
-    if (N<Deco->DecodeLen[12]) {
-      if (N<Deco->DecodeLen[10]) {
-        if (N<Deco->DecodeLen[9])
-          I=9;
-        else
-          I=10;
-      } else {
-        if (N<Deco->DecodeLen[11])
-          I=11;
-        else
-          I=12;
-      }
-    } else {
-      if (N<Deco->DecodeLen[14]) {
-        if (N<Deco->DecodeLen[13])
-          I=13;
-        else
-          I=14;
-
-      } else {
-          I=15;
-      }
-    }
-
-  }
-#endif
-
-  AddBits(I);
-  if ((N=Deco->DecodePos[I]+((N-Deco->DecodeLen[I-1])>>(16-I)))>=Deco->MaxNum)
-      N=0;
-  Number=Deco->DecodeNum[N];
-}
-
-
-void UnpInitData()
-{
-  InAddr=InBit=0;
-  if (!(NewLhd.Flags & LHD_SOLID))
-  {
-    ChannelDelta=CurChannel=0;
-
-#ifdef _USE_ASM
-
-#ifdef _WIN_32                              /* Win32 with VisualC           */
-
-    __asm {
-        push edi
-        push eax
-        push ecx
-
-        cld                                 /* increment EDI and ESI        */
-        mov  al, 0x00
-        mov  ecx, SIZE AudV
-        mov  edi, Offset AudV
-        rep  stosb                          /* clear memory                 */
-
-        mov  ecx, SIZE OldDist
-        mov  edi, Offset OldDist
-        rep  stosb                          /* clear memory                 */
-
-        mov  ecx, SIZE UnpOldTable
-        mov  edi, Offset UnpOldTable
-        rep  stosb                          /* clear memory                 */
-
-        pop  ecx
-        pop  eax
-        pop  edi
-
-
-        mov  [OldDistPtr], 0
-        mov  [LastDist], 0
-        mov  [LastLength], 0
-        mov  [UnpPtr], 0
-        mov  [WrPtr], 0
-        mov  [OldDistPtr], 0
-        mov  [LastLength], 0
-        mov  [LastDist], 0
-        mov  [UnpPtr], 0
-        mov  [WrPtr], 0
-
-    }
-    memset(UnpBuf,0,MAXWINSIZE);
-
-
-#else                    /* unix/linux on i386 cpus */
-    __asm__ __volatile (
-"        cld                                 /* increment EDI and ESI        */"
-"        movb $0x00, %%al"
-"        movl %0, %%ecx"
-"        movl %1, %%edi"
-"        rep  "
-"        stosb                              /* clear memory                 */"
-""
-"        movl %2, %%ecx"
-"        mov  %3, %%edi"
-"        rep  "
-"        stosb                              /* clear memory                 */"
-""
-"        movl %4, %%ecx"
-"        movl %5, %%edi"
-"        rep  "
-"        stosb                              /* clear memory                 */"
-""
-"        movl $0, (OldDistPtr)"
-"        movl $0, (LastDist)"
-"        movl $0, (LastLength)"
-"        movl $0, (UnpPtr)"
-"        movl $0, (WrPtr)"
-"        movl $0, (OldDistPtr)"
-"        movl $0, (LastLength)"
-"        movl $0, (LastDist)"
-"        movl $0, (UnpPtr)"
-"        movl $0, (WrPtr)"
-        :
-        : "m" ((long)sizeof(AudV)),
-          "m" ((long)AudV),
-          "m" ((long)sizeof(OldDist)),
-          "m" ((long)OldDist),
-          "m" ((long)sizeof(UnpOldTable)),
-          "m" ((long)UnpOldTable)
-        : "memory", "edi", "eax", "ecx"
-    );
-    memset(UnpBuf,0,MAXWINSIZE);
-#endif
-
-#else                                       /* unix/linux on non-i386 cpu  */
-    memset(AudV,0,sizeof(AudV));
-    memset(OldDist,0,sizeof(OldDist));
-    OldDistPtr=0;
-    LastDist=LastLength=0;
-    memset(UnpBuf,0,MAXWINSIZE);
-    memset(UnpOldTable,0,sizeof(UnpOldTable));
-    UnpPtr=WrPtr=0;
-#endif
-
-  }
-}
-
-
-UBYTE DecodeAudio(int Delta)
-{
-  struct AudioVariables *V;
-  unsigned int Ch;
-  unsigned int NumMinDif,MinDif;
-  int PCh,I;
-
-  V=&AudV[CurChannel];
-  V->ByteCount++;
-  V->D4=V->D3;
-  V->D3=V->D2;
-  V->D2=V->LastDelta-V->D1;
-  V->D1=V->LastDelta;
-  PCh=8*V->LastChar+V->K1*V->D1+V->K2*V->D2+
-           V->K3*V->D3+V->K4*V->D4+V->K5*ChannelDelta;
-  PCh=(PCh>>3) & 0xFF;
-
-  Ch=PCh-Delta;
-
-  I=((signed char)Delta)<<3;
-
-  V->Dif[0]+=abs(I);
-  V->Dif[1]+=abs(I-V->D1);
-  V->Dif[2]+=abs(I+V->D1);
-  V->Dif[3]+=abs(I-V->D2);
-  V->Dif[4]+=abs(I+V->D2);
-  V->Dif[5]+=abs(I-V->D3);
-  V->Dif[6]+=abs(I+V->D3);
-  V->Dif[7]+=abs(I-V->D4);
-  V->Dif[8]+=abs(I+V->D4);
-  V->Dif[9]+=abs(I-ChannelDelta);
-  V->Dif[10]+=abs(I+ChannelDelta);
-
-  ChannelDelta=V->LastDelta=(signed char)(Ch-V->LastChar);
-  V->LastChar=Ch;
-
-  if ((V->ByteCount & 0x1F)==0)
-  {
-    MinDif=V->Dif[0];
-    NumMinDif=0;
-    V->Dif[0]=0;
-    for (I=1;(unsigned int)I<sizeof(V->Dif)/sizeof(V->Dif[0]);I++)
-    {
-      if (V->Dif[I]<MinDif)
-      {
-        MinDif=V->Dif[I];
-        NumMinDif=I;
-      }
-      V->Dif[I]=0;
-    }
-    switch(NumMinDif)
-    {
-      case 1:
-        if (V->K1>=-16)
-          V->K1--;
-        break;
-      case 2:
-        if (V->K1<16)
-          V->K1++;
-        break;
-      case 3:
-        if (V->K2>=-16)
-          V->K2--;
-        break;
-      case 4:
-        if (V->K2<16)
-          V->K2++;
-        break;
-      case 5:
-        if (V->K3>=-16)
-          V->K3--;
-        break;
-      case 6:
-        if (V->K3<16)
-          V->K3++;
-        break;
-      case 7:
-        if (V->K4>=-16)
-          V->K4--;
-        break;
-      case 8:
-        if (V->K4<16)
-          V->K4++;
-        break;
-      case 9:
-        if (V->K5>=-16)
-          V->K5--;
-        break;
-      case 10:
-        if (V->K5<16)
-          V->K5++;
-        break;
-    }
-  }
-  return((UBYTE)Ch);
-}
-
-
-
-
-
-
-
-/* ***************************************************
- * ** CRCCrypt Code - decryption engine starts here **
- * ***************************************************/
-
-
-#define NROUNDS 32
-
-#define rol(x,n)  (((x)<<(n)) | ((x)>>(8*sizeof(x)-(n))))
-#define ror(x,n)  (((x)>>(n)) | ((x)<<(8*sizeof(x)-(n))))
-
-#define substLong(t) ( (UDWORD)SubstTable[(int)t&255] | \
-           ((UDWORD)SubstTable[(int)(t>> 8)&255]<< 8) | \
-           ((UDWORD)SubstTable[(int)(t>>16)&255]<<16) | \
-           ((UDWORD)SubstTable[(int)(t>>24)&255]<<24) )
-
-
-UDWORD CRCTab[256];
-
-UBYTE SubstTable[256];
-UBYTE InitSubstTable[256]={
-  215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221,  2, 42,
-  232,  1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,
-  255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86,  6,
-   71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,
-  107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,
-  158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,
-   97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,
-  164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,
-  207,120,189,210,  8,226, 41, 72,183,203,135,165,166, 60, 98,  7,
-  122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,
-  131,  3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,
-  224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,
-  118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45,  4,148,108,
-  161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,
-    0, 46,169,186, 68, 95,237, 65, 53,208,253,168,  9, 18,100, 52,
-  116,184,160, 96,109, 37, 30,106,140,104,150,  5,204,117,112, 84
-};
-
-UDWORD Key[4];
-
-
-void EncryptBlock(UBYTE *Buf)
-{
-  int I;
-
-  UDWORD A,B,C,D,T,TA,TB;
-#ifdef NON_INTEL_BYTE_ORDER
-  A=((UDWORD)Buf[0]|((UDWORD)Buf[1]<<8)|((UDWORD)Buf[2]<<16)|
-      ((UDWORD)Buf[3]<<24))^Key[0];
-  B=((UDWORD)Buf[4]|((UDWORD)Buf[5]<<8)|((UDWORD)Buf[6]<<16)|
-      ((UDWORD)Buf[7]<<24))^Key[1];
-  C=((UDWORD)Buf[8]|((UDWORD)Buf[9]<<8)|((UDWORD)Buf[10]<<16)|
-      ((UDWORD)Buf[11]<<24))^Key[2];
-  D=((UDWORD)Buf[12]|((UDWORD)Buf[13]<<8)|((UDWORD)Buf[14]<<16)|
-      ((UDWORD)Buf[15]<<24))^Key[3];
-#else
-  UDWORD *BufPtr;
-  BufPtr=(UDWORD *)Buf;
-  A=BufPtr[0]^Key[0];
-  B=BufPtr[1]^Key[1];
-  C=BufPtr[2]^Key[2];
-  D=BufPtr[3]^Key[3];
-#endif
-  for(I=0;I<NROUNDS;I++)
-  {
-    T=((C+rol(D,11))^Key[I&3]);
-    TA=A^substLong(T);
-    T=((D^rol(C,17))+Key[I&3]);
-    TB=B^substLong(T);
-    A=C;
-    B=D;
-    C=TA;
-    D=TB;
-  }
-#ifdef NON_INTEL_BYTE_ORDER
-  C^=Key[0];
-  Buf[0]=(UBYTE)C;
-  Buf[1]=(UBYTE)(C>>8);
-  Buf[2]=(UBYTE)(C>>16);
-  Buf[3]=(UBYTE)(C>>24);
-  D^=Key[1];
-  Buf[4]=(UBYTE)D;
-  Buf[5]=(UBYTE)(D>>8);
-  Buf[6]=(UBYTE)(D>>16);
-  Buf[7]=(UBYTE)(D>>24);
-  A^=Key[2];
-  Buf[8]=(UBYTE)A;
-  Buf[9]=(UBYTE)(A>>8);
-  Buf[10]=(UBYTE)(A>>16);
-  Buf[11]=(UBYTE)(A>>24);
-  B^=Key[3];
-  Buf[12]=(UBYTE)B;
-  Buf[13]=(UBYTE)(B>>8);
-  Buf[14]=(UBYTE)(B>>16);
-  Buf[15]=(UBYTE)(B>>24);
-#else
-  BufPtr[0]=C^Key[0];
-  BufPtr[1]=D^Key[1];
-  BufPtr[2]=A^Key[2];
-  BufPtr[3]=B^Key[3];
-#endif
-  UpdKeys(Buf);
-}
-
-
-void DecryptBlock(UBYTE *Buf)
-{
-  int I;
-  UBYTE InBuf[16];
-  UDWORD A,B,C,D,T,TA,TB;
-#ifdef NON_INTEL_BYTE_ORDER
-  A=((UDWORD)Buf[0]|((UDWORD)Buf[1]<<8)|((UDWORD)Buf[2]<<16)|
-      ((UDWORD)Buf[3]<<24))^Key[0];
-  B=((UDWORD)Buf[4]|((UDWORD)Buf[5]<<8)|((UDWORD)Buf[6]<<16)|
-      ((UDWORD)Buf[7]<<24))^Key[1];
-  C=((UDWORD)Buf[8]|((UDWORD)Buf[9]<<8)|((UDWORD)Buf[10]<<16)|
-      ((UDWORD)Buf[11]<<24))^Key[2];
-  D=((UDWORD)Buf[12]|((UDWORD)Buf[13]<<8)|((UDWORD)Buf[14]<<16)|
-      ((UDWORD)Buf[15]<<24))^Key[3];
-#else
-  UDWORD *BufPtr;
-  BufPtr=(UDWORD *)Buf;
-  A=BufPtr[0]^Key[0];                       /* xxx may be this can be       */
-  B=BufPtr[1]^Key[1];                       /* optimized in assembler       */
-  C=BufPtr[2]^Key[2];
-  D=BufPtr[3]^Key[3];
-#endif
-  memcpy(InBuf,Buf,sizeof(InBuf));
-  for(I=NROUNDS-1;I>=0;I--)
-  {
-    T=((C+rol(D,11))^Key[I&3]);
-    TA=A^substLong(T);
-    T=((D^rol(C,17))+Key[I&3]);
-    TB=B^substLong(T);
-    A=C;
-    B=D;
-    C=TA;
-    D=TB;
-  }
-#ifdef NON_INTEL_BYTE_ORDER
-  C^=Key[0];
-  Buf[0]=(UBYTE)C;
-  Buf[1]=(UBYTE)(C>>8);
-  Buf[2]=(UBYTE)(C>>16);
-  Buf[3]=(UBYTE)(C>>24);
-  D^=Key[1];
-  Buf[4]=(UBYTE)D;
-  Buf[5]=(UBYTE)(D>>8);
-  Buf[6]=(UBYTE)(D>>16);
-  Buf[7]=(UBYTE)(D>>24);
-  A^=Key[2];
-  Buf[8]=(UBYTE)A;
-  Buf[9]=(UBYTE)(A>>8);
-  Buf[10]=(UBYTE)(A>>16);
-  Buf[11]=(UBYTE)(A>>24);
-  B^=Key[3];
-  Buf[12]=(UBYTE)B;
-  Buf[13]=(UBYTE)(B>>8);
-  Buf[14]=(UBYTE)(B>>16);
-  Buf[15]=(UBYTE)(B>>24);
-#else
-  BufPtr[0]=C^Key[0];
-  BufPtr[1]=D^Key[1];
-  BufPtr[2]=A^Key[2];
-  BufPtr[3]=B^Key[3];
-#endif
-  UpdKeys(InBuf);
-}
-
-
-void UpdKeys(UBYTE *Buf)
-{
-  int I;
-  for (I=0;I<16;I+=4)
-  {
-    Key[0]^=CRCTab[Buf[I]];                 /* xxx may be I'll rewrite this */
-    Key[1]^=CRCTab[Buf[I+1]];               /* in asm for speedup           */
-    Key[2]^=CRCTab[Buf[I+2]];
-    Key[3]^=CRCTab[Buf[I+3]];
-  }
-}
-
-void SetCryptKeys(char *Password)
-{
-  unsigned int I,J,K,PswLength;
-  unsigned char N1,N2;
-  unsigned char Psw[256];
-
-#if !defined _USE_ASM
-  UBYTE Ch;
-#endif
-
-  SetOldKeys(Password);
-
-  Key[0]=0xD3A3B879L;
-  Key[1]=0x3F6D12F7L;
-  Key[2]=0x7515A235L;
-  Key[3]=0xA4E7F123L;
-  memset(Psw,0,sizeof(Psw));
-  strcpy((char *)Psw,Password);
-  PswLength=strlen(Password);
-  memcpy(SubstTable,InitSubstTable,sizeof(SubstTable));
-
-  for (J=0;J<256;J++)
-    for (I=0;I<PswLength;I+=2)
-    {
-      N2=(unsigned char)CRCTab[(Psw[I+1]+J)&0xFF];
-      for (K=1, N1=(unsigned char)CRCTab[(Psw[I]-J)&0xFF];
-           (N1!=N2) && (N1 < 256);      /* I had to add "&& (N1 < 256)",    */
-           N1++, K++)                   /* because the system crashed with  */
-          {                             /* encrypted RARs                   */
-#ifdef _USE_ASM
-
-#ifdef _WIN_32
-          __asm {
-
-                    mov ebx, Offset SubstTable
-                    mov edx, ebx
-
-                    xor ecx, ecx            // read SubstTable[N1]...
-                    mov cl, N1
-                    add ebx, ecx
-                    mov al, byte ptr[ebx]
-
-                    mov cl, N1              // read SubstTable[(N1+I+K)&0xFF]...
-                    add ecx, I
-                    add ecx, K
-                    and ecx, 0xFF
-                    add edx, ecx
-                    mov ah, byte ptr[edx]
-
-                    mov  byte ptr[ebx], ah  // and write back
-                    mov  byte ptr[edx], al
-
-               }
-#else
-                     __asm__ __volatile__ (
-"                    xorl %%ecx, %%ecx"
-"                    movl %2, %%ecx                     /* ecx = N1 */"
-"                    mov %%ebx, %%edx"
-"                    addl %%ecx, %%ebx"
-""
-"                    addl %0, %%ecx"
-"                    addl %1, %%ecx"
-"                    andl $0x000000FF, %%ecx"
-"                    addl %%ecx, %%edx"
-"                    "
-"                    movb (%%ebx), %%al"
-"                    movb (%%edx), %%ah"
-""
-"                    movb  %%ah, (%%ebx)     /* and write back */"
-"                    movb  %%al, (%%edx)"
-                    : : "g" ((long)I),
-                        "g" ((long)K),
-                        "g" ((long)N1),
-                        "ebx"((long)SubstTable)
-                    : "ecx", "edx"
-
-              );
-#endif
-
-#else
-            /* Swap(&SubstTable[N1],&SubstTable[(N1+I+K)&0xFF]);            */
-             Ch=SubstTable[N1];
-             SubstTable[N1]=SubstTable[(N1+I+K)&0xFF];
-             SubstTable[(N1+I+K)&0xFF]=Ch;
-#endif
-          }
-    }
-  for (I=0;I<PswLength;I+=16)
-    EncryptBlock(&Psw[I]);
-}
-
-
-void SetOldKeys(char *Password)
-{
-  UDWORD PswCRC;
-  UBYTE Ch;
-  PswCRC=CalcCRC32(0xFFFFFFFFL,(UBYTE*)Password,strlen(Password));
-  OldKey[0]=(UWORD)PswCRC;
-  OldKey[1]=(UWORD)(PswCRC>>16);
-  OldKey[2]=OldKey[3]=0;
-  PN1=PN2=PN3=0;
-  while ((Ch=*Password)!=0)
-  {
-    PN1+=Ch;
-    PN2^=Ch;
-    PN3+=Ch;
-    PN3=(UBYTE)rol(PN3,1);
-    OldKey[2]^=((UWORD)(Ch^CRCTab[Ch]));
-    OldKey[3]+=((UWORD)(Ch+(CRCTab[Ch]>>16)));
-    Password++;
-  }
-}
-
-void InitCRC(void)
-{
-  int I, J;
-  UDWORD C;
-  for (I=0;I<256;I++)
-  {
-    for (C=I,J=0;J<8;J++)
-      C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1);
-    CRCTab[I]=C;
-  }
-}
-
-
-UDWORD CalcCRC32(UDWORD StartCRC,UBYTE *Addr,UDWORD Size)
-{
-  unsigned int I;
-  for (I=0; I<Size; I++)
-    StartCRC = CRCTab[(UBYTE)StartCRC ^ Addr[I]] ^ (StartCRC >> 8);
-  return(StartCRC);
-}
-
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- *******              D E B U G    F U N C T I O N S                  *******
- *******                                                              *******
- *******                                                              *******
- *******                                                              *******
- ****************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-#ifdef _DEBUG_LOG
-
-
-/* -- global stuff -------------------------------------------------------- */
-char  log_file_name[256];                   /* file name for the log file   */
-DWORD debug_start_time;                     /* starttime of debug           */
-BOOL  debug_started = FALSE;                /* debug_log writes only if     */
-                                            /* this is TRUE                 */
-/* ------------------------------------------------------------------------ */
-
-
-/* -- global functions ---------------------------------------------------- */
-void debug_init_proc(char *file_name)
-/* Create/Rewrite a log file                                                */
-{
-  FILE *fp;
-  char date[] = __DATE__;
-  char time[] = __TIME__;
-
-  debug_start_time = GetTickCount();        /* get start time               */
-  strcpy(log_file_name, file_name);         /* save file name               */
-
-  if((fp = fopen(log_file_name, CREATETEXT)) != NULL)
-  {
-    debug_started = TRUE;                   /* enable debug                 */
-    fprintf(fp, "Debug log of UniquE's RARFileLib\n"\
-                "~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~\n");
-    fprintf(fp, "(executable compiled on %s at %s)\n\n", date, time);
-    fclose(fp);
-  }
-}
-
-
-void debug_log_proc(char *text, char *sourcefile, int sourceline)
-/* add a line to the log file                                               */
-{
-  FILE *fp;
-
-  if(debug_started == FALSE) return;        /* exit if not initialized      */
-
-  if((fp = fopen(log_file_name, APPENDTEXT)) != NULL) /* append to logfile  */
-
-  {
-    fprintf(fp, " %8u ms (line %u in %s):\n              - %s\n",
-            (unsigned int)(GetTickCount() - debug_start_time),
-            sourceline, sourcefile, text);
-    fclose(fp);
-  }
-}
-
-/* ------------------------------------------------------------------------ */
-#endif
-/* **************************************************************************
- ****************************************************************************
- ****************************************************************************
- ************************************************************************** */
-
-
-/* end of file urarlib.c */
--- a/unrarlib.h	Thu Dec 20 10:08:36 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-/* ***************************************************************************
- **
- **  This file is part of the UniquE RAR File Library.
- **
- **  Copyright (C) 2000-2002 by Christian Scheurer (www.ChristianScheurer.ch)
- **  UNIX port copyright (c) 2000-2002 by Johannes Winkelmann (jw@tks6.net)
- **
- ** Modified for use with MPlayer, detailed changelog at
- ** http://svn.mplayerhq.hu/mplayer/trunk/
- ** $Id$
- **
- **  The contents of this file are subject to the UniquE RAR File Library
- **  License (the "unrarlib-license.txt"). You may not use this file except
- **  in compliance with the License. You may obtain a copy of the License
- **  at http://www.unrarlib.org/license.html.
- **  Software distributed under the License is distributed on an "AS IS"
- **  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied warranty.
- **
- **  Alternatively, the contents of this file may be used under the terms
- **  of the GNU General Public License Version 2 or later (the "GPL"), in
- **  which case the provisions of the GPL are applicable instead of those
- **  above. If you wish to allow use of your version of this file only
- **  under the terms of the GPL and not to allow others to use your version
- **  of this file under the terms of the UniquE RAR File Library License,
- **  indicate your decision by deleting the provisions above and replace
- **  them with the notice and other provisions required by the GPL. If you
- **  do not delete the provisions above, a recipient may use your version
- **  of this file under the terms of the GPL or the UniquE RAR File Library
- **  License.
- **
- ************************************************************************** */
-
-/* include file for the "UniquE RAR File Library"  */
-/* (C) 2000-2002 by Christian Scheurer aka. UniquE */
-/* multi-OS version (Win32, Linux and SUN)         */
-
-#ifndef URARLIB_H
-#define URARLIB_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
-/* ************************************************************************ */
-/* ************************************************************************ */
-/* **                                                                    ** */
-/* **   CONFIGURATION of the UniquE RAR FileLib                          ** */
-/* **   ==> you may change the setting for the lib HERE!                 ** */
-/* **                                                                    ** */
-/* ************************************************************************ */
-/* ************************************************************************ */
-
-
-/*#define _DEBUG_LOG*/                         /* generate debug messages      */
-
-#define _DO_CRC32_CHECK                     /* perform cyclical redundancy  */
-                                            /* check (CRC32) - disable this */
-                                            /* for a little speed-up        */
-/*#define _USE_ASM*/                            /*
-                                             * enable assembly extensions
-                                             * x86 cpus.
-                                             */
-
-/*#define _USE_MEMORY_TO_MEMORY_DECOMPRESSION*/ /* read file from memory or a   */
-                                            /* resource instead of reading  */
-                                            /* from a file. NOTE: you won't */
-                                            /*  be able to decompress from  */
-                                            /*  file if you enable this     */
-                                            /*  option!                     */
-
-
-#ifdef WIN32                                /* autodetect Win32 and Linux   */
-#define _WIN_32                             /* Win32 with VisualC           */
-#define _DEBUG_LOG_FILE "C:\\temp\\debug_unrar.txt" /* log file path        */
-#else
-#define _UNIX                               /* Linux or Unix with GCC       */
-#define _DEBUG_LOG_FILE "/tmp/debug_unrar.txt" /* log file path             */
-/*#define NON_INTEL_BYTE_ORDER*/               /* GCC on motorola systems    */
-
-#endif
-
-/* ------------------------------------------------------------------------ */
-
-
-
-/* -- global type definitions --------------------------------------------- */
-
-#ifdef NON_INTEL_BYTE_ORDER
-#ifdef _USE_ASM
-#warning Disabling assembly because NON_INTEL_BYTE_ORDER is set
-#undef _USE_ASM
-#endif
-#endif
-
-#ifdef _WIN_32
-typedef unsigned char    UBYTE;             /* WIN32 definitions            */
-typedef unsigned short   UWORD;
-typedef unsigned long    UDWORD;
-#endif
-
-#ifdef _UNIX                                /* LINUX/UNIX definitions       */
-typedef unsigned char    UBYTE;
-typedef unsigned short   UWORD;
-typedef unsigned long    UDWORD;
-#endif
-
-
-/* This structure is used for listing archive content                       */
-struct RAR20_archive_entry                  /* These infos about files are  */
-{                                           /* stored in RAR v2.0 archives  */
-  char   *Name;
-  UWORD  NameSize;
-  UDWORD PackSize;
-  UDWORD UnpSize;
-  UBYTE  HostOS;                            /* MSDOS=0,OS2=1,WIN32=2,UNIX=3 */
-  UDWORD FileCRC;
-  UDWORD FileTime;
-  UBYTE  UnpVer;
-  UBYTE  Method;
-  UDWORD FileAttr;
-};
-
-typedef struct  archivelist                 /* used to list archives        */
-{
-  struct RAR20_archive_entry item;
-  struct archivelist         *next;
-} ArchiveList_struct;
-
-
-#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION
-typedef struct  memory_file                 /* used to decompress files in  */
-{                                           /* memory                       */
-  void                       *data;         /* pointer to the file data     */
-  unsigned long              size;          /* total size of the file data  */
-  unsigned long              offset;        /* offset within "memory-file"  */
-} MemoryFile;
-#endif
-
-/* -- global functions ---------------------------------------------------- */
-
-/* urarlib_get:
- * decompresses and decrypt data from a RAR file to a buffer in system memory.
- *
- *   input: *output         pointer to an empty char*. This pointer will show
- *                          to the extracted data
- *          *size           shows where to write the size of the decompressed
- *                          file
- *                          (**NOTE: URARLib _does_ memory allocation etc.!**)
- *          *filename       pointer to string containing the file to decompress
- *          *rarfile        pointer to a string with the full name and path of
- *                          the RAR file or pointer to a RAR file in memory if
- *                          memory-to-memory decompression is active.
- *          *libpassword    pointer to a string with the password used to
- *                          en-/decrypt the RAR
- *   output: int            returns TRUE on success or FALSE on error
- *                          (FALSE=0, TRUE=1)
- */
-
-extern int urarlib_get(void  *output,
-                       unsigned long *size,
-                       char *filename,
-                       void *rarfile,
-                       char *libpassword);
-
-
-
-/* urarlib_list:
- * list the content of a RAR archive.
- *
- *   input: *rarfile        pointer to a string with the full name and path of
- *                          the RAR file or pointer to a RAR file in memory if
- *                          memory-to-memory decompression is active.
- *          *list           pointer to an ArchiveList_struct that can be
- *                          filled with details about the archive
- *                          to the extracted data
- *   output: int            number of files/directories within archive
- */
-
-extern int urarlib_list(void *rarfile, ArchiveList_struct *list);
-
-
-/* urarlib_freelist:
- * (after the suggestion and code of Duy Nguyen, Sean O'Blarney
- * and Johannes Winkelmann who independently wrote a patch)
- * free the memory of a ArchiveList_struct created by urarlib_list.
- *
- *    input: *list          pointer to an ArchiveList_struct
- *    output: -
- */
-
-extern void urarlib_freelist(ArchiveList_struct *list);
-
-/* ------------------------------------------------------------------------ */
-
-
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* URARLIB_H */
-
--- a/vobsub.c	Thu Dec 20 10:08:36 2007 +0000
+++ b/vobsub.c	Thu Dec 20 10:10:26 2007 +0000
@@ -22,8 +22,6 @@
 #include "mp_msg.h"
 #ifdef USE_UNRAR_EXEC
 #include "unrar_exec.h"
-#elif defined(USE_UNRARLIB)
-#include "unrarlib.h"
 #endif
 #include "libavutil/common.h"
 
@@ -35,9 +33,8 @@
 /**********************************************************************
  * RAR stream handling
  * The RAR file must have the same basename as the file to open
- * See <URL:http://www.unrarlib.org/>
  **********************************************************************/
-#if defined(USE_UNRARLIB) || defined(USE_UNRAR_EXEC)
+#ifdef USE_UNRAR_EXEC
 typedef struct {
     FILE *file;
     unsigned char *data;
@@ -90,27 +87,15 @@
 	} else {
 		p++;
 	}
-#ifdef USE_UNRAR_EXEC
 	rc = unrar_exec_get(&stream->data, &stream->size, p, rar_filename);
-#endif
-#ifdef USE_UNRARLIB
-	if (!rc)
-	rc = urarlib_get(&stream->data, &stream->size, (char*) p, rar_filename, "");
-#endif
 	if (!rc) {
 	    /* There is no matching filename in the archive. However, sometimes
 	     * the files we are looking for have been given arbitrary names in the archive.
 	     * Let's look for a file with an exact match in the extension only. */
 	    int i, num_files = -1, name_len;
 	    ArchiveList_struct *list, *lp;
-#ifdef USE_UNRARLIB
-	    /* the cast in the next line is a hack to overcome a design flaw (IMHO) in unrarlib */
-	    num_files = urarlib_list (rar_filename, (ArchiveList_struct *)&list);
-#endif
-#ifdef USE_UNRAR_EXEC
 	    if (num_files <= 0)
 	    num_files = unrar_exec_list(rar_filename, &list);
-#endif
 	    if (num_files > 0) {
 		char *demanded_ext;
 		demanded_ext = strrchr (p, '.');
@@ -119,24 +104,13 @@
 	    	    for (i=0, lp=list; i<num_files; i++, lp=lp->next) {
 			name_len = strlen (lp->item.Name);
 			if (name_len >= demanded_ext_len && !strcasecmp (lp->item.Name + name_len - demanded_ext_len, demanded_ext)) {
-#ifdef USE_UNRAR_EXEC
 	                    rc = unrar_exec_get(&stream->data, &stream->size,
                                                 lp->item.Name, rar_filename);
 		            if (rc) break;
-#endif
-#ifdef USE_UNRARLIB
-		            rc = urarlib_get(&stream->data, &stream->size,
-                                             lp->item.Name, rar_filename, "");
-		            if (rc) break;
-#endif
 			}
 		    }
 		}
-#ifdef USE_UNRARLIB
-	    	urarlib_freelist (list);
-#else
 	    	unrar_exec_freelist(list);
-#endif
 	    }
 	    if (!rc) {
 		free(rar_filename);