From da128169aaa250809ed2b143487d062708548fe3 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 17 Jan 1996 00:46:59 +0000 Subject: Sun Jan 14 01:01:10 1996 Ulrich Drepper * stdlib/strtol.c: Return correct pointer for strings like "0xyz" and base 0 or 16. * string/strxfrm.c: Handle case for LENGTH == 0 correct. * sunrpc/etc.rpc: Add some more known protocols. Sun Jan 14 01:01:10 1996 Ulrich Drepper * stdlib/strtol.c: Return correct pointer for strings like "0xyz" and base 0 or 16. * string/strxfrm.c: Handle case for LENGTH == 0 correct. * sunrpc/etc.rpc: Add some more known protocols. --- stdlib/strtol.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'stdlib') diff --git a/stdlib/strtol.c b/stdlib/strtol.c index d52f338c84..b06063c2c5 100644 --- a/stdlib/strtol.c +++ b/stdlib/strtol.c @@ -150,7 +150,7 @@ INTERNAL (strtol) (nptr, endptr, base, group) if (base < 0 || base == 1 || base > 36) base = 10; - s = nptr; + save = s = nptr; /* Skip white space. */ while (isspace (*s)) @@ -269,9 +269,17 @@ INTERNAL (strtol) (nptr, endptr, base, group) return (negative ? -i : i); noconv: - /* There was no number to convert. */ + /* We must handle a special case here: the base is 0 or 16 and the + first two characters and '0' and 'x', but the rest are no + hexadecimal digits. This is no error case. We return 0 and + ENDPTR points to the `x`. */ if (endptr != NULL) - *endptr = (char *) nptr; + if (save - nptr >= 2 && tolower (save[-1]) == 'x' && save[-2] == '0') + *endptr = (char *) &save[-1]; + else + /* There was no number to convert. */ + *endptr = (char *) nptr; + return 0L; } -- cgit v1.2.3