Skip to content

Commit 5a17047

Browse files
committed
Some debugging as well as a few basic tests
1 parent 1528134 commit 5a17047

15 files changed

+257
-66
lines changed

include/Err.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef ERR_H
2+
#define ERR_H
3+
4+
#include "LinkedList.h"
5+
6+
typedef struct {
7+
bool error;
8+
char* msg;
9+
LinkedList backtrace;
10+
}
11+
12+
#endif

include/LinkedList.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ typedef struct Node {
1010

1111
typedef Node* LinkedList;
1212

13-
bool LL_isEmpty(LinkedList);
14-
void LL_add(LinkedList*, void*);
15-
void LL_free(LinkedList*, void (*freeValue)(void*));
1613
LinkedList LL_getNext(LinkedList);
1714
void* LL_getValue(LinkedList);
1815
void LL_setNext(LinkedList, LinkedList);
16+
void LL_setValue(LinkedList, void*);
17+
18+
bool LL_isEmpty(LinkedList);
19+
20+
void LL_add(LinkedList*, void*);
21+
void LL_free(LinkedList*, void (*freeValue)(void*));
22+
1923
void* LL_find(LinkedList, void*, bool (*)(void*, void*));
2024

2125
#endif

include/Vars.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ typedef struct {
99
void* value;
1010
} Var;
1111

12+
const char* V_getName(Var);
13+
1214
/* VLH : Variable-LinkedList Helpers */
1315
Var VLH_getVar(LinkedList);
1416
int VLH_getInt(LinkedList);
1517
char* VLH_getString(LinkedList);
1618
char* VLH_getName(LinkedList);
1719
char* VLH_getType(LinkedList);
20+
void* VLH_getValue(LinkedList);
1821
void VLH_setType(LinkedList, const char*);
1922
void VLH_setName(LinkedList, const char*);
2023
void VLH_setValue(LinkedList, void*);

makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
src=src
22
include=include
33
lib=lib
4+
tests=tests
45
cc=clang
56
cflags= -Wall -pedantic -I$(include) -g
67
ldflags= -L$(lib) -lreadline -llang
8+
ldtestflags= -L$(lib) -llang -lcunit -ltests
79

810
comp: $(src)/comp.o $(lib)/liblang.a
911
$(cc) $(ldflags) -o comp $^
1012

13+
tests: $(tests)/testMain.o $(lib)/libtests.a $(lib)/liblang.a
14+
$(cc) $(ldtestflags) -o testMain $^
15+
16+
$(lib)/libtests.a: $(tests)/LinkedList_tests.o
17+
ar -r $@ $^
18+
1119
$(lib)/liblang.a: $(src)/Parse.o $(src)/LinkedList.o $(src)/Identifiers.o $(src)/Eval.o $(src)/Vars.o $(src)/BalancedBinaryTree.o
1220
ar -r $@ $^
1321

1422
$(src)/%.o : $(src)/%.c
1523
$(cc) $(cflags) -o $@ -c $^
1624

25+
$(tests)/%.o : $(tests)/%.c
26+
$(cc) $(cflags) -o $@ -c $^
1727
clean:
1828
rm $(src)/*.o
1929
rm $(lib)/*.a
30+
rm $(tests)/*.o
2031
rm comp
32+
rm testMain

src/Err.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#include "Err.h"
2+
3+

src/Eval.c

Lines changed: 47 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,58 @@
33
#include <string.h>
44

55
bool match(void* a, void* b) {
6-
if(strcmp((char*)b,(char*)((Var*)a)->value)) {
7-
return true;
8-
}
9-
return false;
6+
if(strcmp(V_getName(*((Var*)a)), (char*)b)==0) {
7+
return true;
8+
}
9+
return false;
10+
}
11+
12+
void trySubExpression(const char* type, const char* expectedType, LinkedList l, LinkedList formalParameters, bool* valid) {
13+
if((strcmp(type,"sub")==0)) {
14+
void* subRes;
15+
char** returns = (char**)malloc(sizeof(char**));
16+
subRes = E_eval(P_parse(VLH_getString(l)), formalParameters, returns);
17+
if(subRes!=NULL) {
18+
if(!strcmp(expectedType,(const char*) *returns)==0) {
19+
printf("Wrong type in subexpression returns !\n");
20+
*valid = false;
21+
} else {
22+
VLH_setType(l, (const char*) *returns);
23+
VLH_setValue(l, subRes);
24+
}
25+
}
26+
}
27+
28+
}
29+
30+
void tryVariable(const char* type, const char* expectedType, LinkedList l, LinkedList formalParameters, bool* valid) {
31+
if((strcmp(type, "variable")==0)) {
32+
Var* varTmp;
33+
if(formalParameters != NULL) {
34+
varTmp = LL_find(formalParameters, VLH_getName(l), match);
35+
*valid = (varTmp!=NULL);
36+
if(*valid) {
37+
VLH_setType(l, expectedType);
38+
VLH_setValue(l, varTmp->value);
39+
}
40+
}
41+
}
42+
1043
}
1144

1245
void E_checkAndEval(const char* args, LinkedList l, LinkedList formalParameters, bool* valid) {
1346
LinkedList sign = P_parse(args);
14-
Var* varTmp;
1547
char* signType;
1648
char* paramType;
17-
void* subRes;
18-
char** returns = (char**)malloc(sizeof(char**));
49+
*valid = true;
1950
while(!LL_isEmpty(sign) && !LL_isEmpty(l) && *valid) {
2051
signType = VLH_getName(sign);
2152
paramType = VLH_getType(l);
2253
if(!(strcmp(signType,paramType) == 0)) {
23-
if((strcmp(paramType,"sub")==0)) {
24-
subRes = E_eval(P_parse(VLH_getString(l)), formalParameters, returns);
25-
if(subRes!=NULL) {
26-
if(!strcmp(signType,(const char*) *returns)==0) {
27-
printf("Wrong type in subexpression returns !\n");
28-
*valid = false;
29-
} else {
30-
VLH_setType(l, (const char*) *returns);
31-
VLH_setValue(l, subRes);
32-
}
33-
}
34-
} else {
35-
if((strcmp(paramType, "variable")==0)) {
36-
if(formalParameters != NULL) {
37-
varTmp = LL_find(formalParameters, VLH_getName(l), match);
38-
if(varTmp==NULL) {
39-
*valid = false;
40-
}
41-
VLH_setType(l, signType);
42-
VLH_setValue(l, varTmp->value);
43-
}
44-
} else {
45-
printf("Wrong types, expected : %s, got : %s \n", signType, paramType);
46-
*valid = false;
47-
}
54+
trySubExpression(paramType, signType, l, formalParameters, valid);
55+
tryVariable(paramType, signType, l, formalParameters, valid);
56+
if(!(*valid)) {
57+
printf("Wrong types, expected : '%s', got : '%s' \n", signType, paramType);
4858
}
4959
}
5060
l = LL_getNext(l);
@@ -66,8 +76,8 @@ void* E_eval(LinkedList l, LinkedList formalParameters, char** returns) {
6676
lt = LL_getNext(l);
6777
E_checkAndEval(act.args, lt, formalParameters, &valid);
6878
if(!act.standard) {
69-
LL_add(&lt, act.params);
70-
LL_add(&lt, act.sub);
79+
LL_add(&lt, (void*)act.params);
80+
LL_add(&lt, (void*)act.sub);
7181
}
7282
if(valid) {
7383
res = act.function(lt);
@@ -90,9 +100,9 @@ void tryPrintInt(const char* returns, void* result) {
90100
}
91101

92102
void tryPrintString(const char* returns, void* result) {
93-
if(strcmp(returns, "string")==0) {
94-
printf("%s\n", (char*)result);
95-
}
103+
if(strcmp(returns, "string")==0) {
104+
printf("%s\n", (char*)result);
105+
}
96106
}
97107

98108
void E_printResult(const char* returns, void* result) {

src/Identifiers.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,20 @@ void* print(LinkedList l) {
2727
}
2828

2929
void* call(LinkedList l) {
30+
char** returns = (char**)malloc(sizeof(char*));
3031
const char* sub = (const char*)LL_getValue(l);
3132
l = LL_getNext(l);
3233
const char* paramsString = (const char*)LL_getValue(l);
3334
l = LL_getNext(l);
3435
LinkedList params = P_parse(paramsString);
35-
LinkedList ltemp = l;
36-
while(!LL_isEmpty(ltemp)) {
37-
params->value = ltemp->value;
36+
LinkedList ltemp = params;
37+
while(!LL_isEmpty(l)) {
38+
VLH_setValue(ltemp, VLH_getValue(l));
39+
l = LL_getNext(l);
3840
ltemp = LL_getNext(ltemp);
3941
}
4042
LinkedList toEval = P_parse(sub);
41-
return E_eval(toEval, params, &sub);
43+
return E_eval(toEval, params, returns);
4244
}
4345

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

src/LinkedList.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,22 @@ bool LL_isEmpty(LinkedList l) {
55
return (l==NULL);
66
}
77

8+
LinkedList LL_getNext(LinkedList l) {
9+
return l->next;
10+
}
11+
12+
void* LL_getValue(LinkedList l) {
13+
return l->value;
14+
}
15+
16+
void LL_setValue(LinkedList l, void* value) {
17+
l->value = value;
18+
}
19+
20+
void LL_setNext(LinkedList l, LinkedList ln) {
21+
l->next = ln;
22+
}
23+
824
void LL_add(LinkedList* l, void* value) {
925
LinkedList ltemp = NULL;
1026
if(LL_isEmpty(*l)) {
@@ -29,19 +45,8 @@ void LL_free(LinkedList* l, void (*freeValue)(void*)) {
2945
}
3046
}
3147

32-
void LL_setNext(LinkedList l, LinkedList ln) {
33-
l->next = ln;
34-
}
35-
36-
LinkedList LL_getNext(LinkedList l) {
37-
return l->next;
38-
}
39-
40-
void* LL_getValue(LinkedList l) {
41-
return l->value;
42-
}
4348

44-
void* LL_find(LinkedList l,void* val, bool (*match)(void*, void*)) {
49+
void* LL_find(LinkedList l, void* val, bool (*match)(void*, void*)) {
4550
while(!LL_isEmpty(l)) {
4651
if(match(LL_getValue(l), val)) {
4752
return LL_getValue(l);

src/Parse.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ char* P_process_call(const char* word) {
100100
char* buf = NULL;
101101
int i,len;
102102
len = strlen(word);
103-
buf = (char*)malloc((len-1)*sizeof(char));
103+
buf = (char*)malloc((len-1)*sizeof(char));
104104
for(i=1; i<len; i++) {
105105
buf[i-1] = word[i];
106106
}

src/Vars.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#include "Vars.h"
22

3+
const char* V_getName(Var v) {
4+
return v.name;
5+
}
6+
37
Var VLH_getVar(LinkedList l) {
48
return *((Var*)LL_getValue(l));
59
}
@@ -20,6 +24,10 @@ char* VLH_getType(LinkedList l) {
2024
return (char*)((Var*)(LL_getValue(l)))->type;
2125
}
2226

27+
void* VLH_getValue(LinkedList l) {
28+
return (void*)((Var*)(LL_getValue(l)))->value;
29+
}
30+
2331
void VLH_setType(LinkedList l, const char* type) {
2432
((Var*)LL_getValue(l))->type = type;
2533
}

src/comp.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,6 @@
88
#include "Identifiers.h"
99
#include "Eval.h"
1010

11-
/*void printArgs(Operation op) {*/
12-
/*Link l = op.params;*/
13-
/*while(l!=NULL) {*/
14-
/*printf("%s\n", l->value);*/
15-
/*l = l->next;*/
16-
/*}*/
17-
/*}*/
18-
1911
void process(char *a) {
2012
LinkedList l;
2113
char** returns = (char**)malloc(sizeof(char*));
@@ -34,7 +26,7 @@ int main() {
3426
while(true) {
3527
a = readline("> ");
3628
process(a);
29+
free(a);
3730
}
38-
free(a);
3931
return EXIT_SUCCESS;
4032
}

0 commit comments

Comments
 (0)