Jörg Höhle : msvcrt/tests: sizeof(long double) is 12 with MS.

Alexandre Julliard julliard at winehq.org
Thu Feb 17 13:06:36 CST 2011


Module: wine
Branch: master
Commit: d9d43231371171ba128d391cfb37cc167e7651cc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d9d43231371171ba128d391cfb37cc167e7651cc

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Tue Dec 28 23:02:12 2010 +0100

msvcrt/tests: sizeof(long double) is 12 with MS.

---

 dlls/msvcrt/tests/misc.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/tests/misc.c b/dlls/msvcrt/tests/misc.c
index a4a1bd3..d93dccf 100644
--- a/dlls/msvcrt/tests/misc.c
+++ b/dlls/msvcrt/tests/misc.c
@@ -170,17 +170,28 @@ static const I10_OUTPUT_test I10_OUTPUT_tests[] = {
 static void test_I10_OUTPUT(void)
 {
     I10_OUTPUT_data out;
-    int i, j, ret;
+    int i, j = sizeof(long double), ret;
 
     if(!pI10_OUTPUT) {
         win_skip("I10_OUTPUT not available\n");
         return;
     }
+    if (j != 12)
+        trace("sizeof(long double) = %d on this machine\n", j);
 
     for(i=0; i<sizeof(I10_OUTPUT_tests)/sizeof(I10_OUTPUT_test); i++) {
         memset(out.str, '#', sizeof(out.str));
 
-        ret = pI10_OUTPUT(I10_OUTPUT_tests[i].d, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
+        if (sizeof(long double) == 12)
+            ret = pI10_OUTPUT(I10_OUTPUT_tests[i].d, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
+        else {
+            /* MS' "long double" is an 80 bit FP that takes 12 bytes*/
+            typedef struct { ULONG x80[3]; } uld; /* same calling convention */
+            union { long double ld; uld ld12; } fp80;
+            int (__cdecl *pI10_OUTPUT12)(uld, int, int, void*) = (void*)pI10_OUTPUT;
+            fp80.ld = I10_OUTPUT_tests[i].d;
+            ret = pI10_OUTPUT12(fp80.ld12, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
+        }
         ok(ret == I10_OUTPUT_tests[i].ret, "%d: ret = %d\n", i, ret);
         ok(out.pos == I10_OUTPUT_tests[i].out.pos, "%d: out.pos = %hd\n", i, out.pos);
         ok(out.sign == I10_OUTPUT_tests[i].out.sign, "%d: out.size = %c\n", i, out.sign);




More information about the wine-cvs mailing list