]> git.sur5r.net Git - cc65/blob - libsrc/zlib/uncompress.c
Fix open flags, minor optimization
[cc65] / libsrc / zlib / uncompress.c
1 /*\r
2  * uncompress.c\r
3  *\r
4  * Piotr Fusik, 18.11.2001\r
5  */\r
6 \r
7 #include <zlib.h>\r
8 \r
9 int uncompress (char* dest, unsigned* destLen,\r
10                 const char* source, unsigned sourceLen)\r
11 {\r
12         unsigned len;\r
13         unsigned char* ptr;\r
14         unsigned long csum;\r
15         /* source[0]: Compression method and flags\r
16             bits 0 to 3: Compression method (must be Z_DEFLATED)\r
17             bits 4 to 7: Compression info (must be <= 7)\r
18            source[1]: Flags\r
19             bits 0 to 4: Check bits\r
20             bit 5:       Preset dictionary (not supported, sorry)\r
21             bits 6 to 7: Compression level\r
22         */\r
23         if ((source[0] & 0x8f) != Z_DEFLATED || source[1] & 0x20)\r
24                 return Z_DATA_ERROR;\r
25         if ((((unsigned) source[0] << 8) | (unsigned char) source[1]) % 31)\r
26                 return Z_DATA_ERROR;\r
27         *destLen = len = inflatemem(dest, source + 2);\r
28         ptr = (unsigned char*) source + sourceLen - 4;\r
29         csum = adler32(adler32(0L, Z_NULL, 0), dest, len);\r
30         if ((unsigned char) csum != ptr[3]\r
31          || (unsigned char) (csum >> 8) != ptr[2]\r
32          || (unsigned char) (csum >> 16) != ptr[1]\r
33          || (unsigned char) (csum >> 24) != ptr[0])\r
34                 return Z_DATA_ERROR;\r
35         return Z_OK;\r
36 }\r