Skip to content

Commit 4d83fc4

Browse files
committed
Fix memory freeing
1 parent 876d7fb commit 4d83fc4

File tree

6 files changed

+79
-53
lines changed

6 files changed

+79
-53
lines changed

src/Eval.c

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,19 @@ bool match(void* a, void* b) {
1212
void trySubExpression(Type type, const char* expectedType, LinkedList l, LinkedList formalParameters, bool* valid) {
1313
if(T_equals("subexpression", type)) {
1414
Var* subRes = (Var*)malloc(sizeof(Var));
15-
*subRes = E_eval(P_parse(VLH_getString(l)), formalParameters);
15+
LinkedList params = P_parse(VLH_getString(l));
16+
*subRes = E_eval(params, formalParameters);
1617
if(!V_isEmpty(*subRes)) {
1718
if(!T_equals(expectedType, V_getType(*subRes))) {
1819
printf("Wrong type in subexpression returns : %s\nres : %d\n", VLH_getString(l), *((int*)V_getValue(*subRes)));
1920
*valid = false;
2021
} else {
22+
void* value = LL_getValue(l);
23+
V_free(&value);
2124
LL_setValue(l, (void*)subRes);
2225
}
2326
}
27+
LL_free(&params, V_free);
2428
}
2529

2630
}
@@ -37,7 +41,6 @@ void tryVariable(Type type, const char* expectedType, LinkedList l, LinkedList f
3741
}
3842
}
3943
}
40-
4144
}
4245

