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