$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;
