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.diff -r1.14 -r1.15 pkgsrc/graphics/lib3ds/Makefile
(reinoud)
@@ -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 | |||
4 | DISTNAME= lib3ds-1.2.0 | 4 | DISTNAME= lib3ds-1.2.0 | |
5 | PKGREVISION= 5 | 5 | PKGREVISION= 6 | |
6 | CATEGORIES= graphics devel | 6 | CATEGORIES= graphics devel | |
7 | MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=lib3ds/} | 7 | MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=lib3ds/} | |
8 | 8 | |||
9 | MAINTAINER= rh@NetBSD.org | 9 | MAINTAINER= rh@NetBSD.org | |
10 | HOMEPAGE= http://lib3ds.sourceforge.net/ | 10 | HOMEPAGE= http://lib3ds.sourceforge.net/ | |
11 | COMMENT= 3D Studio File Format Library | 11 | COMMENT= 3D Studio File Format Library | |
12 | 12 | |||
13 | PKG_DESTDIR_SUPPORT= user-destdir | 13 | PKG_DESTDIR_SUPPORT= user-destdir | |
14 | 14 | |||
15 | GNU_CONFIGURE= YES | 15 | GNU_CONFIGURE= YES | |
16 | USE_LIBTOOL= YES | 16 | USE_LIBTOOL= YES | |
17 | USE_TOOLS= autoconf automake | 17 | USE_TOOLS= autoconf automake | |
18 | 18 |
@@ -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 | |||
3 | SHA1 (lib3ds-1.2.0.tar.gz) = 49614218c4c11572887beefaa34d23f72ef70a2c | 3 | SHA1 (lib3ds-1.2.0.tar.gz) = 49614218c4c11572887beefaa34d23f72ef70a2c | |
4 | RMD160 (lib3ds-1.2.0.tar.gz) = 3e0401e36b545c2a54213ecb2ea3216360450562 | 4 | RMD160 (lib3ds-1.2.0.tar.gz) = 3e0401e36b545c2a54213ecb2ea3216360450562 | |
5 | Size (lib3ds-1.2.0.tar.gz) = 136806 bytes | 5 | Size (lib3ds-1.2.0.tar.gz) = 136806 bytes | |
6 | SHA1 (patch-aa) = 0933c6cb86b05306feb97a10f282ea935bfe2c24 | 6 | SHA1 (patch-aa) = 0933c6cb86b05306feb97a10f282ea935bfe2c24 | |
7 | SHA1 (patch-ab) = b2d6804b71fb37428ebf7fb59168ae8ef2eec362 | 7 | SHA1 (patch-ab) = b2d6804b71fb37428ebf7fb59168ae8ef2eec362 | |
8 | SHA1 (patch-ac) = d73dd1b2cdabe61f78d4a7307a04917ff5fc379b | 8 | SHA1 (patch-ac) = d73dd1b2cdabe61f78d4a7307a04917ff5fc379b | |
9 | SHA1 (patch-ad) = bbf95ca49e1bf6fa67314f9818af5b1b974eb54a | 9 | SHA1 (patch-ad) = bbf95ca49e1bf6fa67314f9818af5b1b974eb54a | |
10 | SHA1 (patch-ae) = 7760d2311d99f3d5d91f89fceced314648abbeb0 | 10 | SHA1 (patch-ae) = 7760d2311d99f3d5d91f89fceced314648abbeb0 | |
11 | SHA1 (patch-af) = 016c93ead0e5d6a033d891d03db5f227a3e1df71 |
$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);
}