Fixed off-by-one in audio converters, when growing a data type's size.
authorRyan C. Gordon <icculus@icculus.org>
Fri, 02 Jan 2009 08:12:14 +0000
changeset 2956 1210d5a28e16
parent 2955 2692999d5271
child 2957 2c30a17edf11
Fixed off-by-one in audio converters, when growing a data type's size.
src/audio/SDL_audiotypecvt.c
src/audio/sdlgenaudiocvt.pl
--- a/src/audio/SDL_audiotypecvt.c	Fri Jan 02 07:34:01 2009 +0000
+++ b/src/audio/SDL_audiotypecvt.c	Fri Jan 02 08:12:14 2009 +0000
@@ -65,8 +65,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_U16LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Uint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Uint16 val = (((Uint16) *src) << 8);
         *dst = SDL_SwapLE16(val);
@@ -89,8 +89,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_S16LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint16 val = (((Sint16) ((*src) ^ 0x80)) << 8);
         *dst = ((Sint16) SDL_SwapLE16(val));
@@ -113,8 +113,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_U16MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Uint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Uint16 val = (((Uint16) *src) << 8);
         *dst = SDL_SwapBE16(val);
@@ -137,8 +137,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_S16MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint16 val = (((Sint16) ((*src) ^ 0x80)) << 8);
         *dst = ((Sint16) SDL_SwapBE16(val));
@@ -161,8 +161,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_S32LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((*src) ^ 0x80)) << 24);
         *dst = ((Sint32) SDL_SwapLE32(val));
@@ -185,8 +185,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_S32MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((*src) ^ 0x80)) << 24);
         *dst = ((Sint32) SDL_SwapBE32(val));
@@ -209,8 +209,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_F32LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const float val = ((((float) *src) * DIVBY127) - 1.0f);
         *dst = SDL_SwapFloatLE(val);
@@ -233,8 +233,8 @@
     fprintf(stderr, "Converting AUDIO_U8 to AUDIO_F32MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const float val = ((((float) *src) * DIVBY127) - 1.0f);
         *dst = SDL_SwapFloatBE(val);
@@ -280,8 +280,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_U16LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Uint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Uint16 val = (((Uint16) ((((Sint8) *src)) ^ 0x80)) << 8);
         *dst = SDL_SwapLE16(val);
@@ -304,8 +304,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_S16LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint16 val = (((Sint16) ((Sint8) *src)) << 8);
         *dst = ((Sint16) SDL_SwapLE16(val));
@@ -328,8 +328,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_U16MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Uint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Uint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Uint16 val = (((Uint16) ((((Sint8) *src)) ^ 0x80)) << 8);
         *dst = SDL_SwapBE16(val);
@@ -352,8 +352,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_S16MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint16 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint16 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint16 val = (((Sint16) ((Sint8) *src)) << 8);
         *dst = ((Sint16) SDL_SwapBE16(val));
@@ -376,8 +376,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_S32LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((Sint8) *src)) << 24);
         *dst = ((Sint32) SDL_SwapLE32(val));
@@ -400,8 +400,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_S32MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((Sint8) *src)) << 24);
         *dst = ((Sint32) SDL_SwapBE32(val));
@@ -424,8 +424,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_F32LSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const float val = (((float) ((Sint8) *src)) * DIVBY127);
         *dst = SDL_SwapFloatLE(val);
@@ -448,8 +448,8 @@
     fprintf(stderr, "Converting AUDIO_S8 to AUDIO_F32MSB.\n");
 #endif
 
-    src = (const Uint8 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 4);
+    src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
         const float val = (((float) ((Sint8) *src)) * DIVBY127);
         *dst = SDL_SwapFloatBE(val);
