blob: af8a9bbb0825d952e39118cf8714a973df24366b (
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"
/* 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;
}
}
st++;
}
result = result / deci;
*valid = 1;
return result;
}
|