#include <errno.h>
#include <string.h>
-_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, int base, _PDCLIB_uintmax_t error, _PDCLIB_uintmax_t limval, int limdigit )
+_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, int base, _PDCLIB_uintmax_t error, _PDCLIB_uintmax_t limval, _PDCLIB_uintmax_t limdigit, char * sign )
{
_PDCLIB_uintmax_t rc = 0;
int digit = -1;
errno = ERANGE;
/* TODO: Only if endptr != NULL */
while ( memchr( _PDCLIB_digits, **p, base ) != NULL ) ++(*p);
+ /* TODO: This is ugly, but keeps caller from negating the error value */
+ *sign = '+';
return error;
}
}
const char * p;
char test[] = "123_";
char fail[] = "xxx";
+ char sign = '-';
BEGIN_TESTS;
/* basic functionality */
p = test;
errno = 0;
- TESTCASE( _PDCLIB_strtox_main( &p, 10, 999, 12, 3 ) == 123 );
+ TESTCASE( _PDCLIB_strtox_main( &p, 10, 999, 12, 3, &sign ) == 123 );
TESTCASE( errno == 0 );
TESTCASE( p == &test[3] );
/* proper functioning to smaller base */
p = test;
- TESTCASE( _PDCLIB_strtox_main( &p, 8, 999, 12, 3 ) == 0123 );
+ TESTCASE( _PDCLIB_strtox_main( &p, 8, 999, 12, 3, &sign ) == 0123 );
TESTCASE( errno == 0 );
TESTCASE( p == &test[3] );
/* overflowing subject sequence must still return proper endptr */
p = test;
- TESTCASE( _PDCLIB_strtox_main( &p, 4, 999, 1, 2 ) == 999 );
+ TESTCASE( _PDCLIB_strtox_main( &p, 4, 999, 1, 2, &sign ) == 999 );
TESTCASE( errno == ERANGE );
TESTCASE( p == &test[3] );
+ TESTCASE( sign == '+' );
/* testing conversion failure */
errno = 0;
p = fail;
- TESTCASE( _PDCLIB_strtox_main( &p, 10, 999, 99, 8 ) == 0 );
+ sign = '-';
+ TESTCASE( _PDCLIB_strtox_main( &p, 10, 999, 99, 8, &sign ) == 0 );
TESTCASE( p == NULL );
return TEST_RESULTS;
}
/* Two helper functions used by strtol(), strtoul() and long long variants. */
const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base );
-_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, int base, _PDCLIB_uintmax_t error, _PDCLIB_uintmax_t limval, int limdigit );
+_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, int base, _PDCLIB_uintmax_t error, _PDCLIB_uintmax_t limval, _PDCLIB_uintmax_t limdigit, char * sign );
/* Digits array used by various integer conversion functions in <stdlib.h> */
extern char _PDCLIB_digits[];