X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fstrtox_prelim.c;h=98f7fcea758145facf450f0aff74a6a767ebd7ea;hb=2040228f27d623585d339dec175c4e779ca9edb5;hp=d36837e49ae911369009643e7b383a88c18dc373;hpb=f8dfae46eb161173a4460a98075669e810c8bb7b;p=pdclib diff --git a/functions/_PDCLIB/strtox_prelim.c b/functions/_PDCLIB/strtox_prelim.c index d36837e..98f7fce 100644 --- a/functions/_PDCLIB/strtox_prelim.c +++ b/functions/_PDCLIB/strtox_prelim.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /* _PDCLIB_strtox_prelim( const char *, char *, int * ) This file is part of the Public Domain C Library (PDCLib). @@ -8,6 +6,9 @@ #include #include +#include + +#ifndef REGTEST const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) { @@ -24,6 +25,15 @@ const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) { *base = 16; ++p; + /* catching a border case here: "0x" followed by a non-digit should + be parsed as the unprefixed zero. + We have to "rewind" the parsing; having the base set to 16 if it + was zero previously does not hurt, as the result is zero anyway. + */ + if ( memchr( _PDCLIB_digits, tolower(*p), *base ) == NULL ) + { + p -= 2; + } } else if ( *base == 0 ) { @@ -41,11 +51,14 @@ const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) return ( ( *base >= 2 ) && ( *base <= 36 ) ) ? p : NULL; } +#endif + #ifdef TEST -#include <_PDCLIB_test.h> +#include "_PDCLIB_test.h" int main( void ) { +#ifndef REGTEST int base = 0; char sign = '\0'; char test1[] = " 123"; @@ -73,6 +86,7 @@ int main( void ) TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); base = 37; TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); +#endif return TEST_RESULTS; }