X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fstrtox_prelim.c;h=7be40309ed41931c09fc0302f94a2959e4a2c09f;hb=10f020f1a39804bbef8cd1cf35ef7c9a8e75c7d6;hp=8b0f44236317d8d7217a647c67f6e2843783a222;hpb=f66fc2a4fc1b45e0aa357f2dd0e45ddd1b7c9142;p=pdclib.old diff --git a/functions/_PDCLIB/strtox_prelim.c b/functions/_PDCLIB/strtox_prelim.c index 8b0f442..7be4030 100644 --- a/functions/_PDCLIB/strtox_prelim.c +++ b/functions/_PDCLIB/strtox_prelim.c @@ -1,7 +1,5 @@ /* $Id$ */ -/* Release $Name$ */ - /* _PDCLIB_strtox_prelim( const char *, char *, int * ) This file is part of the Public Domain C Library (PDCLib). @@ -9,7 +7,9 @@ */ #include - +#include +#include +#ifndef REGTEST const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) { /* skipping leading whitespace */ @@ -25,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 ) { @@ -39,20 +48,21 @@ const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) { *base = 10; } - return p; + return ( ( *base >= 2 ) && ( *base <= 36 ) ) ? p : NULL; } +#endif #ifdef TEST #include <_PDCLIB_test.h> -int main() +int main( void ) { +#ifndef REGTEST int base = 0; char sign = '\0'; char test1[] = " 123"; char test2[] = "\t+0123"; char test3[] = "\v-0x123"; - BEGIN_TESTS; TESTCASE( _PDCLIB_strtox_prelim( test1, &sign, &base ) == &test1[2] ); TESTCASE( sign == '+' ); TESTCASE( base == 10 ); @@ -71,6 +81,11 @@ int main() TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == &test3[2] ); TESTCASE( sign == '-' ); TESTCASE( base == 10 ); + base = 1; + TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); + base = 37; + TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); +#endif return TEST_RESULTS; }