diff options
Diffstat (limited to 'tests/t0028-predefined-ranges.sh')
| -rwxr-xr-x | tests/t0028-predefined-ranges.sh | 95 |
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 |
