summaryrefslogtreecommitdiff
path: root/lib/numbers.c
blob: 9dd306cdbbbc0e3186f64753cd7a3e60abb68cc1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
 * 
 * Conversion de chaines en nombres ( entier ou flottant )
 *
 */

#include "numbers.h"
#include "scalaires.h"

/*
 * Cette fonction lit un nombre. Elle va chercher absolument a traduire la chaine passee en
 * argument en un nombre. Si ce nombre n'est pas valide, alors l'int valid est mis a faux. Cette
 * fonction reconnait les nombres en decimaux, les nombres en octal prefixes avec 0 et les nombres
 * en hexadecimal prefixes 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);
}