# HG changeset patch # User Matti Hamalainen # Date 1425178063 -7200 # Node ID 6436d80ae0fc814f72fb026249046fe9c501bf49 # Parent b1d22289af24ade4ae6cfad842d022211eb44409 Add DMF_COMPRESSED flag for resource nodes and support for raw data nodes. diff -r b1d22289af24 -r 6436d80ae0fc src/dmres.c --- a/src/dmres.c Sun Mar 01 04:46:41 2015 +0200 +++ b/src/dmres.c Sun Mar 01 04:47:43 2015 +0200 @@ -409,36 +409,28 @@ goto out; } - if ((ctx.zout = ctx.zoutStart = dmMalloc(node->size)) == NULL) { - ret = dmError(DMERR_MALLOC, - "Failed to allocate initial decompression buffer.\n"); - goto out; } // Initialize decompression structures ctx.zbuffer = inBuf; ctx.zbufferEnd = inBuf + node->length; - ctx.zoutEnd = ctx.zoutStart + node->size; - ctx.expandable = TRUE; + ctx.zout = ctx.zoutStart = handle->rawData; + ctx.zoutEnd = handle->rawData + node->size; + ctx.expandable = FALSE; + + // Attempt decompression if ((ret = dmZLibParseHeader(&ctx, TRUE)) != DMERR_OK) goto out; if ((ret = dmZLibDecode(&ctx)) != DMERR_OK) goto out; - handle->rawOffset = 0; handle->rawData = ctx.zoutStart; handle->rawSize = ctx.zout - ctx.zoutStart; - if (handle->rawSize != node->size) - { - ret = dmError(DMERR_COMPRESSION, - "Decompressed data size for '%s' does not match size stored in PACK entry (%d <> %d).\n", - node->filename, handle->rawSize, node->size); - } -err: +out: dmFree(inBuf); return ret; } @@ -471,7 +463,43 @@ goto out; } - res = dm_pack_decompress(handle, node); + // Allocate memory for the node + if ((handle->rawData = dmMalloc(node->size)) == NULL) + { + ret = dmError(DMERR_MALLOC, + "Failed to allocate node data for '%s' (%d bytes).\n", + handle->filename, node->size); + goto out; + } + + // Check if the entry is compressed + if (handle->flags & DMF_COMPRESSED) + { + if ((ret = dm_pack_decompress(handle, node)) != DMERR_OK) + goto out; + + if (handle->rawSize != node->size) + { + ret = dmError(DMERR_COMPRESSION, + "Decompressed data size for '%s' does not match size stored in PACK entry (%d <> %d).\n", + handle->filename, handle->rawSize, node->size); + } + } + else + { + if (node->size != node->length) + { + ret = dmError(DMERR_INVALID_DATA, + "Node '%s' raw size and length fields differ for uncompressed node.\n", node->filename); + goto out; + } + if (fread(handle->rawData, sizeof(Uint8), node->size, handle->lib->packFile->file) != node->size) + { + ret = dmError(DMERR_FREAD, + "Error reading node data.\n"); + goto out; + } + } out: return ret; diff -r b1d22289af24 -r 6436d80ae0fc src/dmres.h --- a/src/dmres.h Sun Mar 01 04:46:41 2015 +0200 +++ b/src/dmres.h Sun Mar 01 04:47:43 2015 +0200 @@ -41,6 +41,7 @@ DMF_UNALLOCATED = 0x00004, // The raw data is not allocated, so do not free it DMF_LOADED_RAW = 0x01000, // Raw data has been loaded DMF_LOADED_RES = 0x02000, // Resource has been loaded + DMF_COMPRESSED = 0x10000, // Resource is compressed in PACK file, otherwise raw };