tags 369500 + patch
thanks

Hi Cédric,

The attached patch fixes two endianness issues in stellarium:
 - translator.cpp: the resulting UCS4 string was needlessly
   byteswapped
 - hip_star.cpp: the floats read from the data file were not
   byteswapped due to gcc optimizing the macro away (that, or aliasing
   rules kicking in). The patch does the byteswapping the proper way,
   using a union (warning: anonymous unions are not be portable to
   some non-gcc compilers).

With these fixes, stellarium works perfectly fine on PPC.

(btw, please add the locale files to the stellarium-data package ;)

JB.

-- 
 Julien BLACHE <[EMAIL PROTECTED]>  |  Debian, because code matters more 
 Debian & GNU/Linux Developer        |       <http://www.debian.org>
 Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
 GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 

--- stellarium-0.8.0.orig/src/translator.cpp
+++ stellarium-0.8.0/src/translator.cpp
@@ -114,7 +114,7 @@
 					ch |=  (unsigned short)(utf8[++i]&0x3F);
 				}
 
-#ifdef WORDS_BIGENDIAN
+#if 0 //def WORDS_BIGENDIAN
 		unicode[j] = bswap_16(ch);
 #else
 		unicode[j] = ch;
--- stellarium-0.8.0.orig/src/hip_star.cpp
+++ stellarium-0.8.0/src/hip_star.cpp
@@ -145,21 +145,23 @@
 
 // Read datas in binary catalog and compute x,y,z;
 // The aliasing bug on some architecture has been fixed by Rainer Canavan on 26/11/2003
+// Really ? -- JB, 20060607
 int HipStar::read(FILE * catalog)
 {
-	float RA=0, DE=0, xDE, xRA;
-	fread(&xRA,4,1,catalog);
-	LE_TO_CPU_FLOAT(RA, xRA);
+	union { float fl; unsigned int ui; } RA, DE, LY, xRA, xDE, xLY;
 
-	fread(&xDE,4,1,catalog);
-	LE_TO_CPU_FLOAT(DE, xDE);
+	fread(&xRA.ui,4,1,catalog);
+	LE_TO_CPU_INT32(RA.ui, xRA.ui);
+
+	fread(&xDE.ui,4,1,catalog);
+	LE_TO_CPU_INT32(DE.ui, xDE.ui);
 
 	// for debug printing
-	//	float rao = RA;
-	//  float deo = DE;
+	//	float rao = RA.fl;
+	//  float deo = DE.fl;
      
-    RA*=M_PI/12.;     // Convert from hours to rad
-    DE*=M_PI/180.;    // Convert from deg to rad
+    RA.fl*=M_PI/12.;     // Convert from hours to rad
+    DE.fl*=M_PI/180.;    // Convert from deg to rad
 
 	unsigned short int mag, xmag;
 	fread(&xmag,2,1,catalog);
@@ -173,7 +175,7 @@
 	//	LE_TO_CPU_INT16(type, xtype);
 
 	// Calc the Cartesian coord with RA and DE
-    sphe_to_rect(RA,DE,XYZ);
+    sphe_to_rect(RA.fl,DE.fl,XYZ);
 
     XYZ*=RADIUS_STAR;
 
@@ -198,9 +200,9 @@
 	setColor(SpType); // Color depending on the spectral type
 
 	// distance
-	float LY;
-	fread(&LY,4,1,catalog);
-	LE_TO_CPU_FLOAT(Distance, LY);
+	fread(&xLY.ui,4,1,catalog);
+	LE_TO_CPU_INT32(LY.ui, xLY.ui);
+	Distance = LY.fl;
 
 	if (mag==0 && type==0) return 0;
 

Reply via email to