From d0d842e24ae31d5522a65a3a6f20232af886bdfd Mon Sep 17 00:00:00 2001
From: Alessandro Ranellucci <aar@cpan.org>
Date: Tue, 12 Nov 2013 15:23:48 +0100
Subject: [PATCH] Use fread() to read binary STL files

---
 xs/src/admesh/stl.h     |  1 -
 xs/src/admesh/stlinit.c | 34 ++++------------------------------
 2 files changed, 4 insertions(+), 31 deletions(-)

diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h
index 699044866..b6e2a0bae 100644
--- a/xs/src/admesh/stl.h
+++ b/xs/src/admesh/stl.h
@@ -181,5 +181,4 @@ static void stl_read(stl_file *stl, int first_facet, int first);
 static void stl_facet_stats(stl_file *stl, stl_facet facet, int first);
 extern void stl_reallocate(stl_file *stl);
 static int stl_get_little_int(FILE *fp);
-static float stl_get_little_float(FILE *fp);
 extern void stl_get_size(stl_file *stl);
diff --git a/xs/src/admesh/stlinit.c b/xs/src/admesh/stlinit.c
index a05b6de39..633ff639e 100644
--- a/xs/src/admesh/stlinit.c
+++ b/xs/src/admesh/stlinit.c
@@ -52,22 +52,6 @@ stl_get_little_int(FILE *fp)
   return(value);
 }
 
-static float
-stl_get_little_float(FILE *fp)
-{
-  union 
-    {
-      int   int_value;
-      float float_value;
-    } value;
-  
-  value.int_value  =  fgetc(fp) & 0xFF;
-  value.int_value |= (fgetc(fp) & 0xFF) << 0x08;
-  value.int_value |= (fgetc(fp) & 0xFF) << 0x10;
-  value.int_value |= (fgetc(fp) & 0xFF) << 0x18;
-  return(value.float_value);
-}
-
 
 void
 stl_initialize(stl_file *stl)
@@ -251,20 +235,10 @@ stl_read(stl_file *stl, int first_facet, int first)
       if(stl->stats.type == binary)
 	/* Read a single facet from a binary .STL file */
 	{
-	  facet.normal.x = stl_get_little_float(stl->fp);
-	  facet.normal.y = stl_get_little_float(stl->fp);
-	  facet.normal.z = stl_get_little_float(stl->fp);
-	  facet.vertex[0].x = stl_get_little_float(stl->fp);
-	  facet.vertex[0].y = stl_get_little_float(stl->fp);
-	  facet.vertex[0].z = stl_get_little_float(stl->fp);
-	  facet.vertex[1].x = stl_get_little_float(stl->fp);
-	  facet.vertex[1].y = stl_get_little_float(stl->fp);
-	  facet.vertex[1].z = stl_get_little_float(stl->fp);
-	  facet.vertex[2].x = stl_get_little_float(stl->fp);
-	  facet.vertex[2].y = stl_get_little_float(stl->fp);
-	  facet.vertex[2].z = stl_get_little_float(stl->fp);
-	  facet.extra[0] = fgetc(stl->fp);
-	  facet.extra[1] = fgetc(stl->fp);
+	    // we assume little-endian architecture!
+        fread(&facet.normal, sizeof(stl_normal), 1, stl->fp);
+        fread(&facet.vertex, sizeof(stl_vertex), 3, stl->fp);
+        fread(&facet.extra, sizeof(char), 2, stl->fp);
 	}
       else
 	/* Read a single facet from an ASCII .STL file */