Sophie

Sophie

distrib > Mageia > 6 > armv7hl > media > core-updates-src > by-pkgid > e292cda8ad33284786d7f1384ee2e82d > files > 11

ming-0.4.5-14.1.mga6.src.rpm

From d468907a46a7ca42a78b0ac6f221172905be2fd6 Mon Sep 17 00:00:00 2001
From: Hugo Lefeuvre <hle@debian.org>
Date: Fri, 27 Oct 2017 15:16:16 +0200
Subject: [PATCH 20/29] Fix readSInt16, readUInt16 and readSInt32 methods

* Rewrite readSInt16, readUInt16 and readSInt32.

    Avoid calling all read{U,S}Int8(f) in one line, order of
    evaluation is not guaranteed in the C standard (undefined
    behavior).

* Change return type of readUInt16 from int to unsigned int.

* Rewrite readUInt32.

    Use |= operator instead of adding four separate integers. Less
    memory usage, better readable.
---
 util/read.c | 30 +++++++++++++++++++++---------
 util/read.h |  2 +-
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/util/read.c b/util/read.c
index 9d5bc262..ed59052a 100644
--- a/util/read.c
+++ b/util/read.c
@@ -148,26 +148,38 @@ int readSInt8(FILE *f)
 
 int readSInt16(FILE *f)
 {
-  return readUInt8(f) + readSInt8(f)*256;
+  int result = 0;
+  result |= readUInt8(f);
+  result |= readSInt8(f) << 8;
+  return result;
 }
 
-int readUInt16(FILE *f)
+unsigned int readUInt16(FILE *f)
 {
-  return readUInt8(f) + (readUInt8(f)<<8);
+  unsigned int result = 0u;
+  result |= readUInt8(f);
+  result |= readUInt8(f) << 8;
+  return result;
 }
 
 long readSInt32(FILE *f)
 {
-  return (long)readUInt8(f) + (readUInt8(f)<<8) + (readUInt8(f)<<16) + (readUInt8(f)<<24);
+  long result = 0;
+  result |= readUInt8(f);
+  result |= readUInt8(f) << 8;
+  result |= readUInt8(f) << 16;
+  result |= readUInt8(f) << 24;
+  return result;
 }
 
 unsigned long readUInt32(FILE *f)
 {
-  int part1 = readUInt8(f);
-  int part2 = readUInt8(f) << 8;
-  int part3 = readUInt8(f) << 16;
-  unsigned long part4 = ((unsigned long)readUInt8(f)) << 24;
-  return part1 + part2 + part3 + part4;
+  unsigned long result = 0u;
+  result |= readUInt8(f);
+  result |= readUInt8(f) << 8;
+  result |= readUInt8(f) << 16;
+  result |= readUInt8(f) << 24;
+  return result;
 }
 
 double readDouble(FILE *f)
diff --git a/util/read.h b/util/read.h
index 70a47717..a85a41d9 100644
--- a/util/read.h
+++ b/util/read.h
@@ -13,7 +13,7 @@ int readBits(FILE *f, int number);
 int readSBits(FILE *f, int number);
 int readUInt8(FILE *f);
 int readSInt8(FILE *f);
-int readUInt16(FILE *f);
+unsigned int readUInt16(FILE *f);
 int readSInt16(FILE *f);
 unsigned long readUInt32(FILE *f);
 long readSInt32(FILE *f);
-- 
2.14.3