home · contact · privacy
Use bit-shifting instead of bizarre arithmetics on UCHAR_MAX for readwrite library...
authorChristian Heller <c.heller@plomlompom.de>
Sun, 21 Jul 2013 03:54:42 +0000 (05:54 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Sun, 21 Jul 2013 03:54:42 +0000 (05:54 +0200)
src/readwrite.c

index cdee90bbecbc62027aa7a5b55fe14b7ed4842a6d..8afcfb59bf204bfbb0fafb5b765c57488af25ac9 100644 (file)
@@ -3,34 +3,35 @@
 #include "readwrite.h"
 #include <stdio.h>
 #include <stdint.h>
-#include <limits.h>
 
-static const uint16_t uchar_s = UCHAR_MAX + 1;
+extern uint16_t read_uint16_bigendian( FILE * file )
+{
+    uint16_t x;
+    x =     (uint16_t) fgetc(file) << 8 ;
+    x = x + (uint16_t) fgetc(file)      ;
+    return x;
+}
 
-extern uint16_t read_uint16_bigendian(FILE * file) {
-  unsigned char a = fgetc(file);
-  unsigned char b = fgetc(file);
-  return (a * uchar_s) + b; }
+extern uint32_t read_uint32_bigendian( FILE * file )
+{
+    uint32_t x;
+    x =       (uint32_t) fgetc(file) << 24   ;
+    x = x + ( (uint32_t) fgetc(file) << 16 ) ;
+    x = x + ( (uint32_t) fgetc(file) <<  8 ) ;
+    x = x +   (uint32_t) fgetc(file)         ;
+    return x;
+}
 
-extern uint32_t read_uint32_bigendian(FILE * file) {
-  unsigned char a = fgetc(file);
-  unsigned char b = fgetc(file);
-  unsigned char c = fgetc(file);
-  unsigned char d = fgetc(file);
-  return (a * uchar_s * uchar_s * uchar_s) + (b * uchar_s * uchar_s) + (c * uchar_s) + d; }
+extern void write_uint16_bigendian( uint16_t x, FILE * file )
+{
+    fputc( x >> 8,   file );
+    fputc( x & 0xFF, file );
+}
 
-extern void write_uint16_bigendian(uint16_t x, FILE * file) {
-  unsigned char a = x / uchar_s;
-  unsigned char b = x % uchar_s;
-  fputc(a, file);
-  fputc(b, file); }
-
-extern void write_uint32_bigendian(uint32_t x, FILE * file) {
-  unsigned char a = x / (uchar_s * uchar_s * uchar_s);
-  unsigned char b = (x - (a * uchar_s * uchar_s * uchar_s)) / (uchar_s * uchar_s);
-  unsigned char c = (x - ((a * uchar_s * uchar_s * uchar_s) + (b * uchar_s * uchar_s))) / uchar_s;
-  unsigned char d = x % uchar_s;
-  fputc(a, file);
-  fputc(b, file);
-  fputc(c, file);
-  fputc(d, file); }
+extern void write_uint32_bigendian( uint32_t x, FILE * file )
+{
+    fputc( ( x >> 24 ) & 0xFF, file);
+    fputc( ( x >> 16 ) & 0xFF, file);
+    fputc( ( x >>  8 ) & 0xFF, file);
+    fputc(   x         & 0xFF, file);
+}