@@ -589,8 +589,8 @@
     fprintf(stderr, "Converting AUDIO_U16LSB to AUDIO_S32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((SDL_SwapLE16(*src)) ^ 0x8000)) << 16);
         *dst = ((Sint32) SDL_SwapLE32(val));
@@ -613,8 +613,8 @@
     fprintf(stderr, "Converting AUDIO_U16LSB to AUDIO_S32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((SDL_SwapLE16(*src)) ^ 0x8000)) << 16);
         *dst = ((Sint32) SDL_SwapBE32(val));
@@ -637,8 +637,8 @@
     fprintf(stderr, "Converting AUDIO_U16LSB to AUDIO_F32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = ((((float) SDL_SwapLE16(*src)) * DIVBY32767) - 1.0f);
         *dst = SDL_SwapFloatLE(val);
@@ -661,8 +661,8 @@
     fprintf(stderr, "Converting AUDIO_U16LSB to AUDIO_F32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = ((((float) SDL_SwapLE16(*src)) * DIVBY32767) - 1.0f);
         *dst = SDL_SwapFloatBE(val);
@@ -802,8 +802,8 @@
     fprintf(stderr, "Converting AUDIO_S16LSB to AUDIO_S32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((Sint16) SDL_SwapLE16(*src))) << 16);
         *dst = ((Sint32) SDL_SwapLE32(val));
@@ -826,8 +826,8 @@
     fprintf(stderr, "Converting AUDIO_S16LSB to AUDIO_S32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((Sint16) SDL_SwapLE16(*src))) << 16);
         *dst = ((Sint32) SDL_SwapBE32(val));
@@ -850,8 +850,8 @@
     fprintf(stderr, "Converting AUDIO_S16LSB to AUDIO_F32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = (((float) ((Sint16) SDL_SwapLE16(*src))) * DIVBY32767);
         *dst = SDL_SwapFloatLE(val);
@@ -874,8 +874,8 @@
     fprintf(stderr, "Converting AUDIO_S16LSB to AUDIO_F32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = (((float) ((Sint16) SDL_SwapLE16(*src))) * DIVBY32767);
         *dst = SDL_SwapFloatBE(val);
@@ -1015,8 +1015,8 @@
     fprintf(stderr, "Converting AUDIO_U16MSB to AUDIO_S32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((SDL_SwapBE16(*src)) ^ 0x8000)) << 16);
         *dst = ((Sint32) SDL_SwapLE32(val));
@@ -1039,8 +1039,8 @@
     fprintf(stderr, "Converting AUDIO_U16MSB to AUDIO_S32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((SDL_SwapBE16(*src)) ^ 0x8000)) << 16);
         *dst = ((Sint32) SDL_SwapBE32(val));
@@ -1063,8 +1063,8 @@
     fprintf(stderr, "Converting AUDIO_U16MSB to AUDIO_F32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = ((((float) SDL_SwapBE16(*src)) * DIVBY32767) - 1.0f);
         *dst = SDL_SwapFloatLE(val);
@@ -1087,8 +1087,8 @@
     fprintf(stderr, "Converting AUDIO_U16MSB to AUDIO_F32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = ((((float) SDL_SwapBE16(*src)) * DIVBY32767) - 1.0f);
         *dst = SDL_SwapFloatBE(val);
@@ -1228,8 +1228,8 @@
     fprintf(stderr, "Converting AUDIO_S16MSB to AUDIO_S32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((Sint16) SDL_SwapBE16(*src))) << 16);
         *dst = ((Sint32) SDL_SwapLE32(val));
@@ -1252,8 +1252,8 @@
     fprintf(stderr, "Converting AUDIO_S16MSB to AUDIO_S32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (Sint32 *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((Sint32 *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const Sint32 val = (((Sint32) ((Sint16) SDL_SwapBE16(*src))) << 16);
         *dst = ((Sint32) SDL_SwapBE32(val));
@@ -1276,8 +1276,8 @@
     fprintf(stderr, "Converting AUDIO_S16MSB to AUDIO_F32LSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = (((float) ((Sint16) SDL_SwapBE16(*src))) * DIVBY32767);
         *dst = SDL_SwapFloatLE(val);
@@ -1300,8 +1300,8 @@
     fprintf(stderr, "Converting AUDIO_S16MSB to AUDIO_F32MSB.\n");
 #endif
 
-    src = (const Uint16 *) (cvt->buf + cvt->len_cvt);
-    dst = (float *) (cvt->buf + cvt->len_cvt * 2);
+    src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
     for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
         const float val = (((float) ((Sint16) SDL_SwapBE16(*src))) * DIVBY32767);
         *dst = SDL_SwapFloatBE(val);
--- a/src/audio/sdlgenaudiocvt.pl	Fri Jan 02 07:34:01 2009 +0000
+++ b/src/audio/sdlgenaudiocvt.pl	Fri Jan 02 08:12:14 2009 +0000
@@ -188,8 +188,8 @@
         if ($fsize < $tsize) {
             my $mult = $tsize / $fsize;
             print <<EOF;
-    src = (const $srctype *) (cvt->buf + cvt->len_cvt);
-    dst = ($tctype *) (cvt->buf + cvt->len_cvt * $mult);
+    src = ((const $srctype *) (cvt->buf + cvt->len_cvt)) - 1;
+    dst = (($tctype *) (cvt->buf + cvt->len_cvt * $mult)) - 1;
     for (i = cvt->len_cvt / sizeof ($srctype); i; --i, --src, --dst) {
 EOF
         } else {