ansily-compliant integer (de)serialisation
diff --git a/.gitignore b/.gitignore
index add132e..12f364c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,7 @@ autom4te.cache/
!/build-aux/ax_check_compile_flag.m4
!/build-aux/ax_pthread.m4
!/build-aux/git-version-gen
+
+.version-prev
+
+configure~
diff --git a/include/common.h b/include/common.h
index c02af0d..c0f7479 100644
--- a/include/common.h
+++ b/include/common.h
@@ -35,7 +35,7 @@ typedef int8_t s8;
typedef int16_t s16;
typedef int32_t s32;
-static s32 read_neutral_s32(u8 * data) { return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); }
+static s32 read_neutral_s32(u8 * data) { return ((u32) data[0]) | (((u32) data[1]) << 8) | (((u32) data[2]) << 16) | (((u32) data[3]) << 24); }
static void write_neutral_s32(u8 * data, s32 value) {
data[0] = value & 0xFF;
diff --git a/src/lzp.c b/src/lzp.c
index 8a7aa97..a310c0e 100644
--- a/src/lzp.c
+++ b/src/lzp.c
@@ -20,7 +20,7 @@ static s32 lzp_encode_block(const u8 * restrict in, const u8 * in_end, u8 * rest
for (s32 i = 0; i < 4; ++i) *out++ = *in++;
- ctx = in[-1] | (in[-2] << 8) | (in[-3] << 16) | (in[-4] << 24);
+ ctx = ((u32) in[-1]) | (((u32) in[-2]) << 8) | (((u32) in[-3]) << 16) | (((u32) in[-4]) << 24);
while (in < in_end - m_len - 32 && out < out_eob) {
u32 idx = (ctx >> 15 ^ ctx ^ ctx >> 3) & mask;
@@ -46,7 +46,7 @@ static s32 lzp_encode_block(const u8 * restrict in, const u8 * in_end, u8 * rest
len += in[len] == ref[len];
in += len;
- ctx = in[-1] | (in[-2] << 8) | (in[-3] << 16) | (in[-4] << 24);
+ ctx = ((u32) in[-1]) | (((u32) in[-2]) << 8) | (((u32) in[-3]) << 16) | (((u32) in[-4]) << 24);
*out++ = MATCH;
@@ -69,7 +69,7 @@ static s32 lzp_encode_block(const u8 * restrict in, const u8 * in_end, u8 * rest
}
}
- ctx = in[-1] | (in[-2] << 8) | (in[-3] << 16) | (in[-4] << 24);
+ ctx = ((u32) in[-1]) | (((u32) in[-2]) << 8) | (((u32) in[-3]) << 16) | (((u32) in[-4]) << 24);
while (in < in_end && out < out_eob) {
u32 idx = (ctx >> 15 ^ ctx ^ ctx >> 3) & mask;
@@ -95,7 +95,7 @@ static s32 lzp_decode_block(const u8 * restrict in, const u8 * in_end, s32 * res
for (s32 i = 0; i < 4; ++i) *out++ = *in++;
- u32 ctx = out[-1] | (out[-2] << 8) | (out[-3] << 16) | (out[-4] << 24);
+ u32 ctx = ((u32) out[-1]) | (((u32) out[-2]) << 8) | (((u32) out[-3]) << 16) | (((u32) out[-4]) << 24);
while (in < in_end) {
u32 idx = (ctx >> 15 ^ ctx ^ ctx >> 3) & mask;
@@ -115,7 +115,7 @@ static s32 lzp_decode_block(const u8 * restrict in, const u8 * in_end, s32 * res
while (out < out_end) *out++ = *ref++;
- ctx = out[-1] | out[-2] << 8 | out[-3] << 16 | out[-4] << 24;
+ ctx = ((u32) out[-1]) | (((u32) out[-2]) << 8) | (((u32) out[-3]) << 16) | (((u32) out[-4]) << 24);
} else {
in++;
ctx = (ctx << 8) | (*out++ = MATCH);
