$NetBSD: patch-am,v 1.1 2006/06/30 12:54:38 tron Exp $ --- src/loaders/mdl_load.c.orig 2000-12-29 18:08:33.000000000 +0000 +++ src/loaders/mdl_load.c 2006-06-30 12:57:09.000000000 +0100 @@ -35,6 +35,35 @@ static struct mdl_envelope *v_env; static struct mdl_envelope *p_env; +static void * +get_uint16_le(void *p, uint16_t *x16) +{ + uint8_t *bp; + + bp = p; + *x16 = bp[0] | (bp[1] << 8); + return bp + sizeof(uint16); +} + +static void * +get_uint16_le_int(void *p, int *ip) +{ + uint8_t *bp; + + bp = p; + *ip = bp[0] | (bp[1] << 8); + return bp + sizeof(uint16); +} + +static void * +get_uint32_le_int(void *p, int *ip) +{ + uint8_t *bp; + + bp = p; + *ip = bp[0] | (bp[1] << 8) | (bp[2] << 16) | (bp[3] << 24); + return bp + sizeof(uint32); +} /* Effects 1-6 (note effects) can only be entered in the first effect * column, G-L (volume-effects) only in the second column. @@ -130,7 +159,8 @@ unsigned int x; if (i == 0) { - b = *((uint32 *)(*buf))++; + (void)memcpy(&b, *buf, sizeof(b)); + *buf += sizeof(b); n = 32; return 0; } @@ -268,8 +298,7 @@ buffer += 16; /* Skip pattern name */ for (j = 0; j < chn; j++) { - x16 = *((uint16 *)buffer)++; - L_ENDIAN16 (x16); + buffer = get_uint16_le(buffer, &x16); xxp[i]->info[j].index = x16; } if (V (0)) @@ -297,8 +326,7 @@ xxp[i]->rows = 64; for (j = 0; j < 32; j++) { - x16 = *((uint16 *)buffer)++; - L_ENDIAN16 (x16); + buffer = get_uint16_le(buffer, &x16); if (j < xxh->chn) xxp[i]->info[j].index = x16; } @@ -315,7 +343,8 @@ int i, j, k, row, len; struct xxm_track *track; - xxh->trk = *((uint16 *) buffer)++ + 1; + buffer = get_uint16_le_int(buffer, &xxh->trk); + xxh->trk++; if (V (0)) report ("Stored tracks : %d ", xxh->trk); @@ -330,7 +359,7 @@ for (i = 1; i < xxh->trk; i++) { /* Length of the track in bytes */ - len = *((uint16 *) buffer)++; + buffer = get_uint16_le_int(buffer, &len); memset (track, 0, sizeof (struct xxm_track) + sizeof (struct xxm_event) * 256); @@ -449,7 +478,7 @@ xxih[i].rls = *(uint16 *)buffer; L_ENDIAN32 (xxih[i].rls); } - ((uint16 *)buffer)++; + buffer += sizeof(uint16); xxi[i][j].vra = *buffer++; xxi[i][j].vde = *buffer++; @@ -498,15 +527,12 @@ buffer += 32; /* Sample name */ buffer += 8; /* Sample filename */ - c2spd[i] = *((uint32 *)buffer)++; + (void)memcpy(&c2spd[i], buffer, sizeof(c2spd[i])); + buffer += sizeof(c2spd[i]); - xxs[i].len = *((uint32 *)buffer)++; - xxs[i].lps = *((uint32 *)buffer)++; - xxs[i].lpe = *((uint32 *)buffer)++; - - L_ENDIAN32 (xxs[i].len); - L_ENDIAN32 (xxs[i].lps); - L_ENDIAN32 (xxs[i].lpe); + buffer = get_uint32_le_int(buffer, &xxs[i].len); + buffer = get_uint32_le_int(buffer, &xxs[i].lps); + buffer = get_uint32_le_int(buffer, &xxs[i].lpe); xxs[i].flg = xxs[i].lpe > 0 ? WAVE_LOOPING : 0; xxs[i].lpe = xxs[i].lps + xxs[i].lpe; @@ -579,16 +605,11 @@ buffer += 32; /* Sample name */ buffer += 8; /* Sample filename */ - c2spd[i] = *((uint16 *)buffer)++; - L_ENDIAN16 (c2spd[i]); + buffer = get_uint16_le_int(buffer, &c2spd[i]); - xxs[i].len = *((uint32 *)buffer)++; - xxs[i].lps = *((uint32 *)buffer)++; - xxs[i].lpe = *((uint32 *)buffer)++; - - L_ENDIAN32 (xxs[i].len); - L_ENDIAN32 (xxs[i].lps); - L_ENDIAN32 (xxs[i].lpe); + buffer = get_uint32_le_int(buffer, &xxs[i].len); + buffer = get_uint32_le_int(buffer, &xxs[i].lps); + buffer = get_uint32_le_int(buffer, &xxs[i].lpe); xxs[i].flg = xxs[i].lpe > 0 ? WAVE_LOOPING : 0; xxs[i].lpe = xxs[i].lps + xxs[i].lpe; @@ -648,12 +669,12 @@ buffer += xxs[i].len; break; case 1: - len = *((uint32 *)buffer)++; + buffer = get_uint32_le_int(buffer, &len); unpack_sample8 (smpbuf, buffer, xxs[i].len); buffer += len; break; case 2: - len = *((uint32 *)buffer)++; + buffer = get_uint32_le_int(buffer, &len); unpack_sample16 ((uint16 *)smpbuf, buffer, xxs[i].len >> 1); buffer += len; break;