/* * * Conversion de chaines en nombres ( entier ou flottant ) * */ #include "numbers.h" /* Cette fonction lit un nombre. Elle va chercher absolument à traduire la chaîne passée en argument en un nombre. Si ce nombre n'est pas valide, alors l'int valid est mis à faux. Cette fonction reconnais les nombres en décimaux, les nombres en octal préfixés avec 0 et les nombres en hexadécimal préfixés avec 0x. */ int char_to_number(char *st, int *valid) { int whattype = 0, result = 0; *valid = 0; if (*st == '0') { st++; if (*st == 'x') { whattype = 1; st++; } else if (*st) { whattype = 2; } else { *valid = 1; return 0; } } while (*st) { switch (whattype) { case 0: if ((*st < '0') || (*st > '9')) { return 0; } result *= 10; result += *st - '0'; break; case 1: if (((*st < '0') || (*st > '9')) && ((*st < 'A') || (*st > 'F')) && ((*st < 'a') || (*st > 'f'))) { return 0; } result *= 16; if ((*st >= '0') && (*st <= '9')) { result += *st - '0'; } else if ((*st >= 'A') && (*st <= 'F')) { result += *st - 'A' + 10; } else { result += *st - 'a' + 10; } break; case 2: if ((*st < '0') || (*st > '7')) { return 0; } result *= 8; result += *st - '0'; break; } st++; } *valid = 1; return result; } /* TODO: Rajouter la precision dans les valeurs retournees */ double char_to_double(char *st, int *valid) /* cette fonction tente de traduire une chaine en flottant */ { unsigned int dotnum = 0; unsigned int deci = 1; double result = 0; while (*st) { if (*st == '.') { dotnum++; } else { if ((*st < '0') || (*st > '9') || (dotnum > 1)) { *valid = 0; return 0; } else { result *= 10; result += *st - '0'; if (dotnum == 1) deci *= 10; } } } result = result / deci; *valid = 1; return result; }