From 3b37a00a4be251f87e543d269489cb7a989425d5 Mon Sep 17 00:00:00 2001 From: Pixel Date: Sat, 28 Apr 2001 21:40:25 +0000 Subject: Hop, gros bordel, plein de fichiers ajoutes et supprimes :) --- lib/numbers.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 lib/numbers.c (limited to 'lib/numbers.c') diff --git a/lib/numbers.c b/lib/numbers.c new file mode 100644 index 0000000..831639b --- /dev/null +++ b/lib/numbers.c @@ -0,0 +1,100 @@ +/* + * + * 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; +} -- cgit v1.2.3