| 4058 | } |
| 4059 | |
| 4060 | static unsigned int stb_adler32(unsigned int adler32, unsigned char* buffer, unsigned int buflen) |
| 4061 | { |
| 4062 | const unsigned long ADLER_MOD = 65521; |
| 4063 | unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; |
| 4064 | unsigned long blocklen = buflen % 5552; |
| 4065 | |
| 4066 | unsigned long i; |
| 4067 | while (buflen) { |
| 4068 | for (i = 0; i + 7 < blocklen; i += 8) { |
| 4069 | s1 += buffer[0], s2 += s1; |
| 4070 | s1 += buffer[1], s2 += s1; |
| 4071 | s1 += buffer[2], s2 += s1; |
| 4072 | s1 += buffer[3], s2 += s1; |
| 4073 | s1 += buffer[4], s2 += s1; |
| 4074 | s1 += buffer[5], s2 += s1; |
| 4075 | s1 += buffer[6], s2 += s1; |
| 4076 | s1 += buffer[7], s2 += s1; |
| 4077 | |
| 4078 | buffer += 8; |
| 4079 | } |
| 4080 | |
| 4081 | for (; i < blocklen; ++i) |
| 4082 | s1 += *buffer++, s2 += s1; |
| 4083 | |
| 4084 | s1 %= ADLER_MOD, s2 %= ADLER_MOD; |
| 4085 | buflen -= blocklen; |
| 4086 | blocklen = 5552; |
| 4087 | } |
| 4088 | return (unsigned int)(s2 << 16) + (unsigned int)s1; |
| 4089 | } |
| 4090 | |
| 4091 | static unsigned int stb_decompress(unsigned char* output, const unsigned char* i, unsigned int /*length*/) |
| 4092 | { |