| /* lzo_util.c -- utilities for the LZO library |
| |
| This file is part of the LZO real-time data compression library. |
| |
| Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer |
| Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer |
| All Rights Reserved. |
| |
| The LZO library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU General Public License as |
| published by the Free Software Foundation; either version 2 of |
| the License, or (at your option) any later version. |
| |
| The LZO library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with the LZO library; see the file COPYING. |
| If not, write to the Free Software Foundation, Inc., |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| |
| Markus F.X.J. Oberhumer |
| <markus@oberhumer.com> |
| http://www.oberhumer.com/opensource/lzo/ |
| */ |
| |
| |
| #include "lzo_conf.h" |
| |
| |
| /*********************************************************************** |
| // |
| ************************************************************************/ |
| |
| /* If you use the LZO library in a product, I would appreciate that you |
| * keep this copyright string in the executable of your product. |
| .*/ |
| |
| const char __lzo_copyright[] = |
| #if !defined(__LZO_IN_MINLZO) |
| /* save space as some people want a really small decompressor */ |
| LZO_VERSION_STRING; |
| #else |
| "\r\n\n" |
| "LZO data compression library.\n" |
| "$Copyright: LZO (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Markus Franz Xaver Johannes Oberhumer\n" |
| "<markus@oberhumer.com>\n" |
| "http://www.oberhumer.com $\n\n" |
| "$Id: LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE " $\n" |
| "$Built: " __DATE__ " " __TIME__ " $\n" |
| "$Info: " LZO_INFO_STRING " $\n"; |
| #endif |
| |
| |
| LZO_PUBLIC(const lzo_bytep) |
| lzo_copyright(void) |
| { |
| #if (LZO_OS_DOS16 && LZO_CC_TURBOC) |
| return (lzo_voidp) __lzo_copyright; |
| #else |
| return (const lzo_bytep) __lzo_copyright; |
| #endif |
| } |
| |
| LZO_PUBLIC(unsigned) |
| lzo_version(void) |
| { |
| return LZO_VERSION; |
| } |
| |
| LZO_PUBLIC(const char *) |
| lzo_version_string(void) |
| { |
| return LZO_VERSION_STRING; |
| } |
| |
| LZO_PUBLIC(const char *) |
| lzo_version_date(void) |
| { |
| return LZO_VERSION_DATE; |
| } |
| |
| LZO_PUBLIC(const lzo_charp) |
| _lzo_version_string(void) |
| { |
| return LZO_VERSION_STRING; |
| } |
| |
| LZO_PUBLIC(const lzo_charp) |
| _lzo_version_date(void) |
| { |
| return LZO_VERSION_DATE; |
| } |
| |
| |
| /*********************************************************************** |
| // adler32 checksum |
| // adapted from free code by Mark Adler <madler@alumni.caltech.edu> |
| // see http://www.zlib.org/ |
| ************************************************************************/ |
| |
| #define LZO_BASE 65521u /* largest prime smaller than 65536 */ |
| #define LZO_NMAX 5552 |
| /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ |
| |
| #define LZO_DO1(buf,i) s1 += buf[i]; s2 += s1 |
| #define LZO_DO2(buf,i) LZO_DO1(buf,i); LZO_DO1(buf,i+1); |
| #define LZO_DO4(buf,i) LZO_DO2(buf,i); LZO_DO2(buf,i+2); |
| #define LZO_DO8(buf,i) LZO_DO4(buf,i); LZO_DO4(buf,i+4); |
| #define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8); |
| |
| LZO_PUBLIC(lzo_uint32) |
| lzo_adler32(lzo_uint32 adler, const lzo_bytep buf, lzo_uint len) |
| { |
| lzo_uint32 s1 = adler & 0xffff; |
| lzo_uint32 s2 = (adler >> 16) & 0xffff; |
| unsigned k; |
| |
| if (buf == NULL) |
| return 1; |
| |
| while (len > 0) |
| { |
| k = len < LZO_NMAX ? (unsigned) len : LZO_NMAX; |
| len -= k; |
| if (k >= 16) do |
| { |
| LZO_DO16(buf,0); |
| buf += 16; |
| k -= 16; |
| } while (k >= 16); |
| if (k != 0) do |
| { |
| s1 += *buf++; |
| s2 += s1; |
| } while (--k > 0); |
| s1 %= LZO_BASE; |
| s2 %= LZO_BASE; |
| } |
| return (s2 << 16) | s1; |
| } |
| |
| #undef LZO_DO1 |
| #undef LZO_DO2 |
| #undef LZO_DO4 |
| #undef LZO_DO8 |
| #undef LZO_DO16 |
| |
| |
| /* |
| vi:ts=4:et |
| */ |