[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH] strto(u)l: 0x ist nur ein Praefix, wenn danach noch was kommt



On Tue, Sep 15 21:41, Kevin Wolf wrote:
> ! strtou(l): Wenn nach dem 0x keine gueltige Ziffer mehr kommt, ist es
>   entweder keine Hexzahl (Basis 0) oder eine Null ohne 0x vorne dran
>   (Basis 16).
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/lib/stdlibc/strtol.c |    9 ++++++++-
>  src/lib/string.c         |   15 ++++++++++++---
>  2 files changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/src/lib/stdlibc/strtol.c b/src/lib/stdlibc/strtol.c
> index d605144..2387e98 100644
> --- a/src/lib/stdlibc/strtol.c
> +++ b/src/lib/stdlibc/strtol.c
> @@ -31,6 +31,13 @@
>  #include "limits.h"
>  #include "types.h"
>  
> +static int is_hexdigit(char x)
> +{
> +    return (x >= '0' && x <= '9')
> +        || (x >= 'a' && x <= 'f')
> +        || (x >= 'A' && x <= 'F');
> +}

Was hast du denn gegen unser isxdigit()?

> +
>  long strtol(const char *str, char **endptr, int base)
>  {
>      long retval = 0;
> @@ -56,7 +63,7 @@ long strtol(const char *str, char **endptr, int base)
>                  base = 16;
>              }
>  
> -            if (base == 16) {
> +            if (base == 16 && is_hexdigit(str[2])) {
>                  str += 2;
>              }
>          } else if (base == 0) {
> diff --git a/src/lib/string.c b/src/lib/string.c
> index 3125c2c..ae809a6 100644
> --- a/src/lib/string.c
> +++ b/src/lib/string.c
> @@ -65,6 +65,13 @@ void itoa(unsigned int n, char *s, unsigned int base)
>  	s[y] = '\0';
>  }
>  
> +static int is_hexdigit(char x)
> +{
> +    return (x >= '0' && x <= '9')
> +        || (x >= 'a' && x <= 'f')
> +        || (x >= 'A' && x <= 'F');
> +}

Hier nochmal ;-)

> +
>  unsigned long long int strtoull(const char *nptr, char **endptr, int base)
>  {
>      unsigned long long int result = 0;
> @@ -94,8 +101,10 @@ unsigned long long int strtoull(const char *nptr, char **endptr, int base)
>              base = 10;
>              if (*nptr == '0') {
>                  if (*++nptr == 'x') {
> -                    base = 16;
> -                    nptr++;
> +                    if (is_hexdigit(nptr[1])) {
> +                        base = 16;
> +                        nptr++;
> +                    }
>                  } else {
>                      base = 8;
>                  }
> @@ -103,7 +112,7 @@ unsigned long long int strtoull(const char *nptr, char **endptr, int base)
>              break;
>  
>          case 16:
> -            if ((*nptr == '0') && (*(nptr+1) == 'x')) {
> +            if ((*nptr == '0') && (nptr[1] == 'x') && is_hexdigit(nptr[2])) {
>                  nptr += 2;
>              }
>              break;

Abgesehen davon sieht das gut aus.

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgptSjkWrkOKB.pgp
Description: PGP signature