winejoystick: Fix a crash on accessing a CFArray past its end due to an off-by-one...
[wine/multimedia.git] / dlls / lzexpand.dll16 / lzexpand.c
blob76f25e1f52ea29fac24539441f99fdb9c0140ffa
1 /*
2 * LZ Decompression functions
4 * Copyright 1996 Marcus Meissner
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
23 #include "windef.h"
24 #include "winbase.h"
25 #include "lzexpand.h"
27 #include "wine/winbase16.h"
29 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(file);
33 #define MAX_LZSTATES 16
35 #define IS_LZ_HANDLE(h) (((h) >= 0x400) && ((h) < 0x400+MAX_LZSTATES))
38 /***********************************************************************
39 * LZStart (LZEXPAND.7)
41 INT16 WINAPI LZStart16(void)
43 TRACE("(void)\n");
44 return 1;
48 /***********************************************************************
49 * LZInit (LZEXPAND.3)
51 HFILE16 WINAPI LZInit16( HFILE16 hfSrc )
53 HFILE ret = LZInit( (HFILE)DosFileHandleToWin32Handle(hfSrc) );
54 if (IS_LZ_HANDLE(ret)) return ret;
55 if ((INT)ret <= 0) return ret;
56 return hfSrc;
60 /***********************************************************************
61 * GetExpandedName (LZEXPAND.10)
63 INT16 WINAPI GetExpandedName16( LPSTR in, LPSTR out )
65 return (INT16)GetExpandedNameA( in, out );
69 /***********************************************************************
70 * LZRead (LZEXPAND.5)
72 INT16 WINAPI LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread )
74 if (IS_LZ_HANDLE(fd)) return LZRead( fd, buf, toread );
75 return _lread( (HFILE)DosFileHandleToWin32Handle(fd), buf, toread );
79 /***********************************************************************
80 * LZSeek (LZEXPAND.4)
82 LONG WINAPI LZSeek16( HFILE16 fd, LONG off, INT16 type )
84 if (IS_LZ_HANDLE(fd)) return LZSeek( fd, off, type );
85 return _llseek( (HFILE)DosFileHandleToWin32Handle(fd), off, type );
89 /***********************************************************************
90 * LZCopy (LZEXPAND.1)
93 LONG WINAPI LZCopy16( HFILE16 src, HFILE16 dest )
95 /* already a LZ handle? */
96 if (IS_LZ_HANDLE(src)) return LZCopy( src, (HFILE)DosFileHandleToWin32Handle(dest) );
98 /* no, try to open one */
99 src = LZInit16(src);
100 if ((INT16)src <= 0) return 0;
101 if (IS_LZ_HANDLE(src))
103 LONG ret = LZCopy( src, (HFILE)DosFileHandleToWin32Handle(dest) );
104 LZClose( src );
105 return ret;
107 /* it was not a compressed file */
108 return LZCopy( (HFILE)DosFileHandleToWin32Handle(src), (HFILE)DosFileHandleToWin32Handle(dest) );
112 /***********************************************************************
113 * LZOpenFile (LZEXPAND.2)
115 HFILE16 WINAPI LZOpenFile16( LPSTR fn, LPOFSTRUCT ofs, UINT16 mode )
117 HFILE hfret = LZOpenFileA( fn, ofs, mode );
118 /* return errors and LZ handles unmodified */
119 if ((INT)hfret <= 0) return hfret;
120 if (IS_LZ_HANDLE(hfret)) return hfret;
121 /* but allocate a dos handle for 'normal' files */
122 return Win32HandleToDosFileHandle((HANDLE)hfret);
126 /***********************************************************************
127 * LZClose (LZEXPAND.6)
129 void WINAPI LZClose16( HFILE16 fd )
131 if (IS_LZ_HANDLE(fd)) LZClose( fd );
132 else DisposeLZ32Handle( DosFileHandleToWin32Handle((HFILE)fd) );
136 /***********************************************************************
137 * CopyLZFile (LZEXPAND.8)
139 LONG WINAPI CopyLZFile16( HFILE16 src, HFILE16 dest )
141 TRACE("(%d,%d)\n",src,dest);
142 return LZCopy16(src,dest);
146 /***********************************************************************
147 * LZDone (LZEXPAND.9)
149 void WINAPI LZDone16(void)
151 TRACE("(void)\n");