unsigned long int strtoul(const char *nptr, char **endptr, int base) { unsigned long int ret = 0; //on ignore les espaces while(isspace(*(nptr))) nptr++; //on regarde le signe facultatif if(*nptr == '+') nptr++; else if(*nptr == '-') nptr++; //en magic base on regarde le debut pour determiner le type de base if(base == 0 || base == 16) { // on pass een base 16 si ca commence par 0x if(strncmp(nptr,"0x",2) == 0) { base = 16; nptr+=2; } else if(base == 0) { if(*nptr == '0') base = 8; else base = 10; } } if(base < 2 || base > 36) { errno = 1; return 0; } //on parse en base n int digit; for(digit = digitvalue(*nptr++) ; digit>=0 && digit<base ; digit = digitvalue(*nptr++)) { ret = digit+base*ret; } *endptr =(char*) nptr-1; return ret; }
/* convert a string to an u32 value. if the string starts with 0x, it * is a hexidecimal string, otherwise we treat is as decimal. returns * the converted value on success, or -1 on failure. no, we don't care * about overflows if the string is too long. */ int strtou32(const char *str, unsigned int *value) { int i; *value = 0; if((str[0]=='0') && (str[1]=='x')) { /* hexadecimal mode */ str += 2; while(*str != '\0') { if((i = xdigitvalue(*str)) < 0) return -1; *value = (*value << 4) | (unsigned int)i; str++; } } else { /* decimal mode */ while(*str != '\0') { if((i = digitvalue(*str)) < 0) return -1; *value = (*value * 10) + (unsigned int)i; str++; } } return 0; }