| 3998 | } |
| 3999 | |
| 4000 | static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) |
| 4001 | { |
| 4002 | const unsigned long ADLER_MOD = 65521; |
| 4003 | unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; |
| 4004 | unsigned long blocklen = buflen % 5552; |
| 4005 | |
| 4006 | unsigned long i; |
| 4007 | while (buflen) { |
| 4008 | for (i=0; i + 7 < blocklen; i += 8) { |
| 4009 | s1 += buffer[0], s2 += s1; |
| 4010 | s1 += buffer[1], s2 += s1; |
| 4011 | s1 += buffer[2], s2 += s1; |
| 4012 | s1 += buffer[3], s2 += s1; |
| 4013 | s1 += buffer[4], s2 += s1; |
| 4014 | s1 += buffer[5], s2 += s1; |
| 4015 | s1 += buffer[6], s2 += s1; |
| 4016 | s1 += buffer[7], s2 += s1; |
| 4017 | |
| 4018 | buffer += 8; |
| 4019 | } |
| 4020 | |
| 4021 | for (; i < blocklen; ++i) |
| 4022 | s1 += *buffer++, s2 += s1; |
| 4023 | |
| 4024 | s1 %= ADLER_MOD, s2 %= ADLER_MOD; |
| 4025 | buflen -= blocklen; |
| 4026 | blocklen = 5552; |
| 4027 | } |
| 4028 | return (unsigned int)(s2 << 16) + (unsigned int)s1; |
| 4029 | } |
| 4030 | |
| 4031 | static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/) |
| 4032 | { |