]> pd.if.org Git - pdclib/blobdiff - functions/_PDCLIB/strtox_prelim.c
Caught "0xz" corner case, and improved testing.
[pdclib] / functions / _PDCLIB / strtox_prelim.c
index 6cd5a10e3520cdd059517d430de47460077b3792..29b79197598ace1a5890738a72b20f4052844660 100644 (file)
@@ -7,6 +7,8 @@
 */
 
 #include <ctype.h>
+#include <stddef.h>
+#include <string.h>
 
 const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base )
 {
@@ -23,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 )
         {