hbmap: fix iterator truncation when size_t < 32bit
[rofl0r-agsutils.git] / lzw.c
blob0d7c2ceea777db07cfc8dec341f2b4baf918d59f
1 #include <string.h>
3 #define N 4096
5 #define OUT(X) if(out < outend) *(out++) = X; else return 0;
7 int lzwdecomp(unsigned char* in, unsigned long insz,
8 unsigned char* out, unsigned long outsz)
10 unsigned char buf[N];
11 unsigned char *inend = in+insz, *outend = out+outsz;
12 int bits, len, mask, i = N - 16;
13 while (1) {
14 if(in >= inend) return 0;
15 bits = *(in++);
16 for (mask = 1; mask & 0xFF; mask <<= 1) {
17 if (bits & mask) {
18 if(in+2>inend) return 0;
19 short tmp;
20 memcpy(&tmp, in, 2);
21 in += 2;
22 int j = tmp;
24 len = ((j >> 12) & 15) + 3;
25 j = (i - j - 1) & (N - 1);
27 while (len--) {
28 buf[i] = buf[j];
29 OUT(buf[i]);
30 j = (j + 1) & (N - 1);
31 i = (i + 1) & (N - 1);
33 } else {
34 if(in >= inend) return 0;
35 buf[i] = *(in++);
36 OUT(buf[i]);
37 i = (i + 1) & (N - 1);
39 if(out == outend) break;
41 if(out == outend) break;
43 return 1;