From 59dd864187ee61b6f0bfd7abc85e2fea4b479cb7 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 26 May 1996 19:19:51 +0000 Subject: Sun May 26 15:15:08 1996 Roland McGrath * stdlib/ldiv.c: Deansideclized. Sun May 26 19:39:53 1996 Ulrich Drepper * intl/loadmsgcat.c (_nl_load_domain): Test correct variable after malloc. * string/Makefile (tester-ENV): New variable to suppress message translation in test. * string/tester.c: Add tests for strtok_r and strsep. * sysdeps/i386/i486/strcat.S: Correct some more 8bit operation <-> 32 bit operand conflicts. * sysdeps/i386/strsep.S: Wrapper around to produce strsep function. * sysdeps/i386/strtok.S: Optimized implementation of strtok function. * sysdeps/i386/strtok_r.S: Wrapper around to produce strtok_r function. * sysdeps/generic/strtok.c: Moved here from string/strtok.c. Corrected example in comment. * string/Makefile (routines): Add strtok_r. * sysdeps/generic/strtok_r.c: New file. Implement reentrant version of strtok_r. * string/string.h: Add prototype for strtok_r. * wcsmbs/wcstok.c: Handle illegal SAVE_PTR argument the same as in strtok_r. Sun May 26 13:28:23 1996 Roland McGrath * time/tzset.c (__tzset): Ignore leading : in $TZ; always try tzfile first and fall back to 1003.1 syntax only if it fails. * time/Makefile (install-others): Also install posix/ZONE and right/ZONE for each ZONE in $(zonenames). (z.% rule): Generate rules for right/ZONE and posix/ZONE targets too, the difference begin leapseconds vs /dev/null as 3rd dep. For original ZONE targets use $(leapseconds), to be set in Makeconfig. (target-zone-flavor): New variable. (tzcompile): Use it to get the right -d for posix/ and right/ flavors. * Makeconfig (leapseconds): New variable. * mach/Machrules (%.udeps rule): Depend on Machrules. Emit deps for .uh and .__h files. (%.uh, %.__h rules): Don't depend on %.defs; use #include <$*.defs> instead. Sun May 26 01:06:47 1996 Ulrich Drepper * stdlib/Makefile (routines): Add llabs, lldiv. * stdlib/llabs.c: New file. Implementation of return absolute value of long long argument. * stdlib/lldiv.c: New file. Implementation of division with remainder of long long argument. * stdlib/stdlib.h [__USE_GNU] (lldiv_t): New type for lldiv function. Define prototypes for lldiv and llabs functions. * locale/C-collate.c: Initialize _NL_COLLATE_NRULES element. * stdlib/strtod.c: Replace wchar_t with wint_t. The later is really the type for a single wide character. * string/strxfrm.c (print_val): Define separate version for use as wcsxfrm. Here we don't need UTF8 encoding. * wcsmbs/wchar.h: gcc-2.7.2-960517 finally introduces wint_t in . Use this value and only for older gcc version define in place. (uwchar_t): Remove definition. * wcsmbs/wcscmp.c, wcsmbs/wcscoll.c, wcsmbs/wcsncmp.c, wcsmbs/wcsxfrm.c, wcsmbs/wmemcmp.c: : Don't use uwchar_t as unsigned type. wint_t is intended for this. Sat May 25 14:10:19 1996 Roland McGrath * sysdeps/unix/bsd/direntry.h: Use [1] instead of [0] for d_name to quiet -ansi -pedantic. * sysdeps/unix/common/direntry.h: Likewise. * login/Makefile (headers): Add lastlog.h. * login/lastlog.h: New file. * login/Makefile (CFLAGS): Don't append -D_THREAD_SAFE. * login/utmp.h [_REENTRANT || _THREAD_SAFE]: Replace this conditional with #ifdef __USE_REENTRANT. * features.h (__GNU_LIBRARY__): Set to 6. [_GNU_SOURCE] (_POSIX_SOURCE, _POSIX_C_SOURCE, _BSD_SOURCE, _SVID_SOURCE): Make sure they are all defined. * sysdeps/unix/sysv/linux/gnu/types.h: Instead of including , define _LINUX_TYPES_DONT_EXPORT and then include . * resource/sys/resource.h: Remove trailing commas from enums. * sysdeps/generic/netinet/in.h: Remove trailing commas from enums. * sysdeps/unix/sysv/linux/netinet/in.h: Likewise. --- stdlib/Makefile | 4 ++-- stdlib/llabs.c | 31 +++++++++++++++++++++++++++++++ stdlib/lldiv.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ stdlib/stdlib.h | 17 ++++++++++++++++- stdlib/strtod.c | 13 +++++++------ 5 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 stdlib/llabs.c create mode 100644 stdlib/lldiv.c (limited to 'stdlib') diff --git a/stdlib/Makefile b/stdlib/Makefile index d30a0f2a06..46d7aa13a5 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -29,8 +29,8 @@ routines := \ bsearch qsort msort \ getenv putenv setenv \ exit on_exit atexit \ - abs labs \ - div ldiv \ + abs labs llabs \ + div ldiv lldiv \ mblen mbstowcs mbtowc wcstombs wctomb \ random random_r rand \ drand48 erand48 lrand48 nrand48 mrand48 jrand48 \ diff --git a/stdlib/llabs.c b/stdlib/llabs.c new file mode 100644 index 0000000000..465028c481 --- /dev/null +++ b/stdlib/llabs.c @@ -0,0 +1,31 @@ +/* `long long int' absolute value. +Copyright (C) 1991, 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include + +#undef llabs + + +/* Return the absolute value of I. */ +long long int +llabs (i) + long long int i; +{ + return i < 0 ? -i : i; +} diff --git a/stdlib/lldiv.c b/stdlib/lldiv.c new file mode 100644 index 0000000000..1659e0f837 --- /dev/null +++ b/stdlib/lldiv.c @@ -0,0 +1,57 @@ +/* `long long int' divison with remainder. +Copyright (C) 1992, 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include + + +/* Return the `lldiv_t' representation of NUMER over DENOM. */ +lldiv_t +lldiv (numer, denom) + long long int numer; + long long int denom; +{ + lldiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + /* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where + NUMER / DENOM is to be computed in infinite precision. In + other words, we should always truncate the quotient towards + zero, never -infinity. Machine division and remainer may + work either way when one or both of NUMER or DENOM is + negative. If only one is negative and QUOT has been + truncated towards -infinity, REM will have the same sign as + DENOM and the opposite sign of NUMER; if both are negative + and QUOT has been truncated towards -infinity, REM will be + positive (will have the opposite sign of NUMER). These are + considered `wrong'. If both are NUM and DENOM are positive, + RESULT will always be positive. This all boils down to: if + NUMER >= 0, but REM < 0, we got the wrong answer. In that + case, to get the right answer, add 1 to QUOT and subtract + DENOM from REM. */ + + if (numer >= 0 && result.rem < 0) + { + ++result.quot; + result.rem -= denom; + } + + return result; +} diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 1853c5babb..97b257248e 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -50,6 +50,15 @@ typedef struct long int rem; /* Remainder. */ } ldiv_t; +#ifdef __USE_GNU +/* Returned by `lldiv'. */ +typedef struct + { + long long int quot; /* Quotient. */ + long long int rem; /* Remainder. */ + } lldiv_t; +#endif + /* The largest number rand will return (same as INT_MAX). */ #define RAND_MAX 2147483647 @@ -407,13 +416,19 @@ extern void qsort __P ((__ptr_t __base, size_t __nmemb, size_t __size, /* Return the absolute value of X. */ extern int abs __P ((int __x)) __attribute__ ((__const__)); extern long int labs __P ((long int __x)) __attribute__ ((__const__)); +#ifdef __USE_GNU +extern long long int llabs __P ((long long int __x)) __attribute__ ((__const__)); +#endif -/* Return the `div_t' or `ldiv_t' representation +/* Return the `div_t', `ldiv_t' or `lldiv_t' representation of the value of NUMER over DENOM. */ /* GCC may have built-ins for these someday. */ extern div_t div __P ((int __numer, int __denom)) __attribute__ ((__const__)); extern ldiv_t ldiv __P ((long int __numer, long int __denom)) __attribute__ ((__const__)); +#ifdef __USE_GNU +extern lldiv_t lldiv __P ((long long int __numer, long long int __denom)) __attribute__ ((__const__)); +#endif #ifdef __USE_SVID diff --git a/stdlib/strtod.c b/stdlib/strtod.c index 525a6f98a9..03a37bfb70 100644 --- a/stdlib/strtod.c +++ b/stdlib/strtod.c @@ -365,9 +365,9 @@ INTERNAL (STRTOF) (nptr, endptr, group) CHAR_TYPE c; /* The radix character of the current locale. */ - wchar_t decimal; + wint_t decimal; /* The thousands character of the current locale. */ - wchar_t thousands; + wint_t thousands; /* The numeric grouping specification of the current locale, in the format described in . */ const char *grouping; @@ -380,9 +380,10 @@ INTERNAL (STRTOF) (nptr, endptr, group) else { /* Figure out the thousands separator character. */ - if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP), + if (mbtowc ((wchar_t *) &thousands, + _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP), strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0) - thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP); + thousands = (wint_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP); if (thousands == L'\0') grouping = NULL; } @@ -394,9 +395,9 @@ INTERNAL (STRTOF) (nptr, endptr, group) } /* Find the locale's decimal point character. */ - if (mbtowc (&decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT), + if (mbtowc ((wchar_t *) &decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT), strlen (_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT))) <= 0) - decimal = (wchar_t) *_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT); + decimal = (wint_t) *_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT); /* Prepare number representation. */ -- cgit 1.4.1