From 539cc3553da5b986778959e01e0d0d856a800c2d Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Thu, 12 May 2005 13:21:47 +0000 Subject: [PATCH] - Added isunordered(), isgreater(), isgreaterequal(), isless(), islessequal() and islessgreater() to for C99. - The wchar_t type is now an 'unsigned short' integer (16 bits wide). - Added PTRDIFF_MIN/PTRDIFF_MAX, WCHAR_MIN/WCHAR_MAX and WINT_MIN/WINT_MAX to for C99. - Added imaxdiv() and imaxabs() for C99. - Added strtoimax() and strtoumax() for C99. - Added nextafter() and nextafterf() for C99. - Added copysign() and copysignf() for C99. - Unless I missed something, clib2 should now be functionally complete with regard to C99, except for the floating point operations covered. These are a major challenge all by themselves, and I wonder both whether they are worth the effort and how one could implement them correctly. - fflush() now consistently supports a NULL parameter, causing all streams to be flushed for which this behaviour is defined. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14943 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/GNUmakefile.68k | 11 +- library/GNUmakefile.os4 | 11 +- library/changes | 25 ++++ library/include/complex.h | 26 ++--- library/include/inttypes.h | 72 ++++++++---- library/include/limits.h | 13 ++- library/include/math.h | 81 +++++++++++-- library/include/signal.h | 15 ++- library/include/stdbool.h | 6 +- library/include/stddef.h | 4 +- library/include/stdint.h | 42 ++++--- library/include/stdlib.h | 10 +- library/include/sys/clib2_stdc.h | 63 ++++++++++ library/include/wchar.h | 16 ++- library/include/wctype.h | 3 +- library/inttypes_headers.h | 49 ++++++++ library/inttypes_imaxabs.c | 51 ++++++++ library/inttypes_imaxdiv.c | 51 ++++++++ library/inttypes_strtoimax.c | 192 +++++++++++++++++++++++++++++++ library/inttypes_strtoumax.c | 189 ++++++++++++++++++++++++++++++ library/inttypes_wcstoimax.c | 51 ++++++++ library/inttypes_wcstoumax.c | 51 ++++++++ library/math_copysign.c | 67 +++++++++++ library/math_copysignf.c | 67 +++++++++++ library/math_headers.h | 6 +- library/math_isunordered.c | 117 +++++++++++++++++++ library/math_nextafter.c | 105 +++++++++++++++++ library/math_nextafterf.c | 102 ++++++++++++++++ library/smakefile | 11 +- library/stdio_fflush.c | 89 +++++--------- library/wchar_wcstoll.c | 45 ++++++++ library/wchar_wcstoull.c | 45 ++++++++ library/wctype_iswblank.c | 45 ++++++++ 33 files changed, 1586 insertions(+), 145 deletions(-) create mode 100644 library/include/sys/clib2_stdc.h create mode 100644 library/inttypes_headers.h create mode 100644 library/inttypes_imaxabs.c create mode 100644 library/inttypes_imaxdiv.c create mode 100644 library/inttypes_strtoimax.c create mode 100644 library/inttypes_strtoumax.c create mode 100644 library/inttypes_wcstoimax.c create mode 100644 library/inttypes_wcstoumax.c create mode 100644 library/math_copysign.c create mode 100644 library/math_copysignf.c create mode 100644 library/math_isunordered.c create mode 100644 library/math_nextafter.c create mode 100644 library/math_nextafterf.c create mode 100644 library/wchar_wcstoll.c create mode 100644 library/wchar_wcstoull.c create mode 100644 library/wctype_iswblank.c diff --git a/library/GNUmakefile.68k b/library/GNUmakefile.68k index b5bb3cb..30e25bf 100644 --- a/library/GNUmakefile.68k +++ b/library/GNUmakefile.68k @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.68k,v 1.53 2005-05-11 20:15:24 obarthel Exp $ +# $Id: GNUmakefile.68k,v 1.54 2005-05-12 13:21:41 obarthel Exp $ # # :ts=8 # @@ -156,6 +156,10 @@ C_LIB = \ fcntl_write.o \ ftw_ftw.o \ ftw_nftw.o \ + inttypes_imaxdiv.o \ + inttypes_imaxabs.o \ + inttypes_strtoimax.o \ + inttypes_strtoumax.o \ libgen_basename.o \ libgen_dirname.o \ locale_init_exit.o \ @@ -522,6 +526,8 @@ MATH_LIB = \ math_ceil.o \ math_cos.o \ math_cosh.o \ + math_copysign.o \ + math_copysignf.o \ math_exp.o \ math_fabs.o \ math_fabsf.o \ @@ -529,6 +535,7 @@ MATH_LIB = \ math_fmod.o \ math_fpclassify.o \ math_isfinite.o \ + math_isunordered.o \ math_signbit.o \ math_frexp.o \ math_huge_val.o \ @@ -542,6 +549,8 @@ MATH_LIB = \ math_modf.o \ math_nan.o \ math_nanf.o \ + math_nextafter.o \ + math_nextafterf.o \ math_pow.o \ math_rint.o \ math_rintf.o \ diff --git a/library/GNUmakefile.os4 b/library/GNUmakefile.os4 index c68b4aa..c7554e3 100644 --- a/library/GNUmakefile.os4 +++ b/library/GNUmakefile.os4 @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.os4,v 1.56 2005-05-11 20:15:25 obarthel Exp $ +# $Id: GNUmakefile.os4,v 1.57 2005-05-12 13:21:43 obarthel Exp $ # # :ts=8 # @@ -154,6 +154,10 @@ C_LIB = \ fcntl_write.o \ ftw_ftw.o \ ftw_nftw.o \ + inttypes_imaxdiv.o \ + inttypes_imaxabs.o \ + inttypes_strtoimax.o \ + inttypes_strtoumax.o \ libgen_basename.o \ libgen_dirname.o \ locale_init_exit.o \ @@ -522,6 +526,8 @@ MATH_LIB = \ math_ceil.o \ math_cos.o \ math_cosh.o \ + math_copysign.o \ + math_copysignf.o \ math_exp.o \ math_fabs.o \ math_fabsf.o \ @@ -529,6 +535,7 @@ MATH_LIB = \ math_fmod.o \ math_fpclassify.o \ math_isfinite.o \ + math_isunordered.o \ math_signbit.o \ math_frexp.o \ math_huge_val.o \ @@ -542,6 +549,8 @@ MATH_LIB = \ math_modf.o \ math_nan.o \ math_nanf.o \ + math_nextafter.o \ + math_nextafterf.o \ math_pow.o \ math_rint.o \ math_rintf.o \ diff --git a/library/changes b/library/changes index 34b74d3..cc95ef9 100644 --- a/library/changes +++ b/library/changes @@ -62,6 +62,31 @@ - Added isblank(). +- Added isunordered(), isgreater(), isgreaterequal(), isless(), + islessequal() and islessgreater() to for C99. + +- The wchar_t type is now an 'unsigned short' integer (16 bits wide). + +- Added PTRDIFF_MIN/PTRDIFF_MAX, WCHAR_MIN/WCHAR_MAX and + WINT_MIN/WINT_MAX to for C99. + +- Added imaxdiv() and imaxabs() for C99. + +- Added strtoimax() and strtoumax() for C99. + +- Added nextafter() and nextafterf() for C99. + +- Added copysign() and copysignf() for C99. + +- Unless I missed something, clib2 should now be functionally complete + with regard to C99, except for the floating point operations covered. + These are a major challenge all by themselves, and I wonder both + whether they are worth the effort and how one could implement them + correctly. + +- fflush() now consistently supports a NULL parameter, causing all + streams to be flushed for which this behaviour is defined. + c.lib 1.191 (9.4.2005) diff --git a/library/include/complex.h b/library/include/complex.h index f623319..a430cea 100644 --- a/library/include/complex.h +++ b/library/include/complex.h @@ -1,5 +1,5 @@ /* - * $Id: complex.h,v 1.2 2005-04-04 11:56:26 obarthel Exp $ + * $Id: complex.h,v 1.3 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -41,24 +41,24 @@ /****************************************************************************/ -#if defined(__cplusplus) && defined(__GNUC__) -#warning C99 header used in C++. -#endif /* __GNUC__ */ - -/****************************************************************************/ - -#if (__GNUC__ + 0) < 3 && (__STDC_VERSION__ + 0) < 199901L -#error Complex numbers are not supported by/for this compiler. -#endif /* __GNUC__ && __STDC_VERSION__ */ - -/****************************************************************************/ - #ifndef __GNUC__ #error Unsupported compiler. #endif /* __GNUC__ */ /****************************************************************************/ +#if defined(__cplusplus) +#warning C99 header file used in C++. +#endif /* __cplusplus */ + +/****************************************************************************/ + +#if !defined(__STDC_VERSION__) || (__GNUC__ < 3 && __STDC_VERSION__ < 199901L) +#error Complex numbers are not supported by/for this compiler. +#endif /* __GNUC__ && __STDC_VERSION__ */ + +/****************************************************************************/ + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ diff --git a/library/include/inttypes.h b/library/include/inttypes.h index 5b835bd..81c1cc4 100644 --- a/library/include/inttypes.h +++ b/library/include/inttypes.h @@ -1,5 +1,5 @@ /* - * $Id: inttypes.h,v 1.1 2005-02-04 15:03:13 obarthel Exp $ + * $Id: inttypes.h,v 1.2 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -50,6 +50,12 @@ /****************************************************************************/ +#ifndef _STDDEF_H +#include +#endif /* _STDDEF_H */ + +/****************************************************************************/ + /* printf() format specifications for different types. */ /* "Decimal" */ @@ -162,7 +168,7 @@ /* intmax_t is 32 bits for SAS/C, 64-bits for GCC or if using a conforming C99 compiler. */ -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define PRIdMAX "lld" #define PRIiMAX "lli" #define PRIuMAX "llu" @@ -176,22 +182,22 @@ #define PRIxMAX "lx" #define PRIXMAX "lX" #define PRIoMAX "lo" -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ /* scanf() format specifiers. */ /* "Decimal" */ -/* #define SCNd8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNd8 "hhd" #define SCNd16 "hd" #define SCNd32 "d" #define SCNd64 "lld" -/* #define SCNdLEAST8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNdLEAST8 "hhd" #define SCNdLEAST16 "hd" #define SCNdLEAST32 "d" #define SCNdLEAST64 "lld" -/* #define SCNdFAST8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNdFAST8 "hhd" #define SCNdFAST16 "d" #define SCNdFAST32 "d" #define SCNdFAST64 "lld" @@ -199,17 +205,17 @@ #define SCNdPTR "d" /* "Integer" */ -/* #define SCNi8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNi8 "hhi" #define SCNi16 "hi" #define SCNi32 "i" #define SCNi64 "lli" -/* #define SCNiLEAST8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNiLEAST8 "hhi" #define SCNiLEAST16 "hi" #define SCNiLEAST32 "i" #define SCNiLEAST64 "lli" -/* #define SCNiFAST8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNiFAST8 "hhi" #define SCNiFAST16 "i" #define SCNiFAST32 "i" #define SCNiFAST64 "lli" @@ -217,17 +223,17 @@ #define SCNiPTR "i" /* "Unsigned" */ -/* #define SCNu8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNu8 "hhu" #define SCNu16 "hu" #define SCNu32 "u" #define SCNu64 "llu" -/* #define SCNuLEAST8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNuLEAST8 "hhu" #define SCNuLEAST16 "hu" #define SCNuLEAST32 "u" #define SCNuLEAST64 "llu" -/* #define SCNuFAST8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNuFAST8 "hhu" #define SCNuFAST16 "u" #define SCNuFAST32 "u" #define SCNuFAST64 "llu" @@ -235,17 +241,17 @@ #define SCNuPTR "u" /* "Hexadecimal" */ -/* #define SCNx8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNx8 "hhx" #define SCNx16 "hx" #define SCNx32 "x" #define SCNx64 "llx" -/* #define SCNxLEAST8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNxLEAST8 "hhx" #define SCNxLEAST16 "hx" #define SCNxLEAST32 "x" #define SCNxLEAST64 "llx" -/* #define SCNxFAST8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNxFAST8 "hhx" #define SCNxFAST16 "x" #define SCNxFAST32 "x" #define SCNxFAST64 "llx" @@ -253,24 +259,24 @@ #define SCNxPTR "x" /* "Octal" */ -/* #define SCNo8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNo8 "hho" #define SCNo16 "ho" #define SCNo32 "o" #define SCNo64 "llo" -/* #define SCNoLEAST8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNoLEAST8 "hho" #define SCNoLEAST16 "ho" #define SCNoLEAST32 "o" #define SCNoLEAST64 "llo" -/* #define SCNoFAST8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */ +#define SCNoFAST8 "hho" #define SCNoFAST16 "o" #define SCNoFAST32 "o" #define SCNoFAST64 "llo" #define SCNoPTR "o" -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define SCNdMAX "lld" #define SCNiMAX "lli" #define SCNuMAX "llu" @@ -282,14 +288,30 @@ #define SCNuMAX "lu" #define SCNxMAX "lx" #define SCNoMAX "lo" -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ -/* TODO: Add the rest of inttypes.h here + in the library. */ +/****************************************************************************/ -/* - * Missing stuff is among other things atoll(), strtoll(), ... - * Then there is the matter of wchar support - Zzzz. - */ +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) +typedef struct { long long quot; long long rem; } imaxdiv_t; +#else +typedef struct { long quot; long rem; } imaxdiv_t; +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ + +/****************************************************************************/ + +extern intmax_t imaxabs(intmax_t x); +extern imaxdiv_t imaxdiv(intmax_t n,intmax_t d); + +/****************************************************************************/ + +extern intmax_t strtoimax(const char *str, char **ptr, int base); +extern uintmax_t strtoumax(const char *str, char **ptr, int base); + +/****************************************************************************/ + +extern intmax_t wcstoimax(const wchar_t *str, char **ptr, int base); +extern uintmax_t wcstoumax(const wchar_t *str, char **ptr, int base); /****************************************************************************/ diff --git a/library/include/limits.h b/library/include/limits.h index c69cde0..3c88491 100644 --- a/library/include/limits.h +++ b/library/include/limits.h @@ -1,5 +1,5 @@ /* - * $Id: limits.h,v 1.6 2005-04-03 10:22:48 obarthel Exp $ + * $Id: limits.h,v 1.7 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -83,7 +83,8 @@ /****************************************************************************/ -/* The following is not part of the ISO 'C' (1994) standard. */ +/* The following is not part of the ISO 'C' (1994) standard, but it should + be part of ISO/IEC 9899:1999, also known as "C99". */ /****************************************************************************/ @@ -93,6 +94,14 @@ /****************************************************************************/ +#define MB_LEN_MAX 1 + +/****************************************************************************/ + +/* The following is not part of the ISO 'C' (1994) standard. */ + +/****************************************************************************/ + #define SSIZE_MAX 2147483647L /****************************************************************************/ diff --git a/library/include/math.h b/library/include/math.h index 178c76b..2542e8d 100644 --- a/library/include/math.h +++ b/library/include/math.h @@ -1,5 +1,5 @@ /* - * $Id: math.h,v 1.8 2005-05-08 08:51:30 obarthel Exp $ + * $Id: math.h,v 1.9 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -113,6 +113,14 @@ extern double hypot(double x,double y); /****************************************************************************/ +/* Note that the comparison operations performed on the floating point + data types ought to include float, double and long double. However, + because the current (2005-06-12) compiler technology available on the + Amiga does not support the long double type yet, this library is restricted + to operations on float and double. */ + +/****************************************************************************/ + extern float __huge_val_float; /****************************************************************************/ @@ -137,23 +145,72 @@ extern int __isfinite_double(double x); extern int __signbit_float(float x); extern int __signbit_double(double x); +/****************************************************************************/ + #define fpclassify(x) \ - ((sizeof(x) == sizeof(float)) ? __fpclassify_float(x) : __fpclassify_double(x)) + (sizeof(x) == sizeof(float) ? \ + __fpclassify_float(x) : \ + __fpclassify_double(x)) #define isfinite(x) \ - ((sizeof(x) == sizeof(float)) ? __isfinite_single(x) : __isfinite_double(x)) + (sizeof(x) == sizeof(float) ? \ + __isfinite_float(x) : \ + __isfinite_double(x)) #define isinf(x) \ - (((sizeof(x) == sizeof(float)) ? __fpclassify_float(x) : __fpclassify_double(x)) == FP_INFINITE) + ((sizeof(x) == sizeof(float) ? \ + __fpclassify_float(x) : \ + __fpclassify_double(x)) \ + == FP_INFINITE) #define isnan(x) \ - (((sizeof(x) == sizeof(float)) ? __fpclassify_float(x) : __fpclassify_double(x)) == FP_NAN) + ((sizeof(x) == sizeof(float) ? \ + __fpclassify_float(x) : \ + __fpclassify_double(x)) \ + == FP_NAN) #define isnormal(x) \ - (((sizeof(x) == sizeof(float)) ? __fpclassify_float(x) : __fpclassify_double(x)) == FP_NORMAL) + ((sizeof(x) == sizeof(float) ? \ + __fpclassify_float(x) : \ + __fpclassify_double(x)) \ + == FP_NORMAL) #define signbit(x) \ - ((sizeof(x) == sizeof(float)) ? __signbit_single(x) : __signbit_double(x)) + (sizeof(x) == sizeof(float) ? \ + __signbit_float(x) : \ + __signbit_double(x)) + +/****************************************************************************/ + +extern int __isunordered_float(float x,float y); +extern int __isunordered_float_double(float x,double y); +extern int __isunordered_double(double x,double y); + +/****************************************************************************/ + +#define isunordered(x,y) \ + (sizeof(x) == sizeof(float) ? \ + (sizeof(y) == sizeof(float) ? \ + __isunordered_float((x),y) : \ + __isunordered_float_double((x),(y))) : \ + (sizeof(y) == sizeof(float) ? \ + __isunordered_float_double((y),(x)) : \ + __isunordered_double((x),(y)))) + +#define isgreater(x,y) \ + (isunordered(x,y) ? 0 : (x) > (y)) + +#define isgreaterequal(x,y) \ + (isunordered(x,y) ? 0 : (x) >= (y)) + +#define isless(x,y) \ + (isunordered(x,y) ? 0 : (x) < (y)) + +#define islessequal(x,y) \ + (isunordered(x,y) ? 0 : (x) <= (y)) + +#define islessgreater(x,y) \ + (isunordered(x,y) ? 0 : (x) < (y) || (x) > (y)) /* ZZZ don't evaulate twice! */ /****************************************************************************/ @@ -166,6 +223,16 @@ extern double nan(const char *tagp); /****************************************************************************/ +extern float nextafterf(float x,float y); +extern double nextafter(double x,double y); + +/****************************************************************************/ + +extern double copysign(double x, double y); +extern float copysignf(float x, float y); + +/****************************************************************************/ + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/library/include/signal.h b/library/include/signal.h index 05669b7..a9e3813 100644 --- a/library/include/signal.h +++ b/library/include/signal.h @@ -1,5 +1,5 @@ /* - * $Id: signal.h,v 1.4 2005-01-02 09:07:21 obarthel Exp $ + * $Id: signal.h,v 1.5 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -62,6 +62,15 @@ extern int raise(int sig); /****************************************************************************/ +/* The following is not part of the ISO 'C' (1994) standard, but it should + be part of ISO/IEC 9899:1999, also known as "C99". */ + +/****************************************************************************/ + +typedef int sig_atomic_t; + +/****************************************************************************/ + /* The following is not part of the ISO 'C' (1994) standard. */ /****************************************************************************/ @@ -76,10 +85,6 @@ typedef void (*sig_t)(int); /****************************************************************************/ -typedef int sig_atomic_t; - -/****************************************************************************/ - typedef int sigset_t; /****************************************************************************/ diff --git a/library/include/stdbool.h b/library/include/stdbool.h index cc17bad..796bb05 100644 --- a/library/include/stdbool.h +++ b/library/include/stdbool.h @@ -1,5 +1,5 @@ /* - * $Id: stdbool.h,v 1.1 2005-04-03 10:22:48 obarthel Exp $ + * $Id: stdbool.h,v 1.2 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -47,9 +47,9 @@ /****************************************************************************/ -#if (__STDC_VERSION__ + 0) < 199901L +#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) #warning C99 header file used by non-C99 compliant compiler. -#endif /* __STDC_VERSION__ */ +#endif /* !__STDC_VERSION__ || __STDC_VERSION__ < 199901L */ /****************************************************************************/ diff --git a/library/include/stddef.h b/library/include/stddef.h index 21cff43..48c8ba6 100644 --- a/library/include/stddef.h +++ b/library/include/stddef.h @@ -1,5 +1,5 @@ /* - * $Id: stddef.h,v 1.3 2005-01-08 10:21:28 obarthel Exp $ + * $Id: stddef.h,v 1.4 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -54,7 +54,7 @@ extern "C" { typedef int ptrdiff_t; typedef unsigned int size_t; -typedef unsigned int wchar_t; +typedef unsigned short wchar_t; /****************************************************************************/ diff --git a/library/include/stdint.h b/library/include/stdint.h index 0e565bc..51e5c3b 100644 --- a/library/include/stdint.h +++ b/library/include/stdint.h @@ -1,5 +1,5 @@ /* - * $Id: stdint.h,v 1.1 2005-02-04 15:03:14 obarthel Exp $ + * $Id: stdint.h,v 1.2 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -77,8 +77,7 @@ typedef unsigned int uint_fast32_t; typedef signed long intptr_t; typedef unsigned long uintptr_t; - -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) typedef signed long long int64_t; typedef unsigned long long uint64_t; typedef signed long long int_least64_t; @@ -87,10 +86,10 @@ typedef signed long long int_fast64_t; typedef unsigned long long uint_fast64_t; typedef signed long long intmax_t; typedef unsigned long long uintmax_t; -#else /* No 64-bit types for SAS/C */ +#else typedef signed long intmax_t; typedef unsigned long uintmax_t; -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ #define INT8_MIN SCHAR_MIN #define INT8_MAX SCHAR_MAX @@ -101,11 +100,11 @@ typedef unsigned long uintmax_t; #define INT32_MIN INT_MIN #define INT32_MAX INT_MAX #define UINT32_MAX UINT_MAX -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define INT64_MIN LLONG_MIN #define INT64_MAX LLONG_MAX #define UINT64_MAX ULLONG_MAX -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ #define INT_LEAST8_MIN SCHAR_MIN #define INT_LEAST8_MAX SCHAR_MAX @@ -116,11 +115,11 @@ typedef unsigned long uintmax_t; #define INT_LEAST32_MIN INT_MIN #define INT_LEAST32_MAX INT_MAX #define UINT_LEAST32_MAX UINT_MAX -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define INT_LEAST64_MIN LLONG_MIN #define INT_LEAST64_MAX LLONG_MAX #define UINT_LEAST64_MAX ULLONG_MAX -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ #define INT_FAST8_MIN SCHAR_MIN #define INT_FAST8_MAX SCHAR_MAX @@ -131,17 +130,17 @@ typedef unsigned long uintmax_t; #define INT_FAST32_MIN INT_MIN #define INT_FAST32_MAX INT_MAX #define UINT_FAST32_MAX UINT_MAX -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define INT_FAST64_MIN LLONG_MIN #define INT_FAST64_MAX LLONG_MAX #define UINT_FAST64_MAX ULLONG_MAX -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ #define INTPTR_MIN LONG_MIN #define INTPTR_MAX LONG_MAX #define UINTPTR_MAX ULONG_MAX -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define INTMAX_MIN LLONG_MIN #define INTMAX_MAX LLONG_MAX #define UINTMAX_MAX ULLONG_MAX @@ -149,9 +148,9 @@ typedef unsigned long uintmax_t; #define INTMAX_MIN LONG_MIN #define INTMAX_MAX LONG_MAX #define UINTMAX_MAX ULONG_MAX -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ -#if !defined(__cpluspluis) || defined(__STDC_LIMIT_MACROS) +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) /* sigatomic_t is an int. */ #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX @@ -171,16 +170,27 @@ typedef unsigned long uintmax_t; #define UINT32_C(x) x ## U #define UINT64_C(x) x ## ULL -#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #define INTMAX_C(x) x ## LL #define UINTMAX_C(x) x ## ULL #else #define INTMAX_C(x) x ## L #define UINTMAX_C(x) x ## UL -#endif +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ #endif /* not C++ or CONSTANT_MACROS */ /****************************************************************************/ +#define PTRDIFF_MIN INT_MIN +#define PTRDIFF_MAX INT_MAX + +#define WCHAR_MIN 0 +#define WCHAR_MAX USHRT_MAX + +#define WINT_MIN INT_MIN +#define WINT_MAX INT_MAX + +/****************************************************************************/ + #endif /* _STDINT_H */ diff --git a/library/include/stdlib.h b/library/include/stdlib.h index e6fcdbd..a4f50e4 100644 --- a/library/include/stdlib.h +++ b/library/include/stdlib.h @@ -1,5 +1,5 @@ /* - * $Id: stdlib.h,v 1.10 2005-05-07 13:21:49 obarthel Exp $ + * $Id: stdlib.h,v 1.11 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -49,7 +49,7 @@ extern "C" { /****************************************************************************/ /* Maximum number of bytes in a multibyte character */ -#define MB_CUR_MAX 4 +#define MB_CUR_MAX 2 /****************************************************************************/ @@ -182,9 +182,7 @@ extern char * mkdtemp(char *name_template); /****************************************************************************/ -/* These functions and data structures are unavailable under SAS/C for lack - of a "long long" data type. */ -#if ! defined(__SASC) +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /****************************************************************************/ @@ -203,7 +201,7 @@ extern lldiv_t lldiv(long long n,long long d); /****************************************************************************/ -#endif /* __SASC */ +#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */ /****************************************************************************/ diff --git a/library/include/sys/clib2_stdc.h b/library/include/sys/clib2_stdc.h new file mode 100644 index 0000000..1519104 --- /dev/null +++ b/library/include/sys/clib2_stdc.h @@ -0,0 +1,63 @@ +/* + * $Id: clib2_stdc.h,v 1.1 2005-05-12 13:21:47 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_CLIB2_STDC_H +#define _SYS_CLIB2_STDC_H + +/****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/****************************************************************************/ + +/* The following is not part of the ISO 'C' (1994) standard. */ + +/****************************************************************************/ + +/* Make the "restrict" qualifier work well with 'C' compilers that do + not support it. We do assume that __STDC__ is defined, though. */ +#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) +#define restrict +#endif /* !__STDC_VERSION__ || __STDC_VERSION__ < 199901L */ + +/****************************************************************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/****************************************************************************/ + +#endif /* _SYS_CLIB2_STDC_H */ diff --git a/library/include/wchar.h b/library/include/wchar.h index 15667df..e83516d 100644 --- a/library/include/wchar.h +++ b/library/include/wchar.h @@ -1,5 +1,5 @@ /* - * $Id: wchar.h,v 1.2 2005-01-02 09:07:21 obarthel Exp $ + * $Id: wchar.h,v 1.3 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -162,6 +162,20 @@ extern size_t wcsftime(wchar_t *s, size_t maxsize, const wchar_t *format, const /****************************************************************************/ +/* The following is not part of the ISO 'C' (1994) standard, but it should + be part of ISO/IEC 9899:1999, also known as "C99". */ + +/****************************************************************************/ + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + +extern long long wcstoll(const wchar_t *str, wchar_t **ptr, int base); +extern unsigned long long wcstoull(const wchar_t *str, wchar_t **ptr, int base); + +#endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */ + +/****************************************************************************/ + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/library/include/wctype.h b/library/include/wctype.h index 97a09e9..789a63a 100644 --- a/library/include/wctype.h +++ b/library/include/wctype.h @@ -1,5 +1,5 @@ /* - * $Id: wctype.h,v 1.2 2005-01-02 09:07:21 obarthel Exp $ + * $Id: wctype.h,v 1.3 2005-05-12 13:21:47 obarthel Exp $ * * :ts=4 * @@ -68,6 +68,7 @@ extern int iswlower(wint_t c); extern int iswupper(wint_t c); extern int iswspace(wint_t c); +extern int iswblank(wint_t c); extern wint_t towlower(wint_t c); extern wint_t towupper(wint_t c); diff --git a/library/inttypes_headers.h b/library/inttypes_headers.h new file mode 100644 index 0000000..9fd1511 --- /dev/null +++ b/library/inttypes_headers.h @@ -0,0 +1,49 @@ +/* + * $Id: inttypes_headers.h,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _INTTYPES_HEADERS_H +#define _INTTYPES_HEADERS_H + +/****************************************************************************/ + +#ifndef _STDLIB_HEADERS_H +#include "stdlib_headers.h" +#endif /* _STDLIB_HEADERS_H */ + +/****************************************************************************/ + +#include + +/****************************************************************************/ + +#endif /* _INTTYPES_HEADERS_H */ diff --git a/library/inttypes_imaxabs.c b/library/inttypes_imaxabs.c new file mode 100644 index 0000000..aa7ec76 --- /dev/null +++ b/library/inttypes_imaxabs.c @@ -0,0 +1,51 @@ +/* + * $Id: inttypes_imaxabs.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _INTTYPES_HEADERS_H +#include "inttypes_headers.h" +#endif /* _INTTYPES_HEADERS_H */ + +/****************************************************************************/ + +intmax_t +imaxabs(intmax_t x) +{ + intmax_t result; + + if(x < 0) + result = (-x); + else + result = x; + + return(result); +} diff --git a/library/inttypes_imaxdiv.c b/library/inttypes_imaxdiv.c new file mode 100644 index 0000000..0cbe798 --- /dev/null +++ b/library/inttypes_imaxdiv.c @@ -0,0 +1,51 @@ +/* + * $Id: inttypes_imaxdiv.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _INTTYPES_HEADERS_H +#include "inttypes_headers.h" +#endif /* _INTTYPES_HEADERS_H */ + +/****************************************************************************/ + +imaxdiv_t +imaxdiv(intmax_t n,intmax_t d) +{ + imaxdiv_t result; + + assert( d != 0 ); + + result.quot = n / d; + result.rem = n % d; + + return(result); +} diff --git a/library/inttypes_strtoimax.c b/library/inttypes_strtoimax.c new file mode 100644 index 0000000..90a43e7 --- /dev/null +++ b/library/inttypes_strtoimax.c @@ -0,0 +1,192 @@ +/* + * $Id: inttypes_strtoimax.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STDLIB_NULL_POINTER_CHECK_H +#include "stdlib_null_pointer_check.h" +#endif /* _STDLIB_NULL_POINTER_CHECK_H */ + +/****************************************************************************/ + +#ifndef _INTTYPES_HEADERS_H +#include "inttypes_headers.h" +#endif /* _INTTYPES_HEADERS_H */ + +/****************************************************************************/ + +intmax_t +strtoimax(const char *str, char **ptr, int base) +{ + BOOL is_negative; + intmax_t result = 0; + intmax_t new_sum; + intmax_t sum; + char c; + + ENTER(); + + SHOWSTRING(str); + SHOWPOINTER(ptr); + SHOWVALUE(base); + + assert(str != NULL && base >= 0); + + #if defined(CHECK_FOR_NULL_POINTERS) + { + if(str == NULL) + { + SHOWMSG("invalid str parameter"); + + __set_errno(EFAULT); + goto out; + } + } + #endif /* CHECK_FOR_NULL_POINTERS */ + + if(base < 0) + { + SHOWMSG("invalid base parameter"); + + __set_errno(ERANGE); + goto out; + } + + /* Skip all leading blanks. */ + while((c = (*str)) != '\0') + { + if(NOT isspace(c)) + break; + + str++; + } + + /* The first character may be a sign. */ + if(c == '-') + { + /* It's a negative number. */ + is_negative = TRUE; + + str++; + } + else + { + /* It's not going to be negative. */ + is_negative = FALSE; + + /* But there may be a sign we will choose to + ignore. */ + if(c == '+') + str++; + } + + c = (*str); + + /* There may be a leading '0x' to indicate that what + follows is a hexadecimal number. */ + if(base == 0 || base == 16) + { + if((c == '0') && (str[1] == 'x' || str[1] == 'X')) + { + base = 16; + + str += 2; + + c = (*str); + } + } + + /* If we still don't know what base to use and the + next letter to follow is a zero then this is + probably a number in octal notation. */ + if(base == 0) + { + if(c == '0') + base = 8; + else + base = 10; + } + + sum = 0; + + if(1 <= base && base <= 36) + { + while(c != '\0') + { + if('0' <= c && c <= '9') + c -= '0'; + else if ('a' <= c) + c -= 'a' - 10; + else if ('A' <= c) + c -= 'A' - 10; + else + break; + + /* Ignore invalid numbers. */ + if(c >= base) + break; + + new_sum = base * sum + c; + if(new_sum < sum) /* overflow? */ + { + __set_errno(ERANGE); + + if(is_negative) + result = INTMAX_MIN; + else + result = INTMAX_MAX; + + goto out; + } + + sum = new_sum; + + str++; + + c = (*str); + } + } + + if(is_negative) + result = (-sum); + else + result = sum; + + out: + + /* If desired, remember where we stopped reading the + number from the buffer. */ + if(ptr != NULL) + (*ptr) = (char *)str; + + RETURN(result); + return(result); +} diff --git a/library/inttypes_strtoumax.c b/library/inttypes_strtoumax.c new file mode 100644 index 0000000..77e9dd0 --- /dev/null +++ b/library/inttypes_strtoumax.c @@ -0,0 +1,189 @@ +/* + * $Id: inttypes_strtoumax.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STDLIB_NULL_POINTER_CHECK_H +#include "stdlib_null_pointer_check.h" +#endif /* _STDLIB_NULL_POINTER_CHECK_H */ + +/****************************************************************************/ + +#ifndef _INTTYPES_HEADERS_H +#include "inttypes_headers.h" +#endif /* _INTTYPES_HEADERS_H */ + +/****************************************************************************/ + +uintmax_t +strtoumax(const char *str, char **ptr, int base) +{ + BOOL is_negative; + uintmax_t result = 0; + uintmax_t new_sum; + uintmax_t sum; + char c; + + ENTER(); + + SHOWSTRING(str); + SHOWPOINTER(ptr); + SHOWVALUE(base); + + assert(str != NULL && base >= 0); + + #if defined(CHECK_FOR_NULL_POINTERS) + { + if(str == NULL) + { + SHOWMSG("invalid str parameter"); + + __set_errno(EFAULT); + goto out; + } + } + #endif /* CHECK_FOR_NULL_POINTERS */ + + if(base < 0) + { + SHOWMSG("invalid base parameter"); + + __set_errno(ERANGE); + goto out; + } + + /* Skip all leading blanks. */ + while((c = (*str)) != '\0') + { + if(NOT isspace(c)) + break; + + str++; + } + + /* The first character may be a sign. */ + if(c == '-') + { + /* It's a negative number. */ + is_negative = TRUE; + + str++; + } + else + { + /* It's not going to be negative. */ + is_negative = FALSE; + + /* But there may be a sign we will choose to + ignore. */ + if(c == '+') + str++; + } + + c = (*str); + + /* There may be a leading '0x' to indicate that what + follows is a hexadecimal number. */ + if(base == 0 || base == 16) + { + if((c == '0') && (str[1] == 'x' || str[1] == 'X')) + { + base = 16; + + str += 2; + + c = (*str); + } + } + + /* If we still don't know what base to use and the + next letter to follow is a zero then this is + probably a number in octal notation. */ + if(base == 0) + { + if(c == '0') + base = 8; + else + base = 10; + } + + sum = 0; + + if(1 <= base && base <= 36) + { + while(c != '\0') + { + if('0' <= c && c <= '9') + c -= '0'; + else if ('a' <= c) + c -= 'a' - 10; + else if ('A' <= c) + c -= 'A' - 10; + else + break; + + /* Ignore invalid numbers. */ + if(c >= base) + break; + + new_sum = base * sum + c; + if(new_sum < sum) /* overflow? */ + { + __set_errno(ERANGE); + + result = UINTMAX_MAX; + + goto out; + } + + sum = new_sum; + + str++; + + c = (*str); + } + } + + if(is_negative) + result = (-sum); + else + result = sum; + + out: + + /* If desired, remember where we stopped reading the + number from the buffer. */ + if(ptr != NULL) + (*ptr) = (char *)str; + + RETURN(result); + return(result); +} diff --git a/library/inttypes_wcstoimax.c b/library/inttypes_wcstoimax.c new file mode 100644 index 0000000..e995cb2 --- /dev/null +++ b/library/inttypes_wcstoimax.c @@ -0,0 +1,51 @@ +/* + * $Id: inttypes_wcstoimax.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STDLIB_NULL_POINTER_CHECK_H +#include "stdlib_null_pointer_check.h" +#endif /* _STDLIB_NULL_POINTER_CHECK_H */ + +/****************************************************************************/ + +#ifndef _INTTYPES_HEADERS_H +#include "inttypes_headers.h" +#endif /* _INTTYPES_HEADERS_H */ + +/****************************************************************************/ + +intmax_t +wcstoimax(const wchar_t *str, char **ptr, int base) +{ + /* ZZZ unimplemented */ + return(0); +} diff --git a/library/inttypes_wcstoumax.c b/library/inttypes_wcstoumax.c new file mode 100644 index 0000000..326cc06 --- /dev/null +++ b/library/inttypes_wcstoumax.c @@ -0,0 +1,51 @@ +/* + * $Id: inttypes_wcstoumax.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STDLIB_NULL_POINTER_CHECK_H +#include "stdlib_null_pointer_check.h" +#endif /* _STDLIB_NULL_POINTER_CHECK_H */ + +/****************************************************************************/ + +#ifndef _INTTYPES_HEADERS_H +#include "inttypes_headers.h" +#endif /* _INTTYPES_HEADERS_H */ + +/****************************************************************************/ + +uintmax_t +wcstoumax(const wchar_t *str, char **ptr, int base) +{ + /* ZZZ unimplemented */ + return(0); +} diff --git a/library/math_copysign.c b/library/math_copysign.c new file mode 100644 index 0000000..8389f6a --- /dev/null +++ b/library/math_copysign.c @@ -0,0 +1,67 @@ +/* + * $Id: math_copysign.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * PowerPC math library based in part on work by Sun Microsystems + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + */ + +#ifndef _MATH_HEADERS_H +#include "math_headers.h" +#endif /* _MATH_HEADERS_H */ + +/****************************************************************************/ + +#if defined(FLOATING_POINT_SUPPORT) + +/****************************************************************************/ + +double +copysign(double x, double y) +{ + unsigned long hx,hy; + + GET_HIGH_WORD(hx,x); + GET_HIGH_WORD(hy,y); + SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000U)); + + return x; +} + +/****************************************************************************/ + +#endif /* FLOATING_POINT_SUPPORT */ diff --git a/library/math_copysignf.c b/library/math_copysignf.c new file mode 100644 index 0000000..5f55459 --- /dev/null +++ b/library/math_copysignf.c @@ -0,0 +1,67 @@ +/* + * $Id: math_copysignf.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * PowerPC math library based in part on work by Sun Microsystems + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ + +#ifndef _MATH_HEADERS_H +#include "math_headers.h" +#endif /* _MATH_HEADERS_H */ + +/****************************************************************************/ + +#if defined(FLOATING_POINT_SUPPORT) + +/****************************************************************************/ + +float +copysignf(float x, float y) +{ + unsigned long ix,iy; + GET_FLOAT_WORD(ix,x); + GET_FLOAT_WORD(iy,y); + SET_FLOAT_WORD(x,(ix&0x7fffffff)|(iy&0x80000000U)); + return x; +} + +/****************************************************************************/ + +#endif /* FLOATING_POINT_SUPPORT */ diff --git a/library/math_headers.h b/library/math_headers.h index f7d4c8f..8c7bad0 100644 --- a/library/math_headers.h +++ b/library/math_headers.h @@ -1,5 +1,5 @@ /* - * $Id: math_headers.h,v 1.9 2005-05-08 17:02:10 obarthel Exp $ + * $Id: math_headers.h,v 1.10 2005-05-12 13:21:43 obarthel Exp $ * * :ts=4 * @@ -99,8 +99,6 @@ extern struct Library * NOCOMMON MathIeeeDoubTransBase; /****************************************************************************/ -#if defined(PPC_FLOATING_POINT_SUPPORT) - /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. @@ -212,6 +210,8 @@ do { \ (d) = sf_u.value; \ } while (0) +#if defined(PPC_FLOATING_POINT_SUPPORT) + extern double __kernel_cos(double x, double y); extern double __kernel_sin(double x, double y, int iy); extern int __rem_pio2(double x, double *y); diff --git a/library/math_isunordered.c b/library/math_isunordered.c new file mode 100644 index 0000000..7410ccf --- /dev/null +++ b/library/math_isunordered.c @@ -0,0 +1,117 @@ +/* + * $Id: math_isunordered.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STDIO_HEADERS_H +#include "stdio_headers.h" +#endif /* _STDIO_HEADERS_H */ + +/****************************************************************************/ + +#if defined (FLOATING_POINT_SUPPORT) + +/****************************************************************************/ + +/* The following is not part of the ISO 'C' (1994) standard, but it should + be part of ISO/IEC 9899:1999, also known as "C99". */ + +/****************************************************************************/ + +int +__isunordered_float(float number_x,float number_y) +{ + union ieee_single x; + union ieee_single y; + int result; + + x.value = number_x; + y.value = number_y; + + /* Exponent = 255 and fraction != 0.0 -> not a number */ + if((x.raw[0] & 0x7f800000) == 0x7f800000 && (x.raw[0] & 0x007fffff) != 0) + result = 1; + else if((y.raw[0] & 0x7f800000) == 0x7f800000 && (y.raw[0] & 0x007fffff) != 0) + result = 1; + else + result = 0; + + return(result); +} + +/****************************************************************************/ + +int +__isunordered_float_double(float number_x,double number_y) +{ + union ieee_single x; + union ieee_double y; + int result; + + x.value = number_x; + y.value = number_y; + + if((x.raw[0] & 0x7f800000) == 0x7f800000 && (x.raw[0] & 0x007fffff) != 0) + result = 1; /* Exponent = 255 and fraction != 0.0 -> not a number */ + else if (((y.raw[0] & 0x7ff00000) == 0x7ff00000) && ((y.raw[0] & 0x000fffff) != 0 || (y.raw[1] != 0))) + result = 1; /* Exponent = 2047 and fraction != 0.0 -> not a number */ + else + result = 0; + + return(result); +} + +/****************************************************************************/ + +int +__isunordered_double(double number_x,double number_y) +{ + union ieee_double x; + union ieee_double y; + int result; + + x.value = number_x; + y.value = number_y; + + /* Exponent = 2047 and fraction != 0.0 -> not a number */ + if(((x.raw[0] & 0x7ff00000) == 0x7ff00000) && ((x.raw[0] & 0x000fffff) != 0 || (x.raw[1] != 0))) + result = 1; + else if (((y.raw[0] & 0x7ff00000) == 0x7ff00000) && ((y.raw[0] & 0x000fffff) != 0 || (y.raw[1] != 0))) + result = 1; + else + result = 0; + + return(result); +} + +/****************************************************************************/ + +#endif /* FLOATING_POINT_SUPPORT */ diff --git a/library/math_nextafter.c b/library/math_nextafter.c new file mode 100644 index 0000000..094d943 --- /dev/null +++ b/library/math_nextafter.c @@ -0,0 +1,105 @@ +/* + * $Id: math_nextafter.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * PowerPC math library based in part on work by Sun Microsystems + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + */ + +#ifndef _MATH_HEADERS_H +#include "math_headers.h" +#endif /* _MATH_HEADERS_H */ + +/****************************************************************************/ + +#if defined(FLOATING_POINT_SUPPORT) + +/****************************************************************************/ + +double +nextafter(double x,double y) +{ + long hx,hy,ix,iy; + unsigned long lx,ly; + + EXTRACT_WORDS(hx,lx,x); + EXTRACT_WORDS(hy,ly,y); + ix = hx&0x7fffffff; /* |x| */ + iy = hy&0x7fffffff; /* |y| */ + + if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */ + ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) /* y is nan */ + return x+y; + if(x==y) return x; /* x=y, return x */ + if((ix|lx)==0) { /* x == 0 */ + INSERT_WORDS(x,hy&0x80000000U,1); /* return +-minsubnormal */ + y = x*x; + if(y==x) return y; else return x; /* raise underflow flag */ + } + if(hx>=0) { /* x > 0 */ + if(hx>hy||((hx==hy)&&(lx>ly))) { /* x > y, x -= ulp */ + if(lx==0) hx -= 1; + lx -= 1; + } else { /* x < y, x += ulp */ + lx += 1; + if(lx==0) hx += 1; + } + } else { /* x < 0 */ + if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */ + if(lx==0) hx -= 1; + lx -= 1; + } else { /* x > y, x += ulp */ + lx += 1; + if(lx==0) hx += 1; + } + } + hy = hx&0x7ff00000; + if(hy>=0x7ff00000) return x+x; /* overflow */ + if(hy<0x00100000) { /* underflow */ + y = x*x; + if(y!=x) { /* raise underflow flag */ + INSERT_WORDS(y,hx,lx); + return y; + } + } + INSERT_WORDS(x,hx,lx); + return x; +} + +/****************************************************************************/ + +#endif /* FLOATING_POINT_SUPPORT */ diff --git a/library/math_nextafterf.c b/library/math_nextafterf.c new file mode 100644 index 0000000..c5abc23 --- /dev/null +++ b/library/math_nextafterf.c @@ -0,0 +1,102 @@ +/* + * $Id: math_nextafterf.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * PowerPC math library based in part on work by Sun Microsystems + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ + +#ifndef _MATH_HEADERS_H +#include "math_headers.h" +#endif /* _MATH_HEADERS_H */ + +/****************************************************************************/ + +#if defined(FLOATING_POINT_SUPPORT) + +/****************************************************************************/ + +float +nextafterf(float x, float y) +{ + long hx,hy,ix,iy; + + GET_FLOAT_WORD(hx,x); + GET_FLOAT_WORD(hy,y); + ix = hx&0x7fffffff; /* |x| */ + iy = hy&0x7fffffff; /* |y| */ + + if((ix>0x7f800000) || /* x is nan */ + (iy>0x7f800000)) /* y is nan */ + return x+y; + if(x==y) return x; /* x=y, return x */ + if(ix==0) { /* x == 0 */ + SET_FLOAT_WORD(x,(hy&0x80000000U)|1);/* return +-minsubnormal */ + y = x*x; + if(y==x) return y; else return x; /* raise underflow flag */ + } + if(hx>=0) { /* x > 0 */ + if(hx>hy) { /* x > y, x -= ulp */ + hx -= 1; + } else { /* x < y, x += ulp */ + hx += 1; + } + } else { /* x < 0 */ + if(hy>=0||hx>hy){ /* x < y, x -= ulp */ + hx -= 1; + } else { /* x > y, x += ulp */ + hx += 1; + } + } + hy = hx&0x7f800000; + if(hy>=0x7f800000) return x+x; /* overflow */ + if(hy<0x00800000) { /* underflow */ + y = x*x; + if(y!=x) { /* raise underflow flag */ + SET_FLOAT_WORD(y,hx); + return y; + } + } + SET_FLOAT_WORD(x,hx); + return x; +} + +/****************************************************************************/ + +#endif /* FLOATING_POINT_SUPPORT */ diff --git a/library/smakefile b/library/smakefile index 225c713..732bcbd 100644 --- a/library/smakefile +++ b/library/smakefile @@ -1,5 +1,5 @@ # -# $Id: smakefile,v 1.41 2005-05-11 20:15:25 obarthel Exp $ +# $Id: smakefile,v 1.42 2005-05-12 13:21:43 obarthel Exp $ # # :ts=8 # @@ -186,6 +186,8 @@ MATH_OBJ = \ math_ceil.o \ math_cos.o \ math_cosh.o \ + math_copysign.o \ + math_copysignf.o \ math_exp.o \ math_fabs.o \ math_fabsf.o \ @@ -193,6 +195,7 @@ MATH_OBJ = \ math_fmod.o \ math_fpclassify.o \ math_isfinite.o \ + math_isunordered.o \ math_signbit.o \ math_frexp.o \ math_huge_val.o \ @@ -206,6 +209,8 @@ MATH_OBJ = \ math_modf.o \ math_nan.o \ math_nanf.o \ + math_nextafter.o \ + math_nextafterf.o \ math_pow.o \ math_rint.o \ math_rintf.o \ @@ -377,6 +382,10 @@ STDIO_OBJ = \ stdio_vsprintf_hook_entry.o STDLIB_OBJ = \ + inttypes_imaxdiv.o \ + inttypes_imaxabs.o \ + inttypes_strtoimax.o \ + inttypes_strtoumax.o \ stdlib_abort.o \ stdlib_abs.o \ stdlib_alloca.o \ diff --git a/library/stdio_fflush.c b/library/stdio_fflush.c index 9829970..92abba8 100644 --- a/library/stdio_fflush.c +++ b/library/stdio_fflush.c @@ -1,5 +1,5 @@ /* - * $Id: stdio_fflush.c,v 1.8 2005-04-24 08:46:37 obarthel Exp $ + * $Id: stdio_fflush.c,v 1.9 2005-05-12 13:21:43 obarthel Exp $ * * :ts=4 * @@ -68,71 +68,44 @@ fflush(FILE *stream) in the wrong order. */ flockfile(stream); - #if defined(UNIX_PATH_SEMANTICS) - { - /* Flush a particular stream? */ - if(stream != NULL) - { - struct iob * file = (struct iob *)stream; - - assert( __is_valid_iob(file) ); - - if(__iob_write_buffer_is_valid(file) && __flush_iob_write_buffer(file) < 0) - goto out; - } - else - { - int failed_iob = -1; - int i; - - __stdio_lock(); - - /* Flush all streams which still have unwritten data in the buffer. */ - for(i = 0 ; i < __num_iob ; i++) - { - if(__iob[i] != NULL && - FLAG_IS_SET(__iob[i]->iob_Flags,IOBF_IN_USE) && - FLAG_IS_SET(__iob[i]->iob_Flags,IOBF_WRITE) && - __iob_write_buffer_is_valid(__iob[i])) - { - if(__flush_iob_write_buffer(__iob[i]) < 0) - { - failed_iob = i; - break; - } - } - } - - __stdio_unlock(); - - if(failed_iob >= 0) - goto out; - } - } - #else + /* Flush a particular stream? */ + if(stream != NULL) { struct iob * file = (struct iob *)stream; - assert( stream != NULL ); - - #if defined(CHECK_FOR_NULL_POINTERS) - { - if(stream == NULL) - { - SHOWMSG("invalid file handle"); - - __set_errno(EFAULT); - goto out; - } - } - #endif /* CHECK_FOR_NULL_POINTERS */ - assert( __is_valid_iob(file) ); if(__iob_write_buffer_is_valid(file) && __flush_iob_write_buffer(file) < 0) goto out; } - #endif /* UNIX_PATH_SEMANTICS */ + else + { + int failed_iob = -1; + int i; + + __stdio_lock(); + + /* Flush all streams which still have unwritten data in the buffer. */ + for(i = 0 ; i < __num_iob ; i++) + { + if(__iob[i] != NULL && + FLAG_IS_SET(__iob[i]->iob_Flags,IOBF_IN_USE) && + FLAG_IS_SET(__iob[i]->iob_Flags,IOBF_WRITE) && + __iob_write_buffer_is_valid(__iob[i])) + { + if(__flush_iob_write_buffer(__iob[i]) < 0) + { + failed_iob = i; + break; + } + } + } + + __stdio_unlock(); + + if(failed_iob >= 0) + goto out; + } result = OK; diff --git a/library/wchar_wcstoll.c b/library/wchar_wcstoll.c new file mode 100644 index 0000000..e2dff46 --- /dev/null +++ b/library/wchar_wcstoll.c @@ -0,0 +1,45 @@ +/* + * $Id: wchar_wcstoll.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _WCHAR_HEADERS_H +#include "wchar_headers.h" +#endif /* _WCHAR_HEADERS_H */ + +/****************************************************************************/ + +long long +wcstoll(const wchar_t *str, wchar_t **ptr, int base) +{ + /* ZZZ unimplemented */ + return(0); +} diff --git a/library/wchar_wcstoull.c b/library/wchar_wcstoull.c new file mode 100644 index 0000000..d2640fb --- /dev/null +++ b/library/wchar_wcstoull.c @@ -0,0 +1,45 @@ +/* + * $Id: wchar_wcstoull.c,v 1.1 2005-05-12 13:21:43 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _WCHAR_HEADERS_H +#include "wchar_headers.h" +#endif /* _WCHAR_HEADERS_H */ + +/****************************************************************************/ + +unsigned long long +wcstoull(const wchar_t *str, wchar_t **ptr, int base) +{ + /* ZZZ unimplemented */ + return(0); +} diff --git a/library/wctype_iswblank.c b/library/wctype_iswblank.c new file mode 100644 index 0000000..75a40b6 --- /dev/null +++ b/library/wctype_iswblank.c @@ -0,0 +1,45 @@ +/* + * $Id: wctype_iswblank.c,v 1.1 2005-05-12 13:21:44 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _WCTYPE_HEADERS_H +#include +#endif /* _WCTYPE_HEADERS_H */ + +/****************************************************************************/ + +int +iswblank(wint_t c) +{ + /* ZZZ unimplemented */ + return(0); +}