aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/CascDecompress.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dep/CascLib/src/CascDecompress.cpp')
-rw-r--r--dep/CascLib/src/CascDecompress.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/dep/CascLib/src/CascDecompress.cpp b/dep/CascLib/src/CascDecompress.cpp
new file mode 100644
index 00000000000..2858bcec5ab
--- /dev/null
+++ b/dep/CascLib/src/CascDecompress.cpp
@@ -0,0 +1,83 @@
+/*****************************************************************************/
+/* CascDecompress.cpp Copyright (c) Ladislav Zezula 2014 */
+/*---------------------------------------------------------------------------*/
+/* Decompression functions */
+/*---------------------------------------------------------------------------*/
+/* Date Ver Who Comment */
+/* -------- ---- --- ------- */
+/* 02.05.14 1.00 Lad The first version of CascDecompress.cpp */
+/*****************************************************************************/
+
+#define __CASCLIB_SELF__
+#include "CascLib.h"
+#include "CascCommon.h"
+
+//-----------------------------------------------------------------------------
+// Local functions
+
+static int Decompress_ZLIB(LPBYTE pbOutBuffer, PDWORD pcbOutBuffer, LPBYTE pbInBuffer, DWORD cbInBuffer)
+{
+ z_stream z; // Stream information for zlib
+ int nResult;
+
+ // Fill the stream structure for zlib
+ z.next_in = pbInBuffer;
+ z.avail_in = cbInBuffer;
+ z.total_in = cbInBuffer;
+ z.next_out = pbOutBuffer;
+ z.avail_out = *pcbOutBuffer;
+ z.total_out = 0;
+ z.zalloc = NULL;
+ z.zfree = NULL;
+
+ // Initialize the decompression structure
+ if((nResult = inflateInit(&z)) == Z_OK)
+ {
+ // Call zlib to decompress the data
+ nResult = inflate(&z, Z_NO_FLUSH);
+ inflateEnd(&z);
+
+ // Give the size of the uncompressed data
+ *pcbOutBuffer = z.total_out;
+ }
+
+ // Return an error code
+ return (nResult == Z_OK || nResult == Z_STREAM_END) ? ERROR_SUCCESS : ERROR_FILE_CORRUPT;
+}
+
+//-----------------------------------------------------------------------------
+// Public functions
+
+int CascDecompress(void * pvOutBuffer, PDWORD pcbOutBuffer, void * pvInBuffer, DWORD cbInBuffer)
+{
+ LPBYTE pbOutBuffer = (LPBYTE)pvOutBuffer;
+ LPBYTE pbInBuffer = (LPBYTE)pvInBuffer;
+ DWORD cbOutBuffer = *pcbOutBuffer; // Current size of the output buffer
+ BYTE uCompression; // Decompressions applied to the data
+
+ // Verify buffer sizes
+ if(cbInBuffer <= 1)
+ return 0;
+
+ // Get applied compression types and decrement data length
+ uCompression = *pbInBuffer++;
+ cbInBuffer--;
+
+ // Perform the decompressions
+ switch(uCompression)
+ {
+ case 'N': // Uncompressed
+
+ assert(cbOutBuffer == cbInBuffer);
+ memcpy(pbOutBuffer, pbInBuffer, cbInBuffer);
+ *pcbOutBuffer = cbOutBuffer;
+ return ERROR_SUCCESS;
+
+ case 'Z': // ZLIB
+
+ return Decompress_ZLIB(pbOutBuffer, pcbOutBuffer, pbInBuffer, cbInBuffer);
+ }
+
+ assert(false);
+ return ERROR_NOT_SUPPORTED;
+}