From d91e966f19386a93178ca37ed45bd087cf4fc76e Mon Sep 17 00:00:00 2001 From: Landon Curt Noll Date: Thu, 14 Dec 2023 23:20:35 -0800 Subject: [PATCH] improve how calc compiles on big endian machines Fixed bug that caused calc to fail to compile filepos2z() in file.c on little endian machines for the Debian apcalc package. Thanks to Martin Buck (m at rtin-buck dor de) for for fix. Removed unused macros from zmath.h: SWAP_B32_IN_HASH(dest, src) SWAP_B16_IN_HASH(dest, src) SWAP_B8_IN_HASH(dest, src) SWAP_B32_IN_FLAG(dest, src) SWAP_B16_IN_FLAG(dest, src) SWAP_B8_IN_FLAG(dest, src) When SWAP_HALF_IN_B32(dest, src), SWAP_B32_IN_FULL(dest, src), SWAP_B16_IN_HALF(dest, src), SWAP_B32_IN_bool(dest, src), or SWAP_B32_IN_LEN(dest, src), SWAP_HALF_IN_FILEPOS(dest, src) is an assignment such as: (*(dest) = *(src)) We now case the dest and src pointers to the proper type before referencing and performing the assignment. --- CHANGES | 26 ++++++++++++++++++++++++++ file.c | 2 +- fposval.c | 2 +- zmath.h | 18 +++++------------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/CHANGES b/CHANGES index 3dfbc97..0ee69c9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,29 @@ +The following are the changes from calc version 2.15.0.3 to date: + + Fixed bug that caused calc to fail to compile filepos2z() in file.c + on little endian machines for the Debian apcalc package. Thanks to + Martin Buck (m at rtin-buck dor de) for for fix. + + Removed unused macros from zmath.h: + + SWAP_B32_IN_HASH(dest, src) + SWAP_B16_IN_HASH(dest, src) + SWAP_B8_IN_HASH(dest, src) + SWAP_B32_IN_FLAG(dest, src) + SWAP_B16_IN_FLAG(dest, src) + SWAP_B8_IN_FLAG(dest, src) + + When SWAP_HALF_IN_B32(dest, src), SWAP_B32_IN_FULL(dest, src), + SWAP_B16_IN_HALF(dest, src), SWAP_B32_IN_bool(dest, src), + or SWAP_B32_IN_LEN(dest, src), SWAP_HALF_IN_FILEPOS(dest, src) + is an assignment such as: + + (*(dest) = *(src)) + + We now case the dest and src pointers to the proper type before + referencing and performing the assignment. + + The following are the changes from calc version 2.15.0.1 to 2.15.0.2: Updated BUGS about MSYS2 on Windows compiling of calc. diff --git a/file.c b/file.c index 33b633f..131c979 100644 --- a/file.c +++ b/file.c @@ -1387,7 +1387,7 @@ filepos2z(FILEPOS pos) ret.len = FILEPOS_BITS/BASEB; ret.v = alloc(ret.len); zclearval(ret); - SWAP_HALF_IN_FILEPOS(ret.v, &pos); + SWAP_HALF_IN_FILEPOS(ret.v, (HALF *)&pos); ret.sign = 0; ztrim(&ret); diff --git a/fposval.c b/fposval.c index da04aeb..91a339e 100644 --- a/fposval.c +++ b/fposval.c @@ -140,7 +140,7 @@ main(int UNUSED(argc), char **argv) */ #if defined(HAVE_FILEPOS_SCALAR) printf("#define SWAP_HALF_IN_FILEPOS(dest, src) \\\n" - "\t(*(dest) = *(src))\n"); + "\t(*((HALF *)(dest)) = *((HALF *)(src)))\n"); #else /* HAVE_FILEPOS_SCALAR */ /* * Normally a "(*(dest) = *(src))" would do, but on some diff --git a/zmath.h b/zmath.h index f13c6e8..02a30b4 100644 --- a/zmath.h +++ b/zmath.h @@ -79,7 +79,7 @@ typedef USB64 FULL; /* double unit of number storage */ typedef SB64 SFULL; /* signed FULL */ #define SWAP_HALF_IN_B64(dest, src) SWAP_B32_IN_B64(dest, src) -#define SWAP_HALF_IN_B32(dest, src) (*(dest) = *(src)) +#define SWAP_HALF_IN_B32(dest, src) (*((HALF *)(dest)) = *((HALF *)(src))) #define SWAP_HALF_IN_FULL(dest, src) SWAP_B32_IN_B64(dest, src) #define SWAP_HALF_IN_HASH(dest, src) SWAP_B16_IN_HASH(dest, src) #define SWAP_HALF_IN_FLAG(dest, src) SWAP_B16_IN_FLAG(dest, src) @@ -106,9 +106,9 @@ typedef SB32 SFULL; /* signed FULL */ #define SWAP_HALF_IN_FLAG(dest, src) SWAP_B16_IN_FLAG(dest, src) #define SWAP_HALF_IN_bool(dest, src) SWAP_B16_IN_bool(dest, src) #define SWAP_HALF_IN_LEN(dest, src) SWAP_B16_IN_LEN(dest, src) -#define SWAP_B32_IN_FULL(dest, src) (*(dest) = *(src)) +#define SWAP_B32_IN_FULL(dest, src) (*((FULL *)(dest)) = *((FULL *)(src))) #define SWAP_B16_IN_FULL(dest, src) SWAP_B16_IN_B32(dest, src) -#define SWAP_B16_IN_HALF(dest, src) (*(dest) = *(src)) +#define SWAP_B16_IN_HALF(dest, src) (*((HALF *)(dest)) = *((HALF *)(src))) #define SWAP_B8_IN_FULL(dest, src) SWAP_B8_IN_B32(dest, src) #define SWAP_B8_IN_HALF(dest, src) SWAP_B8_IN_B16(dest, src) @@ -171,19 +171,11 @@ typedef SB32 LEN; /* calc v2 compatible unit of length storage */ typedef uintptr_t LEN; /* unit of length storage */ #endif /* MAJOR_VER < 3 */ -#define SWAP_B32_IN_HASH(dest, src) (*(dest) = *(src)) -#define SWAP_B16_IN_HASH(dest, src) SWAP_B16_IN_B32(dest, src) -#define SWAP_B8_IN_HASH(dest, src) SWAP_B8_IN_B32(dest, src) - -#define SWAP_B32_IN_FLAG(dest, src) (*(dest) = *(src)) -#define SWAP_B16_IN_FLAG(dest, src) SWAP_B16_IN_B32(dest, src) -#define SWAP_B8_IN_FLAG(dest, src) SWAP_B8_IN_B32(dest, src) - -#define SWAP_B32_IN_bool(dest, src) (*(dest) = *(src)) +#define SWAP_B32_IN_bool(dest, src) (*((bool *)(dest)) = *((bool *)(src))) #define SWAP_B16_IN_bool(dest, src) SWAP_B16_IN_B32(dest, src) #define SWAP_B8_IN_bool(dest, src) SWAP_B8_IN_B32(dest, src) -#define SWAP_B32_IN_LEN(dest, src) (*(dest) = *(src)) +#define SWAP_B32_IN_LEN(dest, src) (*((LEN *)(dest)) = *((LEN *)(src))) #define SWAP_B16_IN_LEN(dest, src) SWAP_B16_IN_B32(dest, src) #define SWAP_B8_IN_LEN(dest, src) SWAP_B8_IN_B32(dest, src)