mirror of https://github.com/xemu-project/xemu.git
dmg: exchanging hardcoded dmg UDIF block types to enum.
This change is better to understand what kind of block type is being handled by the code. Using a syntax similar to the DMG documentation is easier than tracking all hex values assigned to a block type. Signed-off-by: Julio Faracco <jcfaracco@gmail.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
7a40b418ec
commit
95a156f689
43
block/dmg.c
43
block/dmg.c
|
@ -44,6 +44,19 @@ enum {
|
||||||
DMG_SECTORCOUNTS_MAX = DMG_LENGTHS_MAX / 512,
|
DMG_SECTORCOUNTS_MAX = DMG_LENGTHS_MAX / 512,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* DMG Block Type */
|
||||||
|
UDZE = 0, /* Zeroes */
|
||||||
|
UDRW, /* RAW type */
|
||||||
|
UDIG, /* Ignore */
|
||||||
|
UDCO = 0x80000004,
|
||||||
|
UDZO,
|
||||||
|
UDBZ,
|
||||||
|
ULFO,
|
||||||
|
UDCM = 0x7ffffffe, /* Comments */
|
||||||
|
UDLE /* Last Entry */
|
||||||
|
};
|
||||||
|
|
||||||
static int dmg_probe(const uint8_t *buf, int buf_size, const char *filename)
|
static int dmg_probe(const uint8_t *buf, int buf_size, const char *filename)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
|
@ -108,16 +121,16 @@ static void update_max_chunk_size(BDRVDMGState *s, uint32_t chunk,
|
||||||
uint32_t uncompressed_sectors = 0;
|
uint32_t uncompressed_sectors = 0;
|
||||||
|
|
||||||
switch (s->types[chunk]) {
|
switch (s->types[chunk]) {
|
||||||
case 0x80000005: /* zlib compressed */
|
case UDZO: /* zlib compressed */
|
||||||
case 0x80000006: /* bzip2 compressed */
|
case UDBZ: /* bzip2 compressed */
|
||||||
case 0x80000007: /* lzfse compressed */
|
case ULFO: /* lzfse compressed */
|
||||||
compressed_size = s->lengths[chunk];
|
compressed_size = s->lengths[chunk];
|
||||||
uncompressed_sectors = s->sectorcounts[chunk];
|
uncompressed_sectors = s->sectorcounts[chunk];
|
||||||
break;
|
break;
|
||||||
case 1: /* copy */
|
case UDRW: /* copy */
|
||||||
uncompressed_sectors = DIV_ROUND_UP(s->lengths[chunk], 512);
|
uncompressed_sectors = DIV_ROUND_UP(s->lengths[chunk], 512);
|
||||||
break;
|
break;
|
||||||
case 2: /* zero */
|
case UDIG: /* zero */
|
||||||
/* as the all-zeroes block may be large, it is treated specially: the
|
/* as the all-zeroes block may be large, it is treated specially: the
|
||||||
* sector is not copied from a large buffer, a simple memset is used
|
* sector is not copied from a large buffer, a simple memset is used
|
||||||
* instead. Therefore uncompressed_sectors does not need to be set. */
|
* instead. Therefore uncompressed_sectors does not need to be set. */
|
||||||
|
@ -186,13 +199,13 @@ typedef struct DmgHeaderState {
|
||||||
static bool dmg_is_known_block_type(uint32_t entry_type)
|
static bool dmg_is_known_block_type(uint32_t entry_type)
|
||||||
{
|
{
|
||||||
switch (entry_type) {
|
switch (entry_type) {
|
||||||
case 0x00000001: /* uncompressed */
|
case UDRW: /* uncompressed */
|
||||||
case 0x00000002: /* zeroes */
|
case UDIG: /* zeroes */
|
||||||
case 0x80000005: /* zlib */
|
case UDZO: /* zlib */
|
||||||
return true;
|
return true;
|
||||||
case 0x80000006: /* bzip2 */
|
case UDBZ: /* bzip2 */
|
||||||
return !!dmg_uncompress_bz2;
|
return !!dmg_uncompress_bz2;
|
||||||
case 0x80000007: /* lzfse */
|
case ULFO: /* lzfse */
|
||||||
return !!dmg_uncompress_lzfse;
|
return !!dmg_uncompress_lzfse;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -586,7 +599,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
|
||||||
|
|
||||||
s->current_chunk = s->n_chunks;
|
s->current_chunk = s->n_chunks;
|
||||||
switch (s->types[chunk]) { /* block entry type */
|
switch (s->types[chunk]) { /* block entry type */
|
||||||
case 0x80000005: { /* zlib compressed */
|
case UDZO: { /* zlib compressed */
|
||||||
/* we need to buffer, because only the chunk as whole can be
|
/* we need to buffer, because only the chunk as whole can be
|
||||||
* inflated. */
|
* inflated. */
|
||||||
ret = bdrv_pread(bs->file, s->offsets[chunk],
|
ret = bdrv_pread(bs->file, s->offsets[chunk],
|
||||||
|
@ -609,7 +622,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break; }
|
break; }
|
||||||
case 0x80000006: /* bzip2 compressed */
|
case UDBZ: /* bzip2 compressed */
|
||||||
if (!dmg_uncompress_bz2) {
|
if (!dmg_uncompress_bz2) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -630,7 +643,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x80000007:
|
case ULFO:
|
||||||
if (!dmg_uncompress_lzfse) {
|
if (!dmg_uncompress_lzfse) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -651,14 +664,14 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: /* copy */
|
case UDRW: /* copy */
|
||||||
ret = bdrv_pread(bs->file, s->offsets[chunk],
|
ret = bdrv_pread(bs->file, s->offsets[chunk],
|
||||||
s->uncompressed_chunk, s->lengths[chunk]);
|
s->uncompressed_chunk, s->lengths[chunk]);
|
||||||
if (ret != s->lengths[chunk]) {
|
if (ret != s->lengths[chunk]) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: /* zero */
|
case UDIG: /* zero */
|
||||||
/* see dmg_read, it is treated specially. No buffer needs to be
|
/* see dmg_read, it is treated specially. No buffer needs to be
|
||||||
* pre-filled, the zeroes can be set directly. */
|
* pre-filled, the zeroes can be set directly. */
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue