12aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/** @file
22aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Every thing you wanted to know about your compiler but didn't know whom to ask.
32aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
42aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved.
52aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Steven Pemberton, CWI, Amsterdam; "Steven.Pemberton@cwi.nl"
62aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Used with permission.
72aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
82aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
92aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This program and the accompanying materials
102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    are licensed and made available under the terms and conditions of the BSD License
112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    which accompanies this distribution. The full text of the license may be found at
122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    http://opensource.org/licenses/bsd-license.
132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm**/
172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(_MSC_VER)           /* Handle Microsoft VC++ compiler specifics. */
182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4018 )
192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4055 )
202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4116 )
212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4130 )
222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4189 )
232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4244 )
242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #pragma warning ( disable : 4723 )
252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif  /* defined(_MSC_VER) */
262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_SC   1   // Compiler doesn't support signed char
282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_UC   1   // Compiler doesn't support unsigned char
292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_UI   1   // Compiler doesn't support unsigned short and long
302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_VOID 1   // Compiler doesn't support void
312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_SIG  1   // Compiler doesn't support signal() or setjmp/longjmp()
322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*  Some compilers can't cope with "#ifdef __FILE__". Use
342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    either the FILENAME or BAD_CPP macro as described below.
352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*  If your C preprocessor doesn't have the predefined __FILE__
372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmacro, and you don't want to call this file enquire.c but, say,
382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtell.c, uncomment the following and change enquire.c to tell.c.
392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define FILENAME "enquire.c"
412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*  Some compilers won't accept the line "#include FILENAME".  Uncomment
432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    the following macro. In that case, this file *must* be called enquire.c.
442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_CPP     1
462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*  Some naughty compilers define __STDC__, but don't really
482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    support it.  Some define it as 0, in which case we ignore it.
492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    But if your compiler defines it, and isn't really ANSI C,
502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    uncomment the BAD_STDC macro. (To those compiler writers: for shame).
512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_STDC    1
532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*  Some naughty compilers define __STDC__, but don't have the
552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    stddef.h include file. Uncomment the BAD_STDDEF macro. (Gcc needs this on
562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    some machines, due to clashes between stddef.h and other include files.)
572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_STDDEF  1
592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*  Some systems crash when you try to malloc all store. To save users of such
612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    defective systems too much grief, they may uncomment the BAD_MALLOC macro,
622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    which ignores that bit of the code.
632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_MALLOC  1
652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef PROGRAM
692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PROGRAM enquire.c
702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define VERSION "5.1a"
712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PURPOSE Everything you wanted to know about your machine and C compiler
722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define BUT didnt know who to ask
732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOR Any OS, any C compiler
742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define AUTHOR  Steven Pemberton, CWI, Amsterdam; "Steven.Pemberton@cwi.nl"
752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved.
762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define NOTE  Improvements gratefully received. Please mention the version.
772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define COMPILE On Unix compile with: "sh enquire.c"; see below for details
782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define WEB "http://www.cwi.nl/~steven/enquire.html"
792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NOTDEFINED /* This is how you compile it; see below for details */
822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  case $0 in
832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *.c) ;;
842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  sh) echo 'Use "sh enquire.c", not "sh < enquire.c"' >&2; exit 1;;
852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *) echo 'Filename must end in ".c"' >&2; exit 1;;
862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  esac
872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if test -r test.c
882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  then echo Would overwrite test.c - try it somewhere safer >&2; exit 1
892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fi
902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  CFLAGS=
912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo Testing for needed CFLAGS ...
922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "main(){char c; c=0;}" > test.c
932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if ${CC=cc} ${1+"$@"} -o enquire test.c $LIBS
942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  then :
952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else
962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      echo '*** "'$CC ${1+"$@"} -o enquire test.c $LIBS'" failed'
972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      echo '*** Giving up'
982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      /bin/rm -f test.c
992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      exit 1
1002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fi
1012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "main(){signed char c; c=0;}" > test.c
1022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null
1032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  then echo "   Signed char ok"
1042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else
1052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    CFLAGS=-DNO_SC
1062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    echo "   Signed char not accepted; using $CFLAGS"
1072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fi
1082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "main(){unsigned char c; c=0;}" > test.c
1092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null
1102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  then echo "   Unsigned char ok"
1112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else
1122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    CFLAGS="$CFLAGS -DNO_UC"
1132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    echo "   Unsigned char not accepted; using $CFLAGS"
1142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fi
1152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "main(){unsigned short s;unsigned long l;s=0;l=0;}" > test.c
1162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null
1172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  then echo "   Unsigned short and long ok"
1182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else
1192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    CFLAGS="$CFLAGS -DNO_UI"
1202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    echo "   Unsigned short or long not accepted; using $CFLAGS"
1212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fi
1222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "void foo(){} main(){foo();}" > test.c
1232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null
1242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  then echo "   Void ok"
1252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else
1262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    CFLAGS="$CFLAGS -DNO_VOID"
1272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    echo "   Void not accepted; using $CFLAGS"
1282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fi
1292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /bin/rm -f test.c a.out
1302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo Compiling $0 ...
1322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  case $# in
1332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  0) : check bug in interpreting "$@" in some shells, if no parameters
1342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     case `echo 1 "$@" 2` in
1352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     "1  2") echo '   *** There is a bug in your shell expanding "$@"!'
1362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       echo '   *** Taking remedial action' ;;
1372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     "1 2") ;;
1382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     esac
1392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  esac
1402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  case $ID in
1412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  "") echo "   $CC" $CFLAGS "$@" $0 -o enquire $LIBS
1422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      $CC $CFLAGS ${1+"$@"} $0 -o enquire $LIBS ||
1432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    { echo '***' Try setting some CFLAGS; exit 1; }
1442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      ;;
1452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *)  echo "   $CC" $CFLAGS "$@" -DID="\"$ID\"" $0 -o enquire $LIBS
1462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      $CC $CFLAGS ${1+"$@"} -DID="\"$ID\"" $0 -o enquire $LIBS ||
1472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    { echo '***' Try setting some CFLAGS; exit 1; }
1482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  esac
1492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "Producing enquire.out limits.h and float.h ..."
1502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "   enquire > enquire.out"
1512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ./enquire > enquire.out || echo '   *** Some problems: see enquire.out'
1522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "   enquire -l > limits.h"
1532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ./enquire -l > limits.h || echo '   *** Some problems: see limits.h'
1542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "   enquire -f > float.h"
1552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ./enquire -f > float.h  || echo '   *** Some problems: see float.h'
1562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "Verifying the contents of limits.h and float.h ..."
1572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "   $CC" -DVERIFY $CFLAGS "$@" $0 -o verify $LIBS
1582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  $CC -DVERIFY $CFLAGS ${@+"$@"} $0 -o verify $LIBS ||
1592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    { echo '***' Failed; exit 1; }
1602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo "   verify -fl > verify.out"
1612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ./verify -fl > verify.out ||
1622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    echo '   *** Some problems: see verify.out'
1632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  echo Done
1642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  exit 0
1652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
1662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*
1682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm PURPOSE
1692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This is a program that determines many properties of the C
1702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    compiler and machine that it is run on, such as minimum and
1712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    maximum [un]signed char/int/long, many properties of float/ [long]
1722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    double, and so on.
1732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    As an option it produces the ANSI C float.h and limits.h files.
1752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    As a further option, it even checks that the compiler reads the
1772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    header files correctly.
1782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    It is a good test-case for compilers, since it exercises them with
1802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    many limiting values, such as the minimum and maximum floating-point
1812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    numbers.
1822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm COMPILING AND RUNNING ON UNIX MACHINES
1842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    With luck and a following wind, on Unix systems just the following
1852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    will work:
1862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  sh enquire.c    (or whatever filename you chose).
1872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Any parameters are passed to the C compiler, so if the compilation
1882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    fails for any reason curable as explained below, you can do the following:
1892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  sh enquire.c -DBAD_CPP
1902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If you do get compilation errors, check the line in question.
1922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Very often there is a comment attached saying which define to set.
1932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
1942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    You can use a different C compiler than the default cc by setting CC:
1952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  CC=gcc sh enquire.c -ansi
1962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    You can load extra libraries by setting LIBS:
1972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  CC=gcc LIBS=-lflong sh enquire.c -ansi
1982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Add ID="string" for the string to be added to the output; for instance:
1992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ID="`hostname` cc -ansi" sh enquire.c -ansi
2002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Compiling may give messages about unreachable code. These you can ignore.
2022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Some compilers offer various flags for different floating point
2042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    modes; it's worth trying all possible combinations of these.
2052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Don't say I haven't tried to make life easy for you...
2072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm COMPILING AND RUNNING ON NON-UNIX SYSTEMS
2092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    On non-Unix systems, you must say (the equivalent of):
2102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc enquire.c -o enquire
2112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  enquire > enquire.out
2122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  enquire -l > limits.h
2132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  enquire -f > float.h
2142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc -DVERIFY enquire.c -o verify #this includes limits.h and float.h
2152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  verify -fl > verify.out
2162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If your compiler doesn't support:   add flag:
2182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signed char (eg pcc)      -DNO_SC
2192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned char       -DNO_UC
2202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned short and long     -DNO_UI
2212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  void          -DNO_VOID
2222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(), or setjmp/longjmp()   -DNO_SIG
2232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Try to compile first with no flags, and see if you get any errors
2252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    - you might be surprised. (Most non-ANSI compilers need -DNO_SC,
2262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    though.)  Some compilers need a -f flag for floating point.
2272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Don't use any optimisation flags: the program may not work if you
2292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    do.  Though "while (a+1.0-a-1.0 == 0.0)" may look like "while(1)"
2302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    to an optimiser, to a floating-point unit there's a world of difference.
2312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Compiling may give messages about unreachable code. These you can ignore.
2332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Some compilers offer various flags for different floating point
2352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    modes; it's worth trying all possible combinations of these.
2362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm FAULTY COMPILERS
2382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Because of bugs and/or inadequacies, some compilers need the following
2392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    defines:
2402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    -  If your C preprocessor doesn't have the predefined __FILE__
2422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       macro, and you don't want to call this file enquire.c but, say,
2432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       tell.c, add the flag -DFILENAME=\"tell.c\" .
2442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    -  Some compilers won't accept the line "#include FILENAME".  Add
2462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       flag -DBAD_CPP. In that case, this file *must* be called
2472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       enquire.c.
2482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    -  Some compilers can't cope with "#ifdef __FILE__". Use
2502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       -DFILENAME= or -DBAD_CPP as above.
2512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    -  Some naughty compilers define __STDC__, but don't really
2532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       support it.  Some define it as 0, in which case we ignore it.
2542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       But if your compiler defines it, and isn't really ANSI C, add
2552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       flag -DBAD_STDC. (To those compiler writers: for shame).
2562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    -  Some naughty compilers define __STDC__, but don't have the
2582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       stddef.h include file. Add flag -DBAD_STDDEF. (Gcc needs this
2592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       on some machines, due to clashes between stddef.h and other
2602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       include files.)
2612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    -  Some systems crash when you try to malloc all store. To save
2632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       users of such defective systems too much grief, they may
2642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       compile with -DBAD_MALLOC, which ignores that bit of the code.
2652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Summary of naughty-compiler flags:
2672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If your compiler doesn't support:    add flag:
2682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  __FILE__ (and you changed the filename) -DFILENAME=\"name.c\"
2692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #ifdef __FILE__       -DBAD_CPP or -DFILENAME=...
2702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #include FILENAME     -DBAD_CPP
2712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  __STDC__ (properly)     -DBAD_STDC
2722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  stddef.h        -DBAD_STDDEF
2732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  malloc(LOTS) == NULL      -DBAD_MALLOC
2742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    While it is not our policy to support defective compilers, pity has been
2762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    taken on people with compilers that can't produce object files bigger than
2772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    32k (especially since it was an easy addition). Compile the program
2782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    into separate parts like this:
2792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc -c -DSEP -DPASS0 -o p0.o <other flags> enquire.c
2802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc -c -DSEP -DPASS1 -o p1.o <other flags> enquire.c
2812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc -c -DSEP -DPASS2 -o p2.o <other flags> enquire.c
2822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc -c -DSEP -DPASS3 -o p3.o <other flags> enquire.c
2832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cc -o enquire p0.o p1.o p2.o p3.o
2842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm SYSTEM DEPENDENCIES
2862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    You may possibly need to add some calls to signal() for other sorts of
2872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    exception on your machine than SIGFPE, SIGOVER, SIGBUS, and SIGSEGV.
2882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    See lines beginning #ifdef SIGxxx (and communicate the differences to me!).
2892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
2902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm OUTPUT
2912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Running without argument gives the information as English text. If run
2922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    with argument -l (e.g. enquire -l), output is a series of #define's for
2932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    the ANSI standard limits.h include file, excluding MB_MAX_CHAR. If run
2942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    with argument -f, output is a series of #define's for the ANSI standard
2952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    float.h include file (according to ANSI C Draft of Dec 7, 1988).
2962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Flag -v gives verbose output: output includes the English text above
2972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    as C comments. The program exit(0)'s if everything went ok, otherwise
2982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    it exits with a positive number, telling how many problems there were.
2992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm VERIFYING THE COMPILER
3012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If, having produced the float.h and limits.h header files, you want to
3022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    verify that the compiler reads them back correctly (there are a lot of
3032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    boundary cases, of course, like minimum and maximum numbers), you can
3042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    recompile enquire.c with -DVERIFY set (plus the other flags that you used
3052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    when compiling the version that produced the header files). This then
3062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    recompiles the program so that it #includes "limits.h" and "float.h",
3072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    and checks that the constants it finds there are the same as the
3082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    constants it produces. Run the resulting program with enquire -fl.
3092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Many compilers fail this test.
3102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    NB: You *must* recompile with the same compiler and flags, otherwise
3112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    you may get odd results.
3122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    You can also use this option if your compiler already has both files,
3142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    and you want to confirm that this program produces the right results.
3152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm TROUBLESHOOTING.
3172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This program is now quite trustworthy, and suspicious and wrong output
3182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    may well be caused by bugs in the compiler, not in the program (however
3192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    of course, this is not guaranteed, and no responsibility can be
3202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    accepted, etc.)
3212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    The program only works if overflows are ignored by the C system or
3232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    are catchable with signal().
3242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If the program fails to run to completion (often with the error message
3262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    "Unexpected signal at point x"), this often turns out to be a bug in the
3272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    C compiler's run-time system. Check what was about to be printed, and
3282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    try to narrow the problem down.
3292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Another possible problem is that you have compiled the program to produce
3312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    loss-of-precision arithmetic traps. The program cannot cope with these,
3322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    and you should re-compile without them. (They should never be the default).
3332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Make sure you compiled with optimisation turned off.
3352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Output preceded by *** WARNING: identifies behaviour of the C system
3372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    deemed incorrect by the program. Likely problems are that printf or
3382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    scanf don't cope properly with certain boundary numbers: this program
3392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    goes to a lot of trouble to calculate its values, and these values
3402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    are mostly boundary numbers. Experience has shown that often printf
3412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    cannot cope with these values, and so in an attempt to increase
3422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    confidence in the output, for each float and double that is printed,
3432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    the printed value is checked by using sscanf to read it back.
3442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Care is taken that numbers are printed with enough digits to uniquely
3452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    identify them, and therefore that they can be read back identically.
3462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If the number read back is different, then there is probably a bug in
3472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf or sscanf, and the program prints the warning message.
3482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If the two numbers in the warning look identical, then printf is more
3492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    than likely rounding the last digit(s) incorrectly. To put you at ease
3502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    that the two really are different, the bit patterns of the two numbers
3512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    are also printed. The difference is very likely in the last bit.
3522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Many scanf's read the minimum double back as 0.0, and similarly cause
3532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    overflow when reading the maximum double. This program quite ruthlessly
3542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    declares all these behaviours faulty. The point is that if you get
3552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    one of these warnings, the output may be wrong, so you should check
3562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    the result carefully if you intend to use the results. Of course, printf
3572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    and sscanf may both be wrong, and cancel each other out, so you should
3582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    check the output carefully anyway.
3592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    The warning that "a cast didn't work" refers to cases like this:
3612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  float f;
3632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  #define C 1.234567890123456789
3642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f= C;
3652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f != (float) C) printf ("Wrong!");
3662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    A faulty compiler will widen f to double and ignore the cast to float,
3682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    and because there is more accuracy in a double than a float, fail to
3692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    recognise that they are the same. In the actual case in point, f and C
3702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    are passed as parameters to a function that discovers they are not equal,
3712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    so it's just possible that the error was in the parameter passing,
3722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    not in the cast (see function Verify()).
3732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    For ANSI C, which has float constants, the error message is "constant has
3742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    wrong precision".
3752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm REPORTING PROBLEMS
3772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If the program doesn't work for you for any reason that can't be
3782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    narrowed down to a problem in the C compiler, or it has to be
3792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    changed in order to get it to compile, or it produces suspicious
3802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    output (like a very low maximum float, for instance), please mail
3812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    the problem and an example of the incorrect output to
3822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Steven.Pemberton@cwi.nl so that improvements can be worked into
3832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    future versions. Try to give as much information as possible;
3842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    DON'T FORGET TO MENTION THE VERSION NUMBER!
3852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    The program tries to catch and diagnose bugs in the compiler/run-time
3872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    system. I would be especially pleased to have reports of failures so
3882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    that I can improve this service.
3892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    I apologise unreservedly for the contorted use of the preprocessor...
3912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    but it was fun!
3922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm NEW VERSIONS
3942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Worried that you may not have the latest version? Ftp to
3952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    ftp.cwi.nl, and look in directory pub/steven/enquire
3962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    for file enquireXX.c; XX is the version number. Or look at
3972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    http://www.cwi.nl/~steven/enquire.html
3982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
3992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm HOW DOES ENQUIRE WORK?
4002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    There is an article that explains a lot of the workings: The
4012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Ergonomics of Portability; available from the above addresses as file
4022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    enquire.ps.
4032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm THE SMALL PRINT
4052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This is not a public domain program; nor is any other program that
4062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    carries a copyright notice. It is however freely copyable under the
4072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    following conditions:
4082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       You may copy and distribute verbatim copies of this source file.
4102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       You may modify this source file, and copy and distribute such
4112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       modified versions, provided that you leave the copyright notice
4122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       at the top of the file and also cause the modified file to carry
4132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       prominent notices stating that you changed the files and the
4142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       date of any change; and cause the whole of any work that you
4152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       distribute or publish, that in whole or in part contains or is a
4162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       derivative of this program or any part thereof, to be licensed
4172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       at no charge to all third parties on terms identical to those
4182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       here.
4192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    While every effort has been taken to make this program as reliable as
4212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    possible, no responsibility can be taken for the correctness of the
4222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    output, nor suitability for any particular use.
4232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If you do have a fix to any problem, please send it to me, so that
4252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    other people can have the benefits.
4262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    This program is an offshoot of a project funded by public funds.
4282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    If you use this program for research or commercial use (i.e. more
4292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    than just for the fun of knowing about your compiler) mailing a short
4302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    note of acknowledgement may help keep enquire.c supported.
4312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ACKNOWLEDGEMENTS
4332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Many people have given time and ideas to making this program what it is.
4342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    To all of them thanks, and apologies for not mentioning them by name.
4352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
4362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm HISTORY
4372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Originally started as a program to generate configuration constants
4382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    for a large piece of software we were writing, which later took on
4392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    a life of its own...
4402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    1.0 Length 6658!; end 1984?
4412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unix only. Only printed a dozen maximum int/double values.
4422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    2.0 Length 10535; Spring 1985
4432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Prints values as #defines (about 20 of them)
4442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  More extensive floating point, using Cody and Waite
4452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Handles signals better
4462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Programs around optimisations
4472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Handles Cybers
4482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    3.0 Length 12648; Aug 1987; prints about 42 values
4492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added PASS stuff, so treats float as well as double
4502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    4.0 Length 33891; Feb 1989; prints around 85 values
4512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  First GNU version (for gcc, where they called it hard-params.c)
4522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Generates float.h and limits.h files
4532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Handles long double
4542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Generates warnings for dubious output
4552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    4.1 Length 47738; April 1989
4562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added VERIFY and TEST
4572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    4.2 Length 63442; Feb 1990
4582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added SEP
4592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed eps/epsneg
4602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added check for pseudo-unsigned chars
4612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added description for each #define output
4622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added check for absence of defines during verify
4632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added prototypes
4642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added BAD_STDC and BAD_CPP
4652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed alignments output
4662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    4.3 Length 75000; Oct 1990; around 114 lines of output
4672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Function xmalloc defined, Richard Stallman, June 89.
4682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Alignments computed from member offsets rather than structure sizes,
4692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Richard Stallman, Oct 89
4702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Print whether char* and int* pointers have the same format;
4712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      also char * and function *
4722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Update to Draft C version Dec 7, 1988
4732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      - types of constants produced in limits.h
4742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    (whether to put a U after unsigned shorts and chars and
4752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     whether to output -1024 as (-1023-1))
4762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      - values of SCHAR_MIN/MAX
4772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      - values of *_EPSILON (not the smallest but the effective smallest)
4782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added FILENAME, since ANSI C doesn't allow #define __FILE__
4792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Renamed from config.c to enquire.c
4802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added size_t and ptrdiff_t enquiries
4812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added promotion enquiries
4822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added type checks of #defines
4832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added BAD_STDDEF
4842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Changed endian to allow for cases where not all bits are used
4852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Sanity check for max integrals
4862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed definition of setjmp for -DNO_SIG
4872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Moved #define ... 0.0L inside #ifdef STDC, in case some cpp's tokenize
4882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added BAD_MALLOC
4892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    5.0 Length 88228; February 1993; around 120 lines of output
4902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (depends on what you count)
4912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added the 'sh enquire.c' horror/delight: thanks David Mankins@think
4922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added checks for long names: thanks Steve Simon@leeds-poly
4932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added FPE signal checks: thanks Leonid A. Broukhis
4942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added check for dereferencing NULL
4952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added TESTI
4962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added LIBS, fixed showtype: thanks Rainer Orth@TechFak.Uni-Bielefeld.DE
4972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added a free(): thanks nickc@perihelion.co.uk
4982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Added signal catching to the malloc part
4992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Renamed naughty-compiler defines to BAD_*
5002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Renamed and altered Verify() to better check faulty compilers
5012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Shut some compilers up from giving incorrect warnings.
5022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed sign_of(): thanks Hugh Redelmeier@redvax
5032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed USHRT_MAX for sizeof(short)=sizeof(int) but INT_MAX > SHRT_MAX
5042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed NO_UI
5052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed -DSEP: thanks Mike Black@seismo
5062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed the case where stdio.h includes limits.h: thanks rms@gnu
5072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed exponent(): thanks Christophe BINOT
5082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    <chb%hpvpta.france.hp.com@hplb.hpl.hp.com>
5092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   5.0a Aug 1997
5102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Made handling of ID= easier
5112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Improved the reporting of use of bits in Floating values.
5122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   5.1  Length 88739; Sep 1998
5132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Fixed detection of infinity for machines with no overflow trap
5142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Speeded up search for max char (first 32 bit char machine turned up...)
5152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   5.1a Length 88832; Feb 1999
5162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Changed identification message
5172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   5.1b Length 88926; Oct 2002
5182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        Fixed a missing \n in an output line; thanks Leonid Broukhis again
5192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
5202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set FILENAME to the name of this file */
5222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef FILENAME
5232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef BAD_CPP
5242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FILENAME "enquire.c"
5252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
5262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __FILE__ /* It's a compiler bug if this fails. Define BAD_CPP */
5272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FILENAME __FILE__
5282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
5292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FILENAME "enquire.c"
5302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* __FILE__ */
5312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* BAD_CPP */
5322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* FILENAME */
5332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* This file is read three times (it #includes itself), to generate
5352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   otherwise identical code for each of short+float, int+double,
5362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   long+long double. If PASS isn't defined, then this is the first pass.
5372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Code bracketed by 'PASS0' is for stuff independent of all three,
5382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   but is read during the first pass.
5392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
5402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef PASS
5412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SEP /* so we're only interested if this is pass 1 or not */
5422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS1
5432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 1
5442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
5452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 0
5462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
5472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* no SEP, so this is the first pass */
5482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 1
5492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS0 1
5502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS1 1
5512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* SEP */
5522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Void just marks the functions that don't return a result */
5542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_VOID
5552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Void int
5562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
5572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Void void
5582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
5592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set STDC to whether this is *really* an ANSI C compiler.
5612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Some bad compilers define __STDC__, when they don't support it.
5622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Compile with -DBAD_STDC to get round this.
5632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
5642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef BAD_STDC
5652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __STDC__
5662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __STDC__ /* If __STDC__ is 0, assume it isn't supported */
5672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define STDC
5682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
5692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
5702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
5712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Stuff different for ANSI C, and old C:
5732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   ARGS and NOARGS are used for function prototypes.
5742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Volatile is used to reduce the chance of optimisation,
5752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  and to prevent variables being put in registers (when setjmp/longjmp
5762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  wouldn't work as we want)
5772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Long_double is the longest floating point type available.
5782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   stdc is used in tests like "if (stdc)", which is less ugly than #ifdef.
5792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   U is output after unsigned constants.
5802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */
5812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC
5822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS(x) x
5842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define NOARGS (void)
5852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Volatile volatile
5862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Long_double long double
5872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define stdc 1
5882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U "U"
5892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* Old style C */
5912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS(x) ()
5932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define NOARGS ()
5942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Volatile static
5952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Long_double double
5962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define stdc 0
5972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U ""
5982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
5992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* STDC */
6002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* include files */
6022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <stdio.h>
6032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include  <wchar.h>
6042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC
6062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef BAD_STDDEF
6072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <stddef.h> /* for size_t: if this fails, define BAD_STDDEF */
6082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SIG
6122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define jmp_buf int
6132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
6142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <signal.h> /* if this fails, define NO_SIG */
6152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <setjmp.h> /* if this fails, define NO_SIG */
6162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#ifndef NO_SIG
6182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#include <signal.h> /* if this fails, define NO_SIG */
6192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#include <setjmp.h> /* if this fails, define NO_SIG */
6202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#endif
6212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Kludge around the possiblity that <stdio.h> includes <limits.h> */
6232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_BIT
6242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef CHAR_BIT
6252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef CHAR_MAX
6262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef CHAR_MIN
6272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef SCHAR_MAX
6282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef SCHAR_MIN
6292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef UCHAR_MAX
6302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef UCHAR_MIN
6312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
6342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include "limits.h"
6352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include "float.h"
6362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The largest unsigned type */
6392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UI
6402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ulong unsigned int
6412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
6422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ulong unsigned long
6432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some shorthands */
6462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Vprintf if (V) printf
6472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Unexpected(place) if (setjmp(lab)!=0) croak(place)
6482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define fabs(x) (((x)<0.0)?(-x):(x))
6492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS */
6512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* A description of the ANSI constants */
6532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_CHAR_BIT "Number of bits in a storage unit"
6542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_CHAR_MAX "Maximum char"
6552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_CHAR_MIN "Minimum char"
6562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_SCHAR_MAX "Maximum signed char"
6572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_SCHAR_MIN "Minimum signed char"
6582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_UCHAR_MAX "Maximum unsigned char (minimum is always 0)"
6592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_INT_MAX "Maximum %s"
6612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_INT_MIN "Minimum %s"
6622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_UINT_MAX "Maximum unsigned %s (minimum is always 0)"
6632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_FLT_ROUNDS "Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown"
6652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_FLT_RADIX "Radix of exponent representation"
6662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MANT_DIG "Number of base-FLT_RADIX digits in the significand of a %s"
6672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_DIG "Number of decimal digits of precision in a %s"
6682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MIN_EXP "Minimum int x such that FLT_RADIX**(x-1) is a normalised %s"
6692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MIN_10_EXP "Minimum int x such that 10**x is a normalised %s"
6702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MAX_EXP "Maximum int x such that FLT_RADIX**(x-1) is a representable %s"
6712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MAX_10_EXP "Maximum int x such that 10**x is a representable %s"
6722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MAX "Maximum %s"
6732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_EPSILON "Difference between 1.0 and the minimum %s greater than 1.0"
6742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MIN "Minimum normalised %s"
6752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS0
6772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Prototypes for what's to come: */
6792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint false NOARGS;
6812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef BAD_STDDEF
6832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *malloc (); /* Old style prototype, since we don't know what size_t is */
6842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
6852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *malloc ARGS((size_t size));
6862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
6872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid free ARGS((char *p)); /* Syntax error here? Try -DNO_VOID */
6882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid exit ARGS((int status));
6902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *f_rep ARGS((int precision, Long_double val));
6922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
6932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint maximum_int NOARGS;
6942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint cprop NOARGS;
6952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint basic NOARGS;
6962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid sprop NOARGS;
6972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid iprop NOARGS;
6982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid lprop NOARGS;
6992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid usprop NOARGS;
7002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid uiprop NOARGS;
7012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid ulprop NOARGS;
7022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint fprop ARGS((int byte_size));
7032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint dprop ARGS((int byte_size));
7042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint ldprop ARGS((int byte_size));
7052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid efprop ARGS((int fprec, int dprec, int lprec));
7062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid edprop ARGS((int fprec, int dprec, int lprec));
7072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid eldprop ARGS((int fprec, int dprec, int lprec));
7082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint setmode ARGS((char *s));
7102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid farewell ARGS((int bugs));
7112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid describe ARGS((char *description, char *extra));
7122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid missing ARGS((char *s));
7132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid fmissing ARGS((char *s));
7142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid check_defines NOARGS;
7152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid bitpattern ARGS((char *p, unsigned int size));
7162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint ceil_log ARGS((int base, Long_double x));
7172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid croak ARGS((int place));
7182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid trap1 ARGS((int sig));
7192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid eek_a_bug ARGS((char *problem));
7202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid endian ARGS((int byte_size));
7212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint exponent ARGS((Long_double x, Long_double *fract, int *exp));
7222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint floor_log ARGS((int base, Long_double x));
7232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid f_define ARGS((char *desc, char *extra, char *sort, char *name,
7242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       int prec, Long_double val, char *mark));
7252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid i_define ARGS((char *desc, char *extra, char *sort, char *name,
7262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       long val, long lim, long req, char *mark));
7272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid u_define ARGS((char *desc, char *extra, char *sort, char *name,
7282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       ulong val, ulong req, char *mark));
7292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SIG  /* There's no signal(), or setjmp/longjmp() */
7312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Dummy routines instead */
7332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  typedef int jmp_buf;
7342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int setjmp ARGS((jmp_buf lab));
7362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  jmp_buf lab, mlab;
7382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int setjmp(jmp_buf lab) { return(0); }
7392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  void  longjmp(jmp_buf lab, int val) { return; }
7402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Void signal(int i, void (*p)()) {}
7422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
7442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  jmp_buf lab, mlab;
7452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Void overflow(int sig)
7462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  { /* what to do on over/underflow */
7472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    signal(sig, overflow);
7482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    longjmp(lab, 1);
7492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
7502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Void address(int sig)
7522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  { /* what to do on an address error */
7532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    signal(sig, address);
7542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    longjmp(mlab, 1);
7552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
7562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /*NO_SIG*/
7582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint V= 0, /* verbose */
7602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    L= 0, /* produce limits.h */
7612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    F= 0, /* produce float.h  */
7622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs=0; /* The number of (possible) bugs in the output */
7632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar co[4], oc[4]; /* Comment starter and ender symbols */
7652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint bits_per_byte; /* the number of bits per unit returned by sizeof() */
7672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint flt_rounds;    /* The calculated value of FLT_ROUNDS */
7682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint flt_radix;     /* The calculated value of FLT_RADIX */
7692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVolatile int trapped; /* For testing FPE traps */
7702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef TEST
7722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set the fp modes on a SUN with 68881 chip, to check that different
7732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   rounding modes etc. get properly detected.
7742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   Compile with -f68881 for cc, -m68881 for gcc, and with additional flag
7752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   -DTEST. Run with additional parameter +hex-number, to set the 68881 mode
7762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   register to hex-number
7772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
7782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Bits 0x30 = rounding mode */
7802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_BITS  0x30
7812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_NEAREST  0x00
7822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_ZERO   0x10
7832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_MINUS_INF  0x20
7842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_PLUS_INF 0x30 /* The SUN FP user's guide seems to be wrong here */
7852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Bits 0xc0 = extended rounding */
7872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXT_BITS  0xc0
7882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_EXTENDED  0x00
7892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_SINGLE  0x40
7902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_DOUBLE  0x80
7912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
7922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Enabled traps */
7932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_INEX1  0x100
7942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_INEX2  0x200
7952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_DZ     0x400
7962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_UNFL   0x800
7972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_OVFL  0x1000
7982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_OPERR 0x2000
7992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_SNAN  0x4000
8002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_BSUN  0x8000
8012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Only used for testing, on a Sun with 68881 chip */
8032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Print the FP mode */
8042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmprintmode(new) unsigned new; {
8052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fpmode_(&new);
8062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("New fp mode:\n");
8072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("  Round toward ");
8082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  switch (new & ROUND_BITS) {
8092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case TO_NEAREST:   printf("nearest"); break;
8102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case TO_ZERO:      printf("zero"); break;
8112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case TO_MINUS_INF: printf("minus infinity"); break;
8122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case TO_PLUS_INF:  printf("plus infinity"); break;
8132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        default: printf("???"); break;
8142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
8152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n  Extended rounding precision: ");
8172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  switch (new & EXT_BITS) {
8192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case ROUND_EXTENDED: printf("extended"); break;
8202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case ROUND_SINGLE:   printf("single"); break;
8212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        case ROUND_DOUBLE:   printf("double"); break;
8222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        default: printf("???"); break;
8232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
8242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n  Enabled exceptions:");
8262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_INEX1) printf(" inex1");
8272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_INEX2) printf(" inex2");
8282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_DZ)    printf(" divz");
8292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_UNFL)  printf(" unfl");
8302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_OVFL)  printf(" ovfl");
8312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_OPERR) printf(" operr");
8322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_SNAN)  printf(" snan");
8332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new & (unsigned) EXE_BSUN)  printf(" bsun");
8342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n");
8352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
8362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Only used for testing, on a Sun with 68881 chip */
8382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set the FP mode */
8392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint setmode(s) char *s; {
8402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned mode=0, dig;
8412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char c;
8422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (*s) {
8442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    c= *s++;
8452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if  (c>='0' && c<='9') dig= c-'0';
8462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else if (c>='a' && c<='f') dig= c-'a'+10;
8472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else if (c>='A' && c<='F') dig= c-'A'+10;
8482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else return 1;
8492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    mode= mode<<4 | dig;
8502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
8512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printmode(mode);
8522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return 0;
8532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
8542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SETMODE
8552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
8562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef TESTI /* Test mode using SunOs IEEE routines */
8582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <sys/ieeefp.h>
8602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint setmode(char *s) {
8622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *dummy, c, *cmd, *val;
8632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (*s) {
8642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    switch (c= *s++) {
8652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '=': cmd= "direction"; val= "nearest"; break;
8662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '0': cmd= "direction"; val= "tozero"; break;
8672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '+': cmd= "direction"; val= "positive"; break;
8682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '-': cmd= "direction"; val= "negative"; break;
8692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '1': cmd= "precision"; val= "single"; break;
8702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '2': cmd= "precision"; val= "double"; break;
8712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '3': cmd= "precision"; val= "extended"; break;
8722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '~': cmd= "exception"; val= "inexact"; break;
8732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '/': cmd= "exception"; val= "division"; break;
8742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '>': cmd= "exception"; val= "overflow"; break;
8752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case '<': cmd= "exception"; val= "underflow"; break;
8762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          default:
8772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("Bad setmode character: %c\n", c);
8782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      return 1;
8792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      break;
8802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
8812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("Set %s %s", cmd, val);
8822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (ieee_flags("set", cmd, val, &dummy)) {
8832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf(": failed\n");
8842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      return 1;
8852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
8862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
8872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
8882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return 0;
8892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
8902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SETMODE
8912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
8922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
8932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SETMODE
8942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* ARGSUSED */
8952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
8962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmsetmode(char *s)
8972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
8982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fprintf(stderr, "Can't set mode: not compiled with TEST\n");
8992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return(1);
9002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
9022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
9042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmemeq(
9052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *p1,
9062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int size1,
9072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *p2,
9082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int size2
9092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  )
9102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
9112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* See if two blocks of store are identical */
9122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int i;
9132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (size1 != size2) return 0;
9142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for (i=1; i<=size1; i++) {
9152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (*p1++ != *p2++) return 0;
9162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
9172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return 1;
9182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
9212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfarewell(int bugs)
9222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
9232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (bugs == 0) exit(0);
9242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n%sFor hints on dealing with the ", co);
9252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (bugs == 1) printf("problem");
9262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else printf("%d problems", bugs);
9272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf(" above\n   see the section 'TROUBLESHOOTING' in the file ");
9282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%s%s\n", FILENAME, oc);
9292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  exit(bugs);
9302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The program has received a signal where it wasn't expecting one */
9332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
9342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmcroak(int place)
9352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
9362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("*** Unexpected signal at point %d\n", place);
9372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  farewell(bugs+1); /* An exit isn't essential here, but avoids loops */
9382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* This is here in case alloca.c is used, which calls this. */
9412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *
9422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmxmalloc(unsigned size)
9432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
9442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *value = malloc(size);
9452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (value == 0) {
9462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    fprintf(stderr, "Virtual memory exceeded\n");
9472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    exit(bugs+1);
9482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
9492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return value;
9502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint maxint;
9532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
9552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmaximum_int( void )
9562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
9572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Find the maximum integer */
9582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int newi, int_max, two=2;
9592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Calculate maxint ***********************************/
9612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Calculate 2**n-1 until overflow - then use the previous value  */
9622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  newi=1; int_max=0;
9642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields int_max */
9662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while(newi>int_max) {
9672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      int_max=newi;
9682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      newi=newi*two+1;
9692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
9702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
9712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(0);
9722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return int_max;
9732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* How long are my identifiers? I could go further here, but some compilers
9762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   have line length limits that I don't want to break.
9772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
9782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zzzzzzzzz4zzzzzzzzz5zzzzzzzzz6zzzz=64;
9802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
9822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmname_len( void )
9832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
9842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   int zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zz=32;
9852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   { int zzzzzzzzz1zzzzzz=16;
9862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     { int zzzzzzzz=8;
9872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       { int zzzzzzz=7;
9882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   { int zzzzzz=6;
9892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     return
9902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zzzzzzzzz4zzzzzzzzz5zzzzzzzzz6zzzz;
9912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   }
9922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       }
9932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     }
9942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   }
9952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
9962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
9972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaaa5aaaaaaaaa6aaaa 64
9982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 64
9992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aa
10012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH
10022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 32
10032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef aaaaaaaaa1aaaaaa
10062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH
10072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 16
10082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef aaaaaaaa
10112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH
10122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 8
10132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaaa5aaaaaaaaa6aaaa
10162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid long_names()
10182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
10192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int l= name_len();
10202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("Compiler names are at least %d chars long", l);
10212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (l != 64)
10222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf(" (but less than %d)", l*2);
10232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n");
10242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("Preprocessor names are at least %d long", LENGTH);
10252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (LENGTH != 64)
10262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf(" (but less than %d)", LENGTH*2);
10272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n\n");
10282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
10292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Used by FPROP to see if FP traps are generated, and if they may return */
10312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
10332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtrap2(int sig)
10342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
10352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  longjmp(lab, 1);
10362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
10372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
10392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtrap1(int sig)
10402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
10412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  trapped= 1; /* A global */
10422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(sig, trap2);
10432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
10442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
10462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmsetsignals( void )
10472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
10482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGFPE
10492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(SIGFPE, overflow);
10502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGOVER
10522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(SIGOVER, overflow);
10532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGBUS
10552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(SIGBUS, address);
10562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGSEGV
10582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(SIGSEGV, address);
10592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
10602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Add more calls as necessary */
10612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
10622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH
10642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
10662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmain(int argc, char *argv[])
10672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
10682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int dprec, fprec, lprec;
10692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int i;
10702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  wchar_t *s;
10712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int bad;
10722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  setsignals();
10742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(1);
10752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
10762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  bad=0;
10772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for (i=1; i < argc; i++) {
10782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    s = (wchar_t *)(argv[i]);
10792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (*s == L'-') {
10802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      s++;
10812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      while (*s) {
10822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        switch (*(s++)) {
10832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm              case L'v': V=1; break;
10842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm              case L'l': L=1; break;
10852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm              case L'f': F=1; break;
10862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm              default: bad=1; break;
10872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
10882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
10892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else if (*s == L'+') {
10902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      s++;
10912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      bad = setmode((char *)s);
10922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else bad= 1;
10932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
10942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (bad) {
10952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    fprintf(stderr,
10962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "Usage: %ls [-vlf]\n  v=Verbose l=Limits.h f=Float.h\n",
10972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (wchar_t *)(argv[0]));
10982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    exit(1);
10992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
11002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L || F) {
11012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co[0]= '/'; oc[0]= ' ';
11022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co[1]= '*'; oc[1]= '*';
11032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co[2]= ' '; oc[2]= '/';
11042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co[3]= '\0'; oc[3]= '\0';
11052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
11062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co[0]= '\0'; oc[0]= '\0';
11072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    V=1;
11082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
11092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
11102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) printf("%slimits.h%s\n", co, oc);
11112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) printf("%sfloat.h%s\n", co, oc);
11122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef ID
11132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%sProduced by enquire version %s (%s), CWI, Amsterdam\n   %s\n",
11142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         co, VERSION, ID, WEB, oc);
11152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
11162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%sProduced by enquire version %s, CWI, Amsterdam\n   %s %s\n",
11172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         co, VERSION,     WEB, oc);
11182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
11202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
11212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%sVerification phase%s\n", co, oc);
11222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
11242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SIG
11252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sCompiled without signal(): %s%s\n",
11262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co,
11272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    "there's nothing that can be done if overflow occurs",
11282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
11292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SC
11312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sCompiled without signed char%s\n", co, oc);
11322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UC
11342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sCompiled without unsigned char%s\n", co, oc);
11352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UI
11372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sCompiled without unsigned short or long%s\n", co, oc);
11382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __STDC__
11402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sCompiler claims to be ANSI C level %d%s\n",
11412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, __STDC__, oc);
11422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
11432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sCompiler does not claim to be ANSI C%s\n", co, oc);
11442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
11452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n");
11462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
11472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  long_names();
11482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  check_defines();
11492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
11502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  maxint= maximum_int();
11512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  bits_per_byte= basic();
11522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n");
11532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F||V) {
11542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    fprec= fprop(bits_per_byte);
11552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    dprec= dprop(bits_per_byte);
11562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    lprec= ldprop(bits_per_byte);
11572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    efprop(fprec, dprec, lprec);
11582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    edprop(fprec, dprec, lprec);
11592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eldprop(fprec, dprec, lprec);
11602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
11612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef BAD_MALLOC
11622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (V) {
11632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* An extra goody: the approximate amount of data-space */
11642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* Allocate store until no more available */
11652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* Different implementations have a different argument type
11662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       to malloc. Here we assume that it's the same type as
11672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       that which sizeof() returns */
11682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    unsigned int size;
11692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Volatile long total;
11702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    char kmg, *ptr, *save;
11712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    char **link;
11722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
11732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    save= NULL;
11742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    size=maximum_int()/4;
11752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    total=0;
11762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while (size!=0) {
11772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (setjmp(mlab) == 0) {
11782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        while ((ptr= malloc((false()?sizeof(int):size))) != (char *)NULL) {
11792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          //if (save == NULL) save= ptr; /* save the biggest chunk */
11802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          link = (char **)ptr;
11812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          if (save == NULL) {
11822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            // Save pointer to first allocated chunk
11832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            save= ptr;
11842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            *link = NULL;
11852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          }
11862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          else {
11872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            // Build list of all subsequently allocated chunks, LIFO
11882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            *link = save;
11892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            save = ptr;
11902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          }
11912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          total+=(size/2);
11922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
11932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      } else {
11942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        eek_a_bug("Trying to malloc all store generates a trap");
11952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
11962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      size/=2;
11972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
11982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(mlab)!=0) croak(-1);
11992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
12002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    //if (save != NULL) free(save);
12012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while(save != NULL) {
12022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      link = (char **)save;
12032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      ptr = *link;
12042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      free(save);
12052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      save = ptr;
12062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
12072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
12082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    total= (total+511)/512; /* Sic */ kmg= 'K';
12092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (total > 10000) {
12102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      total= (total+999)/1000; kmg= 'M';
12112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
12122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (total > 10000) {
12132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      total= (total+999)/1000; kmg= 'G';
12142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
12152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (total > 10000) {
12162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      total= (total+999)/1000; kmg= 'T';
12172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
12182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sMemory mallocatable ~= %ld %cbytes%s\n",
12192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, total, kmg, oc);
12202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
12212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
12222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  farewell(bugs);
12232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return bugs; /* To keep compilers and lint happy */
12242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
12252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
12262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
12272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmeek_a_bug(char *problem)
12282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
12292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* The program has discovered a problem */
12302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n%s*** WARNING: %s%s\n", co, problem, oc);
12312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  bugs++;
12322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
12332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
12342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
12352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmdescribe(char *description, char *extra)
12362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
12372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Produce the description for a #define */
12382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("   %s", co);
12392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf(description, extra);
12402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%s\n", oc);
12412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
12422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
12432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
12442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmi_define(
12452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   char *desc,
12462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   char *extra,
12472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   char *sort,
12482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   char *name,
12492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   long val,
12502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   long lim,
12512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   long req,
12522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   char *mark
12532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  )
12542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
12552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Produce a #define for a signed int type */
12562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  describe(desc, extra);
12572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (val >= 0) {
12582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("#define %s%s %ld%s\n", sort, name, val, mark);
12592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (val + lim < 0) {
12602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* We may not produce a constant like -1024 if the max
12612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       allowable value is 1023. It has then to be output as
12622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       -1023-1. lim is the max allowable value. */
12632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("#define %s%s (%ld%s%ld%s)\n",
12642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           sort, name, -lim, mark, val+lim, mark);
12652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
12662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("#define %s%s (%ld%s)\n", sort, name, val, mark);
12672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
12682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* If VERIFY is not set, val and req are just the same value;
12692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     if it is set, val is the value as calculated, and req is
12702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     the #defined constant
12712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
12722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (val != req) {
12732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s*** Verify failed for above #define!\n", co);
12742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("       Compiler has %ld for value%s\n\n", req, oc);
12752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
12762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
12772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n");
12782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
12792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
12802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
12812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmu_define(
12822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *desc,
12832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *extra,
12842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *sort,
12852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *name,
12862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ulong val,
12872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ulong req,
12882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *mark
12892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  )
12902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
12912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Produce a #define for an unsigned value */
12922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  describe(desc, extra);
12932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("#define %s%s %lu%s%s\n", sort, name, val, U, mark);
12942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (val != req) {
12952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s*** Verify failed for above #define!\n", co);
12962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("       Compiler has %lu for value%s\n\n", req, oc);
12972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
12982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
12992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n");
13002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
13012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
13022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid f_define(
13032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *desc,
13042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *extra,
13052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *sort,
13062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *name,
13072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int precision,
13082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Long_double val,
13092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *mark
13102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  )
13112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
13122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Produce a #define for a float/double/long double */
13132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  describe(desc, extra);
13142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (stdc) {
13152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("#define %s%s %s%s\n",
13162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           sort, name, f_rep(precision, val), mark);
13172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (*mark == 'F') {
13182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* non-ANSI C has no float constants, so cast the constant */
13192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("#define %s%s ((float)%s)\n",
13202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           sort, name, f_rep(precision, val));
13212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
13222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("#define %s%s %s\n", sort, name, f_rep(precision, val));
13232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
13242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n");
13252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
13262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
13272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
13282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfloor_log(int base, Long_double x)
13292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
13302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* return floor(log base(x)) */
13312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int r=0;
13322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (x>=base) { r++; x/=base; }
13332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return r;
13342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
13352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
13362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
13372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmceil_log(int base, Long_double x)
13382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
13392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int r=0;
13402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (x>1.0) { r++; x/=base; }
13412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return r;
13422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
13432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
13442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint
13452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmexponent(Long_double x, Long_double *fract, int *exp)
13462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
13472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Split x into a fraction and a power of ten;
13482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     returns 0 if x is unusable, 1 otherwise.
13492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     Only used for error messages about faulty output.
13502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
13512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int r=0, neg=0;
13522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Long_double old;
13532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *fract=0.0; *exp=0;
13542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x<0.0) {
13552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    x= -x;
13562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    neg= 1;
13572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
13582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x==0.0) return 1;
13592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x>=10.0) {
13602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while (x>=10.0) {
13612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      old=x; r++; x/=10.0;
13622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (old==x) return 0;
13632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
13642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
13652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while (x<1.0) {
13662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      old=x; r--; x*=10.0;
13672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (old==x) return 0;
13682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
13692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
13702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (neg) *fract= -x;
13712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else *fract= x;
13722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  *exp=r;
13732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return 1;
13742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
13752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
13762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *
13772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmf_rep(int precision, Long_double val)
13782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
13792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Return the floating representation of val */
13802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  static char buf[1024];
13812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *f1;
13822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(double) == sizeof(Long_double)) {
13832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* Assume they're the same, and use non-stdc format */
13842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* This is for stdc compilers using non-stdc libraries */
13852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f1= "%.*e";
13862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
13872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* It had better support Le then */
13882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f1= "%.*Le";
13892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
13902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  sprintf(buf, f1, precision, val);
13912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return buf;
13922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
13932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
13942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
13952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmbitpattern(char *p, unsigned int size)
13962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
13972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Printf the bit-pattern of p */
13982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char c;
13992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned int i;
14002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int j;
14012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for (i=1; i<=size; i++) {
14032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    c= *p;
14042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    p++;
14052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    for (j=bits_per_byte-1; j>=0; j--)
14062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("%c", (c>>j)&1 ? '1' : '0');
14072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (i!=size) printf(" ");
14082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
14092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
14102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
14122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfill(char *p, int size)
14132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
14142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *ab= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
14152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int i;
14162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for (i=0; i<size; i++)
14182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    p[i]= ab[i];
14192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
14202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Order(x, mode)\
14222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   printf("%s%s ", co, mode); fill((char *)&x, sizeof(x)); \
14232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   for (i=1; i<=sizeof(x); i++) { c=((x>>(byte_size*(sizeof(x)-i)))&mask);\
14242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      putchar(c==0 ? '?' : (char)c); }\
14252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   printf("%s\n", oc);
14262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
14282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmendian(int byte_size)
14292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
14302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Printf the byte-order used on this machine */
14312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*unsigned*/ short s=0;
14322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*unsigned*/ int j=0;
14332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*unsigned*/ long l=0;
14342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned int mask, i, c;
14362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  mask=0;
14382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for (i=1; i<=(unsigned)byte_size; i++) mask= (mask<<1)|1;
14392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (V) {
14412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%sCHARACTER ORDER%s\n", co, oc);
14422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Order(s, "short:");
14432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Order(j, "int:  ");
14442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Order(l, "long: ");
14452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
14462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
14472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
14492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmissing(char *s)
14502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
14512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%s*** #define %s missing from limits.h%s\n", co, s, oc);
14522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  bugs++;
14532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
14542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid
14562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfmissing(char *s)
14572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
14582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("%s*** #define %s missing from float.h%s\n", co, s, oc);
14592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  bugs++;
14602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
14612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* To try and fool optimisers */
14632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint false( void ) { return 0; }
14642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Promoted(x) (false()?(x):(-1))
14662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define is_signed(x) (Promoted(x) < 0)
14672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define sign_of(x) (is_signed(x)?"signed":"unsigned")
14682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Signed 1
14692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Unsigned 0
14702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define sgn(x) ((is_signed(x))?Signed:Unsigned)
14712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define showtype(t, x) Vprintf("%s%s %s %s%s\n", co, t, sign_of(x), type_of((int)sizeof(x)), oc)
14732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *type_of(int x)
14752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
14762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(char)) {
14772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (sizeof(char) == sizeof(int)) return "char/short/int";
14782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (sizeof(char) == sizeof(short)) return "char/short";
14792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return "char";
14802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
14812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(short)) {
14822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (sizeof(short) == sizeof(int)) return "short/int";
14832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return "short";
14842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
14852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(int)) {
14862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (sizeof(int) == sizeof(long)) return "int/long";
14872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return "int";
14882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
14892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(long)) return "long";
14902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return "unknown-type";
14912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
14922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
14932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *ftype_of(int x)
14942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
14952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(float)) {
14962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return "float";
14972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
14982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(double)) {
14992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (sizeof(double) == sizeof(Long_double))
15002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      return "(long)double";
15012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return "double";
15022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
15032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (x == sizeof(Long_double)) {
15042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return "long double";
15052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
15062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return "unknown-type";
15072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
15082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid typerr(char *name, int esign, int esize, int sign, int size)
15102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
15112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("*** %s has wrong type: expected %s %s, found %s %s\n",
15122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    name, sign_of(esign), type_of(esize),
15132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    sign_of(sign), type_of(size));
15142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
15152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid ftyperr(char *name, int esize, int size)
15172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
15182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("*** %s has wrong type: expected %s, found %s\n",
15192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    name, ftype_of(esize), ftype_of(size));
15202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
15212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid promotions( void )
15232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
15242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int si; long sl;
15252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned int ui;
15262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  short ss;
15272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI
15292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned long ul;  /* if this fails, define NO_UI */
15302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  unsigned short us; /* if this fails, define NO_UI */
15312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ul=0; us=0;
15332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
15342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Shut compiler warnings up: */
15352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  si=0; sl=0; ui=0; ss=0;
15362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n%sPROMOTIONS%s\n", co, oc);
15382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Sanity checks. Possible warnings here; should be no problem */
15402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (is_signed(ui))
15412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("unsigned int promotes to signed!\n");
15422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (!is_signed(si))
15432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("signed int promotes to unsigned!\n");
15442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (!is_signed(sl))
15452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("signed long promotes to unsigned!\n");
15462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(Promoted(si)) != sizeof(int))
15472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("int doesn't promote to int!\n");
15482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(Promoted(sl)) != sizeof(long))
15492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("long doesn't promote to long!\n");
15502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(Promoted(ss)) != sizeof(int))
15512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("short doesn't promote to int!\n");
15522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(Promoted(ui)) != sizeof(int))
15532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("unsigned int doesn't promote to int!\n");
15542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI
15552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(Promoted(ul)) != sizeof(long))
15562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("unsigned long doesn't promote to long!\n");
15572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (is_signed(ul))
15582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("unsigned long promotes to signed!\n");
15592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
15602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI
15622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  showtype("unsigned short promotes to", Promoted(us));
15632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
15642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  showtype("long+unsigned gives", sl+ui);
15652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
15662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define checktype(x, n, s, t) if((sgn(x)!=s)||(sizeof(x)!=sizeof(t))) typerr(n, s, (int)sizeof(t), sgn(x), (int)sizeof(x));
15682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define fchecktype(x, n, t) if (sizeof(x) != sizeof(t)) ftyperr(n, (int)sizeof(x), (int)sizeof(t));
15702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid check_defines( void )
15722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
15732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* ensure that all #defines are present and have the correct type */
15742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
15752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int usign;
15762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UI
15782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  usign= Signed;
15792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
15802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Implementations promote unsigned short differently */
15812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  usign= is_signed((unsigned short)0);
15822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
15832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
15842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) {
15852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_BIT
15862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(CHAR_BIT, "CHAR_BIT", Signed, int);
15872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
15882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("CHAR_BIT");
15892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
15902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_MAX
15912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(CHAR_MAX, "CHAR_MAX", Signed, int);
15922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
15932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("CHAR_MAX");
15942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
15952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_MIN
15962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(CHAR_MIN, "CHAR_MIN", Signed, int);
15972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
15982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("CHAR_MIN");
15992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SCHAR_MAX
16012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(SCHAR_MAX, "SCHAR_MAX", Signed, int);
16022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("SCHAR_MAX");
16042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SCHAR_MIN
16062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(SCHAR_MIN, "SCHAR_MIN", Signed, int);
16072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("SCHAR_MIN");
16092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef UCHAR_MAX
16112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(UCHAR_MAX, "UCHAR_MAX", Signed, int);
16122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("UCHAR_MAX");
16142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MAX
16162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(SHRT_MAX, "SHRT_MAX", Signed, int);
16172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("SHRT_MAX");
16192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MIN
16212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(SHRT_MIN, "SHRT_MIN", Signed, int);
16222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("SHRT_MIN");
16242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MAX
16262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(INT_MAX, "INT_MAX", Signed, int);
16272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("INT_MAX");
16292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MIN
16312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(INT_MIN, "INT_MIN", Signed, int);
16322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("INT_MIN");
16342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MAX
16362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LONG_MAX, "LONG_MAX", Signed, long);
16372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("LONG_MAX");
16392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MIN
16412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LONG_MIN, "LONG_MIN", Signed, long);
16422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("LONG_MIN");
16442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef USHRT_MAX
16462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(USHRT_MAX, "USHRT_MAX", usign, int);
16472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("USHRT_MAX");
16492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef UINT_MAX
16512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(UINT_MAX, "UINT_MAX", Unsigned, int);
16522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("UINT_MAX");
16542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef ULONG_MAX
16562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(ULONG_MAX, "ULONG_MAX", Unsigned, long);
16572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  missing("ULONG_MAX");
16592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } /* if (L) */
16612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
16622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) {
16632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_RADIX
16642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_RADIX, "FLT_RADIX", Signed, int);
16652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_RADIX");
16672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MANT_DIG
16692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_MANT_DIG, "FLT_MANT_DIG", Signed, int);
16702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MANT_DIG");
16722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_DIG
16742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_DIG, "FLT_DIG", Signed, int);
16752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_DIG");
16772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_ROUNDS
16792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_ROUNDS, "FLT_ROUNDS", Signed, int);
16802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_ROUNDS");
16822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_EPSILON
16842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(FLT_EPSILON, "FLT_EPSILON", float);
16852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_EPSILON");
16872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_EXP
16892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_MIN_EXP, "FLT_MIN_EXP", Signed, int);
16902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MIN_EXP");
16922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN
16942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(FLT_MIN, "FLT_MIN", float);
16952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
16962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MIN");
16972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
16982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_10_EXP
16992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_MIN_10_EXP, "FLT_MIN_10_EXP", Signed, int);
17002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MIN_10_EXP");
17022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_EXP
17042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_MAX_EXP, "FLT_MAX_EXP", Signed, int);
17052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MAX_EXP");
17072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX
17092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(FLT_MAX, "FLT_MAX", float);
17102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MAX");
17122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_10_EXP
17142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(FLT_MAX_10_EXP, "FLT_MAX_10_EXP", Signed, int);
17152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("FLT_MAX_10_EXP");
17172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MANT_DIG
17192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(DBL_MANT_DIG, "DBL_MANT_DIG", Signed, int);
17202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MANT_DIG");
17222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_DIG
17242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(DBL_DIG, "DBL_DIG", Signed, int);
17252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_DIG");
17272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_EPSILON
17292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(DBL_EPSILON, "DBL_EPSILON", double);
17302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_EPSILON");
17322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_EXP
17342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(DBL_MIN_EXP, "DBL_MIN_EXP", Signed, int);
17352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MIN_EXP");
17372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN
17392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(DBL_MIN, "DBL_MIN", double);
17402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MIN");
17422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_10_EXP
17442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(DBL_MIN_10_EXP, "DBL_MIN_10_EXP", Signed, int);
17452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MIN_10_EXP");
17472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_EXP
17492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(DBL_MAX_EXP, "DBL_MAX_EXP", Signed, int);
17502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MAX_EXP");
17522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX
17542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(DBL_MAX, "DBL_MAX", double);
17552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MAX");
17572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_10_EXP
17592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(DBL_MAX_10_EXP, "DBL_MAX_10_EXP", Signed, int);
17602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("DBL_MAX_10_EXP");
17622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC
17642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MANT_DIG
17652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LDBL_MANT_DIG, "LDBL_MANT_DIG", Signed, int);
17662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MANT_DIG");
17682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_DIG
17702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LDBL_DIG, "LDBL_DIG", Signed, int);
17712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_DIG");
17732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_EPSILON
17752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(LDBL_EPSILON, "LDBL_EPSILON", long double);
17762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_EPSILON");
17782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_EXP
17802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LDBL_MIN_EXP, "LDBL_MIN_EXP", Signed, int);
17812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MIN_EXP");
17832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN
17852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(LDBL_MIN, "LDBL_MIN", long double);
17862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MIN");
17882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_10_EXP
17902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LDBL_MIN_10_EXP, "LDBL_MIN_10_EXP", Signed, int);
17912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MIN_10_EXP");
17932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_EXP
17952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LDBL_MAX_EXP, "LDBL_MAX_EXP", Signed, int);
17962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
17972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MAX_EXP");
17982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
17992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX
18002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fchecktype(LDBL_MAX, "LDBL_MAX", long double);
18012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
18022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MAX");
18032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_10_EXP
18052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  checktype(LDBL_MAX_10_EXP, "LDBL_MAX_10_EXP", Signed, int);
18062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
18072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fmissing("LDBL_MAX_10_EXP");
18082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* STDC */
18102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } /* if (F) */
18112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */
18122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
18132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
18152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MAX
18162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MAX char_max
18172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MIN
18192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MIN char_min
18202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef UCHAR_MAX
18222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UCHAR_MAX char_max
18232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */
18252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef CHAR_BIT
18272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CHAR_BIT  char_bit
18282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef CHAR_MAX
18302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CHAR_MAX  char_max
18312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef CHAR_MIN
18332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CHAR_MIN  char_min
18342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MAX
18362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MAX char_max
18372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MIN
18392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MIN char_min
18402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef UCHAR_MAX
18422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UCHAR_MAX char_max
18432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
18442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint cprop( void )
18462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
18472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Properties of type char */
18482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile char c, char_max, char_min;
18492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int byte_size, c_signed;
18502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  long char_bit;
18512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(2);
18532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Calculate number of bits per character *************************/
18552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  c=1; byte_size=0;
18562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  do { c=c<<1; byte_size++; } while(c!=0);
18572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  c= (char)(-1);
18582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (((int)c)<0) c_signed=1;
18592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  else c_signed=0;
18602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%schar = %d bits, %ssigned%s\n",
18612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, (int)sizeof(c)*byte_size, (c_signed?"":"un"), oc);
18622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char_bit=(long)(sizeof(c)*byte_size);
18632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) i_define(D_CHAR_BIT, "", "CHAR", "_BIT",
18642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      char_bit, 0L, (long) CHAR_BIT, "");
18652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  c=0; char_max=0;
18672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  c++;
18682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields char_max */
18692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while (c>char_max) {
18702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      char_max=c;
18712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c=(char)(c*2+1);
18722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
18732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
18742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sCharacter overflow generates a trap!%s\n", co, oc);
18752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
18762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  c=0; char_min=0;
18772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  c--;
18782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (c<char_min) /* then the min char < 0 */ {
18792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     /* Minimum value: assume either two's or one's complement *********/
18802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    char_min= -char_max;
18812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab)==0) { /* Yields char_min */
18822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        if (char_min-1 < char_min) char_min--;
18832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
18842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
18852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(8);
18862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (c_signed && char_min == 0) {
18872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sBEWARE! Chars are pseudo-unsigned:%s\n", co, oc);
18882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s   %s%s%s\n",
18892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "They contain only nonnegative values, ",
18902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "but sign extend when used as integers.", co, oc);
18912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
18922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(3);
18932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
18942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) {
18952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* Because of the integer promotions, you must use a U after
18962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       the MAX_CHARS in the following cases */
18972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if ((sizeof(char) == sizeof(int)) && !c_signed) {
18982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      u_define(D_CHAR_MAX, "", "CHAR", "_MAX",
18992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (ulong) char_max,
19002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (ulong) CHAR_MAX, "");
19012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
19022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_CHAR_MAX, "", "CHAR", "_MAX",
19032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) char_max, 0L,
19042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) CHAR_MAX, "");
19052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
19062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    i_define(D_CHAR_MIN, "", "CHAR", "_MIN",
19072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       (long) char_min, (long) maxint,
19082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       (long) CHAR_MIN, "");
19092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (c_signed) {
19102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX",
19112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) char_max, 0L,
19122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) SCHAR_MAX, "");
19132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN",
19142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) char_min, (long) maxint,
19152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) SCHAR_MIN, "");
19162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
19172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (sizeof(char) == sizeof(int)) {
19182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
19192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (ulong) char_max,
19202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (ulong) UCHAR_MAX, "");
19212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      } else {
19222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
19232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (long) char_max, 0L,
19242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (long) UCHAR_MAX, "");
19252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
19262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
19272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
19282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (c_signed) {
19292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UC
19302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Syntax error? Define NO_UC */ Volatile unsigned char c1, char_max;
19312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c1=0; char_max=0;
19322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c1++;
19332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (setjmp(lab)==0) { /* Yields char_max */
19342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        while (c1>char_max) {
19352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          char_max=c1;
19362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          c1++;
19372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
19382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
19392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Unexpected(4);
19402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (sizeof(char) == sizeof(int)) {
19412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
19422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (ulong) char_max,
19432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (ulong) UCHAR_MAX, "");
19442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      } else {
19452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX",
19462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (long) char_max, 0L,
19472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           (long) UCHAR_MAX, "");
19482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
19492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
19502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
19512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_SC
19522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Syntax error? Define NO_SC */ Volatile signed char c1, char_max, char_min;
19532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c1=0; char_max=0;
19542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c1++;
19552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (setjmp(lab)==0) { /* Yields char_max */
19562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        while (c1>char_max) {
19572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          char_max=c1;
19582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          c1++;
19592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
19602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
19612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c1=0; char_min=0;
19622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      c1--;
19632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (setjmp(lab)==0) { /* Yields char_min */
19642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        while (c1<char_min) {
19652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          char_min=c1;
19662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          c1--;
19672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
19682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
19692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Unexpected(5);
19702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN",
19712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) char_min, (long) maxint,
19722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) SCHAR_MIN, "");
19732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX",
19742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) char_max, 0L,
19752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) SCHAR_MAX, "");
19762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* NO_SC */
19772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
19782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
19792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return byte_size;
19802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
19812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
19822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint basic( void )
19832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
19842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* The properties of the basic types.
19852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     Returns number of bits per sizeof unit */
19862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int byte_size;
19872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  typedef int function ();
19882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int variable;
19892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *cp; int *ip; function *fp;
19902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int *p, *q;
19912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
19922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sSIZES%s\n", co, oc);
19932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  byte_size= cprop();
19942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
19952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Shorts, ints and longs *****************************************/
19962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sshort=%d int=%d long=%d float=%d double=%d bits %s\n",
19972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co,
19982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    (int) sizeof(short)*byte_size,
19992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    (int) sizeof(int)*byte_size,
20002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    (int) sizeof(long)*byte_size,
20012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    (int) sizeof(float)*byte_size,
20022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    (int) sizeof(double)*byte_size, oc);
20032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (stdc) {
20042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%slong double=%d bits%s\n",
20052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, (int) sizeof(Long_double)*byte_size, oc);
20062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
20072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%schar*=%d bits%s%s\n",
20082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, (int)sizeof(char *)*byte_size,
20092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    sizeof(char *)>sizeof(int)?" BEWARE! larger than int!":"",
20102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
20112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sint* =%d bits%s%s\n",
20122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, (int)sizeof(int *)*byte_size,
20132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    sizeof(int *)>sizeof(int)?" BEWARE! larger than int!":"",
20142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
20152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sfunc*=%d bits%s%s\n",
20162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, (int)sizeof(function *)*byte_size,
20172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    sizeof(function *)>sizeof(int)?" BEWARE! larger than int!":"",
20182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
20192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  showtype("Type size_t is", sizeof(0));
20212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC
20222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  showtype("Type wchar_t is", L'x');
20232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
20242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Alignment constants ********************************************/
20262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define alignment(TYPE) \
20282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ((long)((char *)&((struct{char c; TYPE d;}*)0)->d - (char *)0))
20292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n%sALIGNMENTS%s\n", co, oc);
20312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%schar=%ld short=%ld int=%ld long=%ld%s\n",
20332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co,
20342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    alignment(char), alignment(short),
20352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    alignment(int), alignment(long),
20362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
20372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sfloat=%ld double=%ld%s\n",
20392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co,
20402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    alignment(float), alignment(double),
20412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
20422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (stdc) {
20442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%slong double=%ld%s\n",
20452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co,
20462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      alignment(Long_double),
20472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      oc);
20482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
20492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%schar*=%ld int*=%ld func*=%ld%s\n",
20502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co,
20512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    alignment(char *), alignment(int *), alignment(function *),
20522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    oc);
20532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n");
20552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Ten little endians *********************************************/
20572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  endian(byte_size);
20592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Pointers *******************************************************/
20612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n%sPROPERTIES OF POINTERS%s\n", co, oc);
20632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  cp= (char *) &variable;
20642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ip= (int *) &variable;
20652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  fp= (function *) &variable;
20662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sChar and int pointer formats ", co);
20682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (memeq((char *) &cp, sizeof(cp), (char *) &ip, sizeof(ip))) {
20692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("seem identical%s\n", oc);
20702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
20712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("are different%s\n", oc);
20722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
20732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sChar and function pointer formats ", co);
20742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (memeq((char *) &cp, sizeof(cp), (char *) &fp, sizeof(fp))) {
20752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("seem identical%s\n", oc);
20762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
20772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("are different%s\n", oc);
20782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
20792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (V) {
20812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if ((VOID *)"abcd" == (VOID *)"abcd")
20822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("%sStrings are shared%s\n", co, oc);
20832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else printf("%sStrings are not shared%s\n", co, oc);
20842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
20852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  p=0; q=0;
20872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  showtype("Type ptrdiff_t is", p-q);
20882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //if (setjmp(mlab) == 0) {
20902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //  variable= *p;
20912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //  Vprintf("%sBEWARE! Dereferencing NULL doesn't cause a trap%s\n",
20922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //    co, oc);
20932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //} else {
20942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //  Vprintf("%sDereferencing NULL causes a trap%s\n", co, oc);
20952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  //}
20962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(mlab)!=0) croak(-2);
20972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
20982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("\n%sPROPERTIES OF INTEGRAL TYPES%s\n", co, oc);
20992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  sprop();
21012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  iprop();
21022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  lprop();
21032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  usprop();
21042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  uiprop();
21052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ulprop();
21062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  promotions();
21082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(6);
21102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return byte_size;
21122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
21132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* not PASS0 */
21152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SEP
21172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The global variables used by several passes */
21182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern jmp_buf lab;
21192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern int V, L, F, bugs, bits_per_byte;
21202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern int maxint, flt_radix, flt_rounds;
21212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern Volatile int trapped;
21222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern char co[], oc[];
21232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern char *f_rep();
21242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern Void trap1();
21252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* SEP */
21262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* ifdef PASS0 */
21272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* As I said, I apologise for the contortions below. The functions are
21292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   expanded by the preprocessor twice or three times (for float and double,
21302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   and maybe for long double, and for short, int and long). That way,
21312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   I never make a change to one that I forget to make to the other.
21322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   You can look on it as C's fault for not supporting multi-line macros.
21332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   This whole file is read 3 times by the preprocessor, with PASSn set for
21342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   n=1, 2 or 3, to decide which parts to reprocess.
21352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
21362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* #undef on an already undefined thing is (wrongly) flagged as an error
21382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   by some compilers, therefore the #ifdef that follows:
21392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
21402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Number
21412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Number
21422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef THING
21432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Thing
21442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef thing
21452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef FPROP
21462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Fname
21472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Store
21482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Sum
21492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Diff
21502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Mul
21512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Div
21522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef ZERO
21532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef HALF
21542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef ONE
21552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef TWO
21562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef THREE
21572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef FOUR
21582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Self
21592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_check
21602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Verify
21612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef EPROP
21622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef MARK
21632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* These are the float.h constants */
21652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_RADIX
21662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MANT_DIG
21672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_DIG
21682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_ROUNDS
21692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_EPSILON
21702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MIN_EXP
21712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MIN
21722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MIN_10_EXP
21732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MAX_EXP
21742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MAX
21752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MAX_10_EXP
21762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
21772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Integer
21792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Integer
21802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef INT
21812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef IPROP
21822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Iname
21832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef UPROP
21842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Uname
21852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef OK_UI
21862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef IMARK
21872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef I_MAX
21892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef I_MIN
21902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef U_MAX
21912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
21922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS1
21942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Define the things we're going to use this pass */
21962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
21972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Number  float
21982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THING "FLOAT"
21992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Thing "Float"
22002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define thing "float"
22012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Fname "FLT"
22022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FPROP fprop
22032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Store fStore
22042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Sum fSum
22052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Diff  fDiff
22062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Mul fMul
22072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Div fDiv
22082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ZERO  0.0
22092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define HALF  0.5
22102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ONE 1.0
22112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TWO 2.0
22122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THREE 3.0
22132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOUR  4.0
22142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Self  fSelf
22152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_check fCheck
22162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define MARK  "F"
22172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
22182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify fVerify
22192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EPROP efprop
22222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Integer short
22242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define INT "short"
22252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IPROP sprop
22262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Iname "SHRT"
22272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI
22282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define OK_UI 1
22292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IMARK ""
22312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UPROP usprop
22332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Uname "USHRT"
22342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
22362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MAX
22372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX   SHRT_MAX
22382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MIN
22402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN   SHRT_MIN
22412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef USHRT_MAX
22432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX   USHRT_MAX
22442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_RADIX
22472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_RADIX   FLT_RADIX
22482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MANT_DIG
22502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG  FLT_MANT_DIG
22512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_DIG
22532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG   FLT_DIG
22542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_ROUNDS
22562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_ROUNDS  FLT_ROUNDS
22572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_EPSILON
22592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON FLT_EPSILON
22602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_EXP
22622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP FLT_MIN_EXP
22632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN
22652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN   FLT_MIN
22662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_10_EXP
22682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP  FLT_MIN_10_EXP
22692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_EXP
22712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP FLT_MAX_EXP
22722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX
22742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX   FLT_MAX
22752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_10_EXP
22772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP  FLT_MAX_10_EXP
22782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
22792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */
22802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS1 */
22822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS2
22842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
22852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Number  double
22862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THING "DOUBLE"
22872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Thing "Double"
22882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define thing "double"
22892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Fname "DBL"
22902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FPROP dprop
22912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Store dStore
22922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Sum dSum
22932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Diff  dDiff
22942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Mul dMul
22952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Div dDiv
22962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ZERO  0.0
22972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define HALF  0.5
22982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ONE 1.0
22992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TWO 2.0
23002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THREE 3.0
23012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOUR  4.0
23022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Self  dSelf
23032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_check dCheck
23042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define MARK  ""
23052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
23062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify dVerify
23072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EPROP edprop
23102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Integer int
23122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define INT "int"
23132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IPROP iprop
23142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Iname "INT"
23152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define OK_UI 1 /* Unsigned int is always possible */
23162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IMARK ""
23172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UPROP uiprop
23192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Uname "UINT"
23202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
23222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MAX
23232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX   INT_MAX
23242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MIN
23262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN   INT_MIN
23272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef UINT_MAX
23292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX   UINT_MAX
23302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MANT_DIG
23332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG  DBL_MANT_DIG
23342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_DIG
23362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG   DBL_DIG
23372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_EPSILON
23392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON DBL_EPSILON
23402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_EXP
23422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP DBL_MIN_EXP
23432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN
23452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN   DBL_MIN
23462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_10_EXP
23482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP  DBL_MIN_10_EXP
23492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_EXP
23512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP DBL_MAX_EXP
23522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX
23542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX   DBL_MAX
23552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_10_EXP
23572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP  DBL_MAX_10_EXP
23582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */
23602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS2 */
23622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS3
23642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC
23662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Number  long double
23672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ZERO  0.0L
23692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define HALF  0.5L
23702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ONE 1.0L
23712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TWO 2.0L
23722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THREE 3.0L
23732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOUR  4.0L
23742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THING "LONG DOUBLE"
23772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Thing "Long double"
23782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define thing "long double"
23792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Fname "LDBL"
23802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FPROP ldprop
23812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Store ldStore
23822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Sum ldSum
23832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Diff  ldDiff
23842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Mul ldMul
23852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Div ldDiv
23862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Self  ldSelf
23872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_check ldCheck
23882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define MARK  "L"
23892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
23902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify ldVerify
23912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
23922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EPROP eldprop
23942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
23952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Integer long
23962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define INT "long"
23972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IPROP lprop
23982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Iname "LONG"
23992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI
24002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define OK_UI 1
24012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IMARK "L"
24032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UPROP ulprop
24052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Uname "ULONG"
24062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
24082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MAX
24092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX LONG_MAX
24102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MIN
24122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN LONG_MIN
24132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef ULONG_MAX
24152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX ULONG_MAX
24162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MANT_DIG
24192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG  LDBL_MANT_DIG
24202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_DIG
24222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG   LDBL_DIG
24232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_EPSILON
24252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON LDBL_EPSILON
24262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_EXP
24282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP LDBL_MIN_EXP
24292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN
24312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN   LDBL_MIN
24322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_10_EXP
24342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP  LDBL_MIN_10_EXP
24352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_EXP
24372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP LDBL_MAX_EXP
24382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX
24402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX   LDBL_MAX
24412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_10_EXP
24432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP  LDBL_MAX_10_EXP
24442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */
24462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS3 */
24482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The rest of the file gets read all three times;
24502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   the differences are encoded in the things #defined above.
24512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
24522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef I_MAX
24542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX int_max
24552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef I_MIN
24572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN int_min
24582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef U_MAX
24602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX u_max
24612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_RADIX
24642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_RADIX   f_radix
24652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MANT_DIG
24672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG  f_mant_dig
24682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_DIG
24702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG   f_dig
24712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_ROUNDS
24732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_ROUNDS  f_rounds
24742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_EPSILON
24762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON f_epsilon
24772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MIN_EXP
24792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP f_min_exp
24802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MIN
24822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN   f_min
24832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MIN_10_EXP
24852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP  f_min_10_exp
24862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MAX_EXP
24882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP f_max_exp
24892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MAX
24912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX   f_max
24922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MAX_10_EXP
24942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP  f_max_10_exp
24952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
24962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
24972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef VERIFY
24982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify(prec, val, req, same, same1) {;}
24992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
25002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Integer
25022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid IPROP( void )
25042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
25052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* the properties of short, int, and long */
25062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile Integer newi, int_max, maxeri, int_min, minneri;
25072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int ibits, ipower, two=2;
25082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Calculate max short/int/long ***********************************/
25102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Calculate 2**n-1 until overflow - then use the previous value  */
25112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  newi=1; int_max=0;
25132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields int_max */
25152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    for(ipower=0; newi>int_max; ipower++) {
25162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      int_max=newi;
25172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      newi=newi*two+1;
25182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
25192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sOverflow of a%s %s does not generate a trap%s\n",
25202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, INT[0]=='i'?"n":"", INT, oc);
25212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
25222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sOverflow of a%s %s generates a trap%s\n",
25232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, INT[0]=='i'?"n":"", INT, oc);
25242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(7);
25262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Minimum value: assume either two's or one's complement *********/
25282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int_min= -int_max;
25292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields int_min */
25302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (int_min-1 < int_min) int_min--;
25312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(8);
25332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Now for those daft Cybers */
25352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  maxeri=0; newi=int_max;
25372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields maxeri */
25392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    for(ibits=ipower; newi>maxeri; ibits++) {
25402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      maxeri=newi;
25412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      newi=newi+newi+1;
25422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
25432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(9);
25452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  minneri= -maxeri;
25472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields minneri */
25482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (minneri-1 < minneri) minneri--;
25492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(10);
25512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sMaximum %s = %ld (= 2**%d-1)%s\n",
25532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, INT, (long)int_max, ipower, oc);
25542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sMinimum %s = %ld%s\n", co, INT, (long)int_min, oc);
25552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) i_define(D_INT_MAX, INT, Iname, "_MAX",
25572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) int_max, 0L,
25582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) I_MAX, IMARK);
25592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) i_define(D_INT_MIN, INT, Iname, "_MIN",
25602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) int_min, (long) (PASS==1?maxint:int_max),
25612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) I_MIN, IMARK);
25622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if(int_max < 0) { /* It has happened (on a Cray) */
25642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("signed integral comparison faulty?");
25652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (maxeri>int_max) {
25682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sThere is a larger %s, %ld (= 2**%d-1), %s %s%s\n",
25692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, INT, (long)maxeri, ibits,
25702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "but only for addition, not multiplication",
25712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "(I smell a Cyber!)",
25722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      oc);
25732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (minneri<int_min) {
25762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sThere is a smaller %s, %ld, %s %s%s\n",
25772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, INT, (long)minneri,
25782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "but only for addition, not multiplication",
25792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "(I smell a Cyber!)",
25802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      oc);
25812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
25832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid UPROP ( void )
25852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
25862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* The properties of unsigned short/int/long */
25872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef OK_UI
25882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile unsigned Integer u_max, newi, two;
25892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  newi=1; u_max=0; two=2;
25902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
25912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* Yields u_max */
25922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while(newi>u_max) {
25932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      u_max=newi;
25942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      newi=newi*two+1;
25952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
25962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
25972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(11);
25982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sMaximum unsigned %s = %lu%s\n",
25992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, INT, (unsigned long) u_max, oc);
26002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Oh woe: new standard C defines value preserving promotions:
26022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     3.2.1.1: "If an int can represent all values of the original type,
26032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           the value is converted to an int;
26042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         otherwise it is converted to an unsigned int."
26052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
26062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (L) {
26072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (PASS == 1 /* we're dealing with short */
26082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        && u_max <= maxint /* an int can represent all values */
26092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        )
26102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    { /* the value is converted to an int */
26112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_UINT_MAX, INT, Uname, "_MAX",
26122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) u_max, 0L,
26132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) U_MAX, IMARK);
26142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else { /* it is converted to an unsigned int */
26152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      u_define(D_UINT_MAX, INT, Uname, "_MAX",
26162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (unsigned long) u_max,
26172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (unsigned long) U_MAX, IMARK);
26182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
26192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
26202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
26212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
26222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* Integer */
26242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Number
26262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The following routines are intended to defeat any attempt at optimisation
26282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   or use of extended precision, and to defeat faulty narrowing casts.
26292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm   The weird prototypes are because of widening incompatibilities.
26302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/
26312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(STDC) || defined(_MSC_VER)
26322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS1(A, a) (A a)
26332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS2(A, a, B, b) (A a, B b)
26342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS5(A, a, B, b, C, c, D, d, E, e) (A a, B b, C c, D d, E e)
26352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
26362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS1(A, a) (a) A a;
26372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS2(A, a, B, b) (a, b) A a; B b;
26382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS5(A, a, B, b, C, c, D, d, E, e) (a,b,c,d,e)A a; B b; C c; D d; E e;
26392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
26402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid Store ARGS2(Number, a, Number *, b) { *b=a; }
26422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Sum ARGS2(Number, a, Number, b) {Number r; Store(a+b, &r); return r; }
26432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Diff ARGS2(Number, a, Number, b){Number r; Store(a-b, &r); return r; }
26442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Mul ARGS2(Number, a, Number, b) {Number r; Store(a*b, &r); return r; }
26452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Div ARGS2(Number, a, Number, b) {Number r; Store(a/b, &r); return r; }
26462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Self ARGS1(Number, a)         {Number r; Store(a,   &r); return r; }
26472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid F_check ARGS((int precision, Long_double val1));
26492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid F_check(int precision, Long_double val1)
26512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
26522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* You don't think I'm going to go to all the trouble of writing
26532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     a program that works out what all sorts of values are, only to
26542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     have printf go and print the wrong values out, do you?
26552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     No, you're right, so this function tries to see if printf
26562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     has written the right value, by reading it back again.
26572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     This introduces a new problem of course: suppose printf writes
26582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     the correct value, and scanf reads it back wrong... oh well.
26592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     But I'm adamant about this: the precision given is enough
26602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     to uniquely identify the printed number, therefore I insist
26612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     that sscanf read the number back identically. Harsh yes, but
26622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     sometimes you've got to be cruel to be kind.
26632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
26642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Long_double new1, rem;
26652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Number val, new, diff;
26662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  int e;
26672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  char *rep, *f2;
26682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (sizeof(double) == sizeof(Long_double)) {
26702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* Assume they're the same, and use non-stdc format */
26712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* This is for stdc compilers using non-stdc libraries */
26722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f2= "%le";   /* Input */
26732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
26742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* It had better support Le then */
26752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f2= "%Le";
26762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
26772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  val= (Number) val1;
26782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  rep= f_rep(precision, (Long_double) val);
26792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) {
26802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    sscanf(rep, f2, &new1);
26812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
26822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("sscanf caused a trap");
26832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s    scanning: %s format: %s%s\n\n", co, rep, f2, oc);
26842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Unexpected(12);
26852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return;
26862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
26872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
26882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* See if new is usable */
26892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    new= new1;
26902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (new != 0.0) {
26912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      diff= val/new - 1.0;
26922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (diff < 0.1) diff= 1.0;
26932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      /* That should be enough to generate a trap */
26942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
26952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
26962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("sscanf returned an unusable number");
26972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s    scanning: %s with format: %s%s\n\n",
26982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           co, rep, f2, oc);
26992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Unexpected(13);
27002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return;
27012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
27022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(14);
27042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (new != val) {
27052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("Possibly bad output from printf above");
27062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (!exponent((Long_double)val, &rem, &e)) {
27072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("%s    but value was an unusable number%s\n\n",
27082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             co, oc);
27092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      return;
27102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
27112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s    expected value around ", co);
27122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    //if (sizeof(double) == sizeof(Long_double)) {
27132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      /* Assume they're the same, and use non-stdc format */
27142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      /* This is for stdc compilers using non-stdc libraries */
27152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      //printf("%.*fe%d, bit pattern:\n    ", precision, rem, e);
27162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    //} else {
27172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      /* It had better support Lfe then */
27182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("%.*Lfe%d, bit pattern:\n    ", precision, rem, e);
27192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    //}
27202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bitpattern((char *) &val, (unsigned)sizeof(val));
27212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf ("%s\n", oc);
27222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s    sscanf gave           %s, bit pattern:\n    ",
27232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           co, f_rep(precision, (Long_double) new));
27242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bitpattern((char *) &new, (unsigned)sizeof(new));
27252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf ("%s\n", oc);
27262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) {
27272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      diff= val-new;
27282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("%s    difference= %s%s\n\n",
27292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             co, f_rep(precision, (Long_double) diff), oc);
27302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } /* else forget it */
27312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Unexpected(15);
27322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
27332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
27342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY
27362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid Verify ARGS5(int, prec, Number, val, Number, req, int, same, int, same1)
27372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
27382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Check that the compiler has read a #define value correctly */
27392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(16);
27402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (!same) {
27412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s*** Verify failed for above #define!\n", co);
27422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) { /* for the case that req == nan */
27432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("       Compiler has %s for value\n",
27442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             f_rep(prec, req));
27452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
27462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("       Compiler has %s for value\n",
27472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             "an unusable number");
27482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
27492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) {
27502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      F_check(prec, (Long_double) req);
27512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } /*else forget it*/
27522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) {
27532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (req > 0.0 && val > 0.0) {
27542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        printf("       difference= %s\n",
27552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm               f_rep(prec, val-req));
27562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
27572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } /*else forget it*/
27582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Unexpected(17);
27592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s\n", oc);
27602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
27612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (!same1) {
27622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (stdc) eek_a_bug("constant has the wrong precision");
27632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else eek_a_bug("the cast didn't work");
27642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
27652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
27662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
27672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */
27682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint FPROP(int byte_size)
27702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
27712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Properties of floating types, using algorithms by Cody and Waite
27722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     from MA Malcolm, as modified by WM Gentleman and SB Marovich.
27732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     Further extended by S Pemberton.
27742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     Returns the number of digits in the fraction.
27762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
27772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int
27792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    i, f_radix, iexp, irnd, mrnd, f_rounds, f_mant_dig,
27802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    iz, k, inf, machep, f_max_exp, f_min_exp, mx, negeps,
27812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    mantbits, digs, f_dig, trap,
27822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    hidden, normal, f_min_10_exp, f_max_10_exp;
27832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile Number
27842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    a, b, base, basein, basem1, f_epsilon, epsneg,
27852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eps, epsp1, etop, ebot,
27862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f_max, newxmax, f_min, xminner, y, y1, z, z1, z2;
27872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(18);
27892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sPROPERTIES OF %s%s\n", co, THING, oc);
27912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
27922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Base and size of significand **************************************/
27932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* First repeatedly double until adding 1 has no effect.    */
27942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* For instance, if base is 10, with 3 significant digits   */
27952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* it will try 1, 2, 4, 8, ... 512, 1024, and stop there,   */
27962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* since 1024 is only representable as 1020.        */
27972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  a=1.0;
27982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* inexact trap? */
27992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    do { a=Sum(a, a); }
28002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while (Diff(Diff(Sum(a, ONE), a), ONE) == ZERO);
28012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
28022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    fprintf(stderr, "*** Program got loss-of-precision trap!\n");
28032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    /* And supporting those is just TOO much trouble! */
28042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    farewell(bugs+1);
28052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
28062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(19);
28072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Now double until you find a number that can be added to the    */
28082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* above number. For 1020 this is 8 or 16, depending whether the  */
28092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* result is rounded or truncated.          */
28102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* In either case the result is 1030. 1030-1020= the base, 10.    */
28112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  b=1.0;
28122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  do { b=Sum(b, b); } while ((base=Diff(Sum(a, b), a)) == ZERO);
28132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_radix=base;
28142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sBase = %d%s\n", co, f_radix, oc);
28152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Sanity check; if base<2, I can't guarantee the rest will work  */
28172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f_radix < 2) {
28182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("Function return or parameter passing faulty? (This is a guess.)");
28192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
28202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    return(0);
28212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
28222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (PASS == 1) { /* only for FLT */
28242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    flt_radix= f_radix;
28252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (F) i_define(D_FLT_RADIX, "", "FLT", "_RADIX",
28262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        (long) f_radix, 0L, (long) F_RADIX, "");
28272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (f_radix != flt_radix) {
28282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n%s*** WARNING: %s %s (%d) %s%s\n",
28292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           co, thing, "arithmetic has a different radix",
28302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           f_radix, "from float", oc);
28312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
28322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
28332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Now the number of digits precision */
28352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_mant_dig=0; b=1.0;
28362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  do { f_mant_dig++; b=Mul(b, base); }
28372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (Diff(Diff(Sum(b, ONE), b), ONE) == ZERO);
28382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_dig=floor_log(10, (Long_double)(b/base)) + (base==10?1:0);
28392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sSignificant base digits = %d %s %d %s%s\n",
28402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, f_mant_dig, "(= at least", f_dig, "decimal digits)", oc);
28412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) i_define(D_MANT_DIG, thing, Fname, "_MANT_DIG",
28422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) f_mant_dig, 0L, (long) F_MANT_DIG, "");
28432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) i_define(D_DIG, thing, Fname, "_DIG",
28442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) f_dig, 0L, (long) F_DIG, "");
28452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  digs= ceil_log(10, (Long_double)b); /* the number of digits to printf */
28462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Rounding *******************************************************/
28482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  basem1=Diff(base, HALF);
28492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (Diff(Sum(a, basem1), a) != ZERO) {
28502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (f_radix == 2) basem1=0.375;
28512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else basem1=1.0;
28522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (Diff(Sum(a, basem1), a) != ZERO) irnd=2; /* away from 0 */
28532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else irnd=1; /* to nearest */
28542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else irnd=0; /* towards 0 */
28552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  basem1=Diff(base, HALF);
28572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (Diff(Diff(-a, basem1), -a) != ZERO) {
28592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (f_radix == 2) basem1=0.375;
28602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else basem1=1.0;
28612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (Diff(Diff(-a, basem1), -a) != ZERO) mrnd=2; /* away from 0*/
28622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else mrnd=1; /* to nearest */
28632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else mrnd=0; /* towards 0 */
28642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_rounds= -1; /* Unknown rounding */
28662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (irnd==0 && mrnd==0) f_rounds=0; /* zero = chops */
28672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (irnd==1 && mrnd==1) f_rounds=1; /* nearest */
28682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (irnd==2 && mrnd==0) f_rounds=2; /* +inf */
28692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (irnd==0 && mrnd==2) f_rounds=3; /* -inf */
28702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
28712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f_rounds != -1) {
28722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sArithmetic rounds towards ", co);
28732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    switch (f_rounds) {
28742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case 0: Vprintf("zero (i.e. it chops)"); break;
28752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case 1: Vprintf("nearest"); break;
28762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case 2: Vprintf("+infinity"); break;
28772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          case 3: Vprintf("-infinity"); break;
28782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          default: Vprintf("???"); break;
28792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
28802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s\n", oc);
28812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else { /* Hmm, try to give some help here */
28822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sArithmetic rounds oddly: %s\n", co, oc);
28832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s    Negative numbers %s%s\n",
28842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, mrnd==0 ? "towards zero" :
28852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          mrnd==1 ? "to nearest" :
28862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm              "away from zero",
28872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      oc);
28882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s    Positive numbers %s%s\n",
28892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, irnd==0 ? "towards zero" :
28902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          irnd==1 ? "to nearest" :
28912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm              "away from zero",
28922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      oc);
28932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
28942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* An extra goody */
28952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f_radix == 2 && f_rounds == 1) {
28962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (Diff(Sum(a, ONE), a) != ZERO) {
28972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%s   Tie breaking rounds up%s\n", co, oc);
28982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else if (Diff(Sum(a, THREE), a) == FOUR) {
28992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%s   Tie breaking rounds to even%s\n", co, oc);
29002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
29012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%s   Tie breaking rounds down%s\n", co, oc);
29022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
29032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (PASS == 1) { /* only for FLT */
29052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    flt_rounds= f_rounds;
29062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (F)
29072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i_define(D_FLT_ROUNDS, "", "FLT", "_ROUNDS",
29082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm         (long) f_rounds, 1L, (long) F_ROUNDS, "");
29092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (f_rounds != flt_rounds) {
29102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n%s*** WARNING: %s %s (%d) %s%s\n\n",
29112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           co, thing, "arithmetic rounds differently",
29122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           f_rounds, "from float", oc);
29132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
29142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Various flavours of epsilon ************************************/
29172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  negeps=f_mant_dig+f_mant_dig;
29182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  basein=1.0/base;
29192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  a=1.0;
29202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for(i=1; i<=negeps; i++) a*=basein;
29212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  b=a;
29232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (Diff(Diff(ONE, a), ONE) == ZERO) {
29242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    a*=base;
29252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    negeps--;
29262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  negeps= -negeps;
29282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sSmallest x such that 1.0-base**x != 1.0 = %d%s\n",
29292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, negeps, oc);
29302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  etop = ONE;
29322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ebot = ZERO;
29332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
29342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* find the smallest epsneg (1-epsneg != 1) by binary search.
29352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     ebot and etop are the current bounds */
29362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (eps != ebot && eps != etop) {
29372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    epsp1 = Diff(ONE, eps);
29382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (epsp1 < ONE) etop = eps;
29392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else ebot = eps;
29402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
29412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  eps= etop;
29432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Sanity check */
29442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (Diff(ONE, etop) >= ONE || Diff(ONE, ebot) != ONE) {
29452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("internal error calculating epsneg");
29462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sSmallest x such that 1.0-x != 1.0 = %s%s\n",
29482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, f_rep(digs, (Long_double) eps), oc);
29492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (V) F_check(digs, (Long_double) eps);
29502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  epsneg=a;
29522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if ((f_radix!=2) && irnd) {
29532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*  a=(a*(1.0+a))/(1.0+1.0); => */
29542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    a=Div(Mul(a, Sum(ONE, a)), Sum(ONE, ONE));
29552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /*  if ((1.0-a)-1.0 != 0.0) epsneg=a; => */
29562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (Diff(Diff(ONE, a), ONE) != ZERO) epsneg=a;
29572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* epsneg is used later */
29592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(20);
29602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  machep= -f_mant_dig-f_mant_dig;
29622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  a=b;
29632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (Diff(Sum(ONE, a), ONE) == ZERO) { a*=base; machep++; }
29642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sSmallest x such that 1.0+base**x != 1.0 = %d%s\n",
29652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, machep, oc);
29662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  etop = ONE;
29682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  ebot = ZERO;
29692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
29702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* find the smallest eps (1+eps != 1) by binary search.
29712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     ebot and etop are the current bounds */
29722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (eps != ebot && eps != etop) {
29732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    epsp1 = Sum(ONE, eps);
29742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (epsp1 > ONE) etop = eps;
29752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    else ebot = eps;
29762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eps = Sum(ebot, Div(Diff(etop, ebot), TWO));
29772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Sanity check */
29792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (Sum(ONE, etop) <= ONE || Sum(ONE, ebot) != ONE) {
29802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("internal error calculating eps");
29812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
29822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_epsilon=etop;
29832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sSmallest x such that 1.0+x != 1.0 = %s%s\n",
29852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, f_rep(digs, (Long_double) f_epsilon), oc);
29862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_epsilon= Diff(Sum(ONE, f_epsilon), ONE); /* New C standard defn */
29882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%s(Above number + 1.0) - 1.0 = %s%s\n",
29892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    co, f_rep(digs, (Long_double) (f_epsilon)), oc);
29902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
29912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Possible loss of precision warnings here from non-stdc compilers */
29922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) f_define(D_EPSILON, thing,
29932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Fname, "_EPSILON", digs, (Long_double) f_epsilon, MARK);
29942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (V || F) F_check(digs, (Long_double) f_epsilon);
29952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(21);
29962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) Verify(digs, f_epsilon, F_EPSILON,
29972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          f_epsilon == Self(F_EPSILON),
29982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          (Long_double) f_epsilon == (Long_double) F_EPSILON);
29992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(22);
30002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Extra chop info *************************************************/
30022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f_rounds == 0) {
30032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (Diff(Mul(Sum(ONE,f_epsilon),ONE),ONE) !=  ZERO) {
30042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sAlthough arithmetic chops, it uses guard digits%s\n", co, oc);
30052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
30062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Size of and minimum normalised exponent ************************/
30092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  y=0; i=0; k=1; z=basein; z1=(1.0+f_epsilon)/base;
30102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Coarse search for the largest power of two */
30122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* for underflow trap */ /* Yields i, k, y, y1 */
30132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    do {
30142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      y=z; y1=z1;
30152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      z=Mul(y,y); z1=Mul(z1, y);
30162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      a=Mul(z,ONE);
30172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      z2=Div(z1,y);
30182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (z2 != y1) break;
30192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if ((Sum(a,a) == ZERO) || (fabs(z) >= y)) break;
30202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      i++;
30212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      k+=k;
30222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } while(1);
30232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
30242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s%s underflow generates a trap%s\n", co, Thing, oc);
30252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(23);
30272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f_radix != 10) {
30292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    iexp=i+1; /* for the sign */
30302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    mx=k+k;
30312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
30322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    iexp=2;
30332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    iz=f_radix;
30342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while (k >= iz) { iz*=f_radix; iexp++; }
30352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    mx=iz+iz-1;
30362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Fine tune starting with y and y1 */
30392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* for underflow trap */ /* Yields k, f_min */
30402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    do {
30412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      f_min=y; z1=y1;
30422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      y=Div(y,base); y1=Div(y1,base);
30432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      a=Mul(y,ONE);
30442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      z2=Mul(y1,base);
30452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (z2 != z1) break;
30462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if ((Sum(a,a) == ZERO) || (fabs(y) >= f_min)) break;
30472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      k++;
30482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } while (1);
30492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(24);
30512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_min_exp=(-k)+1;
30532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if ((mx <= k+k-3) && (f_radix != 10)) { mx+=mx; iexp+=1; }
30552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sNumber of bits used for exponent = %d%s\n", co, iexp, oc);
30562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sMinimum normalised exponent = %d%s\n", co, f_min_exp-1, oc);
30572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F)
30582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    i_define(D_MIN_EXP, thing, Fname, "_MIN_EXP",
30592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm       (long) f_min_exp, (long) maxint, (long) F_MIN_EXP, "");
30602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) {
30622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sMinimum normalised positive number = %s%s\n",
30632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, f_rep(digs, (Long_double) f_min), oc);
30642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
30652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("printf can't print the smallest normalised number");
30662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
30672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(25);
30692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Possible loss of precision warnings here from non-stdc compilers */
30702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab) == 0) {
30712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (F) f_define(D_MIN, thing,
30722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        Fname, "_MIN", digs, (Long_double) f_min, MARK);
30732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (V || F) F_check(digs, (Long_double) f_min);
30742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
30752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("xxx_MIN caused a trap");
30762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
30772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab) == 0) {
30802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (F) Verify(digs, f_min, F_MIN,
30812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            f_min == Self(F_MIN),
30822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            (Long_double) f_min == (Long_double) F_MIN);
30832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
30842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s*** Verify failed for above #define!\n    %s %s\n\n",
30852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           co, "Compiler has an unusable number for value", oc);
30862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
30872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
30882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(26);
30892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  a=1.0; f_min_10_exp=0;
30912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (a > f_min*10.0) { a/=10.0; f_min_10_exp--; }
30922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) i_define(D_MIN_10_EXP, thing, Fname, "_MIN_10_EXP",
30932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) f_min_10_exp, (long) maxint,
30942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) F_MIN_10_EXP, "");
30952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
30962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Minimum exponent ************************************************/
30972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) { /* for underflow trap */ /* Yields xminner */
30982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    do {
30992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      xminner=y;
31002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      y=Div(y,base);
31012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      a=Mul(y,ONE);
31022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if ((Sum(a,a) == ZERO) || (fabs(y) >= xminner)) break;
31032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } while (1);
31042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(27);
31062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (xminner != 0.0 && xminner != f_min) {
31082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    normal= 0;
31092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sThe smallest numbers are not kept normalised%s\n",
31102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, oc);
31112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab)==0) {
31122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        Vprintf("%sSmallest unnormalised positive number = %s%s\n",
31132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          co, f_rep(digs, (Long_double) xminner), oc);
31142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        if (V) F_check(digs, (Long_double) xminner);
31152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
31162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      eek_a_bug("printf can't print the smallest unnormalised number.");
31172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("\n");
31182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
31192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Unexpected(28);
31202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
31212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    normal= 1;
31222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sThe smallest numbers are normalised%s\n", co, oc);
31232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Maximum exponent ************************************************/
31262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_max_exp=2; f_max=1.0; newxmax=base+1.0;
31272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  inf=0; trap=0;
31282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (f_max<newxmax) {
31292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f_max=newxmax;
31302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) { /* Yields inf, f_max_exp */
31312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      newxmax=Mul(newxmax, base);
31322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
31332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      trap=1;
31342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      break;
31352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
31362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (Div(newxmax, base) != f_max) {
31372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (newxmax > f_max) inf=1; /* ieee infinity */
31382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      break;
31392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
31402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    f_max_exp++;
31412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(29);
31432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Vprintf("%sMaximum exponent = %d%s\n", co, f_max_exp, oc);
31442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) i_define(D_MAX_EXP, thing, Fname, "_MAX_EXP",
31452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) f_max_exp, 0L, (long) F_MAX_EXP, "");
31462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Largest number ***************************************************/
31482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  f_max=Diff(ONE, epsneg);
31492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (Mul(f_max,ONE) != f_max) f_max=Diff(ONE, Mul(base,epsneg));
31502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  for (i=1; i<=f_max_exp; i++) f_max=Mul(f_max, base);
31512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) {
31532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sMaximum number = %s%s\n",
31542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, f_rep(digs, (Long_double) f_max), oc);
31552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
31562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("printf can't print the largest double.");
31572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
31582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) {
31602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Possible loss of precision warnings here from non-stdc compilers */
31612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (F) f_define(D_MAX, thing,
31622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        Fname, "_MAX", digs, (Long_double) f_max, MARK);
31632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (V || F) F_check(digs, (Long_double) f_max);
31642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
31652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eek_a_bug("xxx_MAX caused a trap");
31662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("\n");
31672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab)==0) {
31692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (F) Verify(digs, f_max, F_MAX,
31702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            f_max == Self(F_MAX),
31712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            (Long_double) f_max == (Long_double) F_MAX);
31722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
31732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    printf("%s*** Verify failed for above #define!\n    %s %s\n\n",
31742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm           co, "Compiler has an unusable number for value", oc);
31752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    bugs++;
31762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(30);
31782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  a=1.0; f_max_10_exp=0;
31802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  while (a < f_max/10.0) { a*=10.0; f_max_10_exp++; }
31812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (F) i_define(D_MAX_10_EXP, thing, Fname, "_MAX_10_EXP",
31822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      (long) f_max_10_exp, 0L, (long) F_MAX_10_EXP, "");
31832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Traps and infinities ********************************************/
31852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (trap) {
31862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sOverflow generates a trap%s\n", co, oc);
31872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
31882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sOverflow doesn't seem to generate a trap%s\n",
31892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, oc);
31902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
31912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (inf) { Vprintf("%sThere is an 'infinite' value%s\n", co, oc); }
31932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
31942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGFPE
31952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  signal(SIGFPE, trap1);
31962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
31972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab) == 0) {
31982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    trapped= 0; /* A global variable */
31992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    b= 0.0;
32002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    a= (1.0/b)/b;
32012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (!trapped) {
32022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sDivide by zero doesn't generate a trap%s\n",
32032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co, oc);
32042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
32052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sDivide by zero generates a trap%s\n",
32062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co, oc);
32072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sFP signal handlers return safely%s\n",
32082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co, oc);
32092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
32102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
32112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sDivide by zero generates a trap%s\n", co, oc);
32122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sBEWARE! FP signal handlers can NOT return%s\n",
32132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, oc);
32142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
32152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  setsignals();
32162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(31);
32172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
32182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Hidden bit + sanity check ****************************************/
32192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (f_radix != 10) {
32202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    hidden=0;
32212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    mantbits=floor_log(2, (Long_double)f_radix)*f_mant_dig;
32222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (mantbits+iexp == (int)sizeof(Number)*byte_size) {
32232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      hidden=1;
32242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sArithmetic uses a hidden bit%s\n", co, oc);
32252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else if (mantbits+iexp+1 == (int)sizeof(Number)*byte_size) {
32262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sArithmetic doesn't use a hidden bit%s\n",
32272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co, oc);
32282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else if (mantbits+iexp+1 < (int)sizeof(Number)*byte_size) {
32292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sOnly %d of the %d bits of a %s %s%s\n",
32302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co,
32312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        mantbits+iexp,
32322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        (int)sizeof(Number)*byte_size,
32332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        thing,
32342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        "are actually used",
32352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        oc);
32362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
32372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      printf("\n%s%s\n    %s (%d) %s (%d) %s %s (%d)!%s\n\n",
32382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             co,
32392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             "*** Something fishy here!",
32402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             "Exponent size",
32412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             iexp,
32422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             "+ significand size",
32432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             mantbits,
32442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             "doesn't match with the size of a",
32452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             thing,
32462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             (int)sizeof(Number)*byte_size,
32472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm             oc);
32482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
32492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (hidden && f_radix == 2 && f_max_exp+f_min_exp==3) {
32502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sIt looks like %s length IEEE format%s\n",
32512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co, f_mant_dig==24 ? "single" :
32522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            f_mant_dig==53 ? "double" :
32532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            f_mant_dig >53 ? "extended" :
32542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            "some", oc);
32552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (f_rounds != 1 || normal) {
32562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        Vprintf("%s   though ", co);
32572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        if (f_rounds != 1) {
32582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          Vprintf("the rounding is unusual");
32592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm          if (normal) { Vprintf(" and "); }
32602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
32612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        if (normal) {
32622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm            Vprintf("the normalisation is unusual");
32632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        }
32642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        Vprintf("%s\n", oc);
32652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      }
32662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else {
32672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      Vprintf("%sIt doesn't look like IEEE format%s\n",
32682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm        co, oc);
32692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    }
32702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
32712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  printf("\n"); /* regardless of verbosity */
32722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  return f_mant_dig;
32732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
32742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
32752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid EPROP(int fprec, int dprec, int lprec)
32762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{
32772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* See if expressions are evaluated in extended precision.
32782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     Some compilers optimise even if you don't want it,
32792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     and then this function fails to produce the right result.
32802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     We try to diagnose this if it happens.
32812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  */
32822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int eprec;
32832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile double a, b, base, old;
32842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile Number d, oldd, dbase, one, zero;
32852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Volatile int bad=0;
32862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
32872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  /* Size of significand **************************************/
32882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  a=1.0;
32892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (setjmp(lab) == 0) { /* Yields nothing */
32902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    do { old=a; a=a+a; }
32912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    while ((((a+1.0)-a)-1.0) == 0.0 && a>old);
32922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else bad=1;
32932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (!bad && a <= old) bad=1;
32942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
32952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (!bad) {
32962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    b=1.0;
32972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) { /* Yields nothing */
32982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      do { old=b; b=b+b; }
32992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      while ((base=((a+b)-a)) == 0.0 && b>old);
33002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (b <= old) bad=1;
33012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else bad=1;
33022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
33032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (!bad) {
33052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    eprec=0; d=1.0; dbase=base; one=1.0; zero=0.0;
33062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    if (setjmp(lab) == 0) { /* Yields nothing */
33072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      do { eprec++; oldd=d; d=d*dbase; }
33082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      while ((((d+one)-d)-one) == zero && d>oldd);
33092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      if (d <= oldd) bad=1;
33102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    } else bad=1;
33112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
33122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  Unexpected(32);
33142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  if (bad) {
33162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%sCan't determine precision for %s expressions:\n%s%s\n",
33172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     co, thing, "   check that you compiled without optimisation!",
33182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm     oc);
33192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (eprec==dprec) {
33202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s%s expressions are evaluated in double precision%s\n",
33212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, Thing, oc);
33222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (eprec==fprec) {
33232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s%s expressions are evaluated in float precision%s\n",
33242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, Thing, oc);
33252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else if (eprec==lprec) {
33262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s%s expressions are evaluated in long double precision%s\n",
33272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, Thing, oc);
33282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  } else {
33292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm    Vprintf("%s%s expressions are evaluated in a %s %s %d %s%s\n",
33302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      co, Thing, eprec>dprec ? "higher" : "lower",
33312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      "precision than double,\n   using",
33322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      eprec, "base digits",
33332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm      oc);
33342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm  }
33352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}
33362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* not Number */
33382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FPROP /* Then create dummy routines for long double */
33402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* ARGSUSED */
33412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint FPROP(int byte_size) { return 0; }
33422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
33432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef EPROP
33442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* ARGSUSED */
33452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid EPROP(int fprec, int dprec, int lprec) {}
33462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
33472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* ifdef Number */
33492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Increment the pass number */
33512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS
33522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS2
33542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS2
33552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 3
33562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS3 1
33572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
33582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS1
33602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS1
33612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 2
33622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS2 1
33632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
33642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS0
33662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS0
33672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
33682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm
33692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SEP
33702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS /* then rescan this file */
33712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef BAD_CPP
33722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include "enquire.c"
33732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else
33742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include FILENAME  /* if this line fails to compile, define BAD_CPP */
33752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif
33762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS */
33772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* SEP */
3378