Created
September 27, 2012 10:15
-
-
Save cmtsij/3793290 to your computer and use it in GitHub Desktop.
wrapper of strtoul
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <errno.h> | |
#include <limits.h> | |
#include <assert.h> | |
unsigned long int strtoul_wrapper(const char *nptr, char **endptr, int base,int *ret_errno) | |
{ | |
int set_error = 1; | |
unsigned long int ret_value=0; | |
if( nptr != NULL ){ | |
errno = 0; | |
ret_value = strtoul(nptr,endptr,base); | |
set_error = errno; | |
if( nptr == *endptr ){ //no digits at all | |
set_error = 1; | |
} | |
}else{ | |
set_error = 1; //nptr is NULL | |
} | |
if(set_error != 0){ | |
set_error=1; | |
ret_value=0; //reset as zero when error | |
} | |
//config ret_error | |
if( ret_errno != NULL ){ | |
*ret_errno = set_error; | |
} | |
return ret_value; | |
} | |
int strtoul_UNITEST(int argc,char *argv[]) | |
{ | |
char *next=NULL; | |
int err_num=0; | |
/////////////////////////////////////////////// | |
// follow case should be pass | |
/////////////////////////////////////////////// | |
//test 1 | |
assert( 1 == strtoul_wrapper("1",&next,10,&err_num) && 0 == err_num ); | |
//test 0 | |
assert( 0 == strtoul_wrapper("0",&next,10,&err_num) && 0 == err_num ); | |
//test -0 | |
assert( 0 == strtoul_wrapper("-0",&next,10,&err_num) && 0 == err_num ); | |
//WARNING case: -1 in unsigned long integer | |
//test -1 | |
assert( -1lu == strtoul_wrapper("-1",&next,10,&err_num) && 0 == err_num ); | |
//test ULONG_MAX | |
char ulong_max_str[256]={0}; | |
snprintf(ulong_max_str,sizeof(ulong_max_str),"%lu",ULONG_MAX); | |
assert( ULONG_MAX == strtoul_wrapper(ulong_max_str,&next,10,&err_num) && 0 == err_num ); | |
/////////////////////////////////////////////// | |
// follow case should be fail | |
/////////////////////////////////////////////// | |
//null input string | |
assert( 0 == strtoul_wrapper(NULL,&next,10,&err_num) && 1 == err_num ); | |
//invalid base | |
assert( 0 == strtoul_wrapper("1",&next,99,&err_num) && 1 == err_num ); | |
//invalid input string | |
assert( 0 == strtoul_wrapper("invalid",&next,10,&err_num) && 1 == err_num ); | |
//overflow | |
char ulong_overmax_str[256]={0}; | |
snprintf(ulong_overmax_str,sizeof(ulong_max_str),"%lu00000",ULONG_MAX); //ulong_max*100000 | |
assert( 0 == strtoul_wrapper(ulong_overmax_str,&next,10,&err_num) && 1 == err_num ); | |
return 0; | |
} | |
int main(int argc, char*argv[]) | |
{ | |
if( strtoul_UNITEST(argc,argv) == 0 ){ | |
printf("all pass\n"); | |
return 0; | |
} | |
return -1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment