コード例 #1
0
ファイル: strtoul.c プロジェクト: nguyenvuhung/SDP_QNX_BBB
paddr_t
strtopaddr(const char *nptr, char **endptr, int base) {
	const char	*p;
	const char	*startp;
	int 		digit;
	paddr_t		value;

	if(endptr != NULL) *endptr = (char *)nptr;
	p = nptr;
	if(base == 0) {
	    if(hexstr(p))	 base = 16;
	    else if(*p == '0') base = 8;
	    else		 base = 10;
	}
	if(base == 16) {
	    if(hexstr(p))  p += 2;	/* skip over '0x' */
	}
	startp = p;
	value = 0;
	for(;;) {
	    digit = radix_value(*p);
	    if(digit >= base) break;
	    value = value * base + digit;
	    ++p;
	}
	if(p == startp)  p = nptr;
	if(endptr != NULL) *endptr = (char *)p;
	return value;
}
コード例 #2
0
ファイル: strtol.c プロジェクト: kendallb/scitech-mgl
static unsigned long int _stol( const CHAR_TYPE *nptr,CHAR_TYPE **endptr,int base,int who)
    {
        const CHAR_TYPE *p;
        const CHAR_TYPE *startp;
        int digit;
        unsigned long int value;
        unsigned long int prev_value;
        CHAR_TYPE sign;
        char overflow;          /*overflow is used as a flag so it does not
                                 *need to be of type CHAR_TYPE */

        if( endptr != NULL ) *endptr = (CHAR_TYPE *)nptr;
        p = nptr;
        while( __F_NAME(isspace,iswspace)(*p) ) ++p;
        sign = *p;
        if( sign == '+'  ||  sign == '-' ) ++p;
        if( base == 0 ) {
            if( hexstr(p) )      base = 16;
            else if( *p == '0' ) base = 8;
            else                 base = 10;
        }
        if( base < 2  ||  base > 36 ) {
            __set_errno( EDOM );
            return( 0 );
        }
        if( base == 16 ) {
            if( hexstr(p) )  p += 2;    /* skip over '0x' */
        }
        startp = p;
        overflow = 0;
        value = 0;
        for(;;) {
            digit = radix_value( *p );
            if( digit >= base ) break;
            if( value > nearly_overflowing[base-2] ) overflow = 1;
            prev_value = value;
            value = value * base + digit;
            if( value < prev_value ) overflow = 1;
            ++p;
        }
        if( p == startp )  p = nptr;
        if( endptr != NULL ) *endptr = (CHAR_TYPE *)p;
        if( who == 1 ) {
            if( value >= 0x80000000 ) {
                if( value == 0x80000000  &&  sign == '-' ) {
                    ;  /* OK */
                } else {
                    overflow = 1;
                }
            }
        }
        if( overflow ) {
            __set_errno( ERANGE );
            if( who == 0 )     return( ULONG_MAX );
            if( sign == '-' )  return( LONG_MIN );
            return( LONG_MAX );
        }
        if( sign == '-' )  value = - value;
        return( value );
    }