-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstackIf.c
133 lines (108 loc) · 3.37 KB
/
stackIf.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
* @file stackIf.c
* @author Jakub Vlk ([email protected])
* @brief Wrapper pro stack.
* Generates unique labels for jumps and memorizes state using stack
*/
#include "stackIf.h"
#define endlabelidIF "ENDE"
#define elseLbaelIdIF "ELSE"
#define endlabelidWHILE "WENDE"
#define startdWHILE "WSTART"
#define buffersize 100
genericStack *ifS_Init() {
genericStack *gs = gStackInit();
return gs;
}
void ifS_newIf(genericStack *stack) {
static int c = 0;
c++;
ifsState *is = malloc(sizeof(ifsState));
checkNullPointer(is);
// add unikátnost
char buff[buffersize] = {0};
sprintf(buff, "%d", c);
is->elselabel = dstrInitChar(elseLbaelIdIF);
dstrAppend(is->elselabel, buff);
is->endlabel = dstrInitChar(endlabelidIF);
dstrAppend(is->endlabel, buff);
is->startlabel = NULL;
is->isEndingGenerated = false;
is->inElse = false;
is->expectinElse = false;
is->inIfbranch = false;
is->type = if_type;
gStackPush(stack, is);
}
void ifS_newWhile(genericStack *stack) {
static int c = 0;
c++;
ifsState *is = malloc(sizeof(ifsState));
checkNullPointer(is);
// add unikátnost
char buff[buffersize] = {0};
sprintf(buff, "%d", c);
is->endlabel = dstrInitChar(endlabelidWHILE);
dstrAppend(is->endlabel, buff);
is->elselabel = is->endlabel;// else label is not use in while type
is->startlabel = dstrInitChar(startdWHILE);
dstrAppend(is->startlabel, buff);
is->inWhileBody = false;
is->endOfWhile;
is->type = while_type;
gStackPush(stack, is);
}
void ifS_old(genericStack *stack) {
gStackPop(stack);
}
dynStr_t *ifS_ending(genericStack *stack) {
return ((ifsState *) gStackTop(stack))->endlabel;
}
dynStr_t *ifS_else(genericStack *stack) {
return ((ifsState *) gStackTop(stack))->elselabel;
}
dynStr_t *ifS_start(genericStack *stack) {
return ((ifsState *) gStackTop(stack))->startlabel;
}
bool ifS_isEndingGenerated(genericStack *stack) {
if (gStackIsEmpty(stack)) {
return true;// znemaná že se negeneruje žádný if
}
return ((ifsState *) gStackTop(stack))->isEndingGenerated;
}
void ifS_isSetEndingGenerated(genericStack *stack, bool end) {
((ifsState *) gStackTop(stack))->isEndingGenerated = end;
}
bool ifS_expectingElse(genericStack *stack) {
if (gStackIsEmpty(stack)) {
return false;// znemaná že se negeneruje žádný if
}
return ((ifsState *) gStackTop(stack))->expectinElse;
}
void ifS_SetExpectingElse(genericStack *stack, bool end) {
((ifsState *) gStackTop(stack))->expectinElse = end;
}
bool ifS_inElse(genericStack *stack) {
if (gStackIsEmpty(stack)) {
return true;// znemaná že se negeneruje žádný if
}
return ((ifsState *) gStackTop(stack))->isEndingGenerated;
}
void ifS_SetsinElse(genericStack *stack, bool end) {
((ifsState *) gStackTop(stack))->isEndingGenerated = end;
}
bool ifS_inIfbranch(genericStack *stack) {
if (gStackIsEmpty(stack)) {
return false;// znemaná že se negeneruje žádný if
}
return ((ifsState *) gStackTop(stack))->inIfbranch;
}
void ifS_SetinIfbranch(genericStack *stack, bool end) {
((ifsState *) gStackTop(stack))->inIfbranch = end;
}
bool ifS_isEmpty(genericStack *stack) {
return gStackIsEmpty(stack);
}
typeOfIfStackMem ifs_getType(genericStack *stack) {
return ((ifsState *) gStackTop(stack))->type;
}