From c8c4c6e7a931c9223d1d44a74dfb0565b7e2740c Mon Sep 17 00:00:00 2001 From: eck Date: Wed, 28 Mar 1990 16:37:18 +0000 Subject: [PATCH] several bug fixes after test-suite --- lang/cem/libcc.ansi/stdlib/ext_comp.c | 8 ++++++-- lang/cem/libcc.ansi/stdlib/mbtowc.c | 1 - lang/cem/libcc.ansi/stdlib/strtol.c | 20 +++++++++----------- lang/cem/libcc.ansi/stdlib/wcstombs.c | 6 +++--- lang/cem/libcc.ansi/stdlib/wctomb.c | 2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lang/cem/libcc.ansi/stdlib/ext_comp.c b/lang/cem/libcc.ansi/stdlib/ext_comp.c index ab096e4c7..6ed062660 100644 --- a/lang/cem/libcc.ansi/stdlib/ext_comp.c +++ b/lang/cem/libcc.ansi/stdlib/ext_comp.c @@ -501,6 +501,7 @@ _str_ext_cvt(char *s, char **ss, struct EXTEND *e) if (c == 'E' || c == 'e') { int exp1 = 0; int sign = 1; + int exp_overflow = 0; switch(*s) { case '-': @@ -515,13 +516,16 @@ _str_ext_cvt(char *s, char **ss, struct EXTEND *e) exp1 = 10 * exp1 + (c - '0'); if ((tmp = sign * exp1 + exp) > MAX_EXP || tmp < -MAX_EXP) { - errno = ERANGE; + exp_overflow = 1; } } while (c = *++s, isdigit(c)); if (ss) *ss = s; } exp += sign * exp1; - if (errno == ERANGE) exp = sign * MAX_EXP; + if (exp_overflow) { + exp = sign * MAX_EXP; + if (e->m1 != 0 || e->m2 != 0) errno = ERANGE; + } } if (e->m1 == 0 && e->m2 == 0) return; e->exp = 63; diff --git a/lang/cem/libcc.ansi/stdlib/mbtowc.c b/lang/cem/libcc.ansi/stdlib/mbtowc.c index b5ebd7cb9..3e6dd051d 100644 --- a/lang/cem/libcc.ansi/stdlib/mbtowc.c +++ b/lang/cem/libcc.ansi/stdlib/mbtowc.c @@ -11,7 +11,6 @@ int mbtowc(wchar_t *pwc, register const char *s, size_t n) { if (s == (const char *)NULL) return 0; - if (*s == '\0') return 0; if (n <= 0) return 0; if (pwc) *pwc = *s; return (*s != 0); diff --git a/lang/cem/libcc.ansi/stdlib/strtol.c b/lang/cem/libcc.ansi/stdlib/strtol.c index 700b6fe14..bd5084076 100644 --- a/lang/cem/libcc.ansi/stdlib/strtol.c +++ b/lang/cem/libcc.ansi/stdlib/strtol.c @@ -74,16 +74,15 @@ string2long(register const char *nptr, char ** const endptr, else *endptr = (char *)nptr; } - /* We can't represent a negative unsigned long, nor a long that - * is smaller than LONG_MIN or larger than LONG_MAX. - */ if (!ovfl) { - if (!is_signed) - if (sign < 0 && val != 0) - ovfl++; - else if (((sign < 0 && val > -LONG_MIN) - || (sign > 0 && val > LONG_MAX))) - ovfl++; + /* Overflow is only possible when converting a signed long. + * val is unsigned long, so -LONG_MIN is converted to + * unsigned long. + */ + if (is_signed + && ( (sign < 0 && val > -LONG_MIN) + || (sign > 0 && val > LONG_MAX))) + ovfl++; } if (ovfl) { @@ -93,6 +92,5 @@ string2long(register const char *nptr, char ** const endptr, else return LONG_MAX; else return ULONG_MAX; } - if (is_signed) return (unsigned long) sign * val; - else return val; + return (unsigned long) sign * val; } diff --git a/lang/cem/libcc.ansi/stdlib/wcstombs.c b/lang/cem/libcc.ansi/stdlib/wcstombs.c index 2edad1d2f..91a14624d 100644 --- a/lang/cem/libcc.ansi/stdlib/wcstombs.c +++ b/lang/cem/libcc.ansi/stdlib/wcstombs.c @@ -14,8 +14,8 @@ wcstombs(register char *s, register const wchar_t *pwcs, size_t n) register int i = n; while (--i >= 0) { - if (!(*s++ = *pwcs)) - return n - i - 1; + if (!(*s++ = *pwcs++)) + break; } - return n - i; + return n - i - 1; } diff --git a/lang/cem/libcc.ansi/stdlib/wctomb.c b/lang/cem/libcc.ansi/stdlib/wctomb.c index eda9c1d44..1942f52b8 100644 --- a/lang/cem/libcc.ansi/stdlib/wctomb.c +++ b/lang/cem/libcc.ansi/stdlib/wctomb.c @@ -13,5 +13,5 @@ wctomb(char *s, wchar_t wchar) if (!s) return 0; /* no state dependent codings */ *s = wchar; - return (wchar != 0); + return (*s != '\0'); } -- 2.34.1