[ros-diffs] [cwittich] 41336: sync kernel32 lzexpand to wine 1.1.23

cwittich at svn.reactos.org cwittich at svn.reactos.org
Sun Jun 7 16:10:14 CEST 2009


Author: cwittich
Date: Sun Jun  7 18:10:13 2009
New Revision: 41336

URL: http://svn.reactos.org/svn/reactos?rev=41336&view=rev
Log:
sync kernel32 lzexpand to wine 1.1.23

Added:
    trunk/reactos/dll/win32/kernel32/misc/lzexpand.c
      - copied, changed from r41335, trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c
Removed:
    trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c
Modified:
    trunk/reactos/dll/win32/kernel32/kernel32.rbuild
    trunk/reactos/media/doc/README.WINE

Modified: trunk/reactos/dll/win32/kernel32/kernel32.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/kernel32.rbuild?rev=41336&r1=41335&r2=41336&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/kernel32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/kernel32.rbuild [iso-8859-1] Sun Jun  7 18:10:13 2009
@@ -75,7 +75,7 @@
 			<file>handle.c</file>
 			<file>lang.c</file>
 			<file>ldr.c</file>
-			<file>lzexpand_main.c</file>
+			<file>lzexpand.c</file>
 			<file>muldiv.c</file>
 			<file>nls.c</file>
 			<file>perfcnt.c</file>

Copied: trunk/reactos/dll/win32/kernel32/misc/lzexpand.c (from r41335, trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c)
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/lzexpand.c?p2=trunk/reactos/dll/win32/kernel32/misc/lzexpand.c&p1=trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c&r1=41335&r2=41336&rev=41336&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lzexpand.c [iso-8859-1] Sun Jun  7 18:10:13 2009
@@ -1,5 +1,5 @@
 /* $Id$
- *
+ * 
  * LZ Decompression functions
  *
  * Copyright 1996 Marcus Meissner
@@ -16,10 +16,22 @@
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-/*
- * FIXME: return values might be wrong
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * NOTES
+ *
+ * The LZ (Lempel Ziv) decompression was used in win16 installation programs.
+ * It is a simple tabledriven decompression engine, the algorithm is not
+ * documented as far as I know. WINE does not contain a compressor for
+ * this format.
+ *
+ * The implementation is complete and there have been no reports of failures
+ * for some time.
+ *
+ * TODO:
+ *
+ *   o Check whether the return values are correct
+ *
  */
 
 //#include "config.h"
@@ -36,14 +48,19 @@
  */
 #define	GETLEN	2048
 
+#define LZ_MAGIC_LEN    8
+#define LZ_HEADER_LEN   14
+
 /* Format of first 14 byte of LZ compressed file */
 struct lzfileheader {
-	BYTE	magic[8];
+	BYTE	magic[LZ_MAGIC_LEN];
 	BYTE	compressiontype;
 	CHAR	lastchar;
 	DWORD	reallength;
 };
