From 3f284b7fb899f6aaa32cb91d86c4f4a6860694a8 Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Sun, 8 Aug 2004 10:55:57 +0000 Subject: [PATCH] c.lib 1.169 (8.8.2004) - Since the 'long double' data type is not really supported by the GCC versions we use (and not supported by SAS/C either) building the library with support code for it is now a configurable option. Unless enabled, 'long double' is now treated like 'double'. - Reworked the HUGE_VAL definition which previously would default to Infinity. The new code properly defines this to the largest representable floating point number. The 'great' thing about the HUGE_VAL definition in this library is that it's a reference to a binary constant initialized by the library startup code. So any application checking for HUGE_VAL merely needs to be relinked rather than recompiled. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14703 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/amiga.lib_rev.h | 10 +++++----- library/amiga.lib_rev.rev | 2 +- library/c.lib_rev.h | 10 +++++----- library/c.lib_rev.rev | 2 +- library/debug.lib_rev.h | 10 +++++----- library/debug.lib_rev.rev | 2 +- library/m.lib_rev.h | 10 +++++----- library/m.lib_rev.rev | 2 +- library/m881.lib_rev.h | 10 +++++----- library/m881.lib_rev.rev | 2 +- library/math_fp_support.h | 42 +++++++++++++++++++++++++++++++++++++-- library/math_init_exit.c | 34 +++++++++++++++++-------------- library/math_isinf.c | 24 +++------------------- library/math_isnan.c | 26 ++++-------------------- library/net.lib_rev.h | 10 +++++----- library/net.lib_rev.rev | 2 +- library/releasenotes | 16 +++++++++++++++ library/stack.lib_rev.h | 10 +++++----- library/stack.lib_rev.rev | 2 +- library/stdio_protos.h | 20 +------------------ library/stdio_vfprintf.c | 14 ++++++------- library/stdio_vfscanf.c | 14 ++++++------- library/unix.lib_rev.h | 10 +++++----- library/unix.lib_rev.rev | 2 +- 24 files changed, 145 insertions(+), 141 deletions(-) diff --git a/library/amiga.lib_rev.h b/library/amiga.lib_rev.h index dd2f925..a7a5c50 100644 --- a/library/amiga.lib_rev.h +++ b/library/amiga.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "amiga.lib 1.168" -#define VSTRING "amiga.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: amiga.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "amiga.lib 1.169" +#define VSTRING "amiga.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: amiga.lib 1.169 (8.8.2004)" diff --git a/library/amiga.lib_rev.rev b/library/amiga.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/amiga.lib_rev.rev +++ b/library/amiga.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/c.lib_rev.h b/library/c.lib_rev.h index 390ef68..7d92154 100644 --- a/library/c.lib_rev.h +++ b/library/c.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "c.lib 1.168" -#define VSTRING "c.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: c.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "c.lib 1.169" +#define VSTRING "c.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: c.lib 1.169 (8.8.2004)" diff --git a/library/c.lib_rev.rev b/library/c.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/c.lib_rev.rev +++ b/library/c.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/debug.lib_rev.h b/library/debug.lib_rev.h index 0a1faba..2826261 100644 --- a/library/debug.lib_rev.h +++ b/library/debug.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "debug.lib 1.168" -#define VSTRING "debug.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: debug.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "debug.lib 1.169" +#define VSTRING "debug.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: debug.lib 1.169 (8.8.2004)" diff --git a/library/debug.lib_rev.rev b/library/debug.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/debug.lib_rev.rev +++ b/library/debug.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/m.lib_rev.h b/library/m.lib_rev.h index d88d452..c93d730 100644 --- a/library/m.lib_rev.h +++ b/library/m.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "m.lib 1.168" -#define VSTRING "m.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: m.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "m.lib 1.169" +#define VSTRING "m.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: m.lib 1.169 (8.8.2004)" diff --git a/library/m.lib_rev.rev b/library/m.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/m.lib_rev.rev +++ b/library/m.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/m881.lib_rev.h b/library/m881.lib_rev.h index 2341fa4..bbfb550 100644 --- a/library/m881.lib_rev.h +++ b/library/m881.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "m881.lib 1.168" -#define VSTRING "m881.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: m881.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "m881.lib 1.169" +#define VSTRING "m881.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: m881.lib 1.169 (8.8.2004)" diff --git a/library/m881.lib_rev.rev b/library/m881.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/m881.lib_rev.rev +++ b/library/m881.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/math_fp_support.h b/library/math_fp_support.h index 0357493..35b5da0 100644 --- a/library/math_fp_support.h +++ b/library/math_fp_support.h @@ -1,5 +1,5 @@ /* - * $Id: math_fp_support.h,v 1.1.1.1 2004-07-26 16:30:44 obarthel Exp $ + * $Id: math_fp_support.h,v 1.2 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -36,9 +36,47 @@ /****************************************************************************/ +/* If any of the three supported floating point support flavours is + enabled, make sure that the generic 'FLOATING_POINT_SUPPORT' symbol + is defined, too.*/ #if (defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT) || defined(PPC_FLOATING_POINT_SUPPORT)) #define FLOATING_POINT_SUPPORT -#endif +#endif /* IEEE_FLOATING_POINT_SUPPORT || M68881_FLOATING_POINT_SUPPORT || PPC_FLOATING_POINT_SUPPORT */ + +/****************************************************************************/ + +/* This selects whether or not the 'long double' type should be used. So far, + only 'double' can be supported, and 'long double' defaults to 'double'. */ +/*#define USE_LONG_DOUBLE*/ + +/****************************************************************************/ + +#if defined(USE_LONG_DOUBLE) + typedef long double __long_double_t; +#else + typedef double __long_double_t; +#endif /* USE_LONG_DOUBLE */ + +/****************************************************************************/ + +/* 'Portable' raw representations of three IEEE floating point formats. */ +union ieee_long_double +{ + long double value; + unsigned long raw[3]; +}; + +union ieee_double +{ + double value; + unsigned long raw[2]; +}; + +union ieee_single +{ + float value; + unsigned long raw[1]; +}; /****************************************************************************/ diff --git a/library/math_init_exit.c b/library/math_init_exit.c index b81facd..3fb5edb 100644 --- a/library/math_init_exit.c +++ b/library/math_init_exit.c @@ -1,5 +1,5 @@ /* - * $Id: math_init_exit.c,v 1.1.1.1 2004-07-26 16:30:46 obarthel Exp $ + * $Id: math_init_exit.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -121,41 +121,45 @@ __math_init(void) #endif /* IEEE_FLOATING_POINT_SUPPORT */ /* Now fill in the HUGE_VAL constant, which is set to - * +Infinity. - */ + the largest representable floating point value. */ if(sizeof(__huge_val) == 4) /* single precision */ { - static const unsigned long infinity[] = + static const unsigned long largest_fp_value[1] = { - 0x7F800000 + /* Exponent = +126, Mantissa = 8,388,607 */ + 0x7f7fffff }; - assert( sizeof(infinity) == sizeof(__huge_val) ); + assert( sizeof(largest_fp_value) == sizeof(__huge_val) ); - memmove((void *)&__huge_val,infinity,sizeof(infinity)); + memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value)); } else if (sizeof(__huge_val) == 8) /* double precision */ { - static const unsigned long infinity[] = + static const unsigned long largest_fp_value[2] = { - 0x7FF00000,0x00000000 + /* Exponent = +1022, Mantissa = 4,503,599,627,370,495 */ + 0x7fefffff,0xffffffff }; - assert( sizeof(infinity) == sizeof(__huge_val) ); + assert( sizeof(largest_fp_value) == sizeof(__huge_val) ); - memmove((void *)&__huge_val,infinity,sizeof(infinity)); + memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value)); } +#if defined(USE_LONG_DOUBLE) else if (sizeof(__huge_val) == 12) /* extended precision */ { - static const unsigned long infinity[] = + static const unsigned long largest_fp_value[3] = { - 0x7FFF0000,0x00000000,0x00000000 + /* Exponent = +32766, Mantissa = 18,446,744,073,709,551,615 */ + 0x7ffe0000,0xffffffff,0xffffffff }; - assert( sizeof(infinity) == sizeof(__huge_val) ); + assert( sizeof(largest_fp_value) == sizeof(__huge_val) ); - memmove((void *)&__huge_val,infinity,sizeof(infinity)); + memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value)); } +#endif /* USE_LONG_DOUBLE */ result = OK; diff --git a/library/math_isinf.c b/library/math_isinf.c index 95ee965..0062909 100755 --- a/library/math_isinf.c +++ b/library/math_isinf.c @@ -1,5 +1,5 @@ /* - * $Id: math_isinf.c,v 1.1 2004-08-07 09:15:32 obarthel Exp $ + * $Id: math_isinf.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -45,26 +45,6 @@ /****************************************************************************/ -union ieee_long_double -{ - long double value; - unsigned long raw[3]; -}; - -union ieee_double -{ - double value; - unsigned long raw[2]; -}; - -union ieee_single -{ - float value; - unsigned long raw[1]; -}; - -/****************************************************************************/ - int isinf(double number) { @@ -93,6 +73,7 @@ isinf(double number) /* Exponent = 2047 and fraction = 0.0 */ is_infinity = (((x.raw[0] & 0x7FFFFFFF) == 0x7FF00000) && (x.raw[1] == 0)); } +#if defined(USE_LONG_DOUBLE) else if (sizeof(number) == 12) /* extended precision */ { union ieee_long_double x; @@ -102,6 +83,7 @@ isinf(double number) /* Exponent = 32767 and fraction = 0.0 */ is_infinity = (((x.raw[0] & 0x7FFF0000) == 0x7FFF0000) && (x.raw[1] & 0x7FFFFFFF) == 0 && (x.raw[2] == 0)); } +#endif /* USE_LONG_DOUBLE */ else { /* Can't happen */ diff --git a/library/math_isnan.c b/library/math_isnan.c index 9b6a7b1..26f66e4 100755 --- a/library/math_isnan.c +++ b/library/math_isnan.c @@ -1,5 +1,5 @@ /* - * $Id: math_isnan.c,v 1.1 2004-08-07 09:15:32 obarthel Exp $ + * $Id: math_isnan.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -45,26 +45,6 @@ /****************************************************************************/ -union ieee_long_double -{ - long double value; - unsigned long raw[3]; -}; - -union ieee_double -{ - double value; - unsigned long raw[2]; -}; - -union ieee_single -{ - float value; - unsigned long raw[1]; -}; - -/****************************************************************************/ - int isnan(double number) { @@ -92,15 +72,17 @@ isnan(double number) /* Exponent = 2047 and fraction != 0.0 */ result = (((x.raw[0] & 0x7FF00000) == 0x7FF00000) && ((x.raw[0] & 0x000FFFFF) != 0 || (x.raw[1] != 0))); } +#if defined(USE_LONG_DOUBLE) else if (sizeof(number) == 12) /* extended precision */ { union ieee_long_double x; x.value = number; - /* Exponent = 32767 and fraction != 0.0 */ + /* Exponent = 32766 and fraction != 0.0 */ result = (((x.raw[0] & 0x7FFF0000) == 0x7FFF0000) && ((x.raw[1] & 0x7FFFFFFF) != 0 || x.raw[2] != 0)); } +#endif /* USE_LONG_DOUBLE */ else { /* Can't happen */ diff --git a/library/net.lib_rev.h b/library/net.lib_rev.h index 99bb2aa..5483ba8 100644 --- a/library/net.lib_rev.h +++ b/library/net.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "net.lib 1.168" -#define VSTRING "net.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: net.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "net.lib 1.169" +#define VSTRING "net.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: net.lib 1.169 (8.8.2004)" diff --git a/library/net.lib_rev.rev b/library/net.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/net.lib_rev.rev +++ b/library/net.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/releasenotes b/library/releasenotes index f5dfd2d..106a370 100644 --- a/library/releasenotes +++ b/library/releasenotes @@ -1,3 +1,19 @@ +c.lib 1.169 (8.8.2004) + +- Since the 'long double' data type is not really supported by the GCC + versions we use (and not supported by SAS/C either) building the + library with support code for it is now a configurable option. Unless + enabled, 'long double' is now treated like 'double'. + +- Reworked the HUGE_VAL definition which previously would default to + Infinity. The new code properly defines this to the largest + representable floating point number. The 'great' thing about the + HUGE_VAL definition in this library is that it's a reference to + a binary constant initialized by the library startup code. So any + application checking for HUGE_VAL merely needs to be relinked + rather than recompiled. + + c.lib 1.168 (7.8.2004) - Ditched __is_infinity() and __is_not_a_number(), brought them back diff --git a/library/stack.lib_rev.h b/library/stack.lib_rev.h index d2b9e69..9296f7a 100644 --- a/library/stack.lib_rev.h +++ b/library/stack.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "stack.lib 1.168" -#define VSTRING "stack.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: stack.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "stack.lib 1.169" +#define VSTRING "stack.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: stack.lib 1.169 (8.8.2004)" diff --git a/library/stack.lib_rev.rev b/library/stack.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/stack.lib_rev.rev +++ b/library/stack.lib_rev.rev @@ -1 +1 @@ -168 +169 diff --git a/library/stdio_protos.h b/library/stdio_protos.h index 3639c5b..798ce92 100644 --- a/library/stdio_protos.h +++ b/library/stdio_protos.h @@ -1,5 +1,5 @@ /* - * $Id: stdio_protos.h,v 1.1.1.1 2004-07-26 16:31:39 obarthel Exp $ + * $Id: stdio_protos.h,v 1.2 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -200,22 +200,4 @@ extern void __duplicate_fd(struct fd * duplicate_fd,struct fd * original_fd); /****************************************************************************/ -#if defined(FLOATING_POINT_SUPPORT) - -/****************************************************************************/ - -/* stdio_isnotanumber.c */ -extern int __is_not_a_number(long double number); - -/****************************************************************************/ - -/* stdio_isinfinity.c */ -extern int __is_infinity(long double number); - -/****************************************************************************/ - -#endif /* FLOATING_POINT_SUPPORT */ - -/****************************************************************************/ - #endif /* _STDIO_PROTOS_H */ diff --git a/library/stdio_vfprintf.c b/library/stdio_vfprintf.c index 1394f6d..553d849 100644 --- a/library/stdio_vfprintf.c +++ b/library/stdio_vfprintf.c @@ -1,5 +1,5 @@ /* - * $Id: stdio_vfprintf.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $ + * $Id: stdio_vfprintf.c,v 1.3 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -72,7 +72,7 @@ /****************************************************************************/ static int -get_num_leading_digits(long double v) +get_num_leading_digits(__long_double_t v) { int num_digits; @@ -634,14 +634,14 @@ vfprintf(FILE * stream,const char * format, va_list arg) const char * buffer_stop = &buffer[sizeof(buffer)-1]; char * buffer_start = buffer; - long double v; + __long_double_t v; output_buffer = buffer_start; D(("sizeof(long double) == %ld",sizeof(v))); if(parameter_size == parameter_size_long_double) - v = va_arg(arg, long double); + v = va_arg(arg, __long_double_t); else v = va_arg(arg, double); @@ -676,7 +676,7 @@ vfprintf(FILE * stream,const char * format, va_list arg) else { BOOL strip_trailing_zeroes = FALSE; - long double roundoff_fudge = 0.0; + __long_double_t roundoff_fudge = 0.0; int max_digits = -1; int exponent = 0; int digit; @@ -713,7 +713,7 @@ vfprintf(FILE * stream,const char * format, va_list arg) /* Figure out whether 'e' or 'f' format should be used. */ if(conversion_type == 'g' || conversion_type == 'e') { - long double local_v = v; + __long_double_t local_v = v; int local_exponent = 0; /* Put one single digit in front of the decimal point. */ @@ -978,7 +978,7 @@ vfprintf(FILE * stream,const char * format, va_list arg) /* Remove the parameter from the argument vector and don't produce any output. */ if(parameter_size == parameter_size_long_double) - (void)va_arg(arg, long double); + (void)va_arg(arg, __long_double_t); else (void)va_arg(arg, double); diff --git a/library/stdio_vfscanf.c b/library/stdio_vfscanf.c index 69914c8..3f49bfc 100644 --- a/library/stdio_vfscanf.c +++ b/library/stdio_vfscanf.c @@ -1,5 +1,5 @@ /* - * $Id: stdio_vfscanf.c,v 1.1.1.1 2004-07-26 16:31:48 obarthel Exp $ + * $Id: stdio_vfscanf.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $ * * :ts=4 * @@ -456,8 +456,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg) { #if defined(FLOATING_POINT_SUPPORT) { - long double sum = 0.0; - long double new_sum; + __long_double_t sum = 0.0; + __long_double_t new_sum; BOOL is_negative = FALSE; BOOL decimal_point_matches = FALSE; BOOL have_exponent = FALSE; @@ -495,7 +495,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg) { SHOWMSG("extended format (long double)"); - next_parameter = va_arg(arg,long double *); + next_parameter = va_arg(arg,__long_double_t *); } assert( next_parameter != NULL ); @@ -520,7 +520,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg) } else { - *((long double *)next_parameter) = 0; + *((__long_double_t *)next_parameter) = 0; } } @@ -869,7 +869,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg) } else { - *((long double *)next_parameter) = sum; + *((__long_double_t *)next_parameter) = sum; } num_assignments++; @@ -912,7 +912,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg) { SHOWMSG("extended format (long double)"); - next_parameter = va_arg(arg,long double *); + next_parameter = va_arg(arg,__long_double_t *); } assert( next_parameter != NULL ); diff --git a/library/unix.lib_rev.h b/library/unix.lib_rev.h index 2b94734..6861cbc 100644 --- a/library/unix.lib_rev.h +++ b/library/unix.lib_rev.h @@ -1,6 +1,6 @@ #define VERSION 1 -#define REVISION 168 -#define DATE "7.8.2004" -#define VERS "unix.lib 1.168" -#define VSTRING "unix.lib 1.168 (7.8.2004)\r\n" -#define VERSTAG "\0$VER: unix.lib 1.168 (7.8.2004)" +#define REVISION 169 +#define DATE "8.8.2004" +#define VERS "unix.lib 1.169" +#define VSTRING "unix.lib 1.169 (8.8.2004)\r\n" +#define VERSTAG "\0$VER: unix.lib 1.169 (8.8.2004)" diff --git a/library/unix.lib_rev.rev b/library/unix.lib_rev.rev index de8febe..fb402ef 100644 --- a/library/unix.lib_rev.rev +++ b/library/unix.lib_rev.rev @@ -1 +1 @@ -168 +169