can anybody help me translate this c function to d, im having a problem with the data types. thanks.
//------------------------- unsigned int BLZCC blz_pack(const void *source, void *destination, unsigned int length, void *workmem) { BLZPACKDATA ud; const unsigned char **lookup = workmem; const unsigned char *backptr = source; /* check for length == 0 */ if (length == 0) return 0; /* init lookup[] */ { int i; for (i = 0; i < BLZ_WORKMEM_SIZE/4; ++i) lookup[i] = 0; } ud.source = source; ud.destination = destination; /* first byte verbatim */ *ud.destination++ = *ud.source++; /* check for length == 1 */ if (--length == 0) return 1; /* init first tag */ ud.tagpos = ud.destination; ud.destination += 2; ud.tag = 0; ud.bitcount = 16; /* main compression loop */ while (length > 4) { const unsigned char *ppos; unsigned int len = 0; /* update lookup[] up to current position */ while (backptr < ud.source) { lookup[blz_hash4(backptr)] = backptr; backptr++; } /* look up current position */ ppos = lookup[blz_hash4(ud.source)]; /* check match */ if (ppos) { while ((len < length) && (*(ppos + len) == *(ud.source + len))) ++len; } /* output match or literal */ if (len > 3) { unsigned int pos = ud.source - ppos - 1; /* output match tag */ blz_putbit(&ud, 1); /* output length */ blz_putgamma(&ud, len - 2); /* output position */ blz_putgamma(&ud, (pos >> 8) + 2); *ud.destination++ = pos & 0x00ff; ud.source += len; length -= len; } else { /* output literal tag */ blz_putbit(&ud, 0); /* copy literal */ *ud.destination++ = *ud.source++; length--; } } /* output any remaining literals */ while (length > 0) { /* output literal tag */ blz_putbit(&ud, 0); /* copy literal */ *ud.destination++ = *ud.source++; length--; } /* shift last tag into position and store */ ud.tag <<= ud.bitcount; ud.tagpos[0] = ud.tag & 0x00ff; ud.tagpos[1] = (ud.tag >> 8) & 0x00ff; /* return compressed length */ return ud.destination - (unsigned char *)destination; }