|  | /* | 
|  | * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "lzexpand.h" | 
|  |  | 
|  | #include "wine/winbase16.h" | 
|  |  | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(file); | 
|  |  | 
|  | #define MAX_LZSTATES 16 | 
|  |  | 
|  | #define IS_LZ_HANDLE(h) (((h) >= 0x400) && ((h) < 0x400+MAX_LZSTATES)) | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZStart   (LZEXPAND.7) | 
|  | */ | 
|  | INT16 WINAPI LZStart16(void) | 
|  | { | 
|  | TRACE("(void)\n"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZInit   (LZEXPAND.3) | 
|  | */ | 
|  | HFILE16 WINAPI LZInit16( HFILE16 hfSrc ) | 
|  | { | 
|  | HFILE ret = LZInit( (HFILE)DosFileHandleToWin32Handle(hfSrc) ); | 
|  | if (IS_LZ_HANDLE(ret)) return ret; | 
|  | if ((INT)ret <= 0) return ret; | 
|  | return hfSrc; | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           GetExpandedName   (LZEXPAND.10) | 
|  | */ | 
|  | INT16 WINAPI GetExpandedName16( LPSTR in, LPSTR out ) | 
|  | { | 
|  | return (INT16)GetExpandedNameA( in, out ); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZRead   (LZEXPAND.5) | 
|  | */ | 
|  | INT16 WINAPI LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread ) | 
|  | { | 
|  | if (IS_LZ_HANDLE(fd)) return LZRead( fd, buf, toread ); | 
|  | return _lread( (HFILE)DosFileHandleToWin32Handle(fd), buf, toread ); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZSeek   (LZEXPAND.4) | 
|  | */ | 
|  | LONG WINAPI LZSeek16( HFILE16 fd, LONG off, INT16 type ) | 
|  | { | 
|  | if (IS_LZ_HANDLE(fd)) return LZSeek( fd, off, type ); | 
|  | return _llseek( (HFILE)DosFileHandleToWin32Handle(fd), off, type ); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZCopy   (LZEXPAND.1) | 
|  | * | 
|  | */ | 
|  | LONG WINAPI LZCopy16( HFILE16 src, HFILE16 dest ) | 
|  | { | 
|  | /* already a LZ handle? */ | 
|  | if (IS_LZ_HANDLE(src)) return LZCopy( src, (HFILE)DosFileHandleToWin32Handle(dest) ); | 
|  |  | 
|  | /* no, try to open one */ | 
|  | src = LZInit16(src); | 
|  | if ((INT16)src <= 0) return 0; | 
|  | if (IS_LZ_HANDLE(src)) | 
|  | { | 
|  | LONG ret = LZCopy( src, (HFILE)DosFileHandleToWin32Handle(dest) ); | 
|  | LZClose( src ); | 
|  | return ret; | 
|  | } | 
|  | /* it was not a compressed file */ | 
|  | return LZCopy( (HFILE)DosFileHandleToWin32Handle(src), (HFILE)DosFileHandleToWin32Handle(dest) ); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZOpenFile   (LZEXPAND.2) | 
|  | */ | 
|  | HFILE16 WINAPI LZOpenFile16( LPSTR fn, LPOFSTRUCT ofs, UINT16 mode ) | 
|  | { | 
|  | HFILE hfret = LZOpenFileA( fn, ofs, mode ); | 
|  | /* return errors and LZ handles unmodified */ | 
|  | if ((INT)hfret <= 0) return hfret; | 
|  | if (IS_LZ_HANDLE(hfret)) return hfret; | 
|  | /* but allocate a dos handle for 'normal' files */ | 
|  | return Win32HandleToDosFileHandle((HANDLE)hfret); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZClose   (LZEXPAND.6) | 
|  | */ | 
|  | void WINAPI LZClose16( HFILE16 fd ) | 
|  | { | 
|  | if (IS_LZ_HANDLE(fd)) LZClose( fd ); | 
|  | else DisposeLZ32Handle( DosFileHandleToWin32Handle((HFILE)fd) ); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           CopyLZFile   (LZEXPAND.8) | 
|  | */ | 
|  | LONG WINAPI CopyLZFile16( HFILE16 src, HFILE16 dest ) | 
|  | { | 
|  | TRACE("(%d,%d)\n",src,dest); | 
|  | return LZCopy16(src,dest); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           LZDone   (LZEXPAND.9) | 
|  | */ | 
|  | void WINAPI LZDone16(void) | 
|  | { | 
|  | TRACE("(void)\n"); | 
|  | } |