static void cacheRun()

in dmg/dmgfile.c [13:59]


static void cacheRun(DMG* dmg, BLKXTable* blkx, int run) {
	size_t bufferSize;
	void* inBuffer;
	int ret;
	size_t have;
	uint32_t type;

	if(dmg->runData) {
		free(dmg->runData);
	}

	bufferSize = SECTOR_SIZE * blkx->runs[run].sectorCount;

	dmg->runData = (void*) malloc(bufferSize);
	inBuffer = (void*) malloc(bufferSize);
	memset(dmg->runData, 0, bufferSize);

	ASSERT(dmg->dmg->seek(dmg->dmg, blkx->dataStart + blkx->runs[run].compOffset) == 0, "fseeko");

    switch(blkx->runs[run].type) {
		case BLOCK_RAW:
			ASSERT((have = dmg->dmg->read(dmg->dmg, dmg->runData, blkx->runs[run].compLength)) == blkx->runs[run].compLength, "fread");
			break;
		case BLOCK_IGNORE:
			break;
		case BLOCK_COMMENT:
			break;
		case BLOCK_TERMINATOR:
			break;
		case BLOCK_ZEROES:
			break;
		default:
			type = blkx->runs[run].type;
			if (compressionBlockTypeSupported(type) != 0) {
				fprintf(stderr, "Unsupported block type %#08x\n", type);
				exit(1);
			}
			ASSERT(dmg->dmg->read(dmg->dmg, inBuffer, blkx->runs[run].compLength) == blkx->runs[run].compLength, "fread");
			ASSERT(decompressRun(type, inBuffer, blkx->runs[run].compLength, dmg->runData, bufferSize) == 0,
				"decompression failed");
    }
	free(inBuffer);

    dmg->runType = blkx->runs[run].type;
	dmg->runStart = (blkx->runs[run].sectorStart + blkx->firstSectorNumber) * SECTOR_SIZE;
	dmg->runEnd = dmg->runStart + (blkx->runs[run].sectorCount * SECTOR_SIZE);
}