1/* minilzo.c -- mini subset of the LZO real-time data compression library
2
3   This file is part of the LZO real-time data compression library.
4
5   Copyright (C) 2011 Markus Franz Xaver Johannes Oberhumer
6   Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer
7   Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer
8   Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer
9   Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer
10   Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer
11   Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer
12   Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer
13   Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer
14   Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
15   Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
16   Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
17   Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
18   Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
19   Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
20   Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
21   All Rights Reserved.
22
23   The LZO library is free software; you can redistribute it and/or
24   modify it under the terms of the GNU General Public License as
25   published by the Free Software Foundation; either version 2 of
26   the License, or (at your option) any later version.
27
28   The LZO library is distributed in the hope that it will be useful,
29   but WITHOUT ANY WARRANTY; without even the implied warranty of
30   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
31   GNU General Public License for more details.
32
33   You should have received a copy of the GNU General Public License
34   along with the LZO library; see the file COPYING.
35   If not, write to the Free Software Foundation, Inc.,
36   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
37
38   Markus F.X.J. Oberhumer
39   <markus@oberhumer.com>
40   http://www.oberhumer.com/opensource/lzo/
41 */
42
43/*
44 * NOTE:
45 *   the full LZO package can be found at
46 *   http://www.oberhumer.com/opensource/lzo/
47 */
48
49// BEGIN JRS added
50#define LZO_CFG_FREESTANDING 1
51// END JRS added
52
53#define __LZO_IN_MINILZO 1
54
55#if defined(LZO_CFG_FREESTANDING)
56#  undef MINILZO_HAVE_CONFIG_H
57#  define LZO_LIBC_FREESTANDING 1
58#  define LZO_OS_FREESTANDING 1
59#endif
60
61#ifdef MINILZO_HAVE_CONFIG_H
62#  include <config.h>
63#endif
64#include <limits.h>
65#include <stddef.h>
66#if defined(MINILZO_CFG_USE_INTERNAL_LZODEFS)
67
68#ifndef __LZODEFS_H_INCLUDED
69#define __LZODEFS_H_INCLUDED 1
70
71#if defined(__CYGWIN32__) && !defined(__CYGWIN__)
72#  define __CYGWIN__ __CYGWIN32__
73#endif
74#if defined(__IBMCPP__) && !defined(__IBMC__)
75#  define __IBMC__ __IBMCPP__
76#endif
77#if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER)
78#  define __INTEL_COMPILER __ICL
79#endif
80#if 1 && defined(__INTERIX) && defined(__GNUC__) && !defined(_ALL_SOURCE)
81#  define _ALL_SOURCE 1
82#endif
83#if defined(__mips__) && defined(__R5900__)
84#  if !defined(__LONG_MAX__)
85#    define __LONG_MAX__ 9223372036854775807L
86#  endif
87#endif
88#if defined(__INTEL_COMPILER) && defined(__linux__)
89#  pragma warning(disable: 193)
90#endif
91#if defined(__KEIL__) && defined(__C166__)
92#  pragma warning disable = 322
93#elif 0 && defined(__C251__)
94#  pragma warning disable = 322
95#endif
96#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__MWERKS__)
97#  if (_MSC_VER >= 1300)
98#    pragma warning(disable: 4668)
99#  endif
100#endif
101#if 0 && defined(__WATCOMC__)
102#  if (__WATCOMC__ >= 1050) && (__WATCOMC__ < 1060)
103#    pragma warning 203 9
104#  endif
105#endif
106#if defined(__BORLANDC__) && defined(__MSDOS__) && !defined(__FLAT__)
107#  pragma option -h
108#endif
109#if 0
110#define LZO_0xffffL             0xfffful
111#define LZO_0xffffffffL         0xfffffffful
112#else
113#define LZO_0xffffL             65535ul
114#define LZO_0xffffffffL         4294967295ul
115#endif
116#if (LZO_0xffffL == LZO_0xffffffffL)
117#  error "your preprocessor is broken 1"
118#endif
119#if (16ul * 16384ul != 262144ul)
120#  error "your preprocessor is broken 2"
121#endif
122#if 0
123#if (32767 >= 4294967295ul)
124#  error "your preprocessor is broken 3"
125#endif
126#if (65535u >= 4294967295ul)
127#  error "your preprocessor is broken 4"
128#endif
129#endif
130#if (UINT_MAX == LZO_0xffffL)
131#if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__)
132#  if !defined(MSDOS)
133#    define MSDOS 1
134#  endif
135#  if !defined(_MSDOS)
136#    define _MSDOS 1
137#  endif
138#elif 0 && defined(__VERSION) && defined(MB_LEN_MAX)
139#  if (__VERSION == 520) && (MB_LEN_MAX == 1)
140#    if !defined(__AZTEC_C__)
141#      define __AZTEC_C__ __VERSION
142#    endif
143#    if !defined(__DOS__)
144#      define __DOS__ 1
145#    endif
146#  endif
147#endif
148#endif
149#if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == LZO_0xffffL)
150#  define ptrdiff_t long
151#  define _PTRDIFF_T_DEFINED 1
152#endif
153#if (UINT_MAX == LZO_0xffffL)
154#  undef __LZO_RENAME_A
155#  undef __LZO_RENAME_B
156#  if defined(__AZTEC_C__) && defined(__DOS__)
157#    define __LZO_RENAME_A 1
158#  elif defined(_MSC_VER) && defined(MSDOS)
159#    if (_MSC_VER < 600)
160#      define __LZO_RENAME_A 1
161#    elif (_MSC_VER < 700)
162#      define __LZO_RENAME_B 1
163#    endif
164#  elif defined(__TSC__) && defined(__OS2__)
165#    define __LZO_RENAME_A 1
166#  elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410)
167#    define __LZO_RENAME_A 1
168#  elif defined(__PACIFIC__) && defined(DOS)
169#    if !defined(__far)
170#      define __far far
171#    endif
172#    if !defined(__near)
173#      define __near near
174#    endif
175#  endif
176#  if defined(__LZO_RENAME_A)
177#    if !defined(__cdecl)
178#      define __cdecl cdecl
179#    endif
180#    if !defined(__far)
181#      define __far far
182#    endif
183#    if !defined(__huge)
184#      define __huge huge
185#    endif
186#    if !defined(__near)
187#      define __near near
188#    endif
189#    if !defined(__pascal)
190#      define __pascal pascal
191#    endif
192#    if !defined(__huge)
193#      define __huge huge
194#    endif
195#  elif defined(__LZO_RENAME_B)
196#    if !defined(__cdecl)
197#      define __cdecl _cdecl
198#    endif
199#    if !defined(__far)
200#      define __far _far
201#    endif
202#    if !defined(__huge)
203#      define __huge _huge
204#    endif
205#    if !defined(__near)
206#      define __near _near
207#    endif
208#    if !defined(__pascal)
209#      define __pascal _pascal
210#    endif
211#  elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__)
212#    if !defined(__cdecl)
213#      define __cdecl cdecl
214#    endif
215#    if !defined(__pascal)
216#      define __pascal pascal
217#    endif
218#  endif
219#  undef __LZO_RENAME_A
220#  undef __LZO_RENAME_B
221#endif
222#if (UINT_MAX == LZO_0xffffL)
223#if defined(__AZTEC_C__) && defined(__DOS__)
224#  define LZO_BROKEN_CDECL_ALT_SYNTAX 1
225#elif defined(_MSC_VER) && defined(MSDOS)
226#  if (_MSC_VER < 600)
227#    define LZO_BROKEN_INTEGRAL_CONSTANTS 1
228#  endif
229#  if (_MSC_VER < 700)
230#    define LZO_BROKEN_INTEGRAL_PROMOTION 1
231#    define LZO_BROKEN_SIZEOF 1
232#  endif
233#elif defined(__PACIFIC__) && defined(DOS)
234#  define LZO_BROKEN_INTEGRAL_CONSTANTS 1
235#elif defined(__TURBOC__) && defined(__MSDOS__)
236#  if (__TURBOC__ < 0x0150)
237#    define LZO_BROKEN_CDECL_ALT_SYNTAX 1
238#    define LZO_BROKEN_INTEGRAL_CONSTANTS 1
239#    define LZO_BROKEN_INTEGRAL_PROMOTION 1
240#  endif
241#  if (__TURBOC__ < 0x0200)
242#    define LZO_BROKEN_SIZEOF 1
243#  endif
244#  if (__TURBOC__ < 0x0400) && defined(__cplusplus)
245#    define LZO_BROKEN_CDECL_ALT_SYNTAX 1
246#  endif
247#elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__)
248#  define LZO_BROKEN_CDECL_ALT_SYNTAX 1
249#  define LZO_BROKEN_SIZEOF 1
250#endif
251#endif
252#if defined(__WATCOMC__) && (__WATCOMC__ < 900)
253#  define LZO_BROKEN_INTEGRAL_CONSTANTS 1
254#endif
255#if defined(_CRAY) && defined(_CRAY1)
256#  define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1
257#endif
258#define LZO_PP_STRINGIZE(x)             #x
259#define LZO_PP_MACRO_EXPAND(x)          LZO_PP_STRINGIZE(x)
260#define LZO_PP_CONCAT2(a,b)             a ## b
261#define LZO_PP_CONCAT3(a,b,c)           a ## b ## c
262#define LZO_PP_CONCAT4(a,b,c,d)         a ## b ## c ## d
263#define LZO_PP_CONCAT5(a,b,c,d,e)       a ## b ## c ## d ## e
264#define LZO_PP_ECONCAT2(a,b)            LZO_PP_CONCAT2(a,b)
265#define LZO_PP_ECONCAT3(a,b,c)          LZO_PP_CONCAT3(a,b,c)
266#define LZO_PP_ECONCAT4(a,b,c,d)        LZO_PP_CONCAT4(a,b,c,d)
267#define LZO_PP_ECONCAT5(a,b,c,d,e)      LZO_PP_CONCAT5(a,b,c,d,e)
268#if 1
269#define LZO_CPP_STRINGIZE(x)            #x
270#define LZO_CPP_MACRO_EXPAND(x)         LZO_CPP_STRINGIZE(x)
271#define LZO_CPP_CONCAT2(a,b)            a ## b
272#define LZO_CPP_CONCAT3(a,b,c)          a ## b ## c
273#define LZO_CPP_CONCAT4(a,b,c,d)        a ## b ## c ## d
274#define LZO_CPP_CONCAT5(a,b,c,d,e)      a ## b ## c ## d ## e
275#define LZO_CPP_ECONCAT2(a,b)           LZO_CPP_CONCAT2(a,b)
276#define LZO_CPP_ECONCAT3(a,b,c)         LZO_CPP_CONCAT3(a,b,c)
277#define LZO_CPP_ECONCAT4(a,b,c,d)       LZO_CPP_CONCAT4(a,b,c,d)
278#define LZO_CPP_ECONCAT5(a,b,c,d,e)     LZO_CPP_CONCAT5(a,b,c,d,e)
279#endif
280#define __LZO_MASK_GEN(o,b)     (((((o) << ((b)-1)) - (o)) << 1) + (o))
281#if 1 && defined(__cplusplus)
282#  if !defined(__STDC_CONSTANT_MACROS)
283#    define __STDC_CONSTANT_MACROS 1
284#  endif
285#  if !defined(__STDC_LIMIT_MACROS)
286#    define __STDC_LIMIT_MACROS 1
287#  endif
288#endif
289#if defined(__cplusplus)
290#  define LZO_EXTERN_C extern "C"
291#else
292#  define LZO_EXTERN_C extern
293#endif
294#if !defined(__LZO_OS_OVERRIDE)
295#if (LZO_OS_FREESTANDING)
296#  define LZO_INFO_OS           "freestanding"
297#elif (LZO_OS_EMBEDDED)
298#  define LZO_INFO_OS           "embedded"
299#elif 1 && defined(__IAR_SYSTEMS_ICC__)
300#  define LZO_OS_EMBEDDED       1
301#  define LZO_INFO_OS           "embedded"
302#elif defined(__CYGWIN__) && defined(__GNUC__)
303#  define LZO_OS_CYGWIN         1
304#  define LZO_INFO_OS           "cygwin"
305#elif defined(__EMX__) && defined(__GNUC__)
306#  define LZO_OS_EMX            1
307#  define LZO_INFO_OS           "emx"
308#elif defined(__BEOS__)
309#  define LZO_OS_BEOS           1
310#  define LZO_INFO_OS           "beos"
311#elif defined(__Lynx__)
312#  define LZO_OS_LYNXOS         1
313#  define LZO_INFO_OS           "lynxos"
314#elif defined(__OS400__)
315#  define LZO_OS_OS400          1
316#  define LZO_INFO_OS           "os400"
317#elif defined(__QNX__)
318#  define LZO_OS_QNX            1
319#  define LZO_INFO_OS           "qnx"
320#elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460)
321#  define LZO_OS_DOS32          1
322#  define LZO_INFO_OS           "dos32"
323#elif defined(__BORLANDC__) && defined(__DPMI16__)
324#  define LZO_OS_DOS16          1
325#  define LZO_INFO_OS           "dos16"
326#elif defined(__ZTC__) && defined(DOS386)
327#  define LZO_OS_DOS32          1
328#  define LZO_INFO_OS           "dos32"
329#elif defined(__OS2__) || defined(__OS2V2__)
330#  if (UINT_MAX == LZO_0xffffL)
331#    define LZO_OS_OS216        1
332#    define LZO_INFO_OS         "os216"
333#  elif (UINT_MAX == LZO_0xffffffffL)
334#    define LZO_OS_OS2          1
335#    define LZO_INFO_OS         "os2"
336#  else
337#    error "check your limits.h header"
338#  endif
339#elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64)
340#  define LZO_OS_WIN64          1
341#  define LZO_INFO_OS           "win64"
342#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__)
343#  define LZO_OS_WIN32          1
344#  define LZO_INFO_OS           "win32"
345#elif defined(__MWERKS__) && defined(__INTEL__)
346#  define LZO_OS_WIN32          1
347#  define LZO_INFO_OS           "win32"
348#elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows)
349#  if (UINT_MAX == LZO_0xffffL)
350#    define LZO_OS_WIN16        1
351#    define LZO_INFO_OS         "win16"
352#  elif (UINT_MAX == LZO_0xffffffffL)
353#    define LZO_OS_WIN32        1
354#    define LZO_INFO_OS         "win32"
355#  else
356#    error "check your limits.h header"
357#  endif
358#elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS))
359#  if (UINT_MAX == LZO_0xffffL)
360#    define LZO_OS_DOS16        1
361#    define LZO_INFO_OS         "dos16"
362#  elif (UINT_MAX == LZO_0xffffffffL)
363#    define LZO_OS_DOS32        1
364#    define LZO_INFO_OS         "dos32"
365#  else
366#    error "check your limits.h header"
367#  endif
368#elif defined(__WATCOMC__)
369#  if defined(__NT__) && (UINT_MAX == LZO_0xffffL)
370#    define LZO_OS_DOS16        1
371#    define LZO_INFO_OS         "dos16"
372#  elif defined(__NT__) && (__WATCOMC__ < 1100)
373#    define LZO_OS_WIN32        1
374#    define LZO_INFO_OS         "win32"
375#  elif defined(__linux__) || defined(__LINUX__)
376#    define LZO_OS_POSIX        1
377#    define LZO_INFO_OS         "posix"
378#  else
379#    error "please specify a target using the -bt compiler option"
380#  endif
381#elif defined(__palmos__)
382#  define LZO_OS_PALMOS         1
383#  define LZO_INFO_OS           "palmos"
384#elif defined(__TOS__) || defined(__atarist__)
385#  define LZO_OS_TOS            1
386#  define LZO_INFO_OS           "tos"
387#elif defined(macintosh) && !defined(__ppc__)
388#  define LZO_OS_MACCLASSIC     1
389#  define LZO_INFO_OS           "macclassic"
390#elif defined(__VMS)
391#  define LZO_OS_VMS            1
392#  define LZO_INFO_OS           "vms"
393#elif ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__))
394#  define LZO_OS_CONSOLE        1
395#  define LZO_OS_CONSOLE_PS2    1
396#  define LZO_INFO_OS           "console"
397#  define LZO_INFO_OS_CONSOLE   "ps2"
398#elif (defined(__mips__) && defined(__psp__))
399#  define LZO_OS_CONSOLE        1
400#  define LZO_OS_CONSOLE_PSP    1
401#  define LZO_INFO_OS           "console"
402#  define LZO_INFO_OS_CONSOLE   "psp"
403#else
404#  define LZO_OS_POSIX          1
405#  define LZO_INFO_OS           "posix"
406#endif
407#if (LZO_OS_POSIX)
408#  if defined(_AIX) || defined(__AIX__) || defined(__aix__)
409#    define LZO_OS_POSIX_AIX        1
410#    define LZO_INFO_OS_POSIX       "aix"
411#  elif defined(__FreeBSD__)
412#    define LZO_OS_POSIX_FREEBSD    1
413#    define LZO_INFO_OS_POSIX       "freebsd"
414#  elif defined(__hpux__) || defined(__hpux)
415#    define LZO_OS_POSIX_HPUX       1
416#    define LZO_INFO_OS_POSIX       "hpux"
417#  elif defined(__INTERIX)
418#    define LZO_OS_POSIX_INTERIX    1
419#    define LZO_INFO_OS_POSIX       "interix"
420#  elif defined(__IRIX__) || defined(__irix__)
421#    define LZO_OS_POSIX_IRIX       1
422#    define LZO_INFO_OS_POSIX       "irix"
423#  elif defined(__linux__) || defined(__linux) || defined(__LINUX__)
424#    define LZO_OS_POSIX_LINUX      1
425#    define LZO_INFO_OS_POSIX       "linux"
426#  elif defined(__APPLE__) || defined(__MACOS__)
427#    define LZO_OS_POSIX_MACOSX     1
428#    define LZO_INFO_OS_POSIX       "macosx"
429#  elif defined(__minix__) || defined(__minix)
430#    define LZO_OS_POSIX_MINIX      1
431#    define LZO_INFO_OS_POSIX       "minix"
432#  elif defined(__NetBSD__)
433#    define LZO_OS_POSIX_NETBSD     1
434#    define LZO_INFO_OS_POSIX       "netbsd"
435#  elif defined(__OpenBSD__)
436#    define LZO_OS_POSIX_OPENBSD    1
437#    define LZO_INFO_OS_POSIX       "openbsd"
438#  elif defined(__osf__)
439#    define LZO_OS_POSIX_OSF        1
440#    define LZO_INFO_OS_POSIX       "osf"
441#  elif defined(__solaris__) || defined(__sun)
442#    if defined(__SVR4) || defined(__svr4__)
443#      define LZO_OS_POSIX_SOLARIS  1
444#      define LZO_INFO_OS_POSIX     "solaris"
445#    else
446#      define LZO_OS_POSIX_SUNOS    1
447#      define LZO_INFO_OS_POSIX     "sunos"
448#    endif
449#  elif defined(__ultrix__) || defined(__ultrix)
450#    define LZO_OS_POSIX_ULTRIX     1
451#    define LZO_INFO_OS_POSIX       "ultrix"
452#  elif defined(_UNICOS)
453#    define LZO_OS_POSIX_UNICOS     1
454#    define LZO_INFO_OS_POSIX       "unicos"
455#  else
456#    define LZO_OS_POSIX_UNKNOWN    1
457#    define LZO_INFO_OS_POSIX       "unknown"
458#  endif
459#endif
460#endif
461#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16)
462#  if (UINT_MAX != LZO_0xffffL)
463#    error "this should not happen"
464#  endif
465#  if (ULONG_MAX != LZO_0xffffffffL)
466#    error "this should not happen"
467#  endif
468#endif
469#if (LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_WIN32 || LZO_OS_WIN64)
470#  if (UINT_MAX != LZO_0xffffffffL)
471#    error "this should not happen"
472#  endif
473#  if (ULONG_MAX != LZO_0xffffffffL)
474#    error "this should not happen"
475#  endif
476#endif
477#if defined(CIL) && defined(_GNUCC) && defined(__GNUC__)
478#  define LZO_CC_CILLY          1
479#  define LZO_INFO_CC           "Cilly"
480#  if defined(__CILLY__)
481#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(__CILLY__)
482#  else
483#    define LZO_INFO_CCVER      "unknown"
484#  endif
485#elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__)
486#  define LZO_CC_SDCC           1
487#  define LZO_INFO_CC           "sdcc"
488#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(SDCC)
489#elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__)
490#  define LZO_CC_PATHSCALE      (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__)
491#  define LZO_INFO_CC           "Pathscale C"
492#  define LZO_INFO_CCVER        __PATHSCALE__
493#elif defined(__INTEL_COMPILER)
494#  define LZO_CC_INTELC         1
495#  define LZO_INFO_CC           "Intel C"
496#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__INTEL_COMPILER)
497#  if defined(_WIN32) || defined(_WIN64)
498#    define LZO_CC_SYNTAX_MSC 1
499#  else
500#    define LZO_CC_SYNTAX_GNUC 1
501#  endif
502#elif defined(__POCC__) && defined(_WIN32)
503#  define LZO_CC_PELLESC        1
504#  define LZO_INFO_CC           "Pelles C"
505#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__POCC__)
506#elif defined(__clang__) && defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__)
507#  if defined(__GNUC_PATCHLEVEL__)
508#    define LZO_CC_CLANG_GNUC   (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__)
509#  else
510#    define LZO_CC_CLANG_GNUC   (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100)
511#  endif
512#  if defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__)
513#    define LZO_CC_CLANG_CLANG  (__clang_major__ * 0x10000L + __clang_minor__ * 0x100 + __clang_patchlevel__)
514#  else
515#    define LZO_CC_CLANG_CLANG  0x010000L
516#  endif
517#  define LZO_CC_CLANG          LZO_CC_CLANG_GNUC
518#  define LZO_INFO_CC           "clang"
519#  define LZO_INFO_CCVER        __VERSION__
520#elif defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__)
521#  if defined(__GNUC_PATCHLEVEL__)
522#    define LZO_CC_LLVM_GNUC    (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__)
523#  else
524#    define LZO_CC_LLVM_GNUC    (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100)
525#  endif
526#  define LZO_CC_LLVM           LZO_CC_LLVM_GNUC
527#  define LZO_INFO_CC           "llvm-gcc"
528#  define LZO_INFO_CCVER        __VERSION__
529#elif defined(__GNUC__) && defined(__VERSION__)
530#  if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
531#    define LZO_CC_GNUC         (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__)
532#  elif defined(__GNUC_MINOR__)
533#    define LZO_CC_GNUC         (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100)
534#  else
535#    define LZO_CC_GNUC         (__GNUC__ * 0x10000L)
536#  endif
537#  define LZO_INFO_CC           "gcc"
538#  define LZO_INFO_CCVER        __VERSION__
539#elif defined(__ACK__) && defined(_ACK)
540#  define LZO_CC_ACK            1
541#  define LZO_INFO_CC           "Amsterdam Compiler Kit C"
542#  define LZO_INFO_CCVER        "unknown"
543#elif defined(__AZTEC_C__)
544#  define LZO_CC_AZTECC         1
545#  define LZO_INFO_CC           "Aztec C"
546#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__AZTEC_C__)
547#elif defined(__CODEGEARC__)
548#  define LZO_CC_CODEGEARC      1
549#  define LZO_INFO_CC           "CodeGear C"
550#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__CODEGEARC__)
551#elif defined(__BORLANDC__)
552#  define LZO_CC_BORLANDC       1
553#  define LZO_INFO_CC           "Borland C"
554#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__BORLANDC__)
555#elif defined(_CRAYC) && defined(_RELEASE)
556#  define LZO_CC_CRAYC          1
557#  define LZO_INFO_CC           "Cray C"
558#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(_RELEASE)
559#elif defined(__DMC__) && defined(__SC__)
560#  define LZO_CC_DMC            1
561#  define LZO_INFO_CC           "Digital Mars C"
562#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__DMC__)
563#elif defined(__DECC)
564#  define LZO_CC_DECC           1
565#  define LZO_INFO_CC           "DEC C"
566#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__DECC)
567#elif defined(__HIGHC__)
568#  define LZO_CC_HIGHC          1
569#  define LZO_INFO_CC           "MetaWare High C"
570#  define LZO_INFO_CCVER        "unknown"
571#elif defined(__IAR_SYSTEMS_ICC__)
572#  define LZO_CC_IARC           1
573#  define LZO_INFO_CC           "IAR C"
574#  if defined(__VER__)
575#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(__VER__)
576#  else
577#    define LZO_INFO_CCVER      "unknown"
578#  endif
579#elif defined(__IBMC__)
580#  define LZO_CC_IBMC           1
581#  define LZO_INFO_CC           "IBM C"
582#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__IBMC__)
583#elif defined(__KEIL__) && defined(__C166__)
584#  define LZO_CC_KEILC          1
585#  define LZO_INFO_CC           "Keil C"
586#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__C166__)
587#elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL)
588#  define LZO_CC_LCCWIN32       1
589#  define LZO_INFO_CC           "lcc-win32"
590#  define LZO_INFO_CCVER        "unknown"
591#elif defined(__LCC__)
592#  define LZO_CC_LCC            1
593#  define LZO_INFO_CC           "lcc"
594#  if defined(__LCC_VERSION__)
595#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(__LCC_VERSION__)
596#  else
597#    define LZO_INFO_CCVER      "unknown"
598#  endif
599#elif defined(_MSC_VER)
600#  define LZO_CC_MSC            1
601#  define LZO_INFO_CC           "Microsoft C"
602#  if defined(_MSC_FULL_VER)
603#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER)
604#  else
605#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(_MSC_VER)
606#  endif
607#elif defined(__MWERKS__)
608#  define LZO_CC_MWERKS         1
609#  define LZO_INFO_CC           "Metrowerks C"
610#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__MWERKS__)
611#elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386)
612#  define LZO_CC_NDPC           1
613#  define LZO_INFO_CC           "Microway NDP C"
614#  define LZO_INFO_CCVER        "unknown"
615#elif defined(__PACIFIC__)
616#  define LZO_CC_PACIFICC       1
617#  define LZO_INFO_CC           "Pacific C"
618#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__PACIFIC__)
619#elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__))
620#  define LZO_CC_PGI            1
621#  define LZO_INFO_CC           "Portland Group PGI C"
622#  define LZO_INFO_CCVER        "unknown"
623#elif defined(__PUREC__) && defined(__TOS__)
624#  define LZO_CC_PUREC          1
625#  define LZO_INFO_CC           "Pure C"
626#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__PUREC__)
627#elif defined(__SC__) && defined(__ZTC__)
628#  define LZO_CC_SYMANTECC      1
629#  define LZO_INFO_CC           "Symantec C"
630#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__SC__)
631#elif defined(__SUNPRO_C)
632#  define LZO_INFO_CC           "SunPro C"
633#  if ((__SUNPRO_C)+0 > 0)
634#    define LZO_CC_SUNPROC      __SUNPRO_C
635#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(__SUNPRO_C)
636#  else
637#    define LZO_CC_SUNPROC      1
638#    define LZO_INFO_CCVER      "unknown"
639#  endif
640#elif defined(__SUNPRO_CC)
641#  define LZO_INFO_CC           "SunPro C"
642#  if ((__SUNPRO_CC)+0 > 0)
643#    define LZO_CC_SUNPROC      __SUNPRO_CC
644#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(__SUNPRO_CC)
645#  else
646#    define LZO_CC_SUNPROC      1
647#    define LZO_INFO_CCVER      "unknown"
648#  endif
649#elif defined(__TINYC__)
650#  define LZO_CC_TINYC          1
651#  define LZO_INFO_CC           "Tiny C"
652#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__TINYC__)
653#elif defined(__TSC__)
654#  define LZO_CC_TOPSPEEDC      1
655#  define LZO_INFO_CC           "TopSpeed C"
656#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__TSC__)
657#elif defined(__WATCOMC__)
658#  define LZO_CC_WATCOMC        1
659#  define LZO_INFO_CC           "Watcom C"
660#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__WATCOMC__)
661#elif defined(__TURBOC__)
662#  define LZO_CC_TURBOC         1
663#  define LZO_INFO_CC           "Turbo C"
664#  define LZO_INFO_CCVER        LZO_PP_MACRO_EXPAND(__TURBOC__)
665#elif defined(__ZTC__)
666#  define LZO_CC_ZORTECHC       1
667#  define LZO_INFO_CC           "Zortech C"
668#  if (__ZTC__ == 0x310)
669#    define LZO_INFO_CCVER      "0x310"
670#  else
671#    define LZO_INFO_CCVER      LZO_PP_MACRO_EXPAND(__ZTC__)
672#  endif
673#else
674#  define LZO_CC_UNKNOWN        1
675#  define LZO_INFO_CC           "unknown"
676#  define LZO_INFO_CCVER        "unknown"
677#endif
678#if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER)
679#  error "LZO_CC_MSC: _MSC_FULL_VER is not defined"
680#endif
681#if !defined(__LZO_ARCH_OVERRIDE) && !(LZO_ARCH_GENERIC) && defined(_CRAY)
682#  if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY)
683#    if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E)
684#      define LZO_ARCH_CRAY_MPP     1
685#    elif defined(_CRAY1)
686#      define LZO_ARCH_CRAY_PVP     1
687#    endif
688#  endif
689#endif
690#if !defined(__LZO_ARCH_OVERRIDE)
691#if (LZO_ARCH_GENERIC)
692#  define LZO_INFO_ARCH             "generic"
693#elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16)
694#  define LZO_ARCH_I086             1
695#  define LZO_ARCH_IA16             1
696#  define LZO_INFO_ARCH             "i086"
697#elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)
698#  define LZO_ARCH_ALPHA            1
699#  define LZO_INFO_ARCH             "alpha"
700#elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E))
701#  define LZO_ARCH_ALPHA            1
702#  define LZO_INFO_ARCH             "alpha"
703#elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64)
704#  define LZO_ARCH_AMD64            1
705#  define LZO_INFO_ARCH             "amd64"
706#elif defined(__thumb__) || (defined(_M_ARM) && defined(_M_THUMB))
707#  define LZO_ARCH_ARM              1
708#  define LZO_ARCH_ARM_THUMB        1
709#  define LZO_INFO_ARCH             "arm_thumb"
710#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__)
711#  define LZO_ARCH_ARM              1
712#  if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1)
713#    define LZO_ARCH_ARM_THUMB      1
714#    define LZO_INFO_ARCH           "arm_thumb"
715#  elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2)
716#    define LZO_INFO_ARCH           "arm"
717#  else
718#    define LZO_INFO_ARCH           "arm"
719#  endif
720#elif defined(__arm__) || defined(_M_ARM)
721#  define LZO_ARCH_ARM              1
722#  define LZO_INFO_ARCH             "arm"
723#elif (UINT_MAX <= LZO_0xffffL) && defined(__AVR__)
724#  define LZO_ARCH_AVR              1
725#  define LZO_INFO_ARCH             "avr"
726#elif defined(__avr32__) || defined(__AVR32__)
727#  define LZO_ARCH_AVR32            1
728#  define LZO_INFO_ARCH             "avr32"
729#elif defined(__bfin__)
730#  define LZO_ARCH_BLACKFIN         1
731#  define LZO_INFO_ARCH             "blackfin"
732#elif (UINT_MAX == LZO_0xffffL) && defined(__C166__)
733#  define LZO_ARCH_C166             1
734#  define LZO_INFO_ARCH             "c166"
735#elif defined(__cris__)
736#  define LZO_ARCH_CRIS             1
737#  define LZO_INFO_ARCH             "cris"
738#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__)
739#  define LZO_ARCH_EZ80             1
740#  define LZO_INFO_ARCH             "ez80"
741#elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
742#  define LZO_ARCH_H8300            1
743#  define LZO_INFO_ARCH             "h8300"
744#elif defined(__hppa__) || defined(__hppa)
745#  define LZO_ARCH_HPPA             1
746#  define LZO_INFO_ARCH             "hppa"
747#elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386)
748#  define LZO_ARCH_I386             1
749#  define LZO_ARCH_IA32             1
750#  define LZO_INFO_ARCH             "i386"
751#elif (LZO_CC_ZORTECHC && defined(__I86__))
752#  define LZO_ARCH_I386             1
753#  define LZO_ARCH_IA32             1
754#  define LZO_INFO_ARCH             "i386"
755#elif (LZO_OS_DOS32 && LZO_CC_HIGHC) && defined(_I386)
756#  define LZO_ARCH_I386             1
757#  define LZO_ARCH_IA32             1
758#  define LZO_INFO_ARCH             "i386"
759#elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64)
760#  define LZO_ARCH_IA64             1
761#  define LZO_INFO_ARCH             "ia64"
762#elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__)
763#  define LZO_ARCH_M16C             1
764#  define LZO_INFO_ARCH             "m16c"
765#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__)
766#  define LZO_ARCH_M16C             1
767#  define LZO_INFO_ARCH             "m16c"
768#elif defined(__m32r__)
769#  define LZO_ARCH_M32R             1
770#  define LZO_INFO_ARCH             "m32r"
771#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K)
772#  define LZO_ARCH_M68K             1
773#  define LZO_INFO_ARCH             "m68k"
774#elif (UINT_MAX == LZO_0xffffL) && defined(__C251__)
775#  define LZO_ARCH_MCS251           1
776#  define LZO_INFO_ARCH             "mcs251"
777#elif (UINT_MAX == LZO_0xffffL) && defined(__C51__)
778#  define LZO_ARCH_MCS51            1
779#  define LZO_INFO_ARCH             "mcs51"
780#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__)
781#  define LZO_ARCH_MCS51            1
782#  define LZO_INFO_ARCH             "mcs51"
783#elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000)
784#  define LZO_ARCH_MIPS             1
785#  define LZO_INFO_ARCH             "mips"
786#elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__)
787#  define LZO_ARCH_MSP430           1
788#  define LZO_INFO_ARCH             "msp430"
789#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__)
790#  define LZO_ARCH_MSP430           1
791#  define LZO_INFO_ARCH             "msp430"
792#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR)
793#  define LZO_ARCH_POWERPC          1
794#  define LZO_INFO_ARCH             "powerpc"
795#elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x)
796#  define LZO_ARCH_S390             1
797#  define LZO_INFO_ARCH             "s390"
798#elif defined(__sh__) || defined(_M_SH)
799#  define LZO_ARCH_SH               1
800#  define LZO_INFO_ARCH             "sh"
801#elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8)
802#  define LZO_ARCH_SPARC            1
803#  define LZO_INFO_ARCH             "sparc"
804#elif defined(__SPU__)
805#  define LZO_ARCH_SPU              1
806#  define LZO_INFO_ARCH             "spu"
807#elif (UINT_MAX == LZO_0xffffL) && defined(__z80)
808#  define LZO_ARCH_Z80              1
809#  define LZO_INFO_ARCH             "z80"
810#elif (LZO_ARCH_CRAY_PVP)
811#  if defined(_CRAYSV1)
812#    define LZO_ARCH_CRAY_SV1       1
813#    define LZO_INFO_ARCH           "cray_sv1"
814#  elif (_ADDR64)
815#    define LZO_ARCH_CRAY_T90       1
816#    define LZO_INFO_ARCH           "cray_t90"
817#  elif (_ADDR32)
818#    define LZO_ARCH_CRAY_YMP       1
819#    define LZO_INFO_ARCH           "cray_ymp"
820#  else
821#    define LZO_ARCH_CRAY_XMP       1
822#    define LZO_INFO_ARCH           "cray_xmp"
823#  endif
824#else
825#  define LZO_ARCH_UNKNOWN          1
826#  define LZO_INFO_ARCH             "unknown"
827#endif
828#endif
829#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_DOS32 || LZO_OS_OS2)
830#  error "FIXME - missing define for CPU architecture"
831#endif
832#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN32)
833#  error "FIXME - missing WIN32 define for CPU architecture"
834#endif
835#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN64)
836#  error "FIXME - missing WIN64 define for CPU architecture"
837#endif
838#if (LZO_OS_OS216 || LZO_OS_WIN16)
839#  define LZO_ARCH_I086PM           1
840#  define LZO_ARCH_IA16PM           1
841#elif 1 && (LZO_OS_DOS16 && defined(BLX286))
842#  define LZO_ARCH_I086PM           1
843#  define LZO_ARCH_IA16PM           1
844#elif 1 && (LZO_OS_DOS16 && defined(DOSX286))
845#  define LZO_ARCH_I086PM           1
846#  define LZO_ARCH_IA16PM           1
847#elif 1 && (LZO_OS_DOS16 && LZO_CC_BORLANDC && defined(__DPMI16__))
848#  define LZO_ARCH_I086PM           1
849#  define LZO_ARCH_IA16PM           1
850#endif
851#if (LZO_ARCH_ARM_THUMB) && !(LZO_ARCH_ARM)
852#  error "this should not happen"
853#endif
854#if (LZO_ARCH_I086PM) && !(LZO_ARCH_I086)
855#  error "this should not happen"
856#endif
857#if (LZO_ARCH_I086)
858#  if (UINT_MAX != LZO_0xffffL)
859#    error "this should not happen"
860#  endif
861#  if (ULONG_MAX != LZO_0xffffffffL)
862#    error "this should not happen"
863#  endif
864#endif
865#if (LZO_ARCH_I386)
866#  if (UINT_MAX != LZO_0xffffL) && defined(__i386_int16__)
867#    error "this should not happen"
868#  endif
869#  if (UINT_MAX != LZO_0xffffffffL) && !defined(__i386_int16__)
870#    error "this should not happen"
871#  endif
872#  if (ULONG_MAX != LZO_0xffffffffL)
873#    error "this should not happen"
874#  endif
875#endif
876#if !defined(__LZO_MM_OVERRIDE)
877#if (LZO_ARCH_I086)
878#if (UINT_MAX != LZO_0xffffL)
879#  error "this should not happen"
880#endif
881#if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM)
882#  define LZO_MM_TINY           1
883#elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM)
884#  define LZO_MM_HUGE           1
885#elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL)
886#  define LZO_MM_SMALL          1
887#elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM)
888#  define LZO_MM_MEDIUM         1
889#elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM)
890#  define LZO_MM_COMPACT        1
891#elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL)
892#  define LZO_MM_LARGE          1
893#elif (LZO_CC_AZTECC)
894#  if defined(_LARGE_CODE) && defined(_LARGE_DATA)
895#    define LZO_MM_LARGE        1
896#  elif defined(_LARGE_CODE)
897#    define LZO_MM_MEDIUM       1
898#  elif defined(_LARGE_DATA)
899#    define LZO_MM_COMPACT      1
900#  else
901#    define LZO_MM_SMALL        1
902#  endif
903#elif (LZO_CC_ZORTECHC && defined(__VCM__))
904#  define LZO_MM_LARGE          1
905#else
906#  error "unknown memory model"
907#endif
908#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16)
909#define LZO_HAVE_MM_HUGE_PTR        1
910#define LZO_HAVE_MM_HUGE_ARRAY      1
911#if (LZO_MM_TINY)
912#  undef LZO_HAVE_MM_HUGE_ARRAY
913#endif
914#if (LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_ZORTECHC)
915#  undef LZO_HAVE_MM_HUGE_PTR
916#  undef LZO_HAVE_MM_HUGE_ARRAY
917#elif (LZO_CC_DMC || LZO_CC_SYMANTECC)
918#  undef LZO_HAVE_MM_HUGE_ARRAY
919#elif (LZO_CC_MSC && defined(_QC))
920#  undef LZO_HAVE_MM_HUGE_ARRAY
921#  if (_MSC_VER < 600)
922#    undef LZO_HAVE_MM_HUGE_PTR
923#  endif
924#elif (LZO_CC_TURBOC && (__TURBOC__ < 0x0295))
925#  undef LZO_HAVE_MM_HUGE_ARRAY
926#endif
927#if (LZO_ARCH_I086PM) && !(LZO_HAVE_MM_HUGE_PTR)
928#  if (LZO_OS_DOS16)
929#    error "this should not happen"
930#  elif (LZO_CC_ZORTECHC)
931#  else
932#    error "this should not happen"
933#  endif
934#endif
935#ifdef __cplusplus
936extern "C" {
937#endif
938#if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0200))
939   extern void __near __cdecl _AHSHIFT(void);
940#  define LZO_MM_AHSHIFT      ((unsigned) _AHSHIFT)
941#elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC)
942   extern void __near __cdecl _AHSHIFT(void);
943#  define LZO_MM_AHSHIFT      ((unsigned) _AHSHIFT)
944#elif (LZO_CC_MSC || LZO_CC_TOPSPEEDC)
945   extern void __near __cdecl _AHSHIFT(void);
946#  define LZO_MM_AHSHIFT      ((unsigned) _AHSHIFT)
947#elif (LZO_CC_TURBOC && (__TURBOC__ >= 0x0295))
948   extern void __near __cdecl _AHSHIFT(void);
949#  define LZO_MM_AHSHIFT      ((unsigned) _AHSHIFT)
950#elif ((LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_TURBOC) && LZO_OS_DOS16)
951#  define LZO_MM_AHSHIFT      12
952#elif (LZO_CC_WATCOMC)
953   extern unsigned char _HShift;
954#  define LZO_MM_AHSHIFT      ((unsigned) _HShift)
955#else
956#  error "FIXME - implement LZO_MM_AHSHIFT"
957#endif
958#ifdef __cplusplus
959}
960#endif
961#endif
962#elif (LZO_ARCH_C166)
963#if !defined(__MODEL__)
964#  error "FIXME - C166 __MODEL__"
965#elif ((__MODEL__) == 0)
966#  define LZO_MM_SMALL          1
967#elif ((__MODEL__) == 1)
968#  define LZO_MM_SMALL          1
969#elif ((__MODEL__) == 2)
970#  define LZO_MM_LARGE          1
971#elif ((__MODEL__) == 3)
972#  define LZO_MM_TINY           1
973#elif ((__MODEL__) == 4)
974#  define LZO_MM_XTINY          1
975#elif ((__MODEL__) == 5)
976#  define LZO_MM_XSMALL         1
977#else
978#  error "FIXME - C166 __MODEL__"
979#endif
980#elif (LZO_ARCH_MCS251)
981#if !defined(__MODEL__)
982#  error "FIXME - MCS251 __MODEL__"
983#elif ((__MODEL__) == 0)
984#  define LZO_MM_SMALL          1
985#elif ((__MODEL__) == 2)
986#  define LZO_MM_LARGE          1
987#elif ((__MODEL__) == 3)
988#  define LZO_MM_TINY           1
989#elif ((__MODEL__) == 4)
990#  define LZO_MM_XTINY          1
991#elif ((__MODEL__) == 5)
992#  define LZO_MM_XSMALL         1
993#else
994#  error "FIXME - MCS251 __MODEL__"
995#endif
996#elif (LZO_ARCH_MCS51)
997#if !defined(__MODEL__)
998#  error "FIXME - MCS51 __MODEL__"
999#elif ((__MODEL__) == 1)
1000#  define LZO_MM_SMALL          1
1001#elif ((__MODEL__) == 2)
1002#  define LZO_MM_LARGE          1
1003#elif ((__MODEL__) == 3)
1004#  define LZO_MM_TINY           1
1005#elif ((__MODEL__) == 4)
1006#  define LZO_MM_XTINY          1
1007#elif ((__MODEL__) == 5)
1008#  define LZO_MM_XSMALL         1
1009#else
1010#  error "FIXME - MCS51 __MODEL__"
1011#endif
1012#elif (LZO_ARCH_CRAY_PVP)
1013#  define LZO_MM_PVP            1
1014#else
1015#  define LZO_MM_FLAT           1
1016#endif
1017#if (LZO_MM_COMPACT)
1018#  define LZO_INFO_MM           "compact"
1019#elif (LZO_MM_FLAT)
1020#  define LZO_INFO_MM           "flat"
1021#elif (LZO_MM_HUGE)
1022#  define LZO_INFO_MM           "huge"
1023#elif (LZO_MM_LARGE)
1024#  define LZO_INFO_MM           "large"
1025#elif (LZO_MM_MEDIUM)
1026#  define LZO_INFO_MM           "medium"
1027#elif (LZO_MM_PVP)
1028#  define LZO_INFO_MM           "pvp"
1029#elif (LZO_MM_SMALL)
1030#  define LZO_INFO_MM           "small"
1031#elif (LZO_MM_TINY)
1032#  define LZO_INFO_MM           "tiny"
1033#else
1034#  error "unknown memory model"
1035#endif
1036#endif
1037#if defined(SIZEOF_SHORT)
1038#  define LZO_SIZEOF_SHORT          (SIZEOF_SHORT)
1039#endif
1040#if defined(SIZEOF_INT)
1041#  define LZO_SIZEOF_INT            (SIZEOF_INT)
1042#endif
1043#if defined(SIZEOF_LONG)
1044#  define LZO_SIZEOF_LONG           (SIZEOF_LONG)
1045#endif
1046#if defined(SIZEOF_LONG_LONG)
1047#  define LZO_SIZEOF_LONG_LONG      (SIZEOF_LONG_LONG)
1048#endif
1049#if defined(SIZEOF___INT16)
1050#  define LZO_SIZEOF___INT16        (SIZEOF___INT16)
1051#endif
1052#if defined(SIZEOF___INT32)
1053#  define LZO_SIZEOF___INT32        (SIZEOF___INT32)
1054#endif
1055#if defined(SIZEOF___INT64)
1056#  define LZO_SIZEOF___INT64        (SIZEOF___INT64)
1057#endif
1058#if defined(SIZEOF_VOID_P)
1059#  define LZO_SIZEOF_VOID_P         (SIZEOF_VOID_P)
1060#endif
1061#if defined(SIZEOF_SIZE_T)
1062#  define LZO_SIZEOF_SIZE_T         (SIZEOF_SIZE_T)
1063#endif
1064#if defined(SIZEOF_PTRDIFF_T)
1065#  define LZO_SIZEOF_PTRDIFF_T      (SIZEOF_PTRDIFF_T)
1066#endif
1067#define __LZO_LSR(x,b)    (((x)+0ul) >> (b))
1068#if !defined(LZO_SIZEOF_SHORT)
1069#  if (LZO_ARCH_CRAY_PVP)
1070#    define LZO_SIZEOF_SHORT        8
1071#  elif (USHRT_MAX == LZO_0xffffL)
1072#    define LZO_SIZEOF_SHORT        2
1073#  elif (__LZO_LSR(USHRT_MAX,7) == 1)
1074#    define LZO_SIZEOF_SHORT        1
1075#  elif (__LZO_LSR(USHRT_MAX,15) == 1)
1076#    define LZO_SIZEOF_SHORT        2
1077#  elif (__LZO_LSR(USHRT_MAX,31) == 1)
1078#    define LZO_SIZEOF_SHORT        4
1079#  elif (__LZO_LSR(USHRT_MAX,63) == 1)
1080#    define LZO_SIZEOF_SHORT        8
1081#  elif (__LZO_LSR(USHRT_MAX,127) == 1)
1082#    define LZO_SIZEOF_SHORT        16
1083#  else
1084#    error "LZO_SIZEOF_SHORT"
1085#  endif
1086#endif
1087#if !defined(LZO_SIZEOF_INT)
1088#  if (LZO_ARCH_CRAY_PVP)
1089#    define LZO_SIZEOF_INT          8
1090#  elif (UINT_MAX == LZO_0xffffL)
1091#    define LZO_SIZEOF_INT          2
1092#  elif (UINT_MAX == LZO_0xffffffffL)
1093#    define LZO_SIZEOF_INT          4
1094#  elif (__LZO_LSR(UINT_MAX,7) == 1)
1095#    define LZO_SIZEOF_INT          1
1096#  elif (__LZO_LSR(UINT_MAX,15) == 1)
1097#    define LZO_SIZEOF_INT          2
1098#  elif (__LZO_LSR(UINT_MAX,31) == 1)
1099#    define LZO_SIZEOF_INT          4
1100#  elif (__LZO_LSR(UINT_MAX,63) == 1)
1101#    define LZO_SIZEOF_INT          8
1102#  elif (__LZO_LSR(UINT_MAX,127) == 1)
1103#    define LZO_SIZEOF_INT          16
1104#  else
1105#    error "LZO_SIZEOF_INT"
1106#  endif
1107#endif
1108#if !defined(LZO_SIZEOF_LONG)
1109#  if (ULONG_MAX == LZO_0xffffffffL)
1110#    define LZO_SIZEOF_LONG         4
1111#  elif (__LZO_LSR(ULONG_MAX,7) == 1)
1112#    define LZO_SIZEOF_LONG         1
1113#  elif (__LZO_LSR(ULONG_MAX,15) == 1)
1114#    define LZO_SIZEOF_LONG         2
1115#  elif (__LZO_LSR(ULONG_MAX,31) == 1)
1116#    define LZO_SIZEOF_LONG         4
1117#  elif (__LZO_LSR(ULONG_MAX,63) == 1)
1118#    define LZO_SIZEOF_LONG         8
1119#  elif (__LZO_LSR(ULONG_MAX,127) == 1)
1120#    define LZO_SIZEOF_LONG         16
1121#  else
1122#    error "LZO_SIZEOF_LONG"
1123#  endif
1124#endif
1125#if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64)
1126#if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8)
1127#  if defined(__LONG_MAX__) && defined(__LONG_LONG_MAX__)
1128#    if (LZO_CC_GNUC >= 0x030300ul)
1129#      if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0)
1130#        define LZO_SIZEOF_LONG_LONG      LZO_SIZEOF_LONG
1131#      elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1)
1132#        define LZO_SIZEOF_LONG_LONG      4
1133#      endif
1134#    endif
1135#  endif
1136#endif
1137#endif
1138#if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64)
1139#if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8)
1140#if (LZO_ARCH_I086 && LZO_CC_DMC)
1141#elif (LZO_CC_CILLY) && defined(__GNUC__)
1142#  define LZO_SIZEOF_LONG_LONG      8
1143#elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1144#  define LZO_SIZEOF_LONG_LONG      8
1145#elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400))
1146#  define LZO_SIZEOF_LONG_LONG      8
1147#elif (LZO_OS_WIN64 || defined(_WIN64))
1148#  define LZO_SIZEOF___INT64        8
1149#elif (LZO_ARCH_I386 && (LZO_CC_DMC))
1150#  define LZO_SIZEOF_LONG_LONG      8
1151#elif (LZO_ARCH_I386 && (LZO_CC_SYMANTECC && (__SC__ >= 0x700)))
1152#  define LZO_SIZEOF_LONG_LONG      8
1153#elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__)))
1154#  define LZO_SIZEOF_LONG_LONG      8
1155#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC))
1156#  define LZO_SIZEOF_LONG_LONG      8
1157#elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC))
1158#  define LZO_SIZEOF___INT64        8
1159#elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC))
1160#  define LZO_SIZEOF___INT64        8
1161#elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520)))
1162#  define LZO_SIZEOF___INT64        8
1163#elif (LZO_ARCH_I386 && (LZO_CC_WATCOMC && (__WATCOMC__ >= 1100)))
1164#  define LZO_SIZEOF___INT64        8
1165#elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64))
1166#  define LZO_SIZEOF___INT64        8
1167#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__)
1168#  define LZO_SIZEOF_LONG_LONG      8
1169#elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64)
1170#  define LZO_SIZEOF_LONG_LONG      8
1171#elif (LZO_CC_SDCC) && (LZO_SIZEOF_INT == 2)
1172#elif 1 && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
1173#  define LZO_SIZEOF_LONG_LONG      8
1174#endif
1175#endif
1176#endif
1177#if defined(__cplusplus) && (LZO_CC_GNUC)
1178#  if (LZO_CC_GNUC < 0x020800ul)
1179#    undef LZO_SIZEOF_LONG_LONG
1180#  endif
1181#endif
1182#if (LZO_CFG_NO_LONG_LONG) || defined(__NO_LONG_LONG)
1183#  undef LZO_SIZEOF_LONG_LONG
1184#endif
1185#if !defined(LZO_SIZEOF_VOID_P)
1186#if (LZO_ARCH_I086)
1187#  define __LZO_WORDSIZE            2
1188#  if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM)
1189#    define LZO_SIZEOF_VOID_P       2
1190#  elif (LZO_MM_COMPACT || LZO_MM_LARGE || LZO_MM_HUGE)
1191#    define LZO_SIZEOF_VOID_P       4
1192#  else
1193#    error "LZO_MM"
1194#  endif
1195#elif (LZO_ARCH_AVR || LZO_ARCH_Z80)
1196#  define __LZO_WORDSIZE            1
1197#  define LZO_SIZEOF_VOID_P         2
1198#elif (LZO_ARCH_C166 || LZO_ARCH_MCS51 || LZO_ARCH_MCS251 || LZO_ARCH_MSP430)
1199#  define LZO_SIZEOF_VOID_P         2
1200#elif (LZO_ARCH_H8300)
1201#  if defined(__NORMAL_MODE__)
1202#    define __LZO_WORDSIZE          4
1203#    define LZO_SIZEOF_VOID_P       2
1204#  elif defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
1205#    define __LZO_WORDSIZE          4
1206#    define LZO_SIZEOF_VOID_P       4
1207#  else
1208#    define __LZO_WORDSIZE          2
1209#    define LZO_SIZEOF_VOID_P       2
1210#  endif
1211#  if (LZO_CC_GNUC && (LZO_CC_GNUC < 0x040000ul)) && (LZO_SIZEOF_INT == 4)
1212#    define LZO_SIZEOF_SIZE_T       LZO_SIZEOF_INT
1213#    define LZO_SIZEOF_PTRDIFF_T    LZO_SIZEOF_INT
1214#  endif
1215#elif (LZO_ARCH_M16C)
1216#  define __LZO_WORDSIZE            2
1217#  if defined(__m32c_cpu__) || defined(__m32cm_cpu__)
1218#    define LZO_SIZEOF_VOID_P       4
1219#  else
1220#    define LZO_SIZEOF_VOID_P       2
1221#  endif
1222#elif (LZO_SIZEOF_LONG == 8) && ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__))
1223#  define __LZO_WORDSIZE            8
1224#  define LZO_SIZEOF_VOID_P         4
1225#elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64)
1226#  define __LZO_WORDSIZE            8
1227#  define LZO_SIZEOF_VOID_P         8
1228#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__)
1229#  define LZO_SIZEOF_VOID_P         LZO_SIZEOF_LONG
1230#  define LZO_SIZEOF_SIZE_T         LZO_SIZEOF_LONG
1231#  define LZO_SIZEOF_PTRDIFF_T      LZO_SIZEOF_LONG
1232#elif (LZO_OS_OS400 || defined(__OS400__))
1233#  define __LZO_WORDSIZE            LZO_SIZEOF_LONG
1234#  define LZO_SIZEOF_VOID_P         16
1235#  define LZO_SIZEOF_SIZE_T         LZO_SIZEOF_LONG
1236#  define LZO_SIZEOF_PTRDIFF_T      LZO_SIZEOF_LONG
1237#elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64)
1238#  define LZO_SIZEOF_VOID_P         8
1239#  define LZO_SIZEOF_SIZE_T         LZO_SIZEOF_LONG
1240#  define LZO_SIZEOF_PTRDIFF_T      LZO_SIZEOF_LONG
1241#elif (LZO_ARCH_SPU)
1242# if 0
1243#  define __LZO_WORDSIZE            16
1244# endif
1245#  define LZO_SIZEOF_VOID_P         4
1246#else
1247#  define LZO_SIZEOF_VOID_P         LZO_SIZEOF_LONG
1248#endif
1249#endif
1250#if !defined(LZO_WORDSIZE)
1251#  if defined(__LZO_WORDSIZE)
1252#    define LZO_WORDSIZE            __LZO_WORDSIZE
1253#  else
1254#    define LZO_WORDSIZE            LZO_SIZEOF_VOID_P
1255#  endif
1256#endif
1257#if !defined(LZO_SIZEOF_SIZE_T)
1258#if (LZO_ARCH_I086 || LZO_ARCH_M16C)
1259#  define LZO_SIZEOF_SIZE_T         2
1260#else
1261#  define LZO_SIZEOF_SIZE_T         LZO_SIZEOF_VOID_P
1262#endif
1263#endif
1264#if !defined(LZO_SIZEOF_PTRDIFF_T)
1265#if (LZO_ARCH_I086)
1266#  if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM || LZO_MM_HUGE)
1267#    define LZO_SIZEOF_PTRDIFF_T    LZO_SIZEOF_VOID_P
1268#  elif (LZO_MM_COMPACT || LZO_MM_LARGE)
1269#    if (LZO_CC_BORLANDC || LZO_CC_TURBOC)
1270#      define LZO_SIZEOF_PTRDIFF_T  4
1271#    else
1272#      define LZO_SIZEOF_PTRDIFF_T  2
1273#    endif
1274#  else
1275#    error "LZO_MM"
1276#  endif
1277#else
1278#  define LZO_SIZEOF_PTRDIFF_T      LZO_SIZEOF_SIZE_T
1279#endif
1280#endif
1281#if (LZO_ABI_NEUTRAL_ENDIAN)
1282#  undef LZO_ABI_BIG_ENDIAN
1283#  undef LZO_ABI_LITTLE_ENDIAN
1284#elif !(LZO_ABI_BIG_ENDIAN) && !(LZO_ABI_LITTLE_ENDIAN)
1285#if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP)
1286#  define LZO_ABI_BIG_ENDIAN        1
1287#elif (LZO_ARCH_IA64) && (LZO_OS_POSIX_LINUX || LZO_OS_WIN64)
1288#  define LZO_ABI_LITTLE_ENDIAN     1
1289#elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430)
1290#  define LZO_ABI_LITTLE_ENDIAN     1
1291#elif (LZO_ARCH_AVR32 || LZO_ARCH_M68K || LZO_ARCH_S390)
1292#  define LZO_ABI_BIG_ENDIAN        1
1293#elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__)
1294#  if (__LITTLE_ENDIAN__ == 1)
1295#    define LZO_ABI_LITTLE_ENDIAN   1
1296#  else
1297#    define LZO_ABI_BIG_ENDIAN      1
1298#  endif
1299#elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
1300#  define LZO_ABI_BIG_ENDIAN        1
1301#elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
1302#  define LZO_ABI_LITTLE_ENDIAN     1
1303#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__)
1304#  define LZO_ABI_BIG_ENDIAN        1
1305#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__)
1306#  define LZO_ABI_LITTLE_ENDIAN     1
1307#elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__)
1308#  define LZO_ABI_BIG_ENDIAN        1
1309#elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__)
1310#  define LZO_ABI_LITTLE_ENDIAN     1
1311#endif
1312#endif
1313#if (LZO_ABI_BIG_ENDIAN) && (LZO_ABI_LITTLE_ENDIAN)
1314#  error "this should not happen"
1315#endif
1316#if (LZO_ABI_BIG_ENDIAN)
1317#  define LZO_INFO_ABI_ENDIAN       "be"
1318#elif (LZO_ABI_LITTLE_ENDIAN)
1319#  define LZO_INFO_ABI_ENDIAN       "le"
1320#elif (LZO_ABI_NEUTRAL_ENDIAN)
1321#  define LZO_INFO_ABI_ENDIAN       "neutral"
1322#endif
1323#if (LZO_SIZEOF_INT == 1 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2)
1324#  define LZO_ABI_I8LP16         1
1325#  define LZO_INFO_ABI_PM       "i8lp16"
1326#elif (LZO_SIZEOF_INT == 2 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2)
1327#  define LZO_ABI_ILP16         1
1328#  define LZO_INFO_ABI_PM       "ilp16"
1329#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 4)
1330#  define LZO_ABI_ILP32         1
1331#  define LZO_INFO_ABI_PM       "ilp32"
1332#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 8 && LZO_SIZEOF_SIZE_T == 8)
1333#  define LZO_ABI_LLP64         1
1334#  define LZO_INFO_ABI_PM       "llp64"
1335#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8)
1336#  define LZO_ABI_LP64          1
1337#  define LZO_INFO_ABI_PM       "lp64"
1338#elif (LZO_SIZEOF_INT == 8 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8)
1339#  define LZO_ABI_ILP64         1
1340#  define LZO_INFO_ABI_PM       "ilp64"
1341#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 4)
1342#  define LZO_ABI_IP32L64       1
1343#  define LZO_INFO_ABI_PM       "ip32l64"
1344#endif
1345#if !defined(__LZO_LIBC_OVERRIDE)
1346#if (LZO_LIBC_NAKED)
1347#  define LZO_INFO_LIBC         "naked"
1348#elif (LZO_LIBC_FREESTANDING)
1349#  define LZO_INFO_LIBC         "freestanding"
1350#elif (LZO_LIBC_MOSTLY_FREESTANDING)
1351#  define LZO_INFO_LIBC         "mfreestanding"
1352#elif (LZO_LIBC_ISOC90)
1353#  define LZO_INFO_LIBC         "isoc90"
1354#elif (LZO_LIBC_ISOC99)
1355#  define LZO_INFO_LIBC         "isoc99"
1356#elif defined(__dietlibc__)
1357#  define LZO_LIBC_DIETLIBC     1
1358#  define LZO_INFO_LIBC         "dietlibc"
1359#elif defined(_NEWLIB_VERSION)
1360#  define LZO_LIBC_NEWLIB       1
1361#  define LZO_INFO_LIBC         "newlib"
1362#elif defined(__UCLIBC__) && defined(__UCLIBC_MAJOR__) && defined(__UCLIBC_MINOR__)
1363#  if defined(__UCLIBC_SUBLEVEL__)
1364#    define LZO_LIBC_UCLIBC     (__UCLIBC_MAJOR__ * 0x10000L + __UCLIBC_MINOR__ * 0x100 + __UCLIBC_SUBLEVEL__)
1365#  else
1366#    define LZO_LIBC_UCLIBC     0x00090bL
1367#  endif
1368#  define LZO_INFO_LIBC         "uclibc"
1369#elif defined(__GLIBC__) && defined(__GLIBC_MINOR__)
1370#  define LZO_LIBC_GLIBC        (__GLIBC__ * 0x10000L + __GLIBC_MINOR__ * 0x100)
1371#  define LZO_INFO_LIBC         "glibc"
1372#elif (LZO_CC_MWERKS) && defined(__MSL__)
1373#  define LZO_LIBC_MSL          __MSL__
1374#  define LZO_INFO_LIBC         "msl"
1375#elif 1 && defined(__IAR_SYSTEMS_ICC__)
1376#  define LZO_LIBC_ISOC90       1
1377#  define LZO_INFO_LIBC         "isoc90"
1378#else
1379#  define LZO_LIBC_DEFAULT      1
1380#  define LZO_INFO_LIBC         "default"
1381#endif
1382#endif
1383#if !defined(__lzo_gnuc_extension__)
1384#if (LZO_CC_GNUC >= 0x020800ul)
1385#  define __lzo_gnuc_extension__    __extension__
1386#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1387#  define __lzo_gnuc_extension__    __extension__
1388#else
1389#  define __lzo_gnuc_extension__    /*empty*/
1390#endif
1391#endif
1392#if !defined(__lzo_ua_volatile)
1393#  define __lzo_ua_volatile     volatile
1394#endif
1395#if !defined(__lzo_alignof)
1396#if (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI)
1397#  define __lzo_alignof(e)      __alignof__(e)
1398#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700))
1399#  define __lzo_alignof(e)      __alignof__(e)
1400#elif (LZO_CC_MSC && (_MSC_VER >= 1300))
1401#  define __lzo_alignof(e)      __alignof(e)
1402#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100))
1403#  define __lzo_alignof(e)      __alignof__(e)
1404#endif
1405#endif
1406#if defined(__lzo_alignof)
1407#  define __lzo_HAVE_alignof 1
1408#endif
1409#if !defined(__lzo_constructor)
1410#if (LZO_CC_GNUC >= 0x030400ul)
1411#  define __lzo_constructor     __attribute__((__constructor__,__used__))
1412#elif (LZO_CC_GNUC >= 0x020700ul)
1413#  define __lzo_constructor     __attribute__((__constructor__))
1414#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1415#  define __lzo_constructor     __attribute__((__constructor__))
1416#endif
1417#endif
1418#if defined(__lzo_constructor)
1419#  define __lzo_HAVE_constructor 1
1420#endif
1421#if !defined(__lzo_destructor)
1422#if (LZO_CC_GNUC >= 0x030400ul)
1423#  define __lzo_destructor      __attribute__((__destructor__,__used__))
1424#elif (LZO_CC_GNUC >= 0x020700ul)
1425#  define __lzo_destructor      __attribute__((__destructor__))
1426#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1427#  define __lzo_destructor      __attribute__((__destructor__))
1428#endif
1429#endif
1430#if defined(__lzo_destructor)
1431#  define __lzo_HAVE_destructor 1
1432#endif
1433#if (__lzo_HAVE_destructor) && !(__lzo_HAVE_constructor)
1434#  error "this should not happen"
1435#endif
1436#if !defined(__lzo_inline)
1437#if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295))
1438#elif defined(__cplusplus)
1439#  define __lzo_inline          inline
1440#elif (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0550))
1441#  define __lzo_inline          __inline
1442#elif (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI)
1443#  define __lzo_inline          __inline__
1444#elif (LZO_CC_DMC)
1445#  define __lzo_inline          __inline
1446#elif (LZO_CC_INTELC)
1447#  define __lzo_inline          __inline
1448#elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x2405))
1449#  define __lzo_inline          __inline
1450#elif (LZO_CC_MSC && (_MSC_VER >= 900))
1451#  define __lzo_inline          __inline
1452#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100))
1453#  define __lzo_inline          __inline__
1454#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
1455#  define __lzo_inline          inline
1456#endif
1457#endif
1458#if defined(__lzo_inline)
1459#  define __lzo_HAVE_inline 1
1460#else
1461#  define __lzo_inline          /*empty*/
1462#endif
1463#if !defined(__lzo_forceinline)
1464#if (LZO_CC_GNUC >= 0x030200ul)
1465#  define __lzo_forceinline     __inline__ __attribute__((__always_inline__))
1466#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC)
1467#  define __lzo_forceinline     __forceinline
1468#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC)
1469#  define __lzo_forceinline     __inline__ __attribute__((__always_inline__))
1470#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1471#  define __lzo_forceinline     __inline__ __attribute__((__always_inline__))
1472#elif (LZO_CC_MSC && (_MSC_VER >= 1200))
1473#  define __lzo_forceinline     __forceinline
1474#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100))
1475#  define __lzo_forceinline     __inline__ __attribute__((__always_inline__))
1476#endif
1477#endif
1478#if defined(__lzo_forceinline)
1479#  define __lzo_HAVE_forceinline 1
1480#else
1481#  define __lzo_forceinline     /*empty*/
1482#endif
1483#if !defined(__lzo_noinline)
1484#if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul)
1485#  define __lzo_noinline        __attribute__((__noinline__,__used__))
1486#elif (LZO_CC_GNUC >= 0x030200ul)
1487#  define __lzo_noinline        __attribute__((__noinline__))
1488#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC)
1489#  define __lzo_noinline        __declspec(noinline)
1490#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC)
1491#  define __lzo_noinline        __attribute__((__noinline__))
1492#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1493#  define __lzo_noinline        __attribute__((__noinline__))
1494#elif (LZO_CC_MSC && (_MSC_VER >= 1300))
1495#  define __lzo_noinline        __declspec(noinline)
1496#elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x3200) && (LZO_OS_WIN32 || LZO_OS_WIN64))
1497#  if defined(__cplusplus)
1498#  else
1499#    define __lzo_noinline      __declspec(noinline)
1500#  endif
1501#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100))
1502#  define __lzo_noinline        __attribute__((__noinline__))
1503#endif
1504#endif
1505#if defined(__lzo_noinline)
1506#  define __lzo_HAVE_noinline 1
1507#else
1508#  define __lzo_noinline        /*empty*/
1509#endif
1510#if (__lzo_HAVE_forceinline || __lzo_HAVE_noinline) && !(__lzo_HAVE_inline)
1511#  error "this should not happen"
1512#endif
1513#if !defined(__lzo_noreturn)
1514#if (LZO_CC_GNUC >= 0x020700ul)
1515#  define __lzo_noreturn        __attribute__((__noreturn__))
1516#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC)
1517#  define __lzo_noreturn        __declspec(noreturn)
1518#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC)
1519#  define __lzo_noreturn        __attribute__((__noreturn__))
1520#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1521#  define __lzo_noreturn        __attribute__((__noreturn__))
1522#elif (LZO_CC_MSC && (_MSC_VER >= 1200))
1523#  define __lzo_noreturn        __declspec(noreturn)
1524#endif
1525#endif
1526#if defined(__lzo_noreturn)
1527#  define __lzo_HAVE_noreturn 1
1528#else
1529#  define __lzo_noreturn        /*empty*/
1530#endif
1531#if !defined(__lzo_nothrow)
1532#if (LZO_CC_GNUC >= 0x030300ul)
1533#  define __lzo_nothrow         __attribute__((__nothrow__))
1534#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus)
1535#  define __lzo_nothrow         __declspec(nothrow)
1536#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 900) && LZO_CC_SYNTAX_GNUC)
1537#  define __lzo_nothrow         __attribute__((__nothrow__))
1538#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1539#  define __lzo_nothrow         __attribute__((__nothrow__))
1540#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus)
1541#  define __lzo_nothrow         __declspec(nothrow)
1542#endif
1543#endif
1544#if defined(__lzo_nothrow)
1545#  define __lzo_HAVE_nothrow 1
1546#else
1547#  define __lzo_nothrow         /*empty*/
1548#endif
1549#if !defined(__lzo_restrict)
1550#if (LZO_CC_GNUC >= 0x030400ul)
1551#  define __lzo_restrict        __restrict__
1552#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC)
1553#  define __lzo_restrict        __restrict__
1554#elif (LZO_CC_CLANG || LZO_CC_LLVM)
1555#  define __lzo_restrict        __restrict__
1556#elif (LZO_CC_MSC && (_MSC_VER >= 1400))
1557#  define __lzo_restrict        __restrict
1558#endif
1559#endif
1560#if defined(__lzo_restrict)
1561#  define __lzo_HAVE_restrict 1
1562#else
1563#  define __lzo_restrict        /*empty*/
1564#endif
1565#if !defined(__lzo_likely) && !defined(__lzo_unlikely)
1566#if (LZO_CC_GNUC >= 0x030200ul)
1567#  define __lzo_likely(e)       (__builtin_expect(!!(e),1))
1568#  define __lzo_unlikely(e)     (__builtin_expect(!!(e),0))
1569#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800))
1570#  define __lzo_likely(e)       (__builtin_expect(!!(e),1))
1571#  define __lzo_unlikely(e)     (__builtin_expect(!!(e),0))
1572#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1573#  define __lzo_likely(e)       (__builtin_expect(!!(e),1))
1574#  define __lzo_unlikely(e)     (__builtin_expect(!!(e),0))
1575#endif
1576#endif
1577#if defined(__lzo_likely)
1578#  define __lzo_HAVE_likely 1
1579#else
1580#  define __lzo_likely(e)       (e)
1581#endif
1582#if defined(__lzo_unlikely)
1583#  define __lzo_HAVE_unlikely 1
1584#else
1585#  define __lzo_unlikely(e)     (e)
1586#endif
1587#if !defined(LZO_UNUSED)
1588#  if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600))
1589#    define LZO_UNUSED(var)         ((void) &var)
1590#  elif (LZO_CC_BORLANDC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PELLESC || LZO_CC_TURBOC)
1591#    define LZO_UNUSED(var)         if (&var) ; else
1592#  elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1593#    define LZO_UNUSED(var)         ((void) var)
1594#  elif (LZO_CC_MSC && (_MSC_VER < 900))
1595#    define LZO_UNUSED(var)         if (&var) ; else
1596#  elif (LZO_CC_KEILC)
1597#    define LZO_UNUSED(var)         {extern int __lzo_unused[1-2*!(sizeof(var)>0)];}
1598#  elif (LZO_CC_PACIFICC)
1599#    define LZO_UNUSED(var)         ((void) sizeof(var))
1600#  elif (LZO_CC_WATCOMC) && defined(__cplusplus)
1601#    define LZO_UNUSED(var)         ((void) var)
1602#  else
1603#    define LZO_UNUSED(var)         ((void) &var)
1604#  endif
1605#endif
1606#if !defined(LZO_UNUSED_FUNC)
1607#  if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600))
1608#    define LZO_UNUSED_FUNC(func)   ((void) func)
1609#  elif (LZO_CC_BORLANDC || LZO_CC_NDPC || LZO_CC_TURBOC)
1610#    define LZO_UNUSED_FUNC(func)   if (func) ; else
1611#  elif (LZO_CC_CLANG || LZO_CC_LLVM)
1612#    define LZO_UNUSED_FUNC(func)   ((void) &func)
1613#  elif (LZO_CC_MSC && (_MSC_VER < 900))
1614#    define LZO_UNUSED_FUNC(func)   if (func) ; else
1615#  elif (LZO_CC_MSC)
1616#    define LZO_UNUSED_FUNC(func)   ((void) &func)
1617#  elif (LZO_CC_KEILC || LZO_CC_PELLESC)
1618#    define LZO_UNUSED_FUNC(func)   {extern int __lzo_unused[1-2*!(sizeof((int)func)>0)];}
1619#  else
1620#    define LZO_UNUSED_FUNC(func)   ((void) func)
1621#  endif
1622#endif
1623#if !defined(LZO_UNUSED_LABEL)
1624#  if (LZO_CC_WATCOMC) && defined(__cplusplus)
1625#    define LZO_UNUSED_LABEL(l)     switch(0) case 1:goto l
1626#  elif (LZO_CC_CLANG || LZO_CC_INTELC || LZO_CC_WATCOMC)
1627#    define LZO_UNUSED_LABEL(l)     if (0) goto l
1628#  else
1629#    define LZO_UNUSED_LABEL(l)     switch(0) case 1:goto l
1630#  endif
1631#endif
1632#if !defined(LZO_DEFINE_UNINITIALIZED_VAR)
1633#  if 0
1634#    define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init)  type var
1635#  elif 0 && (LZO_CC_GNUC)
1636#    define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init)  type var = var
1637#  else
1638#    define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init)  type var = init
1639#  endif
1640#endif
1641#if !defined(LZO_UNCONST_CAST)
1642#  if 0 && defined(__cplusplus)
1643#    define LZO_UNCONST_CAST(t,e)   (const_cast<t> (e))
1644#  elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE)
1645#    define LZO_UNCONST_CAST(t,e)   ((t) ((void *) ((char *) ((lzo_uintptr_t) ((const void *) (e))))))
1646#  else
1647#    define LZO_UNCONST_CAST(t,e)   ((t) ((void *) ((char *) ((const void *) (e)))))
1648#  endif
1649#endif
1650#if !defined(LZO_COMPILE_TIME_ASSERT_HEADER)
1651#  if (LZO_CC_AZTECC || LZO_CC_ZORTECHC)
1652#    define LZO_COMPILE_TIME_ASSERT_HEADER(e)  extern int __lzo_cta[1-!(e)];
1653#  elif (LZO_CC_DMC || LZO_CC_SYMANTECC)
1654#    define LZO_COMPILE_TIME_ASSERT_HEADER(e)  extern int __lzo_cta[1u-2*!(e)];
1655#  elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295))
1656#    define LZO_COMPILE_TIME_ASSERT_HEADER(e)  extern int __lzo_cta[1-!(e)];
1657#  else
1658#    define LZO_COMPILE_TIME_ASSERT_HEADER(e)  extern int __lzo_cta[1-2*!(e)];
1659#  endif
1660#endif
1661#if !defined(LZO_COMPILE_TIME_ASSERT)
1662#  if (LZO_CC_AZTECC)
1663#    define LZO_COMPILE_TIME_ASSERT(e)  {typedef int __lzo_cta_t[1-!(e)];}
1664#  elif (LZO_CC_DMC || LZO_CC_PACIFICC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC)
1665#    define LZO_COMPILE_TIME_ASSERT(e)  switch(0) case 1:case !(e):break;
1666#  elif (LZO_CC_MSC && (_MSC_VER < 900))
1667#    define LZO_COMPILE_TIME_ASSERT(e)  switch(0) case 1:case !(e):break;
1668#  elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295))
1669#    define LZO_COMPILE_TIME_ASSERT(e)  switch(0) case 1:case !(e):break;
1670#  else
1671#    define LZO_COMPILE_TIME_ASSERT(e)  {typedef int __lzo_cta_t[1-2*!(e)];}
1672#  endif
1673#endif
1674#if (LZO_ARCH_I086 || LZO_ARCH_I386) && (LZO_OS_DOS16 || LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_OS216 || LZO_OS_WIN16 || LZO_OS_WIN32 || LZO_OS_WIN64)
1675#  if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC)
1676#  elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC)
1677#    define __lzo_cdecl                 __cdecl
1678#    define __lzo_cdecl_atexit          /*empty*/
1679#    define __lzo_cdecl_main            __cdecl
1680#    if (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC))
1681#      define __lzo_cdecl_qsort         __pascal
1682#    elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC))
1683#      define __lzo_cdecl_qsort         _stdcall
1684#    else
1685#      define __lzo_cdecl_qsort         __cdecl
1686#    endif
1687#  elif (LZO_CC_WATCOMC)
1688#    define __lzo_cdecl                 __cdecl
1689#  else
1690#    define __lzo_cdecl                 __cdecl
1691#    define __lzo_cdecl_atexit          __cdecl
1692#    define __lzo_cdecl_main            __cdecl
1693#    define __lzo_cdecl_qsort           __cdecl
1694#  endif
1695#  if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC || LZO_CC_WATCOMC)
1696#  elif (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC))
1697#    define __lzo_cdecl_sighandler      __pascal
1698#  elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC))
1699#    define __lzo_cdecl_sighandler      _stdcall
1700#  elif (LZO_CC_MSC && (_MSC_VER >= 1400)) && defined(_M_CEE_PURE)
1701#    define __lzo_cdecl_sighandler      __clrcall
1702#  elif (LZO_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700))
1703#    if defined(_DLL)
1704#      define __lzo_cdecl_sighandler    _far _cdecl _loadds
1705#    elif defined(_MT)
1706#      define __lzo_cdecl_sighandler    _far _cdecl
1707#    else
1708#      define __lzo_cdecl_sighandler    _cdecl
1709#    endif
1710#  else
1711#    define __lzo_cdecl_sighandler      __cdecl
1712#  endif
1713#elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC)
1714#  define __lzo_cdecl                   __cdecl
1715#elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC))
1716#  define __lzo_cdecl                   cdecl
1717#endif
1718#if !defined(__lzo_cdecl)
1719#  define __lzo_cdecl                   /*empty*/
1720#endif
1721#if !defined(__lzo_cdecl_atexit)
1722#  define __lzo_cdecl_atexit            /*empty*/
1723#endif
1724#if !defined(__lzo_cdecl_main)
1725#  define __lzo_cdecl_main              /*empty*/
1726#endif
1727#if !defined(__lzo_cdecl_qsort)
1728#  define __lzo_cdecl_qsort             /*empty*/
1729#endif
1730#if !defined(__lzo_cdecl_sighandler)
1731#  define __lzo_cdecl_sighandler        /*empty*/
1732#endif
1733#if !defined(__lzo_cdecl_va)
1734#  define __lzo_cdecl_va                __lzo_cdecl
1735#endif
1736#if !(LZO_CFG_NO_WINDOWS_H)
1737#if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64)
1738#  if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000))
1739#  elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__)
1740#  elif ((LZO_OS_CYGWIN || defined(__MINGW32__)) && (LZO_CC_GNUC && (LZO_CC_GNUC < 0x025f00ul)))
1741#  else
1742#    define LZO_HAVE_WINDOWS_H 1
1743#  endif
1744#endif
1745#endif
1746#if (LZO_ARCH_ALPHA)
1747#  define LZO_OPT_AVOID_UINT_INDEX  1
1748#  define LZO_OPT_AVOID_SHORT       1
1749#  define LZO_OPT_AVOID_USHORT      1
1750#elif (LZO_ARCH_AMD64)
1751#  define LZO_OPT_AVOID_INT_INDEX   1
1752#  define LZO_OPT_AVOID_UINT_INDEX  1
1753#  define LZO_OPT_UNALIGNED16       1
1754#  define LZO_OPT_UNALIGNED32       1
1755#  define LZO_OPT_UNALIGNED64       1
1756#elif (LZO_ARCH_ARM && LZO_ARCH_ARM_THUMB)
1757#elif (LZO_ARCH_ARM)
1758#  define LZO_OPT_AVOID_SHORT       1
1759#  define LZO_OPT_AVOID_USHORT      1
1760#elif (LZO_ARCH_CRIS)
1761#  define LZO_OPT_UNALIGNED16       1
1762#  define LZO_OPT_UNALIGNED32       1
1763#elif (LZO_ARCH_I386)
1764#  define LZO_OPT_UNALIGNED16       1
1765#  define LZO_OPT_UNALIGNED32       1
1766#elif (LZO_ARCH_IA64)
1767#  define LZO_OPT_AVOID_INT_INDEX   1
1768#  define LZO_OPT_AVOID_UINT_INDEX  1
1769#  define LZO_OPT_PREFER_POSTINC    1
1770#elif (LZO_ARCH_M68K)
1771#  define LZO_OPT_PREFER_POSTINC    1
1772#  define LZO_OPT_PREFER_PREDEC     1
1773#  if defined(__mc68020__) && !defined(__mcoldfire__)
1774#    define LZO_OPT_UNALIGNED16     1
1775#    define LZO_OPT_UNALIGNED32     1
1776#  endif
1777#elif (LZO_ARCH_MIPS)
1778#  define LZO_OPT_AVOID_UINT_INDEX  1
1779#elif (LZO_ARCH_POWERPC)
1780#  define LZO_OPT_PREFER_PREINC     1
1781#  define LZO_OPT_PREFER_PREDEC     1
1782#  if (LZO_ABI_BIG_ENDIAN)
1783#    define LZO_OPT_UNALIGNED16     1
1784#    define LZO_OPT_UNALIGNED32     1
1785#  endif
1786#elif (LZO_ARCH_S390)
1787#  define LZO_OPT_UNALIGNED16       1
1788#  define LZO_OPT_UNALIGNED32       1
1789#  if (LZO_SIZEOF_SIZE_T == 8)
1790#    define LZO_OPT_UNALIGNED64     1
1791#  endif
1792#elif (LZO_ARCH_SH)
1793#  define LZO_OPT_PREFER_POSTINC    1
1794#  define LZO_OPT_PREFER_PREDEC     1
1795#endif
1796#ifndef LZO_CFG_NO_INLINE_ASM
1797#if (LZO_CC_LLVM)
1798#  define LZO_CFG_NO_INLINE_ASM 1
1799#endif
1800#endif
1801#ifndef LZO_CFG_NO_UNALIGNED
1802#if (LZO_ABI_NEUTRAL_ENDIAN) || (LZO_ARCH_GENERIC)
1803#  define LZO_CFG_NO_UNALIGNED 1
1804#endif
1805#endif
1806#if (LZO_CFG_NO_UNALIGNED)
1807#  undef LZO_OPT_UNALIGNED16
1808#  undef LZO_OPT_UNALIGNED32
1809#  undef LZO_OPT_UNALIGNED64
1810#endif
1811#if (LZO_CFG_NO_INLINE_ASM)
1812#elif (LZO_ARCH_I386 && (LZO_OS_DOS32 || LZO_OS_WIN32) && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC))
1813#  define LZO_ASM_SYNTAX_MSC 1
1814#elif (LZO_OS_WIN64 && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC))
1815#elif (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC == 0x011f00ul))
1816#elif (LZO_ARCH_I386 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE))
1817#  define LZO_ASM_SYNTAX_GNUC 1
1818#elif (LZO_ARCH_AMD64 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE))
1819#  define LZO_ASM_SYNTAX_GNUC 1
1820#endif
1821#if (LZO_ASM_SYNTAX_GNUC)
1822#if (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC < 0x020000ul))
1823#  define __LZO_ASM_CLOBBER         "ax"
1824#elif (LZO_CC_INTELC)
1825#  define __LZO_ASM_CLOBBER         "memory"
1826#else
1827#  define __LZO_ASM_CLOBBER         "cc", "memory"
1828#endif
1829#endif
1830#if defined(__LZO_INFOSTR_MM)
1831#elif (LZO_MM_FLAT) && (defined(__LZO_INFOSTR_PM) || defined(LZO_INFO_ABI_PM))
1832#  define __LZO_INFOSTR_MM          ""
1833#elif defined(LZO_INFO_MM)
1834#  define __LZO_INFOSTR_MM          "." LZO_INFO_MM
1835#else
1836#  define __LZO_INFOSTR_MM          ""
1837#endif
1838#if defined(__LZO_INFOSTR_PM)
1839#elif defined(LZO_INFO_ABI_PM)
1840#  define __LZO_INFOSTR_PM          "." LZO_INFO_ABI_PM
1841#else
1842#  define __LZO_INFOSTR_PM          ""
1843#endif
1844#if defined(__LZO_INFOSTR_ENDIAN)
1845#elif defined(LZO_INFO_ABI_ENDIAN)
1846#  define __LZO_INFOSTR_ENDIAN      "." LZO_INFO_ABI_ENDIAN
1847#else
1848#  define __LZO_INFOSTR_ENDIAN      ""
1849#endif
1850#if defined(__LZO_INFOSTR_OSNAME)
1851#elif defined(LZO_INFO_OS_CONSOLE)
1852#  define __LZO_INFOSTR_OSNAME      LZO_INFO_OS "." LZO_INFO_OS_CONSOLE
1853#elif defined(LZO_INFO_OS_POSIX)
1854#  define __LZO_INFOSTR_OSNAME      LZO_INFO_OS "." LZO_INFO_OS_POSIX
1855#else
1856#  define __LZO_INFOSTR_OSNAME      LZO_INFO_OS
1857#endif
1858#if defined(__LZO_INFOSTR_LIBC)
1859#elif defined(LZO_INFO_LIBC)
1860#  define __LZO_INFOSTR_LIBC        "." LZO_INFO_LIBC
1861#else
1862#  define __LZO_INFOSTR_LIBC        ""
1863#endif
1864#if defined(__LZO_INFOSTR_CCVER)
1865#elif defined(LZO_INFO_CCVER)
1866#  define __LZO_INFOSTR_CCVER       " " LZO_INFO_CCVER
1867#else
1868#  define __LZO_INFOSTR_CCVER       ""
1869#endif
1870#define LZO_INFO_STRING \
1871    LZO_INFO_ARCH __LZO_INFOSTR_MM __LZO_INFOSTR_PM __LZO_INFOSTR_ENDIAN \
1872    " " __LZO_INFOSTR_OSNAME __LZO_INFOSTR_LIBC " " LZO_INFO_CC __LZO_INFOSTR_CCVER
1873
1874#endif
1875
1876#endif
1877
1878#undef LZO_HAVE_CONFIG_H
1879#include "minilzo.h"
1880
1881#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2060)
1882#  error "version mismatch in miniLZO source files"
1883#endif
1884
1885#ifdef MINILZO_HAVE_CONFIG_H
1886#  define LZO_HAVE_CONFIG_H 1
1887#endif
1888
1889#ifndef __LZO_CONF_H
1890#define __LZO_CONF_H 1
1891
1892#if !defined(__LZO_IN_MINILZO)
1893#if (LZO_CFG_FREESTANDING)
1894#  define LZO_LIBC_FREESTANDING 1
1895#  define LZO_OS_FREESTANDING 1
1896#  define ACC_LIBC_FREESTANDING 1
1897#  define ACC_OS_FREESTANDING 1
1898#endif
1899#if (LZO_CFG_NO_UNALIGNED)
1900#  define ACC_CFG_NO_UNALIGNED 1
1901#endif
1902#if (LZO_ARCH_GENERIC)
1903#  define ACC_ARCH_GENERIC 1
1904#endif
1905#if (LZO_ABI_NEUTRAL_ENDIAN)
1906#  define ACC_ABI_NEUTRAL_ENDIAN 1
1907#endif
1908#if (LZO_HAVE_CONFIG_H)
1909#  define ACC_CONFIG_NO_HEADER 1
1910#endif
1911#if defined(LZO_CFG_EXTRA_CONFIG_HEADER)
1912#  include LZO_CFG_EXTRA_CONFIG_HEADER
1913#endif
1914#if defined(__LZOCONF_H) || defined(__LZOCONF_H_INCLUDED)
1915#  error "include this file first"
1916#endif
1917#include "lzo/lzoconf.h"
1918#endif
1919
1920#if (LZO_VERSION < 0x02000) || !defined(__LZOCONF_H_INCLUDED)
1921#  error "version mismatch"
1922#endif
1923
1924#if (LZO_CC_BORLANDC && LZO_ARCH_I086)
1925#  pragma option -h
1926#endif
1927
1928#if (LZO_CC_MSC && (_MSC_VER >= 1000))
1929#  pragma warning(disable: 4127 4701)
1930#endif
1931#if (LZO_CC_MSC && (_MSC_VER >= 1300))
1932#  pragma warning(disable: 4820)
1933#  pragma warning(disable: 4514 4710 4711)
1934#endif
1935
1936#if (LZO_CC_SUNPROC)
1937#if !defined(__cplusplus)
1938#  pragma error_messages(off,E_END_OF_LOOP_CODE_NOT_REACHED)
1939#  pragma error_messages(off,E_LOOP_NOT_ENTERED_AT_TOP)
1940#  pragma error_messages(off,E_STATEMENT_NOT_REACHED)
1941#endif
1942#endif
1943
1944#if (__LZO_MMODEL_HUGE) && !(LZO_HAVE_MM_HUGE_PTR)
1945#  error "this should not happen - check defines for __huge"
1946#endif
1947
1948#if defined(__LZO_IN_MINILZO) || defined(LZO_CFG_FREESTANDING)
1949#elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16)
1950#  define ACC_WANT_ACC_INCD_H 1
1951#  define ACC_WANT_ACC_INCE_H 1
1952#  define ACC_WANT_ACC_INCI_H 1
1953#elif 1
1954#  include <string.h>
1955#else
1956#  define ACC_WANT_ACC_INCD_H 1
1957#endif
1958
1959#if (LZO_ARCH_I086)
1960#  define ACC_MM_AHSHIFT        LZO_MM_AHSHIFT
1961#  define ACC_PTR_FP_OFF(x)     (((const unsigned __far*)&(x))[0])
1962#  define ACC_PTR_FP_SEG(x)     (((const unsigned __far*)&(x))[1])
1963#  define ACC_PTR_MK_FP(s,o)    ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o)))
1964#endif
1965
1966#if !defined(lzo_uintptr_t)
1967#  if defined(__LZO_MMODEL_HUGE)
1968#    define lzo_uintptr_t       unsigned long
1969#  elif 1 && defined(LZO_OS_OS400) && (LZO_SIZEOF_VOID_P == 16)
1970#    define __LZO_UINTPTR_T_IS_POINTER 1
1971     typedef char*              lzo_uintptr_t;
1972#    define lzo_uintptr_t       lzo_uintptr_t
1973#  elif (LZO_SIZEOF_SIZE_T == LZO_SIZEOF_VOID_P)
1974#    define lzo_uintptr_t       size_t
1975#  elif (LZO_SIZEOF_LONG == LZO_SIZEOF_VOID_P)
1976#    define lzo_uintptr_t       unsigned long
1977#  elif (LZO_SIZEOF_INT == LZO_SIZEOF_VOID_P)
1978#    define lzo_uintptr_t       unsigned int
1979#  elif (LZO_SIZEOF_LONG_LONG == LZO_SIZEOF_VOID_P)
1980#    define lzo_uintptr_t       unsigned long long
1981#  else
1982#    define lzo_uintptr_t       size_t
1983#  endif
1984#endif
1985LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uintptr_t) >= sizeof(lzo_voidp))
1986
1987#if 1 && !defined(LZO_CFG_FREESTANDING)
1988#if 1 && !defined(HAVE_STRING_H)
1989#define HAVE_STRING_H 1
1990#endif
1991#if 1 && !defined(HAVE_MEMCMP)
1992#define HAVE_MEMCMP 1
1993#endif
1994#if 1 && !defined(HAVE_MEMCPY)
1995#define HAVE_MEMCPY 1
1996#endif
1997#if 1 && !defined(HAVE_MEMMOVE)
1998#define HAVE_MEMMOVE 1
1999#endif
2000#if 1 && !defined(HAVE_MEMSET)
2001#define HAVE_MEMSET 1
2002#endif
2003#endif
2004
2005#if 1 && defined(HAVE_STRING_H)
2006#include <string.h>
2007#endif
2008
2009#if (LZO_CFG_FREESTANDING)
2010#  undef HAVE_MEMCMP
2011#  undef HAVE_MEMCPY
2012#  undef HAVE_MEMMOVE
2013#  undef HAVE_MEMSET
2014#endif
2015
2016#if !(HAVE_MEMCMP)
2017#  undef memcmp
2018#  define memcmp(a,b,c)         lzo_memcmp(a,b,c)
2019#elif !(__LZO_MMODEL_HUGE)
2020#  undef lzo_memcmp
2021#  define lzo_memcmp(a,b,c)     memcmp(a,b,c)
2022#endif
2023#if !(HAVE_MEMCPY)
2024#  undef memcpy
2025#  define memcpy(a,b,c)         lzo_memcpy(a,b,c)
2026#elif !(__LZO_MMODEL_HUGE)
2027#  undef lzo_memcpy
2028#  define lzo_memcpy(a,b,c)     memcpy(a,b,c)
2029#endif
2030#if !(HAVE_MEMMOVE)
2031#  undef memmove
2032#  define memmove(a,b,c)        lzo_memmove(a,b,c)
2033#elif !(__LZO_MMODEL_HUGE)
2034#  undef lzo_memmove
2035#  define lzo_memmove(a,b,c)    memmove(a,b,c)
2036#endif
2037#if !(HAVE_MEMSET)
2038#  undef memset
2039#  define memset(a,b,c)         lzo_memset(a,b,c)
2040#elif !(__LZO_MMODEL_HUGE)
2041#  undef lzo_memset
2042#  define lzo_memset(a,b,c)     memset(a,b,c)
2043#endif
2044
2045#undef NDEBUG
2046#if (LZO_CFG_FREESTANDING)
2047#  undef LZO_DEBUG
2048#  define NDEBUG 1
2049#  undef assert
2050#  define assert(e) ((void)0)
2051#else
2052#  if !defined(LZO_DEBUG)
2053#    define NDEBUG 1
2054#  endif
2055#  include <assert.h>
2056#endif
2057
2058#if 0 && defined(__BOUNDS_CHECKING_ON)
2059#  include <unchecked.h>
2060#else
2061#  define BOUNDS_CHECKING_OFF_DURING(stmt)      stmt
2062#  define BOUNDS_CHECKING_OFF_IN_EXPR(expr)     (expr)
2063#endif
2064
2065#if !defined(__lzo_inline)
2066#  define __lzo_inline              /*empty*/
2067#endif
2068#if !defined(__lzo_forceinline)
2069#  define __lzo_forceinline         /*empty*/
2070#endif
2071#if !defined(__lzo_noinline)
2072#  define __lzo_noinline            /*empty*/
2073#endif
2074
2075#if (LZO_CFG_PGO)
2076#  undef __acc_likely
2077#  undef __acc_unlikely
2078#  undef __lzo_likely
2079#  undef __lzo_unlikely
2080#  define __acc_likely(e)       (e)
2081#  define __acc_unlikely(e)     (e)
2082#  define __lzo_likely(e)       (e)
2083#  define __lzo_unlikely(e)     (e)
2084#endif
2085
2086#if 1
2087#  define LZO_BYTE(x)       ((unsigned char) (x))
2088#else
2089#  define LZO_BYTE(x)       ((unsigned char) ((x) & 0xff))
2090#endif
2091
2092#define LZO_MAX(a,b)        ((a) >= (b) ? (a) : (b))
2093#define LZO_MIN(a,b)        ((a) <= (b) ? (a) : (b))
2094#define LZO_MAX3(a,b,c)     ((a) >= (b) ? LZO_MAX(a,c) : LZO_MAX(b,c))
2095#define LZO_MIN3(a,b,c)     ((a) <= (b) ? LZO_MIN(a,c) : LZO_MIN(b,c))
2096
2097#define lzo_sizeof(type)    ((lzo_uint) (sizeof(type)))
2098
2099#define LZO_HIGH(array)     ((lzo_uint) (sizeof(array)/sizeof(*(array))))
2100
2101#define LZO_SIZE(bits)      (1u << (bits))
2102#define LZO_MASK(bits)      (LZO_SIZE(bits) - 1)
2103
2104#define LZO_LSIZE(bits)     (1ul << (bits))
2105#define LZO_LMASK(bits)     (LZO_LSIZE(bits) - 1)
2106
2107#define LZO_USIZE(bits)     ((lzo_uint) 1 << (bits))
2108#define LZO_UMASK(bits)     (LZO_USIZE(bits) - 1)
2109
2110#if !defined(DMUL)
2111#if 0
2112
2113#  define DMUL(a,b) ((lzo_xint) ((lzo_uint32)(a) * (lzo_uint32)(b)))
2114#else
2115#  define DMUL(a,b) ((lzo_xint) ((a) * (b)))
2116#endif
2117#endif
2118
2119#if 1 && (LZO_ARCH_AMD64 || LZO_ARCH_I386 || LZO_ARCH_POWERPC)
2120#  if (LZO_SIZEOF_SHORT == 2)
2121#    define LZO_UNALIGNED_OK_2 1
2122#  endif
2123#  if (LZO_SIZEOF_INT == 4)
2124#    define LZO_UNALIGNED_OK_4 1
2125#  endif
2126#endif
2127#if 1 && (LZO_ARCH_AMD64)
2128#  if defined(LZO_UINT64_MAX)
2129#    define LZO_UNALIGNED_OK_8 1
2130#  endif
2131#endif
2132#if (LZO_CFG_NO_UNALIGNED)
2133#  undef LZO_UNALIGNED_OK_2
2134#  undef LZO_UNALIGNED_OK_4
2135#  undef LZO_UNALIGNED_OK_8
2136#endif
2137
2138#undef UA_GET16
2139#undef UA_SET16
2140#undef UA_COPY16
2141#undef UA_GET32
2142#undef UA_SET32
2143#undef UA_COPY32
2144#undef UA_GET64
2145#undef UA_SET64
2146#undef UA_COPY64
2147#if defined(LZO_UNALIGNED_OK_2)
2148   LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(unsigned short) == 2)
2149#  if 1 && defined(ACC_UA_COPY16)
2150#    define UA_GET16        ACC_UA_GET16
2151#    define UA_SET16        ACC_UA_SET16
2152#    define UA_COPY16       ACC_UA_COPY16
2153#  else
2154#    define UA_GET16(p)     (* (__lzo_ua_volatile const lzo_ushortp) (__lzo_ua_volatile const lzo_voidp) (p))
2155#    define UA_SET16(p,v)   ((* (__lzo_ua_volatile lzo_ushortp) (__lzo_ua_volatile lzo_voidp) (p)) = (unsigned short) (v))
2156#    define UA_COPY16(d,s)  UA_SET16(d, UA_GET16(s))
2157#  endif
2158#endif
2159#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
2160   LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uint32) == 4)
2161#  if 1 && defined(ACC_UA_COPY32)
2162#    define UA_GET32        ACC_UA_GET32
2163#    define UA_SET32        ACC_UA_SET32
2164#    define UA_COPY32       ACC_UA_COPY32
2165#  else
2166#    define UA_GET32(p)     (* (__lzo_ua_volatile const lzo_uint32p) (__lzo_ua_volatile const lzo_voidp) (p))
2167#    define UA_SET32(p,v)   ((* (__lzo_ua_volatile lzo_uint32p) (__lzo_ua_volatile lzo_voidp) (p)) = (lzo_uint32) (v))
2168#    define UA_COPY32(d,s)  UA_SET32(d, UA_GET32(s))
2169#  endif
2170#endif
2171#if defined(LZO_UNALIGNED_OK_8)
2172   LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uint64) == 8)
2173#  if 1 && defined(ACC_UA_COPY64)
2174#    define UA_GET64        ACC_UA_GET64
2175#    define UA_SET64        ACC_UA_SET64
2176#    define UA_COPY64       ACC_UA_COPY64
2177#  else
2178#    define UA_GET64(p)     (* (__lzo_ua_volatile const lzo_uint64p) (__lzo_ua_volatile const lzo_voidp) (p))
2179#    define UA_SET64(p,v)   ((* (__lzo_ua_volatile lzo_uint64p) (__lzo_ua_volatile lzo_voidp) (p)) = (lzo_uint64) (v))
2180#    define UA_COPY64(d,s)  UA_SET64(d, UA_GET64(s))
2181#  endif
2182#endif
2183
2184#define MEMCPY8_DS(dest,src,len) \
2185    lzo_memcpy(dest,src,len); dest += len; src += len
2186
2187#define BZERO8_PTR(s,l,n) \
2188    lzo_memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n))
2189
2190#define MEMCPY_DS(dest,src,len) \
2191    do *dest++ = *src++; while (--len > 0)
2192
2193LZO_EXTERN(const lzo_bytep) lzo_copyright(void);
2194
2195#ifndef __LZO_PTR_H
2196#define __LZO_PTR_H 1
2197
2198#ifdef __cplusplus
2199extern "C" {
2200#endif
2201
2202#if !defined(lzo_uintptr_t)
2203#  if (__LZO_MMODEL_HUGE)
2204#    define lzo_uintptr_t   unsigned long
2205#  else
2206#    define lzo_uintptr_t   acc_uintptr_t
2207#    ifdef __ACC_INTPTR_T_IS_POINTER
2208#      define __LZO_UINTPTR_T_IS_POINTER 1
2209#    endif
2210#  endif
2211#endif
2212
2213#if (LZO_ARCH_I086)
2214#define PTR(a)              ((lzo_bytep) (a))
2215#define PTR_ALIGNED_4(a)    ((ACC_PTR_FP_OFF(a) & 3) == 0)
2216#define PTR_ALIGNED2_4(a,b) (((ACC_PTR_FP_OFF(a) | ACC_PTR_FP_OFF(b)) & 3) == 0)
2217#elif (LZO_MM_PVP)
2218#define PTR(a)              ((lzo_bytep) (a))
2219#define PTR_ALIGNED_8(a)    ((((lzo_uintptr_t)(a)) >> 61) == 0)
2220#define PTR_ALIGNED2_8(a,b) ((((lzo_uintptr_t)(a)|(lzo_uintptr_t)(b)) >> 61) == 0)
2221#else
2222#define PTR(a)              ((lzo_uintptr_t) (a))
2223#define PTR_LINEAR(a)       PTR(a)
2224#define PTR_ALIGNED_4(a)    ((PTR_LINEAR(a) & 3) == 0)
2225#define PTR_ALIGNED_8(a)    ((PTR_LINEAR(a) & 7) == 0)
2226#define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0)
2227#define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0)
2228#endif
2229
2230#define PTR_LT(a,b)         (PTR(a) < PTR(b))
2231#define PTR_GE(a,b)         (PTR(a) >= PTR(b))
2232#define PTR_DIFF(a,b)       (PTR(a) - PTR(b))
2233#define pd(a,b)             ((lzo_uint) ((a)-(b)))
2234
2235LZO_EXTERN(lzo_uintptr_t)
2236__lzo_ptr_linear(const lzo_voidp ptr);
2237
2238typedef union
2239{
2240    char            a_char;
2241    unsigned char   a_uchar;
2242    short           a_short;
2243    unsigned short  a_ushort;
2244    int             a_int;
2245    unsigned int    a_uint;
2246    long            a_long;
2247    unsigned long   a_ulong;
2248    lzo_int         a_lzo_int;
2249    lzo_uint        a_lzo_uint;
2250    lzo_int32       a_lzo_int32;
2251    lzo_uint32      a_lzo_uint32;
2252#if defined(LZO_UINT64_MAX)
2253    lzo_int64       a_lzo_int64;
2254    lzo_uint64      a_lzo_uint64;
2255#endif
2256    ptrdiff_t       a_ptrdiff_t;
2257    lzo_uintptr_t   a_lzo_uintptr_t;
2258    lzo_voidp       a_lzo_voidp;
2259    void *          a_void_p;
2260    lzo_bytep       a_lzo_bytep;
2261    lzo_bytepp      a_lzo_bytepp;
2262    lzo_uintp       a_lzo_uintp;
2263    lzo_uint *      a_lzo_uint_p;
2264    lzo_uint32p     a_lzo_uint32p;
2265    lzo_uint32 *    a_lzo_uint32_p;
2266    unsigned char * a_uchar_p;
2267    char *          a_char_p;
2268}
2269lzo_full_align_t;
2270
2271#ifdef __cplusplus
2272}
2273#endif
2274
2275#endif
2276
2277#ifndef LZO_DETERMINISTIC
2278#define LZO_DETERMINISTIC 1
2279#endif
2280
2281#ifndef LZO_DICT_USE_PTR
2282#define LZO_DICT_USE_PTR 1
2283#if 0 && (LZO_ARCH_I086)
2284#  undef LZO_DICT_USE_PTR
2285#  define LZO_DICT_USE_PTR 0
2286#endif
2287#endif
2288
2289#if (LZO_DICT_USE_PTR)
2290#  define lzo_dict_t    const lzo_bytep
2291#  define lzo_dict_p    lzo_dict_t __LZO_MMODEL *
2292#else
2293#  define lzo_dict_t    lzo_uint
2294#  define lzo_dict_p    lzo_dict_t __LZO_MMODEL *
2295#endif
2296
2297#endif
2298
2299#if !defined(MINILZO_CFG_SKIP_LZO_PTR)
2300
2301LZO_PUBLIC(lzo_uintptr_t)
2302__lzo_ptr_linear(const lzo_voidp ptr)
2303{
2304    lzo_uintptr_t p;
2305
2306#if (LZO_ARCH_I086)
2307    p = (((lzo_uintptr_t)(ACC_PTR_FP_SEG(ptr))) << (16 - ACC_MM_AHSHIFT)) + (ACC_PTR_FP_OFF(ptr));
2308#elif (LZO_MM_PVP)
2309    p = (lzo_uintptr_t) (ptr);
2310    p = (p << 3) | (p >> 61);
2311#else
2312    p = (lzo_uintptr_t) PTR_LINEAR(ptr);
2313#endif
2314
2315    return p;
2316}
2317
2318LZO_PUBLIC(unsigned)
2319__lzo_align_gap(const lzo_voidp ptr, lzo_uint size)
2320{
2321#if defined(__LZO_UINTPTR_T_IS_POINTER)
2322    size_t n = (size_t) ptr;
2323    n = (((n + size - 1) / size) * size) - n;
2324#else
2325    lzo_uintptr_t p, n;
2326    p = __lzo_ptr_linear(ptr);
2327    n = (((p + size - 1) / size) * size) - p;
2328#endif
2329
2330    assert(size > 0);
2331    assert((long)n >= 0);
2332    assert(n <= size);
2333    return (unsigned)n;
2334}
2335
2336#endif
2337#if !defined(MINILZO_CFG_SKIP_LZO_UTIL)
2338
2339/* If you use the LZO library in a product, I would appreciate that you
2340 * keep this copyright string in the executable of your product.
2341 */
2342
2343static const char __lzo_copyright[] =
2344#if !defined(__LZO_IN_MINLZO)
2345    LZO_VERSION_STRING;
2346#else
2347    "\r\n\n"
2348    "LZO data compression library.\n"
2349    "$Copyright: LZO Copyright (C) 1996-2011 Markus Franz Xaver Johannes Oberhumer\n"
2350    "<markus@oberhumer.com>\n"
2351    "http://www.oberhumer.com $\n\n"
2352    "$Id: LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE " $\n"
2353    "$Info: " LZO_INFO_STRING " $\n";
2354#endif
2355
2356LZO_PUBLIC(const lzo_bytep)
2357lzo_copyright(void)
2358{
2359#if (LZO_OS_DOS16 && LZO_CC_TURBOC)
2360    return (lzo_voidp) __lzo_copyright;
2361#else
2362    return (const lzo_bytep) __lzo_copyright;
2363#endif
2364}
2365
2366LZO_PUBLIC(unsigned)
2367lzo_version(void)
2368{
2369    return LZO_VERSION;
2370}
2371
2372LZO_PUBLIC(const char *)
2373lzo_version_string(void)
2374{
2375    return LZO_VERSION_STRING;
2376}
2377
2378LZO_PUBLIC(const char *)
2379lzo_version_date(void)
2380{
2381    return LZO_VERSION_DATE;
2382}
2383
2384LZO_PUBLIC(const lzo_charp)
2385_lzo_version_string(void)
2386{
2387    return LZO_VERSION_STRING;
2388}
2389
2390LZO_PUBLIC(const lzo_charp)
2391_lzo_version_date(void)
2392{
2393    return LZO_VERSION_DATE;
2394}
2395
2396#define LZO_BASE 65521u
2397#define LZO_NMAX 5552
2398
2399#define LZO_DO1(buf,i)  s1 += buf[i]; s2 += s1
2400#define LZO_DO2(buf,i)  LZO_DO1(buf,i); LZO_DO1(buf,i+1);
2401#define LZO_DO4(buf,i)  LZO_DO2(buf,i); LZO_DO2(buf,i+2);
2402#define LZO_DO8(buf,i)  LZO_DO4(buf,i); LZO_DO4(buf,i+4);
2403#define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8);
2404
2405LZO_PUBLIC(lzo_uint32)
2406lzo_adler32(lzo_uint32 adler, const lzo_bytep buf, lzo_uint len)
2407{
2408    lzo_uint32 s1 = adler & 0xffff;
2409    lzo_uint32 s2 = (adler >> 16) & 0xffff;
2410    unsigned k;
2411
2412    if (buf == NULL)
2413        return 1;
2414
2415    while (len > 0)
2416    {
2417        k = len < LZO_NMAX ? (unsigned) len : LZO_NMAX;
2418        len -= k;
2419        if (k >= 16) do
2420        {
2421            LZO_DO16(buf,0);
2422            buf += 16;
2423            k -= 16;
2424        } while (k >= 16);
2425        if (k != 0) do
2426        {
2427            s1 += *buf++;
2428            s2 += s1;
2429        } while (--k > 0);
2430        s1 %= LZO_BASE;
2431        s2 %= LZO_BASE;
2432    }
2433    return (s2 << 16) | s1;
2434}
2435
2436#undef LZO_DO1
2437#undef LZO_DO2
2438#undef LZO_DO4
2439#undef LZO_DO8
2440#undef LZO_DO16
2441
2442#endif
2443#if !defined(MINILZO_CFG_SKIP_LZO_STRING)
2444#undef lzo_memcmp
2445#undef lzo_memcpy
2446#undef lzo_memmove
2447#undef lzo_memset
2448#if !defined(__LZO_MMODEL_HUGE)
2449#  undef LZO_HAVE_MM_HUGE_PTR
2450#endif
2451#define lzo_hsize_t             lzo_uint
2452#define lzo_hvoid_p             lzo_voidp
2453#define lzo_hbyte_p             lzo_bytep
2454#define LZOLIB_PUBLIC(r,f)      LZO_PUBLIC(r) f
2455#define lzo_hmemcmp             lzo_memcmp
2456#define lzo_hmemcpy             lzo_memcpy
2457#define lzo_hmemmove            lzo_memmove
2458#define lzo_hmemset             lzo_memset
2459#define __LZOLIB_HMEMCPY_CH_INCLUDED 1
2460#if !defined(LZOLIB_PUBLIC)
2461#  define LZOLIB_PUBLIC(r,f)    r __LZOLIB_FUNCNAME(f)
2462#endif
2463LZOLIB_PUBLIC(int, lzo_hmemcmp) (const lzo_hvoid_p s1, const lzo_hvoid_p s2, lzo_hsize_t len)
2464{
2465#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCMP)
2466    const lzo_hbyte_p p1 = (const lzo_hbyte_p) s1;
2467    const lzo_hbyte_p p2 = (const lzo_hbyte_p) s2;
2468    if __lzo_likely(len > 0) do
2469    {
2470        int d = *p1 - *p2;
2471        if (d != 0)
2472            return d;
2473        p1++; p2++;
2474    } while __lzo_likely(--len > 0);
2475    return 0;
2476#else
2477    return memcmp(s1, s2, len);
2478#endif
2479}
2480LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemcpy) (lzo_hvoid_p dest, const lzo_hvoid_p src, lzo_hsize_t len)
2481{
2482#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCPY)
2483    lzo_hbyte_p p1 = (lzo_hbyte_p) dest;
2484    const lzo_hbyte_p p2 = (const lzo_hbyte_p) src;
2485    if (!(len > 0) || p1 == p2)
2486        return dest;
2487    do
2488        *p1++ = *p2++;
2489    while __lzo_likely(--len > 0);
2490    return dest;
2491#else
2492    return memcpy(dest, src, len);
2493#endif
2494}
2495LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemmove) (lzo_hvoid_p dest, const lzo_hvoid_p src, lzo_hsize_t len)
2496{
2497#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMMOVE)
2498    lzo_hbyte_p p1 = (lzo_hbyte_p) dest;
2499    const lzo_hbyte_p p2 = (const lzo_hbyte_p) src;
2500    if (!(len > 0) || p1 == p2)
2501        return dest;
2502    if (p1 < p2)
2503    {
2504        do
2505            *p1++ = *p2++;
2506        while __lzo_likely(--len > 0);
2507    }
2508    else
2509    {
2510        p1 += len;
2511        p2 += len;
2512        do
2513            *--p1 = *--p2;
2514        while __lzo_likely(--len > 0);
2515    }
2516    return dest;
2517#else
2518    return memmove(dest, src, len);
2519#endif
2520}
2521LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemset) (lzo_hvoid_p s, int c, lzo_hsize_t len)
2522{
2523#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMSET)
2524    lzo_hbyte_p p = (lzo_hbyte_p) s;
2525    if __lzo_likely(len > 0) do
2526        *p++ = (unsigned char) c;
2527    while __lzo_likely(--len > 0);
2528    return s;
2529#else
2530    return memset(s, c, len);
2531#endif
2532}
2533#undef LZOLIB_PUBLIC
2534#endif
2535#if !defined(MINILZO_CFG_SKIP_LZO_INIT)
2536
2537#if !defined(__LZO_IN_MINILZO)
2538
2539#define ACC_WANT_ACC_CHK_CH 1
2540#undef ACCCHK_ASSERT
2541
2542    ACCCHK_ASSERT_IS_SIGNED_T(lzo_int)
2543    ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint)
2544
2545    ACCCHK_ASSERT_IS_SIGNED_T(lzo_int32)
2546    ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint32)
2547    ACCCHK_ASSERT((LZO_UINT32_C(1) << (int)(8*sizeof(LZO_UINT32_C(1))-1)) > 0)
2548    ACCCHK_ASSERT(sizeof(lzo_uint32) >= 4)
2549#if defined(LZO_UINT64_MAX)
2550    ACCCHK_ASSERT(sizeof(lzo_uint64) == 8)
2551    ACCCHK_ASSERT_IS_SIGNED_T(lzo_int64)
2552    ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint64)
2553#endif
2554
2555#if !defined(__LZO_UINTPTR_T_IS_POINTER)
2556    ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uintptr_t)
2557#endif
2558    ACCCHK_ASSERT(sizeof(lzo_uintptr_t) >= sizeof(lzo_voidp))
2559
2560    ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_xint)
2561    ACCCHK_ASSERT(sizeof(lzo_xint) >= sizeof(lzo_uint32))
2562    ACCCHK_ASSERT(sizeof(lzo_xint) >= sizeof(lzo_uint))
2563    ACCCHK_ASSERT(sizeof(lzo_xint) == sizeof(lzo_uint32) || sizeof(lzo_xint) == sizeof(lzo_uint))
2564
2565#endif
2566#undef ACCCHK_ASSERT
2567
2568#define WANT_lzo_bitops_clz32 1
2569#define WANT_lzo_bitops_clz64 1
2570#define WANT_lzo_bitops_ctz32 1
2571#define WANT_lzo_bitops_ctz64 1
2572
2573#if (defined(_WIN32) || defined(_WIN64)) && ((LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_MSC && (_MSC_VER >= 1400)))
2574#include <intrin.h>
2575#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32) && 0
2576#pragma intrinsic(_BitScanReverse)
2577static __lzo_inline unsigned lzo_bitops_clz32(lzo_uint32 v)
2578{
2579    unsigned long r;
2580    (void) _BitScanReverse(&r, v);
2581    return (unsigned) r;
2582}
2583#define lzo_bitops_clz32 lzo_bitops_clz32
2584#endif
2585#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX) && 0
2586#pragma intrinsic(_BitScanReverse64)
2587static __lzo_inline unsigned lzo_bitops_clz64(lzo_uint64 v)
2588{
2589    unsigned long r;
2590    (void) _BitScanReverse64(&r, v);
2591    return (unsigned) r;
2592}
2593#define lzo_bitops_clz64 lzo_bitops_clz64
2594#endif
2595#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32)
2596#pragma intrinsic(_BitScanForward)
2597static __lzo_inline unsigned lzo_bitops_ctz32(lzo_uint32 v)
2598{
2599    unsigned long r;
2600    (void) _BitScanForward(&r, v);
2601    return (unsigned) r;
2602}
2603#define lzo_bitops_ctz32 lzo_bitops_ctz32
2604#endif
2605#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX)
2606#pragma intrinsic(_BitScanForward64)
2607static __lzo_inline unsigned lzo_bitops_ctz64(lzo_uint64 v)
2608{
2609    unsigned long r;
2610    (void) _BitScanForward64(&r, v);
2611    return (unsigned) r;
2612}
2613#define lzo_bitops_ctz64 lzo_bitops_ctz64
2614#endif
2615
2616#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul))))
2617#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32)
2618#define lzo_bitops_clz32(v) ((unsigned) __builtin_clz(v))
2619#endif
2620#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX)
2621#define lzo_bitops_clz64(v) ((unsigned) __builtin_clzll(v))
2622#endif
2623#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32)
2624#define lzo_bitops_ctz32(v) ((unsigned) __builtin_ctz(v))
2625#endif
2626#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX)
2627#define lzo_bitops_ctz64(v) ((unsigned) __builtin_ctzll(v))
2628#endif
2629#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount32)
2630#define lzo_bitops_popcount32(v) ((unsigned) __builtin_popcount(v))
2631#endif
2632#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount64) && defined(LZO_UINT64_MAX)
2633#define lzo_bitops_popcount64(v) ((unsigned) __builtin_popcountll(v))
2634#endif
2635#endif
2636
2637#if 0
2638#define u2p(ptr,off) ((lzo_voidp) (((lzo_bytep)(lzo_voidp)(ptr)) + (off)))
2639#else
2640static __lzo_noinline lzo_voidp u2p(lzo_voidp ptr, lzo_uint off)
2641{
2642    return (lzo_voidp) ((lzo_bytep) ptr + off);
2643}
2644#endif
2645
2646LZO_PUBLIC(int)
2647_lzo_config_check(void)
2648{
2649    lzo_bool r = 1;
2650    union {
2651        lzo_xint a[2]; unsigned char b[2*LZO_MAX(8,sizeof(lzo_xint))];
2652#if defined(LZO_UNALIGNED_OK_8)
2653        lzo_uint64 c[2];
2654#endif
2655        unsigned short x[2]; lzo_uint32 y[2]; lzo_uint z[2];
2656    } u;
2657    lzo_voidp p;
2658
2659    u.a[0] = u.a[1] = 0;
2660    p = u2p(&u, 0);
2661    r &= ((* (lzo_bytep) p) == 0);
2662#if !defined(LZO_CFG_NO_CONFIG_CHECK)
2663#if defined(LZO_ABI_BIG_ENDIAN)
2664    u.a[0] = u.a[1] = 0; u.b[sizeof(lzo_uint) - 1] = 128;
2665    p = u2p(&u, 0);
2666    r &= ((* (lzo_uintp) p) == 128);
2667#endif
2668#if defined(LZO_ABI_LITTLE_ENDIAN)
2669    u.a[0] = u.a[1] = 0; u.b[0] = 128;
2670    p = u2p(&u, 0);
2671    r &= ((* (lzo_uintp) p) == 128);
2672#endif
2673#if defined(LZO_UNALIGNED_OK_2)
2674    u.a[0] = u.a[1] = 0;
2675    u.b[0] = 1; u.b[sizeof(unsigned short) + 1] = 2;
2676    p = u2p(&u, 1);
2677    r &= ((* (lzo_ushortp) p) == 0);
2678#endif
2679#if defined(LZO_UNALIGNED_OK_4)
2680    u.a[0] = u.a[1] = 0;
2681    u.b[0] = 3; u.b[sizeof(lzo_uint32) + 1] = 4;
2682    p = u2p(&u, 1);
2683    r &= ((* (lzo_uint32p) p) == 0);
2684#endif
2685#if defined(LZO_UNALIGNED_OK_8)
2686    u.c[0] = u.c[1] = 0;
2687    u.b[0] = 5; u.b[sizeof(lzo_uint64) + 1] = 6;
2688    p = u2p(&u, 1);
2689    r &= ((* (lzo_uint64p) p) == 0);
2690#endif
2691#if defined(lzo_bitops_clz32)
2692    { unsigned i; lzo_uint32 v = 1;
2693    for (i = 0; i < 32; i++, v <<= 1)
2694        r &= lzo_bitops_clz32(v) == 31 - i;
2695    }
2696#endif
2697#if defined(lzo_bitops_clz64)
2698    { unsigned i; lzo_uint64 v = 1;
2699    for (i = 0; i < 64; i++, v <<= 1)
2700        r &= lzo_bitops_clz64(v) == 63 - i;
2701    }
2702#endif
2703#if defined(lzo_bitops_ctz32)
2704    { unsigned i; lzo_uint32 v = 1;
2705    for (i = 0; i < 32; i++, v <<= 1)
2706        r &= lzo_bitops_ctz32(v) == i;
2707    }
2708#endif
2709#if defined(lzo_bitops_ctz64)
2710    { unsigned i; lzo_uint64 v = 1;
2711    for (i = 0; i < 64; i++, v <<= 1)
2712        r &= lzo_bitops_ctz64(v) == i;
2713    }
2714#endif
2715#endif
2716
2717    return r == 1 ? LZO_E_OK : LZO_E_ERROR;
2718}
2719
2720LZO_PUBLIC(int)
2721__lzo_init_v2(unsigned v, int s1, int s2, int s3, int s4, int s5,
2722                          int s6, int s7, int s8, int s9)
2723{
2724    int r;
2725
2726#if defined(__LZO_IN_MINILZO)
2727#elif (LZO_CC_MSC && ((_MSC_VER) < 700))
2728#else
2729#define ACC_WANT_ACC_CHK_CH 1
2730#undef ACCCHK_ASSERT
2731#define ACCCHK_ASSERT(expr)  LZO_COMPILE_TIME_ASSERT(expr)
2732#endif
2733#undef ACCCHK_ASSERT
2734
2735    if (v == 0)
2736        return LZO_E_ERROR;
2737
2738    r = (s1 == -1 || s1 == (int) sizeof(short)) &&
2739        (s2 == -1 || s2 == (int) sizeof(int)) &&
2740        (s3 == -1 || s3 == (int) sizeof(long)) &&
2741        (s4 == -1 || s4 == (int) sizeof(lzo_uint32)) &&
2742        (s5 == -1 || s5 == (int) sizeof(lzo_uint)) &&
2743        (s6 == -1 || s6 == (int) lzo_sizeof_dict_t) &&
2744        (s7 == -1 || s7 == (int) sizeof(char *)) &&
2745        (s8 == -1 || s8 == (int) sizeof(lzo_voidp)) &&
2746        (s9 == -1 || s9 == (int) sizeof(lzo_callback_t));
2747    if (!r)
2748        return LZO_E_ERROR;
2749
2750    r = _lzo_config_check();
2751    if (r != LZO_E_OK)
2752        return r;
2753
2754    return r;
2755}
2756
2757#if !defined(__LZO_IN_MINILZO)
2758
2759#if (LZO_OS_WIN16 && LZO_CC_WATCOMC) && defined(__SW_BD)
2760
2761#if 0
2762BOOL FAR PASCAL LibMain ( HANDLE hInstance, WORD wDataSegment,
2763                          WORD wHeapSize, LPSTR lpszCmdLine )
2764#else
2765int __far __pascal LibMain ( int a, short b, short c, long d )
2766#endif
2767{
2768    LZO_UNUSED(a); LZO_UNUSED(b); LZO_UNUSED(c); LZO_UNUSED(d);
2769    return 1;
2770}
2771
2772#endif
2773
2774#endif
2775
2776#endif
2777
2778#define LZO1X           1
2779#define LZO_EOF_CODE    1
2780#define M2_MAX_OFFSET   0x0800
2781
2782#if !defined(MINILZO_CFG_SKIP_LZO1X_1_COMPRESS)
2783
2784#if 1 && defined(UA_GET32)
2785#undef  LZO_DICT_USE_PTR
2786#define LZO_DICT_USE_PTR 0
2787#undef  lzo_dict_t
2788#define lzo_dict_t unsigned short
2789#endif
2790
2791#define LZO_NEED_DICT_H 1
2792#ifndef D_BITS
2793#define D_BITS          14
2794#endif
2795#define D_INDEX1(d,p)       d = DM(DMUL(0x21,DX3(p,5,5,6)) >> 5)
2796#define D_INDEX2(d,p)       d = (d & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f)
2797#if 1
2798#define DINDEX(dv,p)        DM(((DMUL(0x1824429d,dv)) >> (32-D_BITS)))
2799#else
2800#define DINDEX(dv,p)        DM((dv) + ((dv) >> (32-D_BITS)))
2801#endif
2802
2803#ifndef __LZO_CONFIG1X_H
2804#define __LZO_CONFIG1X_H 1
2805
2806#if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z)
2807#  define LZO1X 1
2808#endif
2809
2810#if !defined(__LZO_IN_MINILZO)
2811#include "lzo/lzo1x.h"
2812#endif
2813
2814#ifndef LZO_EOF_CODE
2815#define LZO_EOF_CODE 1
2816#endif
2817#undef LZO_DETERMINISTIC
2818
2819#define M1_MAX_OFFSET   0x0400
2820#ifndef M2_MAX_OFFSET
2821#define M2_MAX_OFFSET   0x0800
2822#endif
2823#define M3_MAX_OFFSET   0x4000
2824#define M4_MAX_OFFSET   0xbfff
2825
2826#define MX_MAX_OFFSET   (M1_MAX_OFFSET + M2_MAX_OFFSET)
2827
2828#define M1_MIN_LEN      2
2829#define M1_MAX_LEN      2
2830#define M2_MIN_LEN      3
2831#ifndef M2_MAX_LEN
2832#define M2_MAX_LEN      8
2833#endif
2834#define M3_MIN_LEN      3
2835#define M3_MAX_LEN      33
2836#define M4_MIN_LEN      3
2837#define M4_MAX_LEN      9
2838
2839#define M1_MARKER       0
2840#define M2_MARKER       64
2841#define M3_MARKER       32
2842#define M4_MARKER       16
2843
2844#ifndef MIN_LOOKAHEAD
2845#define MIN_LOOKAHEAD       (M2_MAX_LEN + 1)
2846#endif
2847
2848#if defined(LZO_NEED_DICT_H)
2849
2850#ifndef LZO_HASH
2851#define LZO_HASH            LZO_HASH_LZO_INCREMENTAL_B
2852#endif
2853#define DL_MIN_LEN          M2_MIN_LEN
2854
2855#ifndef __LZO_DICT_H
2856#define __LZO_DICT_H 1
2857
2858#ifdef __cplusplus
2859extern "C" {
2860#endif
2861
2862#if !defined(D_BITS) && defined(DBITS)
2863#  define D_BITS        DBITS
2864#endif
2865#if !defined(D_BITS)
2866#  error "D_BITS is not defined"
2867#endif
2868#if (D_BITS < 16)
2869#  define D_SIZE        LZO_SIZE(D_BITS)
2870#  define D_MASK        LZO_MASK(D_BITS)
2871#else
2872#  define D_SIZE        LZO_USIZE(D_BITS)
2873#  define D_MASK        LZO_UMASK(D_BITS)
2874#endif
2875#define D_HIGH          ((D_MASK >> 1) + 1)
2876
2877#if !defined(DD_BITS)
2878#  define DD_BITS       0
2879#endif
2880#define DD_SIZE         LZO_SIZE(DD_BITS)
2881#define DD_MASK         LZO_MASK(DD_BITS)
2882
2883#if !defined(DL_BITS)
2884#  define DL_BITS       (D_BITS - DD_BITS)
2885#endif
2886#if (DL_BITS < 16)
2887#  define DL_SIZE       LZO_SIZE(DL_BITS)
2888#  define DL_MASK       LZO_MASK(DL_BITS)
2889#else
2890#  define DL_SIZE       LZO_USIZE(DL_BITS)
2891#  define DL_MASK       LZO_UMASK(DL_BITS)
2892#endif
2893
2894#if (D_BITS != DL_BITS + DD_BITS)
2895#  error "D_BITS does not match"
2896#endif
2897#if (D_BITS < 6 || D_BITS > 18)
2898#  error "invalid D_BITS"
2899#endif
2900#if (DL_BITS < 6 || DL_BITS > 20)
2901#  error "invalid DL_BITS"
2902#endif
2903#if (DD_BITS < 0 || DD_BITS > 6)
2904#  error "invalid DD_BITS"
2905#endif
2906
2907#if !defined(DL_MIN_LEN)
2908#  define DL_MIN_LEN    3
2909#endif
2910#if !defined(DL_SHIFT)
2911#  define DL_SHIFT      ((DL_BITS + (DL_MIN_LEN - 1)) / DL_MIN_LEN)
2912#endif
2913
2914#define LZO_HASH_GZIP                   1
2915#define LZO_HASH_GZIP_INCREMENTAL       2
2916#define LZO_HASH_LZO_INCREMENTAL_A      3
2917#define LZO_HASH_LZO_INCREMENTAL_B      4
2918
2919#if !defined(LZO_HASH)
2920#  error "choose a hashing strategy"
2921#endif
2922
2923#undef DM
2924#undef DX
2925
2926#if (DL_MIN_LEN == 3)
2927#  define _DV2_A(p,shift1,shift2) \
2928        (((( (lzo_xint)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2])
2929#  define _DV2_B(p,shift1,shift2) \
2930        (((( (lzo_xint)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0])
2931#  define _DV3_B(p,shift1,shift2,shift3) \
2932        ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0])
2933#elif (DL_MIN_LEN == 2)
2934#  define _DV2_A(p,shift1,shift2) \
2935        (( (lzo_xint)(p[0]) << shift1) ^ p[1])
2936#  define _DV2_B(p,shift1,shift2) \
2937        (( (lzo_xint)(p[1]) << shift1) ^ p[2])
2938#else
2939#  error "invalid DL_MIN_LEN"
2940#endif
2941#define _DV_A(p,shift)      _DV2_A(p,shift,shift)
2942#define _DV_B(p,shift)      _DV2_B(p,shift,shift)
2943#define DA2(p,s1,s2) \
2944        (((((lzo_xint)((p)[2]) << (s2)) + (p)[1]) << (s1)) + (p)[0])
2945#define DS2(p,s1,s2) \
2946        (((((lzo_xint)((p)[2]) << (s2)) - (p)[1]) << (s1)) - (p)[0])
2947#define DX2(p,s1,s2) \
2948        (((((lzo_xint)((p)[2]) << (s2)) ^ (p)[1]) << (s1)) ^ (p)[0])
2949#define DA3(p,s1,s2,s3) ((DA2((p)+1,s2,s3) << (s1)) + (p)[0])
2950#define DS3(p,s1,s2,s3) ((DS2((p)+1,s2,s3) << (s1)) - (p)[0])
2951#define DX3(p,s1,s2,s3) ((DX2((p)+1,s2,s3) << (s1)) ^ (p)[0])
2952#define DMS(v,s)        ((lzo_uint) (((v) & (D_MASK >> (s))) << (s)))
2953#define DM(v)           DMS(v,0)
2954
2955#if (LZO_HASH == LZO_HASH_GZIP)
2956#  define _DINDEX(dv,p)     (_DV_A((p),DL_SHIFT))
2957
2958#elif (LZO_HASH == LZO_HASH_GZIP_INCREMENTAL)
2959#  define __LZO_HASH_INCREMENTAL 1
2960#  define DVAL_FIRST(dv,p)  dv = _DV_A((p),DL_SHIFT)
2961#  define DVAL_NEXT(dv,p)   dv = (((dv) << DL_SHIFT) ^ p[2])
2962#  define _DINDEX(dv,p)     (dv)
2963#  define DVAL_LOOKAHEAD    DL_MIN_LEN
2964
2965#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_A)
2966#  define __LZO_HASH_INCREMENTAL 1
2967#  define DVAL_FIRST(dv,p)  dv = _DV_A((p),5)
2968#  define DVAL_NEXT(dv,p) \
2969                dv ^= (lzo_xint)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2])
2970#  define _DINDEX(dv,p)     ((DMUL(0x9f5f,dv)) >> 5)
2971#  define DVAL_LOOKAHEAD    DL_MIN_LEN
2972
2973#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_B)
2974#  define __LZO_HASH_INCREMENTAL 1
2975#  define DVAL_FIRST(dv,p)  dv = _DV_B((p),5)
2976#  define DVAL_NEXT(dv,p) \
2977                dv ^= p[-1]; dv = (((dv) >> 5) ^ ((lzo_xint)(p[2]) << (2*5)))
2978#  define _DINDEX(dv,p)     ((DMUL(0x9f5f,dv)) >> 5)
2979#  define DVAL_LOOKAHEAD    DL_MIN_LEN
2980
2981#else
2982#  error "choose a hashing strategy"
2983#endif
2984
2985#ifndef DINDEX
2986#define DINDEX(dv,p)        ((lzo_uint)((_DINDEX(dv,p)) & DL_MASK) << DD_BITS)
2987#endif
2988#if !defined(DINDEX1) && defined(D_INDEX1)
2989#define DINDEX1             D_INDEX1
2990#endif
2991#if !defined(DINDEX2) && defined(D_INDEX2)
2992#define DINDEX2             D_INDEX2
2993#endif
2994
2995#if !defined(__LZO_HASH_INCREMENTAL)
2996#  define DVAL_FIRST(dv,p)  ((void) 0)
2997#  define DVAL_NEXT(dv,p)   ((void) 0)
2998#  define DVAL_LOOKAHEAD    0
2999#endif
3000
3001#if !defined(DVAL_ASSERT)
3002#if defined(__LZO_HASH_INCREMENTAL) && !defined(NDEBUG)
3003#if (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_LLVM)
3004static void __attribute__((__unused__))
3005#else
3006static void
3007#endif
3008DVAL_ASSERT(lzo_xint dv, const lzo_bytep p)
3009{
3010    lzo_xint df;
3011    DVAL_FIRST(df,(p));
3012    assert(DINDEX(dv,p) == DINDEX(df,p));
3013}
3014#else
3015#  define DVAL_ASSERT(dv,p) ((void) 0)
3016#endif
3017#endif
3018
3019#if (LZO_DICT_USE_PTR)
3020#  define DENTRY(p,in)                          (p)
3021#  define GINDEX(m_pos,m_off,dict,dindex,in)    m_pos = dict[dindex]
3022#else
3023#  define DENTRY(p,in)                          ((lzo_dict_t) pd(p, in))
3024#  define GINDEX(m_pos,m_off,dict,dindex,in)    m_off = dict[dindex]
3025#endif
3026
3027#if (DD_BITS == 0)
3028
3029#  define UPDATE_D(dict,drun,dv,p,in)       dict[ DINDEX(dv,p) ] = DENTRY(p,in)
3030#  define UPDATE_I(dict,drun,index,p,in)    dict[index] = DENTRY(p,in)
3031#  define UPDATE_P(ptr,drun,p,in)           (ptr)[0] = DENTRY(p,in)
3032
3033#else
3034
3035#  define UPDATE_D(dict,drun,dv,p,in)   \
3036        dict[ DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= DD_MASK
3037#  define UPDATE_I(dict,drun,index,p,in)    \
3038        dict[ (index) + drun++ ] = DENTRY(p,in); drun &= DD_MASK
3039#  define UPDATE_P(ptr,drun,p,in)   \
3040        (ptr) [ drun++ ] = DENTRY(p,in); drun &= DD_MASK
3041
3042#endif
3043
3044#if (LZO_DICT_USE_PTR)
3045
3046#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \
3047        (m_pos == NULL || (m_off = pd(ip, m_pos)) > max_offset)
3048
3049#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \
3050    (BOUNDS_CHECKING_OFF_IN_EXPR(( \
3051        m_pos = ip - (lzo_uint) PTR_DIFF(ip,m_pos), \
3052        PTR_LT(m_pos,in) || \
3053        (m_off = (lzo_uint) PTR_DIFF(ip,m_pos)) == 0 || \
3054         m_off > max_offset )))
3055
3056#else
3057
3058#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \
3059        (m_off == 0 || \
3060         ((m_off = pd(ip, in) - m_off) > max_offset) || \
3061         (m_pos = (ip) - (m_off), 0) )
3062
3063#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \
3064        (pd(ip, in) <= m_off || \
3065         ((m_off = pd(ip, in) - m_off) > max_offset) || \
3066         (m_pos = (ip) - (m_off), 0) )
3067
3068#endif
3069
3070#if (LZO_DETERMINISTIC)
3071#  define LZO_CHECK_MPOS    LZO_CHECK_MPOS_DET
3072#else
3073#  define LZO_CHECK_MPOS    LZO_CHECK_MPOS_NON_DET
3074#endif
3075
3076#ifdef __cplusplus
3077}
3078#endif
3079
3080#endif
3081
3082#endif
3083
3084#endif
3085
3086#define LZO_DETERMINISTIC !(LZO_DICT_USE_PTR)
3087
3088#ifndef DO_COMPRESS
3089#define DO_COMPRESS     lzo1x_1_compress
3090#endif
3091
3092#if 1 && defined(DO_COMPRESS) && !defined(do_compress)
3093#  define do_compress       LZO_CPP_ECONCAT2(DO_COMPRESS,_core)
3094#endif
3095
3096#if defined(UA_GET64) && (LZO_ABI_BIG_ENDIAN)
3097#  define WANT_lzo_bitops_clz64 1
3098#elif defined(UA_GET64) && (LZO_ABI_LITTLE_ENDIAN)
3099#  define WANT_lzo_bitops_ctz64 1
3100#elif defined(UA_GET32) && (LZO_ABI_BIG_ENDIAN)
3101#  define WANT_lzo_bitops_clz32 1
3102#elif defined(UA_GET32) && (LZO_ABI_LITTLE_ENDIAN)
3103#  define WANT_lzo_bitops_ctz32 1
3104#endif
3105
3106#if (defined(_WIN32) || defined(_WIN64)) && ((LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_MSC && (_MSC_VER >= 1400)))
3107#include <intrin.h>
3108#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32) && 0
3109#pragma intrinsic(_BitScanReverse)
3110static __lzo_inline unsigned lzo_bitops_clz32(lzo_uint32 v)
3111{
3112    unsigned long r;
3113    (void) _BitScanReverse(&r, v);
3114    return (unsigned) r;
3115}
3116#define lzo_bitops_clz32 lzo_bitops_clz32
3117#endif
3118#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX) && 0
3119#pragma intrinsic(_BitScanReverse64)
3120static __lzo_inline unsigned lzo_bitops_clz64(lzo_uint64 v)
3121{
3122    unsigned long r;
3123    (void) _BitScanReverse64(&r, v);
3124    return (unsigned) r;
3125}
3126#define lzo_bitops_clz64 lzo_bitops_clz64
3127#endif
3128#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32)
3129#pragma intrinsic(_BitScanForward)
3130static __lzo_inline unsigned lzo_bitops_ctz32(lzo_uint32 v)
3131{
3132    unsigned long r;
3133    (void) _BitScanForward(&r, v);
3134    return (unsigned) r;
3135}
3136#define lzo_bitops_ctz32 lzo_bitops_ctz32
3137#endif
3138#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX)
3139#pragma intrinsic(_BitScanForward64)
3140static __lzo_inline unsigned lzo_bitops_ctz64(lzo_uint64 v)
3141{
3142    unsigned long r;
3143    (void) _BitScanForward64(&r, v);
3144    return (unsigned) r;
3145}
3146#define lzo_bitops_ctz64 lzo_bitops_ctz64
3147#endif
3148
3149#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul))))
3150#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32)
3151#define lzo_bitops_clz32(v) ((unsigned) __builtin_clz(v))
3152#endif
3153#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX)
3154#define lzo_bitops_clz64(v) ((unsigned) __builtin_clzll(v))
3155#endif
3156#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32)
3157#define lzo_bitops_ctz32(v) ((unsigned) __builtin_ctz(v))
3158#endif
3159#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX)
3160#define lzo_bitops_ctz64(v) ((unsigned) __builtin_ctzll(v))
3161#endif
3162#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount32)
3163#define lzo_bitops_popcount32(v) ((unsigned) __builtin_popcount(v))
3164#endif
3165#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount64) && defined(LZO_UINT64_MAX)
3166#define lzo_bitops_popcount64(v) ((unsigned) __builtin_popcountll(v))
3167#endif
3168#endif
3169
3170static __lzo_noinline lzo_uint
3171do_compress ( const lzo_bytep in , lzo_uint  in_len,
3172                    lzo_bytep out, lzo_uintp out_len,
3173                    lzo_uint  ti,  lzo_voidp wrkmem)
3174{
3175    register const lzo_bytep ip;
3176    lzo_bytep op;
3177    const lzo_bytep const in_end = in + in_len;
3178    const lzo_bytep const ip_end = in + in_len - 20;
3179    const lzo_bytep ii;
3180    lzo_dict_p const dict = (lzo_dict_p) wrkmem;
3181
3182    op = out;
3183    ip = in;
3184    ii = ip;
3185
3186    ip += ti < 4 ? 4 - ti : 0;
3187    for (;;)
3188    {
3189        const lzo_bytep m_pos;
3190#if !(LZO_DETERMINISTIC)
3191        LZO_DEFINE_UNINITIALIZED_VAR(lzo_uint, m_off, 0);
3192        lzo_uint m_len;
3193        lzo_uint dindex;
3194next:
3195        if __lzo_unlikely(ip >= ip_end)
3196            break;
3197        DINDEX1(dindex,ip);
3198        GINDEX(m_pos,m_off,dict,dindex,in);
3199        if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET))
3200            goto literal;
3201#if 1
3202        if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3])
3203            goto try_match;
3204        DINDEX2(dindex,ip);
3205#endif
3206        GINDEX(m_pos,m_off,dict,dindex,in);
3207        if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET))
3208            goto literal;
3209        if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3])
3210            goto try_match;
3211        goto literal;
3212
3213try_match:
3214#if defined(UA_GET32)
3215        if (UA_GET32(m_pos) != UA_GET32(ip))
3216#else
3217        if (m_pos[0] != ip[0] || m_pos[1] != ip[1] || m_pos[2] != ip[2] || m_pos[3] != ip[3])
3218#endif
3219        {
3220literal:
3221            UPDATE_I(dict,0,dindex,ip,in);
3222            ip += 1 + ((ip - ii) >> 5);
3223            continue;
3224        }
3225        UPDATE_I(dict,0,dindex,ip,in);
3226#else
3227        lzo_uint m_off;
3228        lzo_uint m_len;
3229        {
3230        lzo_uint32 dv;
3231        lzo_uint dindex;
3232literal:
3233        ip += 1 + ((ip - ii) >> 5);
3234next:
3235        if __lzo_unlikely(ip >= ip_end)
3236            break;
3237        dv = UA_GET32(ip);
3238        dindex = DINDEX(dv,ip);
3239        GINDEX(m_off,m_pos,in+dict,dindex,in);
3240        UPDATE_I(dict,0,dindex,ip,in);
3241        if __lzo_unlikely(dv != UA_GET32(m_pos))
3242            goto literal;
3243        }
3244#endif
3245
3246        ii -= ti; ti = 0;
3247        {
3248        register lzo_uint t = pd(ip,ii);
3249        if (t != 0)
3250        {
3251            if (t <= 3)
3252            {
3253                op[-2] |= LZO_BYTE(t);
3254#if defined(UA_COPY32)
3255                UA_COPY32(op, ii);
3256                op += t;
3257#else
3258                { do *op++ = *ii++; while (--t > 0); }
3259#endif
3260            }
3261#if defined(UA_COPY32) || defined(UA_COPY64)
3262            else if (t <= 16)
3263            {
3264                *op++ = LZO_BYTE(t - 3);
3265#if defined(UA_COPY64)
3266                UA_COPY64(op, ii);
3267                UA_COPY64(op+8, ii+8);
3268#else
3269                UA_COPY32(op, ii);
3270                UA_COPY32(op+4, ii+4);
3271                UA_COPY32(op+8, ii+8);
3272                UA_COPY32(op+12, ii+12);
3273#endif
3274                op += t;
3275            }
3276#endif
3277            else
3278            {
3279                if (t <= 18)
3280                    *op++ = LZO_BYTE(t - 3);
3281                else
3282                {
3283                    register lzo_uint tt = t - 18;
3284                    *op++ = 0;
3285                    while __lzo_unlikely(tt > 255)
3286                    {
3287                        tt -= 255;
3288#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400))
3289                        * (volatile unsigned char *) op++ = 0;
3290#else
3291                        *op++ = 0;
3292#endif
3293                    }
3294                    assert(tt > 0);
3295                    *op++ = LZO_BYTE(tt);
3296                }
3297#if defined(UA_COPY32) || defined(UA_COPY64)
3298                do {
3299#if defined(UA_COPY64)
3300                    UA_COPY64(op, ii);
3301                    UA_COPY64(op+8, ii+8);
3302#else
3303                    UA_COPY32(op, ii);
3304                    UA_COPY32(op+4, ii+4);
3305                    UA_COPY32(op+8, ii+8);
3306                    UA_COPY32(op+12, ii+12);
3307#endif
3308                    op += 16; ii += 16; t -= 16;
3309                } while (t >= 16); if (t > 0)
3310#endif
3311                { do *op++ = *ii++; while (--t > 0); }
3312            }
3313        }
3314        }
3315        m_len = 4;
3316        {
3317#if defined(UA_GET64)
3318        lzo_uint64 v;
3319        v = UA_GET64(ip + m_len) ^ UA_GET64(m_pos + m_len);
3320        if __lzo_unlikely(v == 0) {
3321            do {
3322                m_len += 8;
3323                v = UA_GET64(ip + m_len) ^ UA_GET64(m_pos + m_len);
3324                if __lzo_unlikely(ip + m_len >= ip_end)
3325                    goto m_len_done;
3326            } while (v == 0);
3327        }
3328#if (LZO_ABI_BIG_ENDIAN) && defined(lzo_bitops_clz64)
3329        m_len += lzo_bitops_clz64(v) / CHAR_BIT;
3330#elif (LZO_ABI_BIG_ENDIAN)
3331        if ((v >> (64 - CHAR_BIT)) == 0) do {
3332            v <<= CHAR_BIT;
3333            m_len += 1;
3334        } while ((v >> (64 - CHAR_BIT)) == 0);
3335#elif (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz64)
3336        m_len += lzo_bitops_ctz64(v) / CHAR_BIT;
3337#elif (LZO_ABI_LITTLE_ENDIAN)
3338        if ((v & UCHAR_MAX) == 0) do {
3339            v >>= CHAR_BIT;
3340            m_len += 1;
3341        } while ((v & UCHAR_MAX) == 0);
3342#else
3343        if (ip[m_len] == m_pos[m_len]) do {
3344            m_len += 1;
3345        } while (ip[m_len] == m_pos[m_len]);
3346#endif
3347#elif defined(UA_GET32)
3348        lzo_uint32 v;
3349        v = UA_GET32(ip + m_len) ^ UA_GET32(m_pos + m_len);
3350        if __lzo_unlikely(v == 0) {
3351            do {
3352                m_len += 4;
3353                v = UA_GET32(ip + m_len) ^ UA_GET32(m_pos + m_len);
3354                if __lzo_unlikely(ip + m_len >= ip_end)
3355                    goto m_len_done;
3356            } while (v == 0);
3357        }
3358#if (LZO_ABI_BIG_ENDIAN) && defined(lzo_bitops_clz32)
3359        m_len += lzo_bitops_clz32(v) / CHAR_BIT;
3360#elif (LZO_ABI_BIG_ENDIAN)
3361        if ((v >> (32 - CHAR_BIT)) == 0) do {
3362            v <<= CHAR_BIT;
3363            m_len += 1;
3364        } while ((v >> (32 - CHAR_BIT)) == 0);
3365#elif (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz32)
3366        m_len += lzo_bitops_ctz32(v) / CHAR_BIT;
3367#elif (LZO_ABI_LITTLE_ENDIAN)
3368        if ((v & UCHAR_MAX) == 0) do {
3369            v >>= CHAR_BIT;
3370            m_len += 1;
3371        } while ((v & UCHAR_MAX) == 0);
3372#else
3373        if (ip[m_len] == m_pos[m_len]) do {
3374            m_len += 1;
3375        } while (ip[m_len] == m_pos[m_len]);
3376#endif
3377#else
3378        if __lzo_unlikely(ip[m_len] == m_pos[m_len]) {
3379            do {
3380                m_len += 1;
3381                if __lzo_unlikely(ip + m_len >= ip_end)
3382                    goto m_len_done;
3383            } while (ip[m_len] == m_pos[m_len]);
3384        }
3385#endif
3386        }
3387m_len_done:
3388        m_off = pd(ip,m_pos);
3389        ip += m_len;
3390        ii = ip;
3391        if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
3392        {
3393            m_off -= 1;
3394#if defined(LZO1X)
3395            *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
3396            *op++ = LZO_BYTE(m_off >> 3);
3397#elif defined(LZO1Y)
3398            *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
3399            *op++ = LZO_BYTE(m_off >> 2);
3400#endif
3401        }
3402        else if (m_off <= M3_MAX_OFFSET)
3403        {
3404            m_off -= 1;
3405            if (m_len <= M3_MAX_LEN)
3406                *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
3407            else
3408            {
3409                m_len -= M3_MAX_LEN;
3410                *op++ = M3_MARKER | 0;
3411                while __lzo_unlikely(m_len > 255)
3412                {
3413                    m_len -= 255;
3414#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400))
3415                    * (volatile unsigned char *) op++ = 0;
3416#else
3417                    *op++ = 0;
3418#endif
3419                }
3420                *op++ = LZO_BYTE(m_len);
3421            }
3422            *op++ = LZO_BYTE(m_off << 2);
3423            *op++ = LZO_BYTE(m_off >> 6);
3424        }
3425        else
3426        {
3427            m_off -= 0x4000;
3428            if (m_len <= M4_MAX_LEN)
3429                *op++ = LZO_BYTE(M4_MARKER | ((m_off >> 11) & 8) | (m_len - 2));
3430            else
3431            {
3432                m_len -= M4_MAX_LEN;
3433                *op++ = LZO_BYTE(M4_MARKER | ((m_off >> 11) & 8));
3434                while __lzo_unlikely(m_len > 255)
3435                {
3436                    m_len -= 255;
3437#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400))
3438                    * (volatile unsigned char *) op++ = 0;
3439#else
3440                    *op++ = 0;
3441#endif
3442                }
3443                *op++ = LZO_BYTE(m_len);
3444            }
3445            *op++ = LZO_BYTE(m_off << 2);
3446            *op++ = LZO_BYTE(m_off >> 6);
3447        }
3448        goto next;
3449    }
3450
3451    *out_len = pd(op, out);
3452    return pd(in_end,ii-ti);
3453}
3454
3455LZO_PUBLIC(int)
3456DO_COMPRESS      ( const lzo_bytep in , lzo_uint  in_len,
3457                         lzo_bytep out, lzo_uintp out_len,
3458                         lzo_voidp wrkmem )
3459{
3460    const lzo_bytep ip = in;
3461    lzo_bytep op = out;
3462    lzo_uint l = in_len;
3463    lzo_uint t = 0;
3464
3465    while (l > 20)
3466    {
3467        lzo_uint ll = l;
3468        lzo_uintptr_t ll_end;
3469#if 0 || (LZO_DETERMINISTIC)
3470        ll = LZO_MIN(ll, 49152);
3471#endif
3472        ll_end = (lzo_uintptr_t)ip + ll;
3473        if ((ll_end + ((t + ll) >> 5)) <= ll_end || (const lzo_bytep)(ll_end + ((t + ll) >> 5)) <= ip + ll)
3474            break;
3475#if (LZO_DETERMINISTIC)
3476        lzo_memset(wrkmem, 0, ((lzo_uint)1 << D_BITS) * sizeof(lzo_dict_t));
3477#endif
3478        t = do_compress(ip,ll,op,out_len,t,wrkmem);
3479        ip += ll;
3480        op += *out_len;
3481        l  -= ll;
3482    }
3483    t += l;
3484
3485    if (t > 0)
3486    {
3487        const lzo_bytep ii = in + in_len - t;
3488
3489        if (op == out && t <= 238)
3490            *op++ = LZO_BYTE(17 + t);
3491        else if (t <= 3)
3492            op[-2] |= LZO_BYTE(t);
3493        else if (t <= 18)
3494            *op++ = LZO_BYTE(t - 3);
3495        else
3496        {
3497            lzo_uint tt = t - 18;
3498
3499            *op++ = 0;
3500            while (tt > 255)
3501            {
3502                tt -= 255;
3503#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400))
3504
3505                * (volatile unsigned char *) op++ = 0;
3506#else
3507                *op++ = 0;
3508#endif
3509            }
3510            assert(tt > 0);
3511            *op++ = LZO_BYTE(tt);
3512        }
3513        do *op++ = *ii++; while (--t > 0);
3514    }
3515
3516    *op++ = M4_MARKER | 1;
3517    *op++ = 0;
3518    *op++ = 0;
3519
3520    *out_len = pd(op, out);
3521    return LZO_E_OK;
3522}
3523
3524#endif
3525
3526#undef do_compress
3527#undef DO_COMPRESS
3528#undef LZO_HASH
3529
3530#undef LZO_TEST_OVERRUN
3531#undef DO_DECOMPRESS
3532#define DO_DECOMPRESS       lzo1x_decompress
3533
3534#if !defined(MINILZO_CFG_SKIP_LZO1X_DECOMPRESS)
3535
3536#if defined(LZO_TEST_OVERRUN)
3537#  if !defined(LZO_TEST_OVERRUN_INPUT)
3538#    define LZO_TEST_OVERRUN_INPUT       2
3539#  endif
3540#  if !defined(LZO_TEST_OVERRUN_OUTPUT)
3541#    define LZO_TEST_OVERRUN_OUTPUT      2
3542#  endif
3543#  if !defined(LZO_TEST_OVERRUN_LOOKBEHIND)
3544#    define LZO_TEST_OVERRUN_LOOKBEHIND  1
3545#  endif
3546#endif
3547
3548#undef TEST_IP
3549#undef TEST_OP
3550#undef TEST_LB
3551#undef TEST_LBO
3552#undef NEED_IP
3553#undef NEED_OP
3554#undef HAVE_TEST_IP
3555#undef HAVE_TEST_OP
3556#undef HAVE_NEED_IP
3557#undef HAVE_NEED_OP
3558#undef HAVE_ANY_IP
3559#undef HAVE_ANY_OP
3560
3561#if defined(LZO_TEST_OVERRUN_INPUT)
3562#  if (LZO_TEST_OVERRUN_INPUT >= 1)
3563#    define TEST_IP             (ip < ip_end)
3564#  endif
3565#  if (LZO_TEST_OVERRUN_INPUT >= 2)
3566#    define NEED_IP(x) \
3567            if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x))  goto input_overrun
3568#  endif
3569#endif
3570
3571#if defined(LZO_TEST_OVERRUN_OUTPUT)
3572#  if (LZO_TEST_OVERRUN_OUTPUT >= 1)
3573#    define TEST_OP             (op <= op_end)
3574#  endif
3575#  if (LZO_TEST_OVERRUN_OUTPUT >= 2)
3576#    undef TEST_OP
3577#    define NEED_OP(x) \
3578            if ((lzo_uint)(op_end - op) < (lzo_uint)(x))  goto output_overrun
3579#  endif
3580#endif
3581
3582#if defined(LZO_TEST_OVERRUN_LOOKBEHIND)
3583#  define TEST_LB(m_pos)        if (m_pos < out || m_pos >= op) goto lookbehind_overrun
3584#  define TEST_LBO(m_pos,o)     if (m_pos < out || m_pos >= op - (o)) goto lookbehind_overrun
3585#else
3586#  define TEST_LB(m_pos)        ((void) 0)
3587#  define TEST_LBO(m_pos,o)     ((void) 0)
3588#endif
3589
3590#if !defined(LZO_EOF_CODE) && !defined(TEST_IP)
3591#  define TEST_IP               (ip < ip_end)
3592#endif
3593
3594#if defined(TEST_IP)
3595#  define HAVE_TEST_IP 1
3596#else
3597#  define TEST_IP               1
3598#endif
3599#if defined(TEST_OP)
3600#  define HAVE_TEST_OP 1
3601#else
3602#  define TEST_OP               1
3603#endif
3604
3605#if defined(NEED_IP)
3606#  define HAVE_NEED_IP 1
3607#else
3608#  define NEED_IP(x)            ((void) 0)
3609#endif
3610#if defined(NEED_OP)
3611#  define HAVE_NEED_OP 1
3612#else
3613#  define NEED_OP(x)            ((void) 0)
3614#endif
3615
3616#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP)
3617#  define HAVE_ANY_IP 1
3618#endif
3619#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP)
3620#  define HAVE_ANY_OP 1
3621#endif
3622
3623#if defined(DO_DECOMPRESS)
3624LZO_PUBLIC(int)
3625DO_DECOMPRESS  ( const lzo_bytep in , lzo_uint  in_len,
3626                       lzo_bytep out, lzo_uintp out_len,
3627                       lzo_voidp wrkmem )
3628#endif
3629{
3630    register lzo_bytep op;
3631    register const lzo_bytep ip;
3632    register lzo_uint t;
3633#if defined(COPY_DICT)
3634    lzo_uint m_off;
3635    const lzo_bytep dict_end;
3636#else
3637    register const lzo_bytep m_pos;
3638#endif
3639
3640    const lzo_bytep const ip_end = in + in_len;
3641#if defined(HAVE_ANY_OP)
3642    lzo_bytep const op_end = out + *out_len;
3643#endif
3644#if defined(LZO1Z)
3645    lzo_uint last_m_off = 0;
3646#endif
3647
3648    LZO_UNUSED(wrkmem);
3649
3650#if defined(COPY_DICT)
3651    if (dict)
3652    {
3653        if (dict_len > M4_MAX_OFFSET)
3654        {
3655            dict += dict_len - M4_MAX_OFFSET;
3656            dict_len = M4_MAX_OFFSET;
3657        }
3658        dict_end = dict + dict_len;
3659    }
3660    else
3661    {
3662        dict_len = 0;
3663        dict_end = NULL;
3664    }
3665#endif
3666
3667    *out_len = 0;
3668
3669    op = out;
3670    ip = in;
3671
3672    if (*ip > 17)
3673    {
3674        t = *ip++ - 17;
3675        if (t < 4)
3676            goto match_next;
3677        assert(t > 0); NEED_OP(t); NEED_IP(t+1);
3678        do *op++ = *ip++; while (--t > 0);
3679        goto first_literal_run;
3680    }
3681
3682    while (TEST_IP && TEST_OP)
3683    {
3684        t = *ip++;
3685        if (t >= 16)
3686            goto match;
3687        if (t == 0)
3688        {
3689            NEED_IP(1);
3690            while (*ip == 0)
3691            {
3692                t += 255;
3693                ip++;
3694                NEED_IP(1);
3695            }
3696            t += 15 + *ip++;
3697        }
3698        assert(t > 0); NEED_OP(t+3); NEED_IP(t+4);
3699#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4)
3700        t += 3;
3701        if (t >= 8) do
3702        {
3703            UA_COPY64(op,ip);
3704            op += 8; ip += 8; t -= 8;
3705        } while (t >= 8);
3706        if (t >= 4)
3707        {
3708            UA_COPY32(op,ip);
3709            op += 4; ip += 4; t -= 4;
3710        }
3711        if (t > 0)
3712        {
3713            *op++ = *ip++;
3714            if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } }
3715        }
3716#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
3717#if !defined(LZO_UNALIGNED_OK_4)
3718        if (PTR_ALIGNED2_4(op,ip))
3719        {
3720#endif
3721        UA_COPY32(op,ip);
3722        op += 4; ip += 4;
3723        if (--t > 0)
3724        {
3725            if (t >= 4)
3726            {
3727                do {
3728                    UA_COPY32(op,ip);
3729                    op += 4; ip += 4; t -= 4;
3730                } while (t >= 4);
3731                if (t > 0) do *op++ = *ip++; while (--t > 0);
3732            }
3733            else
3734                do *op++ = *ip++; while (--t > 0);
3735        }
3736#if !defined(LZO_UNALIGNED_OK_4)
3737        }
3738        else
3739#endif
3740#endif
3741#if !defined(LZO_UNALIGNED_OK_4) && !defined(LZO_UNALIGNED_OK_8)
3742        {
3743            *op++ = *ip++; *op++ = *ip++; *op++ = *ip++;
3744            do *op++ = *ip++; while (--t > 0);
3745        }
3746#endif
3747
3748first_literal_run:
3749
3750        t = *ip++;
3751        if (t >= 16)
3752            goto match;
3753#if defined(COPY_DICT)
3754#if defined(LZO1Z)
3755        m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2);
3756        last_m_off = m_off;
3757#else
3758        m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2);
3759#endif
3760        NEED_OP(3);
3761        t = 3; COPY_DICT(t,m_off)
3762#else
3763#if defined(LZO1Z)
3764        t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2);
3765        m_pos = op - t;
3766        last_m_off = t;
3767#else
3768        m_pos = op - (1 + M2_MAX_OFFSET);
3769        m_pos -= t >> 2;
3770        m_pos -= *ip++ << 2;
3771#endif
3772        TEST_LB(m_pos); NEED_OP(3);
3773        *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos;
3774#endif
3775        goto match_done;
3776
3777        do {
3778match:
3779            if (t >= 64)
3780            {
3781#if defined(COPY_DICT)
3782#if defined(LZO1X)
3783                m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3);
3784                t = (t >> 5) - 1;
3785#elif defined(LZO1Y)
3786                m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2);
3787                t = (t >> 4) - 3;
3788#elif defined(LZO1Z)
3789                m_off = t & 0x1f;
3790                if (m_off >= 0x1c)
3791                    m_off = last_m_off;
3792                else
3793                {
3794                    m_off = 1 + (m_off << 6) + (*ip++ >> 2);
3795                    last_m_off = m_off;
3796                }
3797                t = (t >> 5) - 1;
3798#endif
3799#else
3800#if defined(LZO1X)
3801                m_pos = op - 1;
3802                m_pos -= (t >> 2) & 7;
3803                m_pos -= *ip++ << 3;
3804                t = (t >> 5) - 1;
3805#elif defined(LZO1Y)
3806                m_pos = op - 1;
3807                m_pos -= (t >> 2) & 3;
3808                m_pos -= *ip++ << 2;
3809                t = (t >> 4) - 3;
3810#elif defined(LZO1Z)
3811                {
3812                    lzo_uint off = t & 0x1f;
3813                    m_pos = op;
3814                    if (off >= 0x1c)
3815                    {
3816                        assert(last_m_off > 0);
3817                        m_pos -= last_m_off;
3818                    }
3819                    else
3820                    {
3821                        off = 1 + (off << 6) + (*ip++ >> 2);
3822                        m_pos -= off;
3823                        last_m_off = off;
3824                    }
3825                }
3826                t = (t >> 5) - 1;
3827#endif
3828                TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1);
3829                goto copy_match;
3830#endif
3831            }
3832            else if (t >= 32)
3833            {
3834                t &= 31;
3835                if (t == 0)
3836                {
3837                    NEED_IP(1);
3838                    while (*ip == 0)
3839                    {
3840                        t += 255;
3841                        ip++;
3842                        NEED_IP(1);
3843                    }
3844                    t += 31 + *ip++;
3845                }
3846#if defined(COPY_DICT)
3847#if defined(LZO1Z)
3848                m_off = 1 + (ip[0] << 6) + (ip[1] >> 2);
3849                last_m_off = m_off;
3850#else
3851                m_off = 1 + (ip[0] >> 2) + (ip[1] << 6);
3852#endif
3853#else
3854#if defined(LZO1Z)
3855                {
3856                    lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2);
3857                    m_pos = op - off;
3858                    last_m_off = off;
3859                }
3860#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN)
3861                m_pos = op - 1;
3862                m_pos -= UA_GET16(ip) >> 2;
3863#else
3864                m_pos = op - 1;
3865                m_pos -= (ip[0] >> 2) + (ip[1] << 6);
3866#endif
3867#endif
3868                ip += 2;
3869            }
3870            else if (t >= 16)
3871            {
3872#if defined(COPY_DICT)
3873                m_off = (t & 8) << 11;
3874#else
3875                m_pos = op;
3876                m_pos -= (t & 8) << 11;
3877#endif
3878                t &= 7;
3879                if (t == 0)
3880                {
3881                    NEED_IP(1);
3882                    while (*ip == 0)
3883                    {
3884                        t += 255;
3885                        ip++;
3886                        NEED_IP(1);
3887                    }
3888                    t += 7 + *ip++;
3889                }
3890#if defined(COPY_DICT)
3891#if defined(LZO1Z)
3892                m_off += (ip[0] << 6) + (ip[1] >> 2);
3893#else
3894                m_off += (ip[0] >> 2) + (ip[1] << 6);
3895#endif
3896                ip += 2;
3897                if (m_off == 0)
3898                    goto eof_found;
3899                m_off += 0x4000;
3900#if defined(LZO1Z)
3901                last_m_off = m_off;
3902#endif
3903#else
3904#if defined(LZO1Z)
3905                m_pos -= (ip[0] << 6) + (ip[1] >> 2);
3906#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN)
3907                m_pos -= UA_GET16(ip) >> 2;
3908#else
3909                m_pos -= (ip[0] >> 2) + (ip[1] << 6);
3910#endif
3911                ip += 2;
3912                if (m_pos == op)
3913                    goto eof_found;
3914                m_pos -= 0x4000;
3915#if defined(LZO1Z)
3916                last_m_off = pd((const lzo_bytep)op, m_pos);
3917#endif
3918#endif
3919            }
3920            else
3921            {
3922#if defined(COPY_DICT)
3923#if defined(LZO1Z)
3924                m_off = 1 + (t << 6) + (*ip++ >> 2);
3925                last_m_off = m_off;
3926#else
3927                m_off = 1 + (t >> 2) + (*ip++ << 2);
3928#endif
3929                NEED_OP(2);
3930                t = 2; COPY_DICT(t,m_off)
3931#else
3932#if defined(LZO1Z)
3933                t = 1 + (t << 6) + (*ip++ >> 2);
3934                m_pos = op - t;
3935                last_m_off = t;
3936#else
3937                m_pos = op - 1;
3938                m_pos -= t >> 2;
3939                m_pos -= *ip++ << 2;
3940#endif
3941                TEST_LB(m_pos); NEED_OP(2);
3942                *op++ = *m_pos++; *op++ = *m_pos;
3943#endif
3944                goto match_done;
3945            }
3946
3947#if defined(COPY_DICT)
3948
3949            NEED_OP(t+3-1);
3950            t += 3-1; COPY_DICT(t,m_off)
3951
3952#else
3953
3954            TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1);
3955#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4)
3956            if (op - m_pos >= 8)
3957            {
3958                t += (3 - 1);
3959                if (t >= 8) do
3960                {
3961                    UA_COPY64(op,m_pos);
3962                    op += 8; m_pos += 8; t -= 8;
3963                } while (t >= 8);
3964                if (t >= 4)
3965                {
3966                    UA_COPY32(op,m_pos);
3967                    op += 4; m_pos += 4; t -= 4;
3968                }
3969                if (t > 0)
3970                {
3971                    *op++ = m_pos[0];
3972                    if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } }
3973                }
3974            }
3975            else
3976#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
3977#if !defined(LZO_UNALIGNED_OK_4)
3978            if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos))
3979            {
3980                assert((op - m_pos) >= 4);
3981#else
3982            if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4)
3983            {
3984#endif
3985                UA_COPY32(op,m_pos);
3986                op += 4; m_pos += 4; t -= 4 - (3 - 1);
3987                do {
3988                    UA_COPY32(op,m_pos);
3989                    op += 4; m_pos += 4; t -= 4;
3990                } while (t >= 4);
3991                if (t > 0) do *op++ = *m_pos++; while (--t > 0);
3992            }
3993            else
3994#endif
3995            {
3996copy_match:
3997                *op++ = *m_pos++; *op++ = *m_pos++;
3998                do *op++ = *m_pos++; while (--t > 0);
3999            }
4000
4001#endif
4002
4003match_done:
4004#if defined(LZO1Z)
4005            t = ip[-1] & 3;
4006#else
4007            t = ip[-2] & 3;
4008#endif
4009            if (t == 0)
4010                break;
4011
4012match_next:
4013            assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1);
4014#if 0
4015            do *op++ = *ip++; while (--t > 0);
4016#else
4017            *op++ = *ip++;
4018            if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } }
4019#endif
4020            t = *ip++;
4021        } while (TEST_IP && TEST_OP);
4022    }
4023
4024#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP)
4025    *out_len = pd(op, out);
4026    return LZO_E_EOF_NOT_FOUND;
4027#endif
4028
4029eof_found:
4030    assert(t == 1);
4031    *out_len = pd(op, out);
4032    return (ip == ip_end ? LZO_E_OK :
4033           (ip < ip_end  ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN));
4034
4035#if defined(HAVE_NEED_IP)
4036input_overrun:
4037    *out_len = pd(op, out);
4038    return LZO_E_INPUT_OVERRUN;
4039#endif
4040
4041#if defined(HAVE_NEED_OP)
4042output_overrun:
4043    *out_len = pd(op, out);
4044    return LZO_E_OUTPUT_OVERRUN;
4045#endif
4046
4047#if defined(LZO_TEST_OVERRUN_LOOKBEHIND)
4048lookbehind_overrun:
4049    *out_len = pd(op, out);
4050    return LZO_E_LOOKBEHIND_OVERRUN;
4051#endif
4052}
4053
4054#endif
4055
4056#define LZO_TEST_OVERRUN 1
4057#undef DO_DECOMPRESS
4058#define DO_DECOMPRESS       lzo1x_decompress_safe
4059
4060#if !defined(MINILZO_CFG_SKIP_LZO1X_DECOMPRESS_SAFE)
4061
4062#if defined(LZO_TEST_OVERRUN)
4063#  if !defined(LZO_TEST_OVERRUN_INPUT)
4064#    define LZO_TEST_OVERRUN_INPUT       2
4065#  endif
4066#  if !defined(LZO_TEST_OVERRUN_OUTPUT)
4067#    define LZO_TEST_OVERRUN_OUTPUT      2
4068#  endif
4069#  if !defined(LZO_TEST_OVERRUN_LOOKBEHIND)
4070#    define LZO_TEST_OVERRUN_LOOKBEHIND  1
4071#  endif
4072#endif
4073
4074#undef TEST_IP
4075#undef TEST_OP
4076#undef TEST_LB
4077#undef TEST_LBO
4078#undef NEED_IP
4079#undef NEED_OP
4080#undef HAVE_TEST_IP
4081#undef HAVE_TEST_OP
4082#undef HAVE_NEED_IP
4083#undef HAVE_NEED_OP
4084#undef HAVE_ANY_IP
4085#undef HAVE_ANY_OP
4086
4087#if defined(LZO_TEST_OVERRUN_INPUT)
4088#  if (LZO_TEST_OVERRUN_INPUT >= 1)
4089#    define TEST_IP             (ip < ip_end)
4090#  endif
4091#  if (LZO_TEST_OVERRUN_INPUT >= 2)
4092#    define NEED_IP(x) \
4093            if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x))  goto input_overrun
4094#  endif
4095#endif
4096
4097#if defined(LZO_TEST_OVERRUN_OUTPUT)
4098#  if (LZO_TEST_OVERRUN_OUTPUT >= 1)
4099#    define TEST_OP             (op <= op_end)
4100#  endif
4101#  if (LZO_TEST_OVERRUN_OUTPUT >= 2)
4102#    undef TEST_OP
4103#    define NEED_OP(x) \
4104            if ((lzo_uint)(op_end - op) < (lzo_uint)(x))  goto output_overrun
4105#  endif
4106#endif
4107
4108#if defined(LZO_TEST_OVERRUN_LOOKBEHIND)
4109#  define TEST_LB(m_pos)        if (m_pos < out || m_pos >= op) goto lookbehind_overrun
4110#  define TEST_LBO(m_pos,o)     if (m_pos < out || m_pos >= op - (o)) goto lookbehind_overrun
4111#else
4112#  define TEST_LB(m_pos)        ((void) 0)
4113#  define TEST_LBO(m_pos,o)     ((void) 0)
4114#endif
4115
4116#if !defined(LZO_EOF_CODE) && !defined(TEST_IP)
4117#  define TEST_IP               (ip < ip_end)
4118#endif
4119
4120#if defined(TEST_IP)
4121#  define HAVE_TEST_IP 1
4122#else
4123#  define TEST_IP               1
4124#endif
4125#if defined(TEST_OP)
4126#  define HAVE_TEST_OP 1
4127#else
4128#  define TEST_OP               1
4129#endif
4130
4131#if defined(NEED_IP)
4132#  define HAVE_NEED_IP 1
4133#else
4134#  define NEED_IP(x)            ((void) 0)
4135#endif
4136#if defined(NEED_OP)
4137#  define HAVE_NEED_OP 1
4138#else
4139#  define NEED_OP(x)            ((void) 0)
4140#endif
4141
4142#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP)
4143#  define HAVE_ANY_IP 1
4144#endif
4145#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP)
4146#  define HAVE_ANY_OP 1
4147#endif
4148
4149#if defined(DO_DECOMPRESS)
4150LZO_PUBLIC(int)
4151DO_DECOMPRESS  ( const lzo_bytep in , lzo_uint  in_len,
4152                       lzo_bytep out, lzo_uintp out_len,
4153                       lzo_voidp wrkmem )
4154#endif
4155{
4156    register lzo_bytep op;
4157    register const lzo_bytep ip;
4158    register lzo_uint t;
4159#if defined(COPY_DICT)
4160    lzo_uint m_off;
4161    const lzo_bytep dict_end;
4162#else
4163    register const lzo_bytep m_pos;
4164#endif
4165
4166    const lzo_bytep const ip_end = in + in_len;
4167#if defined(HAVE_ANY_OP)
4168    lzo_bytep const op_end = out + *out_len;
4169#endif
4170#if defined(LZO1Z)
4171    lzo_uint last_m_off = 0;
4172#endif
4173
4174    LZO_UNUSED(wrkmem);
4175
4176#if defined(COPY_DICT)
4177    if (dict)
4178    {
4179        if (dict_len > M4_MAX_OFFSET)
4180        {
4181            dict += dict_len - M4_MAX_OFFSET;
4182            dict_len = M4_MAX_OFFSET;
4183        }
4184        dict_end = dict + dict_len;
4185    }
4186    else
4187    {
4188        dict_len = 0;
4189        dict_end = NULL;
4190    }
4191#endif
4192
4193    *out_len = 0;
4194
4195    op = out;
4196    ip = in;
4197
4198    if (*ip > 17)
4199    {
4200        t = *ip++ - 17;
4201        if (t < 4)
4202            goto match_next;
4203        assert(t > 0); NEED_OP(t); NEED_IP(t+1);
4204        do *op++ = *ip++; while (--t > 0);
4205        goto first_literal_run;
4206    }
4207
4208    while (TEST_IP && TEST_OP)
4209    {
4210        t = *ip++;
4211        if (t >= 16)
4212            goto match;
4213        if (t == 0)
4214        {
4215            NEED_IP(1);
4216            while (*ip == 0)
4217            {
4218                t += 255;
4219                ip++;
4220                NEED_IP(1);
4221            }
4222            t += 15 + *ip++;
4223        }
4224        assert(t > 0); NEED_OP(t+3); NEED_IP(t+4);
4225#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4)
4226        t += 3;
4227        if (t >= 8) do
4228        {
4229            UA_COPY64(op,ip);
4230            op += 8; ip += 8; t -= 8;
4231        } while (t >= 8);
4232        if (t >= 4)
4233        {
4234            UA_COPY32(op,ip);
4235            op += 4; ip += 4; t -= 4;
4236        }
4237        if (t > 0)
4238        {
4239            *op++ = *ip++;
4240            if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } }
4241        }
4242#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
4243#if !defined(LZO_UNALIGNED_OK_4)
4244        if (PTR_ALIGNED2_4(op,ip))
4245        {
4246#endif
4247        UA_COPY32(op,ip);
4248        op += 4; ip += 4;
4249        if (--t > 0)
4250        {
4251            if (t >= 4)
4252            {
4253                do {
4254                    UA_COPY32(op,ip);
4255                    op += 4; ip += 4; t -= 4;
4256                } while (t >= 4);
4257                if (t > 0) do *op++ = *ip++; while (--t > 0);
4258            }
4259            else
4260                do *op++ = *ip++; while (--t > 0);
4261        }
4262#if !defined(LZO_UNALIGNED_OK_4)
4263        }
4264        else
4265#endif
4266#endif
4267#if !defined(LZO_UNALIGNED_OK_4) && !defined(LZO_UNALIGNED_OK_8)
4268        {
4269            *op++ = *ip++; *op++ = *ip++; *op++ = *ip++;
4270            do *op++ = *ip++; while (--t > 0);
4271        }
4272#endif
4273
4274first_literal_run:
4275
4276        t = *ip++;
4277        if (t >= 16)
4278            goto match;
4279#if defined(COPY_DICT)
4280#if defined(LZO1Z)
4281        m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2);
4282        last_m_off = m_off;
4283#else
4284        m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2);
4285#endif
4286        NEED_OP(3);
4287        t = 3; COPY_DICT(t,m_off)
4288#else
4289#if defined(LZO1Z)
4290        t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2);
4291        m_pos = op - t;
4292        last_m_off = t;
4293#else
4294        m_pos = op - (1 + M2_MAX_OFFSET);
4295        m_pos -= t >> 2;
4296        m_pos -= *ip++ << 2;
4297#endif
4298        TEST_LB(m_pos); NEED_OP(3);
4299        *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos;
4300#endif
4301        goto match_done;
4302
4303        do {
4304match:
4305            if (t >= 64)
4306            {
4307#if defined(COPY_DICT)
4308#if defined(LZO1X)
4309                m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3);
4310                t = (t >> 5) - 1;
4311#elif defined(LZO1Y)
4312                m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2);
4313                t = (t >> 4) - 3;
4314#elif defined(LZO1Z)
4315                m_off = t & 0x1f;
4316                if (m_off >= 0x1c)
4317                    m_off = last_m_off;
4318                else
4319                {
4320                    m_off = 1 + (m_off << 6) + (*ip++ >> 2);
4321                    last_m_off = m_off;
4322                }
4323                t = (t >> 5) - 1;
4324#endif
4325#else
4326#if defined(LZO1X)
4327                m_pos = op - 1;
4328                m_pos -= (t >> 2) & 7;
4329                m_pos -= *ip++ << 3;
4330                t = (t >> 5) - 1;
4331#elif defined(LZO1Y)
4332                m_pos = op - 1;
4333                m_pos -= (t >> 2) & 3;
4334                m_pos -= *ip++ << 2;
4335                t = (t >> 4) - 3;
4336#elif defined(LZO1Z)
4337                {
4338                    lzo_uint off = t & 0x1f;
4339                    m_pos = op;
4340                    if (off >= 0x1c)
4341                    {
4342                        assert(last_m_off > 0);
4343                        m_pos -= last_m_off;
4344                    }
4345                    else
4346                    {
4347                        off = 1 + (off << 6) + (*ip++ >> 2);
4348                        m_pos -= off;
4349                        last_m_off = off;
4350                    }
4351                }
4352                t = (t >> 5) - 1;
4353#endif
4354                TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1);
4355                goto copy_match;
4356#endif
4357            }
4358            else if (t >= 32)
4359            {
4360                t &= 31;
4361                if (t == 0)
4362                {
4363                    NEED_IP(1);
4364                    while (*ip == 0)
4365                    {
4366                        t += 255;
4367                        ip++;
4368                        NEED_IP(1);
4369                    }
4370                    t += 31 + *ip++;
4371                }
4372#if defined(COPY_DICT)
4373#if defined(LZO1Z)
4374                m_off = 1 + (ip[0] << 6) + (ip[1] >> 2);
4375                last_m_off = m_off;
4376#else
4377                m_off = 1 + (ip[0] >> 2) + (ip[1] << 6);
4378#endif
4379#else
4380#if defined(LZO1Z)
4381                {
4382                    lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2);
4383                    m_pos = op - off;
4384                    last_m_off = off;
4385                }
4386#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN)
4387                m_pos = op - 1;
4388                m_pos -= UA_GET16(ip) >> 2;
4389#else
4390                m_pos = op - 1;
4391                m_pos -= (ip[0] >> 2) + (ip[1] << 6);
4392#endif
4393#endif
4394                ip += 2;
4395            }
4396            else if (t >= 16)
4397            {
4398#if defined(COPY_DICT)
4399                m_off = (t & 8) << 11;
4400#else
4401                m_pos = op;
4402                m_pos -= (t & 8) << 11;
4403#endif
4404                t &= 7;
4405                if (t == 0)
4406                {
4407                    NEED_IP(1);
4408                    while (*ip == 0)
4409                    {
4410                        t += 255;
4411                        ip++;
4412                        NEED_IP(1);
4413                    }
4414                    t += 7 + *ip++;
4415                }
4416#if defined(COPY_DICT)
4417#if defined(LZO1Z)
4418                m_off += (ip[0] << 6) + (ip[1] >> 2);
4419#else
4420                m_off += (ip[0] >> 2) + (ip[1] << 6);
4421#endif
4422                ip += 2;
4423                if (m_off == 0)
4424                    goto eof_found;
4425                m_off += 0x4000;
4426#if defined(LZO1Z)
4427                last_m_off = m_off;
4428#endif
4429#else
4430#if defined(LZO1Z)
4431                m_pos -= (ip[0] << 6) + (ip[1] >> 2);
4432#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN)
4433                m_pos -= UA_GET16(ip) >> 2;
4434#else
4435                m_pos -= (ip[0] >> 2) + (ip[1] << 6);
4436#endif
4437                ip += 2;
4438                if (m_pos == op)
4439                    goto eof_found;
4440                m_pos -= 0x4000;
4441#if defined(LZO1Z)
4442                last_m_off = pd((const lzo_bytep)op, m_pos);
4443#endif
4444#endif
4445            }
4446            else
4447            {
4448#if defined(COPY_DICT)
4449#if defined(LZO1Z)
4450                m_off = 1 + (t << 6) + (*ip++ >> 2);
4451                last_m_off = m_off;
4452#else
4453                m_off = 1 + (t >> 2) + (*ip++ << 2);
4454#endif
4455                NEED_OP(2);
4456                t = 2; COPY_DICT(t,m_off)
4457#else
4458#if defined(LZO1Z)
4459                t = 1 + (t << 6) + (*ip++ >> 2);
4460                m_pos = op - t;
4461                last_m_off = t;
4462#else
4463                m_pos = op - 1;
4464                m_pos -= t >> 2;
4465                m_pos -= *ip++ << 2;
4466#endif
4467                TEST_LB(m_pos); NEED_OP(2);
4468                *op++ = *m_pos++; *op++ = *m_pos;
4469#endif
4470                goto match_done;
4471            }
4472
4473#if defined(COPY_DICT)
4474
4475            NEED_OP(t+3-1);
4476            t += 3-1; COPY_DICT(t,m_off)
4477
4478#else
4479
4480            TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1);
4481#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4)
4482            if (op - m_pos >= 8)
4483            {
4484                t += (3 - 1);
4485                if (t >= 8) do
4486                {
4487                    UA_COPY64(op,m_pos);
4488                    op += 8; m_pos += 8; t -= 8;
4489                } while (t >= 8);
4490                if (t >= 4)
4491                {
4492                    UA_COPY32(op,m_pos);
4493                    op += 4; m_pos += 4; t -= 4;
4494                }
4495                if (t > 0)
4496                {
4497                    *op++ = m_pos[0];
4498                    if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } }
4499                }
4500            }
4501            else
4502#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
4503#if !defined(LZO_UNALIGNED_OK_4)
4504            if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos))
4505            {
4506                assert((op - m_pos) >= 4);
4507#else
4508            if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4)
4509            {
4510#endif
4511                UA_COPY32(op,m_pos);
4512                op += 4; m_pos += 4; t -= 4 - (3 - 1);
4513                do {
4514                    UA_COPY32(op,m_pos);
4515                    op += 4; m_pos += 4; t -= 4;
4516                } while (t >= 4);
4517                if (t > 0) do *op++ = *m_pos++; while (--t > 0);
4518            }
4519            else
4520#endif
4521            {
4522copy_match:
4523                *op++ = *m_pos++; *op++ = *m_pos++;
4524                do *op++ = *m_pos++; while (--t > 0);
4525            }
4526
4527#endif
4528
4529match_done:
4530#if defined(LZO1Z)
4531            t = ip[-1] & 3;
4532#else
4533            t = ip[-2] & 3;
4534#endif
4535            if (t == 0)
4536                break;
4537
4538match_next:
4539            assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1);
4540#if 0
4541            do *op++ = *ip++; while (--t > 0);
4542#else
4543            *op++ = *ip++;
4544            if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } }
4545#endif
4546            t = *ip++;
4547        } while (TEST_IP && TEST_OP);
4548    }
4549
4550#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP)
4551    *out_len = pd(op, out);
4552    return LZO_E_EOF_NOT_FOUND;
4553#endif
4554
4555eof_found:
4556    assert(t == 1);
4557    *out_len = pd(op, out);
4558    return (ip == ip_end ? LZO_E_OK :
4559           (ip < ip_end  ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN));
4560
4561#if defined(HAVE_NEED_IP)
4562input_overrun:
4563    *out_len = pd(op, out);
4564    return LZO_E_INPUT_OVERRUN;
4565#endif
4566
4567#if defined(HAVE_NEED_OP)
4568output_overrun:
4569    *out_len = pd(op, out);
4570    return LZO_E_OUTPUT_OVERRUN;
4571#endif
4572
4573#if defined(LZO_TEST_OVERRUN_LOOKBEHIND)
4574lookbehind_overrun:
4575    *out_len = pd(op, out);
4576    return LZO_E_LOOKBEHIND_OVERRUN;
4577#endif
4578}
4579
4580#endif
4581
4582/***** End of minilzo.c *****/
4583
4584