/* * * Conversion de chaines en nombres ( entier ou flottant ) * */ #include "numbers.h" #include "scalaires.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; } rationnel char_to_rat(char *st, int *valid) { /* cette fonction tente de traduire une chaine en rationnel */ int dotnum = 0, deci = 1, temp = 0; while (*st) { if (*st == '.') { dotnum++; } else { if ((*st < '0') || (*st > '9') || (dotnum > 1)) { *valid = 0; return rat_constr_zero(); } else { temp *= 10; temp += *st - '0'; if (dotnum == 1) deci *= 10; } } st++; } *valid = 1; return rat_constr(temp, deci); }