-
Notifications
You must be signed in to change notification settings - Fork 0
/
parse_utils.c
95 lines (69 loc) · 1.84 KB
/
parse_utils.c
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
#include "parse_utils.h"
int is_assignment(char* instruction){
return strchr(instruction, EQUAL_SIGN);
}
// from the first number
error_t parse_num(char** instruction, value_t* result) {
char* string_num = NULL;
int val = 0;
int str_len = 0;
error_t res = ERROR_SUCCESS;
while (isdigit(*(*instruction + str_len))) {
str_len++;
}
if (*(*instruction + str_len) == DECIMAL_POINT) {
res = parse_float(instruction, result, str_len);
if (res != ERROR_SUCCESS) {
return res;
}
}
else {
res = parse_integer(instruction, result, str_len);
if (res != ERROR_SUCCESS) {
return res;
}
}
return ERROR_SUCCESS;
}
error_t parse_integer(char** instruction, value_t* result, int integer_len) {
char* string_integer = NULL;
int val = 0;
error_t res = ERROR_SUCCESS;
string_integer = (char*)malloc(integer_len * sizeof(char) + 1);
if (!string_integer) {
printf("malloc failed.\n");
return ERROR_MEM;
}
strncpy(string_integer, *instruction, integer_len);
*(string_integer + integer_len) = 0;
val = atoi(string_integer);
free(string_integer);
result->value_type = INT;
result->value.int_val = val;
*instruction += integer_len;
return ERROR_SUCCESS;
}
error_t parse_float(char** instruction, value_t* result, int len_before_d_point) {
int str_len = 0;
char* string_float = NULL;
double val = 0;
error_t res = ERROR_SUCCESS;
str_len = len_before_d_point;
str_len++; //for the decimal point
while (isdigit(*(*instruction + str_len))) {
str_len++;
}
string_float = (char*)malloc(str_len * sizeof(char) + 1);
if (!string_float) {
printf("malloc failed.\n");
return ERROR_MEM;
}
strncpy(string_float, *instruction, str_len);
*(string_float + str_len) = 0;
val = atof(string_float);
free(string_float);
result->value_type = FLOAT;
result->value.float_val = val;
*instruction += str_len;
return ERROR_SUCCESS;
}