1 /* lzo_util.c -- utilities for the LZO library 2 3 This file is part of the LZO real-time data compression library. 4 5 Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer 6 All Rights Reserved. 7 8 The LZO library is free software; you can redistribute it and/or 9 modify it under the terms of the GNU General Public License as 10 published by the Free Software Foundation; either version 2 of 11 the License, or (at your option) any later version. 12 13 The LZO library is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with the LZO library; see the file COPYING. 20 If not, write to the Free Software Foundation, Inc., 21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 22 23 Markus F.X.J. Oberhumer 24 <markus (at) oberhumer.com> 25 http://www.oberhumer.com/opensource/lzo/ 26 */ 27 28 29 #include "lzo_conf.h" 30 31 32 /*********************************************************************** 33 // 34 ************************************************************************/ 35 36 /* If you use the LZO library in a product, I would appreciate that you 37 * keep this copyright string in the executable of your product. 38 .*/ 39 40 static const char __lzo_copyright[] = 41 #if !defined(__LZO_IN_MINLZO) 42 /* save space as some people want a really small decompressor */ 43 LZO_VERSION_STRING; 44 #else 45 "\r\n\n" 46 "LZO data compression library.\n" 47 "$Copyright: LZO Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer\n" 48 "<markus (at) oberhumer.com>\n" 49 "http://www.oberhumer.com $\n\n" 50 "$Id: LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE " $\n" 51 "$Info: " LZO_INFO_STRING " $\n"; 52 #endif 53 54 55 LZO_PUBLIC(const lzo_bytep) 56 lzo_copyright(void) 57 { 58 return (const lzo_bytep) __lzo_copyright; 59 } 60 61 LZO_PUBLIC(unsigned) 62 lzo_version(void) 63 { 64 return LZO_VERSION; 65 } 66 67 LZO_PUBLIC(const char *) 68 lzo_version_string(void) 69 { 70 return LZO_VERSION_STRING; 71 } 72 73 LZO_PUBLIC(const char *) 74 lzo_version_date(void) 75 { 76 return LZO_VERSION_DATE; 77 } 78 79 LZO_PUBLIC(const lzo_charp) 80 _lzo_version_string(void) 81 { 82 return LZO_VERSION_STRING; 83 } 84 85 LZO_PUBLIC(const lzo_charp) 86 _lzo_version_date(void) 87 { 88 return LZO_VERSION_DATE; 89 } 90 91 92 /*********************************************************************** 93 // adler32 checksum 94 // adapted from free code by Mark Adler <madler (at) alumni.caltech.edu> 95 // see http://www.zlib.org/ 96 ************************************************************************/ 97 98 #define LZO_BASE 65521u /* largest prime smaller than 65536 */ 99 #define LZO_NMAX 5552 100 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ 101 102 #define LZO_DO1(buf,i) s1 += buf[i]; s2 += s1 103 #define LZO_DO2(buf,i) LZO_DO1(buf,i); LZO_DO1(buf,i+1); 104 #define LZO_DO4(buf,i) LZO_DO2(buf,i); LZO_DO2(buf,i+2); 105 #define LZO_DO8(buf,i) LZO_DO4(buf,i); LZO_DO4(buf,i+4); 106 #define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8); 107 108 LZO_PUBLIC(lzo_uint32_t) 109 lzo_adler32(lzo_uint32_t adler, const lzo_bytep buf, lzo_uint len) 110 { 111 lzo_uint32_t s1 = adler & 0xffff; 112 lzo_uint32_t s2 = (adler >> 16) & 0xffff; 113 unsigned k; 114 115 if (buf == NULL) 116 return 1; 117 118 while (len > 0) 119 { 120 k = len < LZO_NMAX ? (unsigned) len : LZO_NMAX; 121 len -= k; 122 if (k >= 16) do 123 { 124 LZO_DO16(buf,0); 125 buf += 16; 126 k -= 16; 127 } while (k >= 16); 128 if (k != 0) do 129 { 130 s1 += *buf++; 131 s2 += s1; 132 } while (--k > 0); 133 s1 %= LZO_BASE; 134 s2 %= LZO_BASE; 135 } 136 return (s2 << 16) | s1; 137 } 138 139 #undef LZO_DO1 140 #undef LZO_DO2 141 #undef LZO_DO4 142 #undef LZO_DO8 143 #undef LZO_DO16 144 145 146 /* 147 vi:ts=4:et 148 */ 149