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