diff options
Diffstat (limited to 'numbers.c')
-rw-r--r-- | numbers.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/numbers.c b/numbers.c new file mode 100644 index 0000000..9beeb82 --- /dev/null +++ b/numbers.c @@ -0,0 +1,101 @@ +/* + * + * 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; +} + + + +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; + + } +} |