4346
void E_checkAndEval(const char* args, LinkedList l, LinkedList formalParameters, bool* valid) {
@@ -72,8 +75,18 @@ void E_checkAndEval(const char* args, LinkedList l, LinkedList formalParameters,
7275
LL_free(&signTmp, V_free);
7376
}
7477

78+
void printLL(LinkedList l) {
79+
while(!LL_isEmpty(l)) {
80+
V_print(*((Var*)LL_getValue(l)));
81+
l = LL_getNext(l);
82+
}
83+
}
84+
7585
Var E_eval(LinkedList l, LinkedList formalParameters) {
86+
/*printLL(l);*/
7687
LinkedList lt = l;
88+
Var v;
89+
V_init(&v);
7790
Identifier act = I_find(VLH_getName(lt));
7891
bool valid = true;
7992
if(!(strcmp(act.name, "NotFound") == 0)) {
@@ -87,35 +100,20 @@ Var E_eval(LinkedList l, LinkedList formalParameters) {
87100
LL_add(&lt, (void*)formalParameters);
88101
}
89102
if(valid) {
90-
return act.function(lt);
91-
} else {
92-
Var v;
93-
V_init(&v);
94-
return v;
103+
v = act.function(lt);
95104
}
96105
} else {
97106
printf("Unknown Identifier : '%s'\n", VLH_getName(l));
98-
Var v;
99-
V_init(&v);
100-
return v;
101-
}
102-
}
103-
104-
void tryPrintInt(const char* returns, void* result) {
105-
if(strcmp(returns,"int")==0) {
106-
printf("%d\n", *((int*)result));
107107
}
108-
}
109-
110-
void tryPrintString(const char* returns, void* result) {
111-
if(strcmp(returns, "string")==0) {
112-
printf("%s\n", (char*)result);
108+
if(!act.standard) {
109+
free(LL_getNext(lt));
110+
free(lt);
111+
lt = NULL;
113112
}
114-
}
115-
116-
void E_printResult(const char* returns, void* result) {
117-
if(result != NULL) {
118-
tryPrintString(returns, result);
119-
tryPrintInt(returns, result);
113+
if(strcmp(act.name, "if")==0) {
114+
free(lt);
115+
lt = NULL;
120116
}
117+
/*printLL(l);*/
118+
return v;
121119
}

src/Identifiers.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,32 @@ Var print(LinkedList l) {
4949
return v;
5050
}
5151

52+
void V_free_name(void** v) {
53+
free((void*)((*(Var**)v))->name);
54+
free(*v);
55+
*v = NULL;
56+
}
57+
5258
Var call(LinkedList l) {
59+
Var result;
60+
V_init(&result);
61+
LinkedList ltemp;
5362
const char* sub = (const char*)LL_getValue(l);
5463
l = LL_getNext(l);
5564
const char* paramsString = (const char*)LL_getValue(l);
5665
l = LL_getNext(l);
5766
LinkedList params = P_parse(paramsString);
58-
LinkedList ltemp = params;
67+
ltemp = params;
5968
while(!LL_isEmpty(l)) {
6069
VLH_setValue(ltemp, VLH_getValue(l));
6170
l = LL_getNext(l);
6271
ltemp = LL_getNext(ltemp);
6372
}
6473
LinkedList toEval = P_parse(sub);
65-
return E_eval(toEval, params);
74+
result = E_eval(toEval, params);
75+
LL_free(&params, V_free_name);
76+
LL_free(&toEval, V_free);
77+
return result;
6678
}
6779

6880
bool I_compare(void* a, void* b) {

src/LinkedList.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ void LL_add(LinkedList* l, void* value) {
3535
}
3636
}
3737

38-
void LL_free(LinkedList* l, void (*freeValue)(void*)) {
38+
void LL_free(LinkedList* l, void (*freeValue)(void**)) {
3939
LinkedList ltemp;
40+
void* value;
4041
while(!LL_isEmpty(*l)) {
4142
ltemp = (*l)->next;
42-
freeValue((*l)->value);
43+
value = (*l)->value;
44+
freeValue(&value);
4345
free(*l);
4446
*l = ltemp;
4547
}

src/Parse.c

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ char* P_process_string(const char* word) {
101101
buf[i-1] = word[i];
102102
}
103103
buf[i-1]='\0';
104-
free((void*)word);
105104
return buf;
106105
}
107106

@@ -114,7 +113,6 @@ char* P_process_call(const char* word) {
114113
buf[i-1] = word[i];
115114
}
116115
buf[i-1]='\0';
117-
free((void*)word);
118116
return buf;
119117
}
120118

@@ -129,11 +127,10 @@ int* P_process_digit(const char* word) {
129127
/*}*/
130128
/*}*/
131129
*r = atoi(word);
132-
free((void*)word);
133130
return r;
134131
}
135132

136-
void P_process_sign(const char* word, const char** name, void** value) {
133+
void P_process_sign(const char* word, Var* p) {
137134
int i = 1;
138135
char* nameBuffer = NULL;
139136
int numNameBuffer = 1;
@@ -162,39 +159,48 @@ void P_process_sign(const char* word, const char** name, void** value) {
162159
}
163160
i++;
164161
}
165-
*name = nameBuffer;
166-
*value = (void*)valueBuffer;
167-
free((void*)word);
162+
nameBuffer = (char*)realloc(nameBuffer, (numNameBuffer)*sizeof(char));
163+
nameBuffer[numNameBuffer - 1] = '\0';
164+
valueBuffer = (char*)realloc(valueBuffer, (numValueBuffer)*sizeof(char));
165+
valueBuffer[numValueBuffer - 1] = '\0';
166+
167+
V_setName(p, nameBuffer);
168+
V_setValue(p, (void*)valueBuffer);
168169
}
169170

170171
Var* P_process(const char* word) {
171172
errno = GOOD;
173+
char* wordcp;
172174
Var *p = (Var*)malloc(sizeof(Var));
173175
V_init(p);
174176
if(word[0] == '"') {
175-
p->value = P_process_string(word);
176-
p->type = STRING;
177+
V_setValue(p, P_process_string(word));
178+
V_setType(p, STRING);
177179
return p;
178180
} else if(word[0] == '(') {
179-
p->value = P_process_call(word);
180-
p->type = SUBEXPRESSION;
181+
V_setValue(p, P_process_call(word));
182+
V_setType(p, SUBEXPRESSION);
181183
return p;
182184
} else if(isdigit(word[0])) {
183-
p->value = P_process_digit(word);
184-
p->type = NUMBER;
185+
V_setValue(p, P_process_digit(word));
186+
V_setType(p, NUMBER);
185187
return p;
186188
} else if(word[0] == '{') {
187-
p->type = SIGNATURE;
188-
P_process_sign(word, &(p->name), &(p->value));
189+
V_setType(p, SIGNATURE);
190+
P_process_sign(word, p);
189191
return p;
190192
} else if ((strcmp(word, "true")==0) || (strcmp(word, "false")==0)) {
191-
p->type = BOOLEAN;
192-
p->value = word;
193+
wordcp = (char*)malloc(sizeof(char)*(strlen(word)+1));
194+
strcpy(wordcp, word);
195+
V_setType(p, BOOLEAN);
196+
V_setValue(p, (void*)wordcp);
193197
return p;
194198
} else {
195199
/*p->value = P_process_var(word);*/
196-
p->type = VARIABLE;
197-
p->name = word;
200+
wordcp = (char*)malloc(sizeof(char)*(strlen(word)+1));
201+
strcpy(wordcp, word);
202+
V_setType(p, VARIABLE);
203+
V_setName(p, wordcp);
198204
return p;
199205
}
200206
}
@@ -207,10 +213,12 @@ LinkedList P_parse(const char* line) {
207213
LinkedList res = NULL;
208214
word = P_getNextWord(line, end, &end);
209215
LL_add(&res, P_process(word));
216+
free((void*)word);
210217
lend = res;
211218
while(end!=-1) {
212219
word = P_getNextWord(line, end, &end);
213220
LL_add(&ltemp, P_process(word));
221+
free((void*)word);
214222
LL_setNext(lend, ltemp);
215223
lend = ltemp;
216224
ltemp = NULL;

src/Vars.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
#include "Vars.h"
22

3+
void V_print(Var v) {
4+
printf("'%s' : '%s'\n", v.name, T_toString(v.type));
5+
}
6+
37
void V_init(Var* v) {
48
v->name = NULL;
59
v->type = NONE;
610
v->value = NULL;
711
}
812

9-
void V_free(void* v) {
10-
Var* var = (Var*)v;
13+
void V_free(void** v) {
14+
Var* var = *((Var**)v);
1115
free((void*)var->name);
1216
free((void*)var->value);
1317
free(var);
18+
*v = NULL;
1419
}
1520

1621
bool V_isEmpty(Var v) {

src/comp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void printResult(Var v) {
2424
printf("%s\n", (char*)V_getValue(v));
2525
break;
2626
default :
27-
printf("Erreur, retour non affichable (subexpression, variable, signature)");
27+
printf("Erreur, retour non affichable : %s\n", T_toString(t));
2828
}
2929
}
3030
}
@@ -35,6 +35,7 @@ void process(char *a) {
3535
l = P_parse(a);
3636
res = E_eval(l, NULL);
3737
printResult(res);
38+
/*printLL(l);*/
3839
free(V_getValue(res));
3940
LL_free(&l, V_free);
4041
/*printf("%d\n", *((int*)((Var*)(l->value))->value));*/

0 commit comments

Comments
 (0)