summaryrefslogtreecommitdiff
path: root/tests/t0028-predefined-ranges.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/t0028-predefined-ranges.sh')
-rwxr-xr-xtests/t0028-predefined-ranges.sh95
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/t0028-predefined-ranges.sh b/tests/t0028-predefined-ranges.sh
new file mode 100755
index 0000000..72693a2
--- /dev/null
+++ b/tests/t0028-predefined-ranges.sh
@@ -0,0 +1,95 @@
+#!/bin/sh
+set -eu
+base="${TMPDIR-/tmp}/mcpu-cpp-predef-ranges-$$"
+mkdir -p "$base"
+trap 'rm -rf "$base"' EXIT HUP INT TERM
+
+"$MCPU_CPP" --no-config -dMP < /dev/null > "$base/macros"
+
+# Integer families: derive the largest advertised width, then verify every
+# power-of-two family from int8 through that LibMPU limit.
+int_limit=`sed -n 's/^#define __INT\([0-9][0-9]*\)_TYPE__ int[0-9][0-9]*$/\1/p' "$base/macros" | sort -n | tail -1`
+test -n "$int_limit"
+grep "^#define __MCPU_INT_MAX_WIDTH__ ${int_limit}$" "$base/macros" >/dev/null
+
+bits=8
+while test "$bits" -le "$int_limit"; do
+ bytes=`expr "$bits" / 8`
+ grep "^#define __INT${bits}_TYPE__ int${bits}$" "$base/macros" >/dev/null
+ grep "^#define __UINT${bits}_TYPE__ uint${bits}$" "$base/macros" >/dev/null
+ grep "^#define __INT${bits}_WIDTH__ ${bits}$" "$base/macros" >/dev/null
+ grep "^#define __UINT${bits}_WIDTH__ ${bits}$" "$base/macros" >/dev/null
+ grep "^#define __SIZEOF_INT${bits}__ ${bytes}$" "$base/macros" >/dev/null
+ grep "^#define __SIZEOF_UINT${bits}__ ${bytes}$" "$base/macros" >/dev/null
+
+ grep "^#define __INT${bits}_DECIMAL_DIG__ [1-9][0-9]*$" "$base/macros" >/dev/null
+ grep "^#define __UINT${bits}_DECIMAL_DIG__ [1-9][0-9]*$" "$base/macros" >/dev/null
+
+ if test "$bits" -le 256; then
+ grep "^#define __INT${bits}_MAX__ 0x[0-9a-f][0-9a-f]*$" "$base/macros" >/dev/null
+ grep "^#define __UINT${bits}_MAX__ 0x[0-9a-f][0-9a-f]*$" "$base/macros" >/dev/null
+ else
+ for name in "__INT${bits}_MAX__" "__UINT${bits}_MAX__"; do
+ if grep "^#define ${name}\\>" "$base/macros" >/dev/null; then exit 1; fi
+ done
+ fi
+
+ if grep "^#define __INT${bits}_MIN__\\>" "$base/macros" >/dev/null; then exit 1; fi
+ bits=`expr "$bits" \* 2`
+done
+
+# Real/Complex families: their complete structural metadata extends through
+# MPU_REAL_IO_LIMIT. Complex WIDTH is the language parameter, not storage bits.
+real_limit=`sed -n 's/^#define __MCPU_REAL_IO_LIMIT__ \([0-9][0-9]*\)$/\1/p' "$base/macros"`
+test -n "$real_limit"
+grep "^#define __MCPU_REAL_MAX_WIDTH__ ${real_limit}$" "$base/macros" >/dev/null
+grep "^#define __MCPU_COMPLEX_MAX_WIDTH__ ${real_limit}$" "$base/macros" >/dev/null
+
+bits=32
+while test "$bits" -le "$real_limit"; do
+ real_bytes=`expr "$bits" / 8`
+ complex_bytes=`expr "$bits" / 4`
+ grep "^#define __REAL${bits}_TYPE__ real${bits}$" "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_WIDTH__ ${bits}$" "$base/macros" >/dev/null
+ grep "^#define __SIZEOF_REAL${bits}__ ${real_bytes}$" "$base/macros" >/dev/null
+ case "$bits" in
+ 32) exp_bytes=1; max_strlen=20 ;;
+ 64) exp_bytes=2; max_strlen=40 ;;
+ 128) exp_bytes=4; max_strlen=60 ;;
+ 256) exp_bytes=4; max_strlen=80 ;;
+ 512) exp_bytes=8; max_strlen=160 ;;
+ 1024) exp_bytes=8; max_strlen=320 ;;
+ 2048) exp_bytes=16; max_strlen=640 ;;
+ 4096) exp_bytes=16; max_strlen=1280 ;;
+ 8192) exp_bytes=32; max_strlen=2560 ;;
+ 16384) exp_bytes=32; max_strlen=5120 ;;
+ 32768) exp_bytes=64; max_strlen=10240 ;;
+ 65536) exp_bytes=64; max_strlen=20480 ;;
+ *) exit 1 ;;
+ esac
+ grep "^#define __SIZEOF_REAL${bits}_EXP__ ${exp_bytes}$" "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MAX_STRLEN__ ${max_strlen}$" "$base/macros" >/dev/null
+ grep "^#define __COMPLEX${bits}_TYPE__ complex${bits}$" "$base/macros" >/dev/null
+ grep "^#define __COMPLEX${bits}_WIDTH__ ${bits}$" "$base/macros" >/dev/null
+ grep "^#define __SIZEOF_COMPLEX${bits}__ ${complex_bytes}$" "$base/macros" >/dev/null
+
+ grep "^#define __REAL${bits}_DECIMAL_DIG__ [1-9][0-9]*$" "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MANT_DIG__ [1-9][0-9]*$" "$base/macros" >/dev/null
+
+ if test "$bits" -le 256; then
+ grep "^#define __REAL${bits}_MAX__ " "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MIN__ " "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_EPSILON__ " "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MAX_EXP__ " "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MIN_EXP__ " "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MAX_10_EXP__ " "$base/macros" >/dev/null
+ grep "^#define __REAL${bits}_MIN_10_EXP__ " "$base/macros" >/dev/null
+ else
+ for suffix in MAX MIN EPSILON MAX_EXP MIN_EXP MAX_10_EXP MIN_10_EXP; do
+ if grep "^#define __REAL${bits}_${suffix}__\\>" "$base/macros" >/dev/null; then exit 1; fi
+ done
+ fi
+
+ if grep "^#define __REAL${bits}_DIG__\\>" "$base/macros" >/dev/null; then exit 1; fi
+ bits=`expr "$bits" \* 2`
+done