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; }
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 ); }