#!/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