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... ============================================================================== --- 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/lze... ============================================================================== --- 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/lze... ============================================================================== --- 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=4... ============================================================================== --- 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