On Thu, Mar 8, 2012 at 10:14 PM, Leonardo E. Reiter <lrei...@vbridges.com> wrote: > +#if defined(BLOCK_GOW1) > +#define GOW_MAGIC GOW1_MAGIC > +#define GOW_MAXBLOCKS 1048576 > + > +/* GOW1: header is not padded */ > +/* header type, contains map */ > +typedef struct { > + uint32_t magic; > + uint32_t size; > + uint32_t allocated; > + uint32_t map[GOW_MAXBLOCKS]; > +} gow_header_t; > + > +/* block type, contains data */ > +typedef struct { > + uint8_t data[GOW_BLOCKSIZE]; > +} gow_block_t; > +#else /* GOW2, GOW3 below */ > + > + > +/* GOW2: approximately 16MB header size, and up to 256GB image size > + * GOW3: approximately 32MB header size, and up to 256GB image size */ > + > +#define GOW_MAXBLOCKS 4194304 > + > +typedef struct { > + uint32_t magic; > + uint32_t size; > + uint32_t allocated; > + uint32_t map[GOW_MAXBLOCKS]; > +} gow2_header_t; > + > +typedef struct { > + uint32_t magic; > + uint32_t size; > + uint32_t allocated; > + uint32_t map[GOW_MAXBLOCKS]; > + uint32_t ver[GOW_MAXBLOCKS]; > + uint32_t carry; > + uint8_t signature[32]; > + uint32_t maint; > +} gow3_header_t; > + > +/* header is padded to 512-bytes so image can be indexed in sectors */ > +#define GOW2_HEADER_SIZE (((sizeof(gow2_header_t) + 511) >> 9) << 9) > +#define GOW3_HEADER_SIZE (((sizeof(gow3_header_t) + 511) >> 9) << 9) > + > +#endif /* GOW2, GOW3 */ > + > +#if defined(BLOCK_GOW1) > + > +#define GOW_HEADER_SIZE (sizeof(gow_header_t)) > + > +#elif defined(BLOCK_GOW2) > + > +#define GOW_MAGIC GOW2_MAGIC > +#define GOW_HEADER_SIZE GOW2_HEADER_SIZE > +#define gow_header_t gow2_header_t > + > +#elif defined(BLOCK_GOW3) > + > +#define GOW_MAGIC GOW3_MAGIC > +#define gow_header_t gow3_header_t > +#define GOW_HEADER_SIZE GOW3_HEADER_SIZE > + > +#endif
This #ifdef approach is ugly. All three headers have the same starting common fields. I bet you could have clean C code without reincluding this header and using macro tricks. Just use the common header fields and parameterize the size, if needed. Stefan