summaryrefslogtreecommitdiff
path: root/tests/t0028-predefined-ranges.sh
blob: d788fc6cbfa490152e215249ad81d55e51e9614c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/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" / 8`
  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
  if test "$bits" -gt 32; then
    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
  fi
  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