Thu Dec 18 13:15:10 2008 UTC ()
Fix float reading by using a union instead of a cast. Newer gcc's would
generate incorrect code effectively breaking the package.

I know this solution is still lame but its fix comes from the still uncomitted
lib3ds version 2.0.0. Should one day be fixed/done correctly for non i386.


(reinoud)
diff -r1.14 -r1.15 pkgsrc/graphics/lib3ds/Makefile
diff -r1.5 -r1.6 pkgsrc/graphics/lib3ds/distinfo
diff -r0 -r1.1 pkgsrc/graphics/lib3ds/patches/patch-af

cvs diff -r1.14 -r1.15 pkgsrc/graphics/lib3ds/Makefile (expand / switch to unified diff)

--- pkgsrc/graphics/lib3ds/Makefile 2008/07/14 12:56:05 1.14
+++ pkgsrc/graphics/lib3ds/Makefile 2008/12/18 13:15:10 1.15
@@ -1,18 +1,18 @@ @@ -1,18 +1,18 @@
1# $NetBSD: Makefile,v 1.14 2008/07/14 12:56:05 joerg Exp $ 1# $NetBSD: Makefile,v 1.15 2008/12/18 13:15:10 reinoud Exp $
2# 2#
3 3
4DISTNAME= lib3ds-1.2.0 4DISTNAME= lib3ds-1.2.0
5PKGREVISION= 5 5PKGREVISION= 6
6CATEGORIES= graphics devel 6CATEGORIES= graphics devel
7MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=lib3ds/} 7MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=lib3ds/}
8 8
9MAINTAINER= rh@NetBSD.org 9MAINTAINER= rh@NetBSD.org
10HOMEPAGE= http://lib3ds.sourceforge.net/ 10HOMEPAGE= http://lib3ds.sourceforge.net/
11COMMENT= 3D Studio File Format Library 11COMMENT= 3D Studio File Format Library
12 12
13PKG_DESTDIR_SUPPORT= user-destdir 13PKG_DESTDIR_SUPPORT= user-destdir
14 14
15GNU_CONFIGURE= YES 15GNU_CONFIGURE= YES
16USE_LIBTOOL= YES 16USE_LIBTOOL= YES
17USE_TOOLS= autoconf automake 17USE_TOOLS= autoconf automake
18 18

cvs diff -r1.5 -r1.6 pkgsrc/graphics/lib3ds/distinfo (expand / switch to unified diff)

--- pkgsrc/graphics/lib3ds/distinfo 2006/04/11 14:47:06 1.5
+++ pkgsrc/graphics/lib3ds/distinfo 2008/12/18 13:15:10 1.6
@@ -1,10 +1,11 @@ @@ -1,10 +1,11 @@
1$NetBSD: distinfo,v 1.5 2006/04/11 14:47:06 jmmv Exp $ 1$NetBSD: distinfo,v 1.6 2008/12/18 13:15:10 reinoud Exp $
2 2
3SHA1 (lib3ds-1.2.0.tar.gz) = 49614218c4c11572887beefaa34d23f72ef70a2c 3SHA1 (lib3ds-1.2.0.tar.gz) = 49614218c4c11572887beefaa34d23f72ef70a2c
4RMD160 (lib3ds-1.2.0.tar.gz) = 3e0401e36b545c2a54213ecb2ea3216360450562 4RMD160 (lib3ds-1.2.0.tar.gz) = 3e0401e36b545c2a54213ecb2ea3216360450562
5Size (lib3ds-1.2.0.tar.gz) = 136806 bytes 5Size (lib3ds-1.2.0.tar.gz) = 136806 bytes
6SHA1 (patch-aa) = 0933c6cb86b05306feb97a10f282ea935bfe2c24 6SHA1 (patch-aa) = 0933c6cb86b05306feb97a10f282ea935bfe2c24
7SHA1 (patch-ab) = b2d6804b71fb37428ebf7fb59168ae8ef2eec362 7SHA1 (patch-ab) = b2d6804b71fb37428ebf7fb59168ae8ef2eec362
8SHA1 (patch-ac) = d73dd1b2cdabe61f78d4a7307a04917ff5fc379b 8SHA1 (patch-ac) = d73dd1b2cdabe61f78d4a7307a04917ff5fc379b
9SHA1 (patch-ad) = bbf95ca49e1bf6fa67314f9818af5b1b974eb54a 9SHA1 (patch-ad) = bbf95ca49e1bf6fa67314f9818af5b1b974eb54a
10SHA1 (patch-ae) = 7760d2311d99f3d5d91f89fceced314648abbeb0 10SHA1 (patch-ae) = 7760d2311d99f3d5d91f89fceced314648abbeb0
 11SHA1 (patch-af) = 016c93ead0e5d6a033d891d03db5f227a3e1df71

File Added: pkgsrc/graphics/lib3ds/patches/patch-af
$NetBSD: patch-af,v 1.1 2008/12/18 13:15:10 reinoud Exp $

--- lib3ds/io.c.orig	2001-07-11 15:47:35.000000000 +0200
+++ lib3ds/io.c
@@ -31,6 +31,11 @@
  * \author J.E. Hoffmann <je-h@gmx.net>
  */
 
+typedef union {
+    uint32_t dword_value;
+    float float_value;
+} Lib3dsDwordFloat;
+
 
 struct _Lib3dsIo {
   void *self;
@@ -248,15 +253,15 @@ Lib3dsFloat
 lib3ds_io_read_float(Lib3dsIo *io)
 {
   Lib3dsByte b[4];
-  Lib3dsDword d;
+  Lib3dsDwordFloat d;
 
   ASSERT(io);
   lib3ds_io_read(io, b, 4);
-  d=((Lib3dsDword)b[3] << 24) |
+  d.dword_value =((Lib3dsDword)b[3] << 24) |
     ((Lib3dsDword)b[2] << 16) |
     ((Lib3dsDword)b[1] << 8) |
     ((Lib3dsDword)b[0]);
-  return(*((Lib3dsFloat*)&d));
+  return d.float_value;
 }
 
 
@@ -459,14 +464,14 @@ Lib3dsBool
 lib3ds_io_write_float(Lib3dsIo *io, Lib3dsFloat l)
 {
   Lib3dsByte b[4];
-  Lib3dsDword d;
+  Lib3dsDwordFloat d;
 
   ASSERT(io);
-  d=*((Lib3dsDword*)&l);
-  b[3]=(Lib3dsByte)(((Lib3dsDword)d & 0xFF000000) >> 24);
-  b[2]=(Lib3dsByte)(((Lib3dsDword)d & 0x00FF0000) >> 16);
-  b[1]=(Lib3dsByte)(((Lib3dsDword)d & 0x0000FF00) >> 8);
-  b[0]=(Lib3dsByte)(((Lib3dsDword)d & 0x000000FF));
+  d.float_value = l;
+  b[3]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0xFF000000) >> 24);
+  b[2]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0x00FF0000) >> 16);
+  b[1]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0x0000FF00) >> 8);
+  b[0]=(Lib3dsByte)(((Lib3dsDword)d.dword_value & 0x000000FF));
   if (lib3ds_io_write(io, b, 4)!=4) {
     return(LIB3DS_FALSE);
   }