summaryrefslogtreecommitdiff
path: root/numbers.c
diff options
context:
space:
mode:
Diffstat (limited to 'numbers.c')
-rw-r--r--numbers.c101
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;
+
+ }
+}