-static BYTE LZMagic[8]={'S','Z','D','D',0x88,0xf0,0x27,0x33};
+static const BYTE LZMagic[LZ_MAGIC_LEN]={'S','Z','D','D',0x88,0xf0,0x27,0x33};
+
+#define LZ_TABLE_SIZE    0x1000
 
 struct lzstate {
 	HFILE	realfd;		/* the real filedescriptor */
@@ -53,7 +70,7 @@
 	DWORD	realcurrent;	/* the position the decompressor currently is */
 	DWORD	realwanted;	/* the position the user wants to read from */
 
-	BYTE	table[0x1000];	/* the rotating LZ table */
+	BYTE	table[LZ_TABLE_SIZE];	/* the rotating LZ table */
 	UINT	curtabent;	/* CURrent TABle ENTry */
 
 	BYTE	stringlen;	/* length and position of current string */
@@ -70,8 +87,9 @@
 #define MAX_LZSTATES 16
 static struct lzstate *lzstates[MAX_LZSTATES];
 
-#define IS_LZ_HANDLE(h) (((h) >= 0x400) && ((h) < 0x400+MAX_LZSTATES))
-#define GET_LZ_STATE(h) (IS_LZ_HANDLE(h) ? lzstates[(h)-0x400] : NULL)
+#define LZ_MIN_HANDLE  0x400
+#define IS_LZ_HANDLE(h) (((h) >= LZ_MIN_HANDLE) && ((h) < LZ_MIN_HANDLE+MAX_LZSTATES))
+#define GET_LZ_STATE(h) (IS_LZ_HANDLE(h) ? lzstates[(h)-LZ_MIN_HANDLE] : NULL)
 
 /* reads one compressed byte, including buffering */
 #define GET(lzs,b)	_lzget(lzs,&b)
@@ -102,7 +120,7 @@
  */
 static INT read_header(HFILE fd,struct lzfileheader *head)
 {
-	BYTE	buf[14];
+	BYTE	buf[LZ_HEADER_LEN];
 
 	if (_llseek(fd,0,SEEK_SET)==-1)
 		return LZERROR_BADINHANDLE;
@@ -110,16 +128,16 @@
 	/* We can't directly read the lzfileheader struct due to
 	 * structure element alignment
 	 */
-	if (_hread(fd,buf,14)<14)
+	if (_hread(fd,buf,LZ_HEADER_LEN)<LZ_HEADER_LEN)
 		return 0;
-	memcpy(head->magic,buf,8);
-	memcpy(&(head->compressiontype),buf+8,1);
-	memcpy(&(head->lastchar),buf+9,1);
+	memcpy(head->magic,buf,LZ_MAGIC_LEN);
+	memcpy(&(head->compressiontype),buf+LZ_MAGIC_LEN,1);
+	memcpy(&(head->lastchar),buf+LZ_MAGIC_LEN+1,1);
 
 	/* FIXME: consider endianess on non-intel architectures */
-	memcpy(&(head->reallength),buf+10,4);
-
-	if (memcmp(head->magic,LZMagic,8))
+	memcpy(&(head->reallength),buf+LZ_MAGIC_LEN+2,4);
+
+	if (memcmp(head->magic,LZMagic,LZ_MAGIC_LEN))
 		return 0;
 	if (head->compressiontype!='A')
 		return LZERROR_UNKNOWNALG;
@@ -128,9 +146,7 @@
 
 
 /***********************************************************************
- *           LZStart   (LZ32.@)
- *
- * @unimplemented
+ *           LZStart   (KERNEL32.@)
  */
 INT WINAPI LZStart(void)
 {
@@ -140,7 +156,7 @@
 
 
 /***********************************************************************
- *           LZInit   (LZ32.@)
+ *           LZInit   (KERNEL32.@)
  *
  * initializes internal decompression buffers, returns lzfiledescriptor.
  * (return value the same as hfSrc, if hfSrc is not compressed)
@@ -149,22 +165,19 @@
  *
  * since _llseek uses the same types as libc.lseek, we just use the macros of
  *  libc
- *
- * @implemented
  */
 HFILE WINAPI LZInit( HFILE hfSrc )
 {
 
 	struct	lzfileheader	head;
 	struct	lzstate		*lzs;
-	DWORD	ret;
-        int i;
+    int	i, ret;
 
 	DPRINT("(%d)\n",hfSrc);
 	ret=read_header(hfSrc,&head);
 	if (ret<=0) {
 		_llseek(hfSrc,0,SEEK_SET);
-		return ret?(HFILE)ret:hfSrc;
+		return ret?ret:hfSrc;
 	}
         for (i = 0; i < MAX_LZSTATES; i++) if (!lzstates[i]) break;
         if (i == MAX_LZSTATES) return LZERROR_GLOBALLOC;
@@ -186,18 +199,15 @@
 	}
 
 	/* Yes, preinitialize with spaces */
-	memset(lzs->table,' ',0x1000);
+	memset(lzs->table,' ',LZ_TABLE_SIZE);
 	/* Yes, start 16 byte from the END of the table */
 	lzs->curtabent	= 0xff0;
-	return 0x400 + i;
-}
-
-
-/***********************************************************************
- *           LZDone   (LZEXPAND.9)
- *           LZDone   (LZ32.@)
- *
- * @unimplemented
+	return LZ_MIN_HANDLE + i;
+}
+
+
+/***********************************************************************
+ *           LZDone   (KERNEL32.@)
  */
 void WINAPI LZDone(void)
 {
@@ -206,7 +216,7 @@
 
 
 /***********************************************************************
- *           GetExpandedNameA   (LZ32.@)
+ *           GetExpandedNameA   (KERNEL32.@)
  *
  * gets the full filename of the compressed file 'in' by opening it
  * and reading the header
@@ -214,8 +224,6 @@
  * "file." is being translated to "file"
  * "file.bl_" (with lastchar 'a') is being translated to "file.bla"
  * "FILE.BL_" (with lastchar 'a') is being translated to "FILE.BLA"
- *
- * @implemented
  */
 
 INT WINAPI GetExpandedNameA( LPSTR in, LPSTR out )
@@ -265,9 +273,9 @@
 	}
 	if (isalpha(head.lastchar)) {
 		if (fnislowercased)
-			head.lastchar=(CHAR)tolower(head.lastchar);
+			head.lastchar=tolower(head.lastchar);
 		else
-			head.lastchar=(CHAR)toupper(head.lastchar);
+			head.lastchar=toupper(head.lastchar);
 	}
 
 	/* now look where to replace the last character */
@@ -286,9 +294,7 @@
 
 
 /***********************************************************************
- *           GetExpandedNameW   (LZ32.@)
- *
- * @implemented
+ *           GetExpandedNameW   (KERNEL32.@)
  */
 INT WINAPI GetExpandedNameW( LPWSTR in, LPWSTR out )
 {
@@ -315,9 +321,7 @@
 
 
 /***********************************************************************
- *           LZRead   (LZ32.@)
- *
- * @implemented
+ *           LZRead   (KERNEL32.@)
  */
 INT WINAPI LZRead( HFILE fd, LPSTR vbuf, INT toread )
 {
@@ -383,12 +387,12 @@
 		 */
 		if (lzs->realcurrent>lzs->realwanted) {
 			/* flush decompressor state */
-			_llseek(lzs->realfd,14,SEEK_SET);
+			_llseek(lzs->realfd,LZ_HEADER_LEN,SEEK_SET);
 			GET_FLUSH(lzs);
 			lzs->realcurrent= 0;
 			lzs->bytetype	= 0;
 			lzs->stringlen	= 0;
-			memset(lzs->table,' ',0x1000);
+			memset(lzs->table,' ',LZ_TABLE_SIZE);
 			lzs->curtabent	= 0xFF0;
 		}
 		while (lzs->realcurrent<lzs->realwanted) {
@@ -408,9 +412,7 @@
 
 
 /***********************************************************************
- *           LZSeek   (LZ32.@)
- *
- * @implemented
+ *           LZSeek   (KERNEL32.@)
  */
 LONG WINAPI LZSeek( HFILE fd, LONG off, INT type )
 {
@@ -432,7 +434,7 @@
 		newwanted	= off;
 		break;
 	}
-	if (newwanted>(LONG)lzs->reallength)
+	if (newwanted>lzs->reallength)
 		return LZERROR_BADVALUE;
 	if (newwanted<0)
 		return LZERROR_BADVALUE;
@@ -442,22 +444,19 @@
 
 
 /***********************************************************************
- *           LZCopy   (LZ32.@)
+ *           LZCopy   (KERNEL32.@)
  *
  * Copies everything from src to dest
  * if src is a LZ compressed file, it will be uncompressed.
  * will return the number of bytes written to dest or errors.
- *
- * @implemented
  */
 LONG WINAPI LZCopy( HFILE src, HFILE dest )
 {
-	int	usedlzinit=0,ret,wret;
+	int	usedlzinit = 0, ret, wret;
 	LONG	len;
  	HFILE	oldsrc = src, srcfd;
  	FILETIME filetime;
  	struct	lzstate	*lzs;
-
 #define BUFLEN	1000
 	CHAR	buf[BUFLEN];
 	/* we need that weird typedef, for i can't seem to get function pointer
@@ -476,7 +475,7 @@
 
 	/* not compressed? just copy */
         if (!IS_LZ_HANDLE(src))
-		xread=(_readfun)_hread;
+		xread=_lread;
 	else
 		xread=(_readfun)LZRead;
 	len=0;
@@ -497,8 +496,8 @@
 
  	/* Maintain the timestamp of source file to destination file */
  	srcfd = (!(lzs = GET_LZ_STATE(src))) ? src : lzs->realfd;
- 	GetFileTime((HANDLE)srcfd, NULL, NULL, &filetime);
- 	SetFileTime((HANDLE)dest, NULL, NULL, &filetime);
+ 	GetFileTime( LongToHandle(srcfd), NULL, NULL, &filetime );
+ 	SetFileTime( LongToHandle(dest), NULL, NULL, &filetime );
 
  	/* close handle */
 	if (usedlzinit)
@@ -511,8 +510,7 @@
 static LPSTR LZEXPAND_MangleName( LPCSTR fn )
 {
     char *p;
-    char *mfn = (char *)RtlAllocateHeap( GetProcessHeap(), 0,
-                                   strlen(fn) + 3 ); /* "._" and \0 */
+    char *mfn = RtlAllocateHeap( GetProcessHeap(), 0, strlen(fn) + 3 ); /* "._" and \0 */
     if(mfn == NULL) return NULL;
     strcpy( mfn, fn );
     if (!(p = strrchr( mfn, '\\' ))) p = mfn;
@@ -526,12 +524,11 @@
     return mfn;
 }
 
-/***********************************************************************
- *           LZOpenFileA   (LZ32.@)
+
+/***********************************************************************
+ *           LZOpenFileA   (KERNEL32.@)
  *
  * Opens a file. If not compressed, open it as a normal file.
- *
- * @implemented
  */
 HFILE WINAPI LZOpenFileA( LPSTR fn, LPOFSTRUCT ofs, WORD mode )
 {
@@ -557,9 +554,7 @@
 
 
 /***********************************************************************
- *           LZOpenFileW   (LZ32.@)
- *
- * @implemented
+ *           LZOpenFileW   (KERNEL32.@)
  */
 HFILE WINAPI LZOpenFileW( LPWSTR fn, LPOFSTRUCT ofs, WORD mode )
 {
@@ -574,9 +569,7 @@
 
 
 /***********************************************************************
- *           LZClose   (LZ32.@)
- *
- * @implemented
+ *           LZClose   (KERNEL32.@)
  */
 void WINAPI LZClose( HFILE fd )
 {
@@ -587,23 +580,9 @@
         else
         {
             if (lzs->get) RtlFreeHeap( GetProcessHeap(), 0, lzs->get );
-            CloseHandle((HANDLE)lzs->realfd);
-            lzstates[fd - 0x400] = NULL;
+            CloseHandle( LongToHandle(lzs->realfd) );
+            lzstates[fd - LZ_MIN_HANDLE] = NULL;
             RtlFreeHeap( GetProcessHeap(), 0, lzs );
         }
 }
 
-
-/***********************************************************************
- *           CopyLZFile  (LZ32.@)
- *
- * Copy src to dest (including uncompressing src).
- * NOTE: Yes. This is exactly the same function as LZCopy.
- *
- * @implemented
- */
-LONG WINAPI CopyLZFile( HFILE src, HFILE dest )
-{
-    DPRINT("(%d,%d)\n",src,dest);
-    return LZCopy(src,dest);
-}

Removed: trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c?rev=41335&view=auto
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lzexpand_main.c (removed)
@@ -1,609 +1,0 @@
-/* $Id$
- *
- * LZ Decompression functions
- *
- * Copyright 1996 Marcus Meissner
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-/*
- * FIXME: return values might be wrong
- */
-
-//#include "config.h"
-
-#include <k32.h>
-#define NDEBUG
-#include <debug.h>
-#include "lzexpand.h"
-
-#define HFILE_ERROR ((HFILE)-1)
-
-/* The readahead length of the decompressor. Reading single bytes
- * using _hread() would be SLOW.
- */
-#define	GETLEN	2048
-
-/* Format of first 14 byte of LZ compressed file */
-struct lzfileheader {
-	BYTE	magic[8];
-	BYTE	compressiontype;
-	CHAR	lastchar;
-	DWORD	reallength;
-};
-static BYTE LZMagic[8]={'S','Z','D','D',0x88,0xf0,0x27,0x33};
-
-struct lzstate {
-	HFILE	realfd;		/* the real filedescriptor */
-	CHAR	lastchar;	/* the last char of the filename */
-
-	DWORD	reallength;	/* the decompressed length of the file */
-	DWORD	realcurrent;	/* the position the decompressor currently is */
-	DWORD	realwanted;	/* the position the user wants to read from */
-
-	BYTE	table[0x1000];	/* the rotating LZ table */
-	UINT	curtabent;	/* CURrent TABle ENTry */
-
-	BYTE	stringlen;	/* length and position of current string */
-	DWORD	stringpos;	/* from stringtable */
-
-
-	WORD	bytetype;	/* bitmask within blocks */
-
-	BYTE	*get;		/* GETLEN bytes */
-	DWORD	getcur;		/* current read */
-	DWORD	getlen;		/* length last got */
-};
-
-#define MAX_LZSTATES 16
-static struct lzstate *lzstates[MAX_LZSTATES];
-
-#define IS_LZ_HANDLE(h) (((h) >= 0x400) && ((h) < 0x400+MAX_LZSTATES))
-#define GET_LZ_STATE(h) (IS_LZ_HANDLE(h) ? lzstates[(h)-0x400] : NULL)
-
-/* reads one compressed byte, including buffering */
-#define GET(lzs,b)	_lzget(lzs,&b)
-#define GET_FLUSH(lzs)	lzs->getcur=lzs->getlen;
-
-static int
-_lzget(struct lzstate *lzs,BYTE *b) {
-	if (lzs->getcur<lzs->getlen) {
-		*b		= lzs->get[lzs->getcur++];
-		return		1;
-	} else {
-		int ret = _hread(lzs->realfd,lzs->get,GETLEN);
-		if (ret==HFILE_ERROR)
-			return HFILE_ERROR;
-		if (ret==0)
-			return 0;
-		lzs->getlen	= ret;
-		lzs->getcur	= 1;
-		*b		= *(lzs->get);
-		return 1;
-	}
-}
-/* internal function, reads lzheader
- * returns BADINHANDLE for non filedescriptors
- * return 0 for file not compressed using LZ
- * return UNKNOWNALG for unknown algorithm
- * returns lzfileheader in *head
- */
-static INT read_header(HFILE fd,struct lzfileheader *head)
-{
-	BYTE	buf[14];
-
-	if (_llseek(fd,0,SEEK_SET)==-1)
-		return LZERROR_BADINHANDLE;
-
-	/* We can't directly read the lzfileheader struct due to
-	 * structure element alignment
-	 */
-	if (_hread(fd,buf,14)<14)
-		return 0;
-	memcpy(head->magic,buf,8);
-	memcpy(&(head->compressiontype),buf+8,1);
-	memcpy(&(head->lastchar),buf+9,1);
-
-	/* FIXME: consider endianess on non-intel architectures */
-	memcpy(&(head->reallength),buf+10,4);
-
-	if (memcmp(head->magic,LZMagic,8))
-		return 0;
-	if (head->compressiontype!='A')
-		return LZERROR_UNKNOWNALG;
-	return 1;
-}
-
-
-/***********************************************************************
- *           LZStart   (LZ32.@)
- *
- * @unimplemented
- */
-INT WINAPI LZStart(void)
-{
-    DPRINT("(void)\n");
-    return 1;
-}
-
-
-/***********************************************************************
- *           LZInit   (LZ32.@)
- *
- * initializes internal decompression buffers, returns lzfiledescriptor.
- * (return value the same as hfSrc, if hfSrc is not compressed)
- * on failure, returns error code <0
- * lzfiledescriptors range from 0x400 to 0x410 (only 16 open files per process)
- *
- * since _llseek uses the same types as libc.lseek, we just use the macros of
- *  libc
- *
- * @implemented
- */
-HFILE WINAPI LZInit( HFILE hfSrc )
-{
-
-	struct	lzfileheader	head;
-	struct	lzstate		*lzs;
-	DWORD	ret;
-        int i;
-
-	DPRINT("(%d)\n",hfSrc);
-	ret=read_header(hfSrc,&head);
-	if (ret<=0) {
-		_llseek(hfSrc,0,SEEK_SET);
-		return ret?(HFILE)ret:hfSrc;
-	}
-        for (i = 0; i < MAX_LZSTATES; i++) if (!lzstates[i]) break;
-        if (i == MAX_LZSTATES) return LZERROR_GLOBALLOC;
-	lzstates[i] = lzs = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct lzstate) );
-	if(lzs == NULL) return LZERROR_GLOBALLOC;
-
-	lzs->realfd	= hfSrc;
-	lzs->lastchar	= head.lastchar;
-	lzs->reallength = head.reallength;
-
-	lzs->get	= RtlAllocateHeap( GetProcessHeap(), 0, GETLEN );
-	lzs->getlen	= 0;
-	lzs->getcur	= 0;
-
-	if(lzs->get == NULL) {
-		RtlFreeHeap(GetProcessHeap(), 0, lzs);
-		lzstates[i] = NULL;
-		return LZERROR_GLOBALLOC;
-	}
-
-	/* Yes, preinitialize with spaces */
-	memset(lzs->table,' ',0x1000);
-	/* Yes, start 16 byte from the END of the table */
-	lzs->curtabent	= 0xff0;
-	return 0x400 + i;
-}
-
-
-/***********************************************************************
- *           LZDone   (LZEXPAND.9)
- *           LZDone   (LZ32.@)
- *
- * @unimplemented
- */
-void WINAPI LZDone(void)
-{
-    DPRINT("(void)\n");
-}
-
-
-/***********************************************************************
- *           GetExpandedNameA   (LZ32.@)
- *
- * gets the full filename of the compressed file 'in' by opening it
- * and reading the header
- *
- * "file." is being translated to "file"
- * "file.bl_" (with lastchar 'a') is being translated to "file.bla"
- * "FILE.BL_" (with lastchar 'a') is being translated to "FILE.BLA"
- *
- * @implemented
- */
-
-INT WINAPI GetExpandedNameA( LPSTR in, LPSTR out )
-{
-	struct lzfileheader	head;
-	HFILE		fd;
-	OFSTRUCT	ofs;
-	INT		fnislowercased,ret,len;
-	LPSTR		s,t;
-
-	DPRINT("(%s)\n",in);
-	fd=OpenFile(in,&ofs,OF_READ);
-	if (fd==HFILE_ERROR)
-		return (INT)(INT16)LZERROR_BADINHANDLE;
-	strcpy(out,in);
-	ret=read_header(fd,&head);
-	if (ret<=0) {
-		/* not a LZ compressed file, so the expanded name is the same
-		 * as the input name */
-		_lclose(fd);
-		return 1;
-	}
-
-
-	/* look for directory prefix and skip it. */
-	s=out;
-	while (NULL!=(t=strpbrk(s,"/\\:")))
-		s=t+1;
-
-	/* now mangle the basename */
-	if (!*s) {
-		/* FIXME: hmm. shouldn't happen? */
-		DPRINT("Specified a directory or what? (%s)\n",in);
-		_lclose(fd);
-		return 1;
-	}
-	/* see if we should use lowercase or uppercase on the last char */
-	fnislowercased=1;
-	t=s+strlen(s)-1;
-	while (t>=out) {
-		if (!isalpha(*t)) {
-			t--;
-			continue;
-		}
-		fnislowercased=islower(*t);
-		break;
-	}
-	if (isalpha(head.lastchar)) {
-		if (fnislowercased)
-			head.lastchar=(CHAR)tolower(head.lastchar);
-		else
-			head.lastchar=(CHAR)toupper(head.lastchar);
-	}
-
-	/* now look where to replace the last character */
-	if (NULL!=(t=strchr(s,'.'))) {
-		if (t[1]=='\0') {
-			t[0]='\0';
-		} else {
-			len=strlen(t)-1;
-			if (t[len]=='_')
-				t[len]=head.lastchar;
-		}
-	} /* else no modification necessary */
-	_lclose(fd);
-	return 1;
-}
-
-
-/***********************************************************************
- *           GetExpandedNameW   (LZ32.@)
- *
- * @implemented
- */
-INT WINAPI GetExpandedNameW( LPWSTR in, LPWSTR out )
-{
-    INT ret;
-    DWORD len;
-    char *xin, *xout;
-    len = WideCharToMultiByte( CP_ACP, 0, in, -1, NULL, 0, NULL, NULL );
-    xin = RtlAllocateHeap( RtlGetProcessHeap(), 0, len );
-    if (xin == NULL)
-        return LZERROR_BADVALUE;
-    xout = RtlAllocateHeap( RtlGetProcessHeap(), 0, len+3 );
-    if (xout == NULL)
-    {
-        RtlFreeHeap( RtlGetProcessHeap(), 0, xin );
-        return LZERROR_BADVALUE;
-    }
-    WideCharToMultiByte( CP_ACP, 0, in, -1, xin, len, NULL, NULL );
-    if ((ret = GetExpandedNameA( xin, xout )) > 0)
-        MultiByteToWideChar( CP_ACP, 0, xout, -1, out, wcslen(in)+4 );
-    RtlFreeHeap( RtlGetProcessHeap(), 0, xin );
-    RtlFreeHeap( RtlGetProcessHeap(), 0, xout );
-    return ret;
-}
-
-
-/***********************************************************************
- *           LZRead   (LZ32.@)
- *
- * @implemented
- */
-INT WINAPI LZRead( HFILE fd, LPSTR vbuf, INT toread )
-{
-	int	howmuch;
-	BYTE	b,*buf;
-	struct	lzstate	*lzs;
-
-	buf=(LPBYTE)vbuf;
-	DPRINT("(%d,%p,%d)\n",fd,buf,toread);
-	howmuch=toread;
-	if (!(lzs = GET_LZ_STATE(fd))) return _hread(fd,buf,toread);
-
-/* The decompressor itself is in a define, cause we need it twice
- * in this function. (the decompressed byte will be in b)
- */
-#define DECOMPRESS_ONE_BYTE 						\
-		if (lzs->stringlen) {					\
-			b		= lzs->table[lzs->stringpos];	\
-			lzs->stringpos	= (lzs->stringpos+1)&0xFFF;	\
-			lzs->stringlen--;				\
-		} else {						\
-			if (!(lzs->bytetype&0x100)) {			\
-				if (1!=GET(lzs,b)) 			\
-					return toread-howmuch;		\
-				lzs->bytetype = b|0xFF00;		\
-			}						\
-			if (lzs->bytetype & 1) {			\
-				if (1!=GET(lzs,b))			\
-					return toread-howmuch;		\
-			} else {					\
-				BYTE	b1,b2;				\
-									\
-				if (1!=GET(lzs,b1))			\
-					return toread-howmuch;		\
-				if (1!=GET(lzs,b2))			\
-					return toread-howmuch;		\
-				/* Format:				\
-				 * b1 b2				\
-				 * AB CD 				\
-				 * where CAB is the stringoffset in the table\
-				 * and D+3 is the len of the string	\
-				 */					\
-				lzs->stringpos	= b1|((b2&0xf0)<<4);	\
-				lzs->stringlen	= (b2&0xf)+2; 		\
-				/* 3, but we use a  byte already below ... */\
-				b		= lzs->table[lzs->stringpos];\
-				lzs->stringpos	= (lzs->stringpos+1)&0xFFF;\
-			}						\
-			lzs->bytetype>>=1;				\
-		}							\
-		/* store b in table */					\
-		lzs->table[lzs->curtabent++]= b;			\
-		lzs->curtabent	&= 0xFFF;				\
-		lzs->realcurrent++;
-
-	/* if someone has seeked, we have to bring the decompressor
-	 * to that position
-	 */
-	if (lzs->realcurrent!=lzs->realwanted) {
-		/* if the wanted position is before the current position
-		 * I see no easy way to unroll ... We have to restart at
-		 * the beginning. *sigh*
-		 */
-		if (lzs->realcurrent>lzs->realwanted) {
-			/* flush decompressor state */
-			_llseek(lzs->realfd,14,SEEK_SET);
-			GET_FLUSH(lzs);
-			lzs->realcurrent= 0;
-			lzs->bytetype	= 0;
-			lzs->stringlen	= 0;
-			memset(lzs->table,' ',0x1000);
-			lzs->curtabent	= 0xFF0;
-		}
-		while (lzs->realcurrent<lzs->realwanted) {
-			DECOMPRESS_ONE_BYTE;
-		}
-	}
-
-	while (howmuch) {
-		DECOMPRESS_ONE_BYTE;
-		lzs->realwanted++;
-		*buf++		= b;
-		howmuch--;
-	}
-	return 	toread;
-#undef DECOMPRESS_ONE_BYTE
-}
-
-
-/***********************************************************************
- *           LZSeek   (LZ32.@)
- *
- * @implemented
- */
-LONG WINAPI LZSeek( HFILE fd, LONG off, INT type )
-{
-	struct	lzstate	*lzs;
-	LONG	newwanted;
-
-	DPRINT("(%d,%ld,%d)\n",fd,off,type);
-	/* not compressed? just use normal _llseek() */
-        if (!(lzs = GET_LZ_STATE(fd))) return _llseek(fd,off,type);
-	newwanted = lzs->realwanted;
-	switch (type) {
-	case 1:	/* SEEK_CUR */
-		newwanted      += off;
-		break;
-	case 2:	/* SEEK_END */
-		newwanted	= lzs->reallength-off;
-		break;
-	default:/* SEEK_SET */
-		newwanted	= off;
-		break;
-	}
-	if (newwanted>(LONG)lzs->reallength)
-		return LZERROR_BADVALUE;
-	if (newwanted<0)
-		return LZERROR_BADVALUE;
-	lzs->realwanted	= newwanted;
-	return newwanted;
-}
-
-
-/***********************************************************************
- *           LZCopy   (LZ32.@)
- *
- * Copies everything from src to dest
- * if src is a LZ compressed file, it will be uncompressed.
- * will return the number of bytes written to dest or errors.
- *
- * @implemented
- */
-LONG WINAPI LZCopy( HFILE src, HFILE dest )
-{
-	int	usedlzinit=0,ret,wret;
-	LONG	len;
- 	HFILE	oldsrc = src, srcfd;
- 	FILETIME filetime;
- 	struct	lzstate	*lzs;
-
-#define BUFLEN	1000
-	CHAR	buf[BUFLEN];
-	/* we need that weird typedef, for i can't seem to get function pointer
-	 * casts right. (Or they probably just do not like WINAPI in general)
-	 */
-	typedef	UINT	(WINAPI *_readfun)(HFILE,LPVOID,UINT);
-
-	_readfun	xread;
-
-	DPRINT("(%d,%d)\n",src,dest);
-	if (!IS_LZ_HANDLE(src)) {
-		src = LZInit(src);
-                if ((INT)src <= 0) return 0;
-		if (src != oldsrc) usedlzinit=1;
-	}
-
-	/* not compressed? just copy */
-        if (!IS_LZ_HANDLE(src))
-		xread=(_readfun)_hread;
-	else
-		xread=(_readfun)LZRead;
-	len=0;
-	while (1) {
-		ret=xread(src,buf,BUFLEN);
-		if (ret<=0) {
-			if (ret==0)
-				break;
-			if (ret==-1)
-				return LZERROR_READ;
-			return ret;
-		}
-		len    += ret;
-		wret	= _hwrite(dest,buf,ret);
-		if (wret!=ret)
-			return LZERROR_WRITE;
-	}
-
- 	/* Maintain the timestamp of source file to destination file */
- 	srcfd = (!(lzs = GET_LZ_STATE(src))) ? src : lzs->realfd;
- 	GetFileTime((HANDLE)srcfd, NULL, NULL, &filetime);
- 	SetFileTime((HANDLE)dest, NULL, NULL, &filetime);
-
- 	/* close handle */
-	if (usedlzinit)
-		LZClose(src);
-	return len;
-#undef BUFLEN
-}
-
-/* reverses GetExpandedPathname */
-static LPSTR LZEXPAND_MangleName( LPCSTR fn )
-{
-    char *p;
-    char *mfn = (char *)RtlAllocateHeap( GetProcessHeap(), 0,
-                                   strlen(fn) + 3 ); /* "._" and \0 */
-    if(mfn == NULL) return NULL;
-    strcpy( mfn, fn );
-    if (!(p = strrchr( mfn, '\\' ))) p = mfn;
-    if ((p = strchr( p, '.' )))
-    {
-        p++;
-        if (strlen(p) < 3) strcat( p, "_" );  /* append '_' */
-        else p[strlen(p)-1] = '_';  /* replace last character */
-    }
-    else strcat( mfn, "._" );	/* append "._" */
-    return mfn;
-}
-
-/***********************************************************************
- *           LZOpenFileA   (LZ32.@)
- *
- * Opens a file. If not compressed, open it as a normal file.
- *
- * @implemented
- */
-HFILE WINAPI LZOpenFileA( LPSTR fn, LPOFSTRUCT ofs, WORD mode )
-{
-	HFILE	fd,cfd;
-
-	DPRINT("(%s,%p,%d)\n",fn,ofs,mode);
-	/* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
-	fd=OpenFile(fn,ofs,mode);
-	if (fd==HFILE_ERROR)
-        {
-            LPSTR mfn = LZEXPAND_MangleName(fn);
-            fd = OpenFile(mfn,ofs,mode);
-            RtlFreeHeap( GetProcessHeap(), 0, mfn );
-	}
-	if ((mode&~0x70)!=OF_READ)
-		return fd;
-	if (fd==HFILE_ERROR)
-		return HFILE_ERROR;
-	cfd=LZInit(fd);
-	if ((INT)cfd <= 0) return fd;
-	return cfd;
-}
-
-
-/***********************************************************************
- *           LZOpenFileW   (LZ32.@)
- *
- * @implemented
- */
-HFILE WINAPI LZOpenFileW( LPWSTR fn, LPOFSTRUCT ofs, WORD mode )
-{
-    HFILE ret;
-    DWORD len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL );
-    LPSTR xfn = RtlAllocateHeap( GetProcessHeap(), 0, len );
-    WideCharToMultiByte( CP_ACP, 0, fn, -1, xfn, len, NULL, NULL );
-    ret = LZOpenFileA(xfn,ofs,mode);
-    RtlFreeHeap( GetProcessHeap(), 0, xfn );
-    return ret;
-}
-
-
-/***********************************************************************
- *           LZClose   (LZ32.@)
- *
- * @implemented
- */
-void WINAPI LZClose( HFILE fd )
-{
-	struct lzstate *lzs;
-
-	DPRINT("(%d)\n",fd);
-        if (!(lzs = GET_LZ_STATE(fd))) _lclose(fd);
-        else
-        {
-            if (lzs->get) RtlFreeHeap( GetProcessHeap(), 0, lzs->get );
-            CloseHandle((HANDLE)lzs->realfd);
-            lzstates[fd - 0x400] = NULL;
-            RtlFreeHeap( GetProcessHeap(), 0, lzs );
-        }
-}
-
-
-/***********************************************************************
- *           CopyLZFile  (LZ32.@)
- *
- * Copy src to dest (including uncompressing src).
- * NOTE: Yes. This is exactly the same function as LZCopy.
- *
- * @implemented
- */
-LONG WINAPI CopyLZFile( HFILE src, HFILE dest )
-{
-    DPRINT("(%d,%d)\n",src,dest);
-    return LZCopy(src,dest);
-}

Modified: trunk/reactos/media/doc/README.WINE
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=41336&r1=41335&r2=41336&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sun Jun  7 18:10:13 2009
@@ -207,6 +207,7 @@
   reactos/dll/win32/kernel32/misc/errormsg.c    # Out of sync
   reactos/dll/win32/kernel32/misc/profile.c     # Out of sync
   reactos/dll/win32/kernel32/misc/lcformat.c    # Out of sync
+  reactos/dll/win32/kernel32/misc/lzexpand.c    # Synced to Wine-1_1_23
 
 msvcrt -
   reactos/lib/sdk/crt/except/cpp.c              # Synced at 20071111



More information about the Ros-diffs mailing list