[Substrate-commits] SF.net SVN: substrate: [290] trunk
Brought to you by:
landonf
|
From: <la...@us...> - 2006-09-01 03:54:00
|
Revision: 290
http://svn.sourceforge.net/substrate/?rev=290&view=rev
Author: landonf
Date: 2006-08-31 20:53:57 -0700 (Thu, 31 Aug 2006)
Log Message:
-----------
Fix type punned alias breakage through the judicious use of unions.
This should fix the unit test failures on linux-amd64
Modified Paths:
--------------
trunk/Foundation/NSByteOrder.m
trunk/Tests/NSByteOrder.m
Modified: trunk/Foundation/NSByteOrder.m
===================================================================
--- trunk/Foundation/NSByteOrder.m 2006-09-01 02:44:30 UTC (rev 289)
+++ trunk/Foundation/NSByteOrder.m 2006-09-01 03:53:57 UTC (rev 290)
@@ -24,6 +24,27 @@
#include <Foundation/NSByteOrder.h>
+/*
+ * According to ISO C99, 6.5:
+ * An object shall have its stored value accessed only by an lvalue expression
+ * that has one of the following types:
+ * ...
+ * - an aggregate or union type that includes on of the aforementioned
+ * types among its members (including, recursively, a member of a
+ * subagregate or contained union)
+ * ...
+ * So, that's exactly what we do:
+ */
+union fcast {
+ float number;
+ NSSwappedFloat swapped;
+};
+
+union dcast {
+ double number;
+ NSSwappedDouble swapped;
+};
+
LF_DECLARE unsigned int
NSHostByteOrder()
{
@@ -185,29 +206,25 @@
LF_DECLARE NSSwappedFloat
NSConvertHostFloatToSwapped(float x)
{
- NSSwappedFloat f;
- f.v = *((unsigned long *)&x);
- return f;
+ return ((union fcast *)&x)->swapped;
}
LF_DECLARE float
NSConvertSwappedFloatToHost(NSSwappedFloat x)
{
- return *((float *)&x.v);
+ return ((union fcast *)&x.v)->number;
}
LF_DECLARE NSSwappedDouble
NSConvertHostDoubleToSwapped(double x)
{
- NSSwappedDouble d;
- d.v = *((unsigned long long *)&x);
- return d;
+ return ((union dcast *)&x)->swapped;
}
LF_DECLARE double
NSConvertSwappedDoubleToHost(NSSwappedDouble x)
{
- return *((double *)&x.v);
+ return ((union dcast *)&x.v)->number;
}
LF_DECLARE NSSwappedFloat
Modified: trunk/Tests/NSByteOrder.m
===================================================================
--- trunk/Tests/NSByteOrder.m 2006-09-01 02:44:30 UTC (rev 289)
+++ trunk/Tests/NSByteOrder.m 2006-09-01 03:53:57 UTC (rev 290)
@@ -250,7 +250,7 @@
START_TEST (test_NSConvertHostFloatToSwapped) {
float x = 21345.0;
NSSwappedFloat f = NSConvertHostFloatToSwapped(x);
- fail_unless(memcmp(&x, &f, 4) == 0, "NSConvertHostFloatToSwapped() returned differing memory.\n");
+ fail_unless(memcmp(&x, &f, sizeof(x)) == 0, "NSConvertHostFloatToSwapped() returned incorrect value (Expected: %f, got: %f)\n", x, NSConvertSwappedFloatToHost(f));
}
END_TEST
@@ -259,14 +259,14 @@
float x;
f.v = 0x1234ABCD;
x = NSConvertSwappedFloatToHost(f);
- fail_unless(memcmp(&x, &f, 4) == 0, "NSConvertSwappedFloatToHost() returned differing memory.\n");
+ fail_unless(memcmp(&x, &f, sizeof(x)) == 0, "NSConvertSwappedFloatToHost() returned incorrect value. (Expected: %f, got: %f)", x, NSConvertSwappedFloatToHost(f));
}
END_TEST
START_TEST (test_NSConvertHostDoubleToSwapped) {
double x = 21345.0;
NSSwappedDouble d = NSConvertHostDoubleToSwapped(x);
- fail_unless(memcmp(&x, &d, 8) == 0, "NSConvertHostDoubleToSwapped() returned differing memory.\n");
+ fail_unless(memcmp(&x, &d, sizeof(x)) == 0, "NSConvertHostDoubleToSwapped() returned incorrect value. (Expected: %f, got: %f)", x, NSConvertSwappedDoubleToHost(d));
}
END_TEST
@@ -275,7 +275,7 @@
double x;
d.v = 0x1234ABCDABCD1234ULL;
x = NSConvertSwappedDoubleToHost(d);
- fail_unless(memcmp(&x, &d, 8) == 0, "NSConvertSwappedDoubleToHost() returned differing memory.\n");
+ fail_unless(memcmp(&x, &d, sizeof(x)) == 0, "NSConvertSwappedDoubleToHost() returned incorrect value (Expected: %f, got %f)", NSConvertSwappedDoubleToHost(d), x);
}
END_TEST
@@ -307,7 +307,7 @@
#else
NSSwappedDouble expected = NSSwapDouble(d);
#endif
- fail_unless(memcmp(&expected, &x, 8) == 0, "NSSwapBigDoubleToHost() returned incorrect data.\n");
+ fail_unless(memcmp(&expected, &x, sizeof(x)) == 0, "NSSwapBigDoubleToHost() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedDoubleToHost(expected), x);
}
END_TEST
@@ -321,7 +321,7 @@
#else
NSSwappedFloat expected = NSSwapFloat(f);
#endif
- fail_unless(memcmp(&expected, &x, 4) == 0, "NSSwapBigDoubleToHost() returned incorrect data.\n");
+ fail_unless(memcmp(&expected, &x, sizeof(x)) == 0, "NSSwapBigFloatToHost() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedFloatToHost(expected), x);
}
END_TEST
@@ -334,7 +334,7 @@
#else
NSSwappedDouble expected = NSSwapDouble(x_);
#endif
- fail_if(d.v != expected.v, "NSSwapHostDoubleToBig() returned incorrect data.\n");
+ fail_unless(NSConvertSwappedDoubleToHost(d) == NSConvertSwappedDoubleToHost(expected), "NSSwapHostDoubleToBig() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedDoubleToHost(expected), NSConvertSwappedDoubleToHost(d));
}
END_TEST
@@ -347,7 +347,7 @@
#else
NSSwappedFloat expected = NSSwapFloat(x_);
#endif
- fail_if(f.v != expected.v, "NSSwapHostDoubleToBig() returned incorrect data.\n");
+ fail_unless(NSConvertSwappedFloatToHost(f) == NSConvertSwappedFloatToHost(expected), "NSSwapHostFloatToBig() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedFloatToHost(expected), NSConvertSwappedFloatToHost(f));
}
END_TEST
@@ -361,7 +361,7 @@
#else
NSSwappedDouble expected = d;
#endif
- fail_unless(memcmp(&expected, &x, 8) == 0, "NSSwapLittleDoubleToHost() returned incorrect data.\n");
+ fail_unless(memcmp(&expected, &x, sizeof(x)) == 0, "NSSwapLittleDoubleToHost() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedDoubleToHost(expected), x);
}
END_TEST
@@ -375,7 +375,7 @@
#else
NSSwappedFloat expected = f;
#endif
- fail_unless(memcmp(&expected, &x, 4) == 0, "NSSwapLittleDoubleToHost() returned incorrect data.\n");
+ fail_unless(memcmp(&expected, &x, sizeof(x)) == 0, "NSSwapLittleFloatToHost() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedFloatToHost(expected), x);
}
END_TEST
@@ -388,7 +388,7 @@
#else
NSSwappedDouble expected = x_;
#endif
- fail_if(d.v != expected.v, "NSSwapHostDoubleToLittle() returned incorrect data.\n");
+ fail_unless(NSConvertSwappedDoubleToHost(d) == NSConvertSwappedDoubleToHost(expected), "NSSwapHostDoubleToLittle() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedDoubleToHost(expected), NSConvertSwappedDoubleToHost(d));
}
END_TEST
@@ -401,7 +401,7 @@
#else
NSSwappedFloat expected = x_;
#endif
- fail_if(f.v != expected.v, "NSSwapHostDoubleToLittle() returned incorrect data.\n");
+ fail_unless(NSConvertSwappedFloatToHost(f) == NSConvertSwappedFloatToHost(expected), "NSSwapHostFloatToLittle() returned incorrect value (Expected: %f, got: %f)", NSConvertSwappedFloatToHost(expected), NSConvertSwappedFloatToHost(f));
}
END_TEST
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|