]> pd.if.org Git - pdclib/blobdiff - functions/_PDCLIB/strtox_prelim.c
* Test cleanups: surround the code for all functions by #ifndef REGTEST
[pdclib] / functions / _PDCLIB / strtox_prelim.c
index d36837e49ae911369009643e7b383a88c18dc373..7be40309ed41931c09fc0302f94a2959e4a2c09f 100644 (file)
@@ -8,7 +8,8 @@
 
 #include <ctype.h>
 #include <stddef.h>
-
+#include <string.h>
+#ifndef REGTEST
 const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base )
 {
     /* skipping leading whitespace */
@@ -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 )
         {
@@ -40,12 +50,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>
 
 int main( void )
 {
+#ifndef REGTEST
     int base = 0;
     char sign = '\0';
     char test1[] = "  123";
@@ -73,6 +85,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;
 }