Fix brainf*ck interpreter memory issue
[bob_language.git] / tables.c
blob99be26e6fc83c8271b5104293007de4ac08406c9
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
6 #include "tables.h"
8 int maxVars = 0;
9 Variable *globals;
10 Variable *locals;
11 int maxFunctions = 0;
12 Function *functions;
13 int maxCalls = 0;
14 Call *calls;
16 void reallocFunctions(int newSize){
17 functions = realloc(functions, newSize * sizeof(Function));
19 int i;
20 for (i = maxFunctions; i < newSize; i++) {
21 functions[i].name = NULL;
22 functions[i].paramcount= 0;
25 maxFunctions = newSize;
28 void reallocVariables(int newSize){
29 globals = realloc(globals, newSize * sizeof(Variable));
30 locals = realloc(locals, newSize * sizeof(Variable));
32 int i;
33 for (i = maxVars; i < newSize; i++) {
34 globals[i].name = NULL;
35 globals[i].tname = NULL;
36 globals[i].pos = 0;
37 locals[i].name = NULL;
38 locals[i].tname = NULL;
39 locals[i].pos= 0;
42 maxVars = newSize;
45 void clearLocals(){
46 int i;
47 for (i = 0; i < maxVars; i++){
48 free(locals[i].name);
49 free(locals[i].tname);
50 locals[i].name = NULL;
51 locals[i].tname = NULL;
52 locals[i].pos = 0;
56 void clearGlobals(){
57 int i;
58 for (i = 0; i < maxVars; i++){
59 free(globals[i].name);
60 free(globals[i].tname);
61 globals[i].name = NULL;
62 globals[i].tname = NULL;
63 globals[i].pos = 0;
67 void clearFunctions(){
68 //destruktor - funkcie sa uz nebudu dat pridavat
69 int i = 0;
70 while ((i < maxFunctions) && (functions[i].name != NULL)) {
71 free(functions[i].name);
72 i++;
74 functions = realloc(functions, 0);
75 maxFunctions = 0;
78 void destroyVariables(){
79 reallocVariables(0);
82 int varLocal(char *name){
83 int i;
84 for (i = 0; i < maxVars; i++){
85 if (locals[i].name != NULL && strcmp(locals[i].name, name) == 0){
86 return locals[i].pos;
89 return -1;
92 char *varGlobal(char *name){
93 int i;
94 for (i = 0; i < maxVars; i++){
95 if (globals[i].name != NULL && strcmp(globals[i].name, name) == 0){
96 return globals[i].tname;
99 return NULL;
102 char *varGlobalNo(int i){
103 if (maxVars <= i){
104 return NULL;
107 return globals[i].tname;
110 int varFunction(char *name){
111 int i;
112 for (i = 0; i < maxFunctions; i++){
113 if (functions[i].name != NULL && strcmp(functions[i].name, name) == 0){
114 return functions[i].paramcount;
117 return -1;
120 int varFunctionCall(char *name){
121 int pos = 0;
122 while ((pos < maxCalls) && (calls[pos].name != NULL)){
123 if (strcmp(name, calls[pos].name) == 0){
124 return calls[pos].paramcountSize;
126 pos++;
129 return 0;
132 void varInvalidFunctionCalls(char ***names, int *n){
133 char **invfns = malloc(maxCalls);
134 int i = 0;
135 int pos = 0;
136 while ( (i < maxCalls) && (calls[i].name != NULL) ){
137 if ((calls[i].paramcountSize > 1)
138 || (calls[i].paramcount[0] != varFunction(calls[i].name))
139 || (varFunction(calls[i].name) == -1)){
140 invfns[pos++] = calls[i].name;
142 i++;
145 *names = invfns;
146 *n = pos;
149 void addFunctionCall(char *name, int paramcount){
150 int pos = 0;
151 while ((pos < maxCalls)
152 && (calls[pos].name != NULL)
153 && (strcmp(calls[pos].name, name) != 0)) {
154 pos++;
157 if (pos == maxCalls) {
158 //uz ma nebavilo pisat novu funkciu na zvacsenie a vynulovanie
159 int newSize = (maxCalls + 1) * 2;
160 calls = realloc(calls, newSize * sizeof(Call));
161 int i;
162 for (i = pos; i < newSize; i++){
163 calls[i].name = NULL;
164 calls[i].paramcountSize = 0;
167 maxCalls = newSize;
170 calls[pos].name = strdup(name);
172 //fuj
173 int paramPos = 0;
174 while (
175 (paramPos < calls[pos].paramcountSize)
176 && (calls[pos].paramcount[paramPos] != paramcount))
178 paramPos++;
181 if (paramPos == calls[pos].paramcountSize){
182 calls[pos].paramcountSize++;
185 calls[pos].paramcount[paramPos] = paramcount;
188 void pushVariable(char *name, int isGlobal){
189 Variable *vars;
190 char *prefix;
191 if (isGlobal){
192 vars = globals;
193 prefix = "glb";
194 } else {
195 vars = locals;
196 prefix = "loc";
200 int i = 0;
201 while ((i < maxVars) && (vars[i].name != NULL)) {
202 i++;
205 if (i == maxVars) {
206 reallocVariables(maxVars * 2 + 1);
207 //zmenili sa nam smerniky
208 if (isGlobal){
209 vars = globals;
210 } else {
211 vars = locals;
215 vars[i].pos = i;
217 vars[i].name = strdup(name);
219 vars[i].tname = malloc(sizeof(char) * (strlen(name) + strlen(prefix) + 1));
220 strcpy(vars[i].tname, prefix);
221 strcat(vars[i].tname, name);
225 void addLocal(char *name){
226 pushVariable(name, 0);
229 void addGlobal(char *name){
230 pushVariable(name, 1);
233 void addFunction(char *name, int paramcount){
235 int i = 0;
236 while ((i < maxFunctions) && (functions[i].name != NULL)) {
237 i++;
240 if (i == maxFunctions) {
241 reallocFunctions(maxFunctions * 2 + 1);
244 functions[i].name = strdup(name);
246 functions[i].paramcount = paramcount;
251 int main(){
252 int i;
254 addFunctionCall("macka", 3);
255 addFunctionCall("kacka", 3);
256 addFunctionCall("kacka", 1);
257 addFunctionCall("huska", 3);
258 addFunctionCall("macka", 1);
259 addFunctionCall("macka", 3);
260 addFunctionCall("kacka", 2);
261 addFunctionCall("macka", 3);
262 addFunctionCall("kacka", 4);
263 addFunctionCall("1", 3);
264 addFunctionCall("1", 3);
265 addFunctionCall("2", 3);
266 addFunctionCall("2", 4);
267 addFunctionCall("3", 3);
268 addFunctionCall("4", 3);
269 addFunctionCall("5", 3);
270 addFunctionCall("6", 3);
271 printf("pocty argumentov pre kacka: %d\n", varFunctionCall("kacka"));
272 printf("pocty argumentov pre macka: %d\n", varFunctionCall("macka"));
273 printf("pocty argumentov pre huska: %d\n", varFunctionCall("huska"));
274 printf("pocty argumentov pre neni: %d\n", varFunctionCall("neni"));
276 int n;
277 char **nazvy;
278 varInvalidFunctionCalls(&nazvy, &n);
279 for (i = 0; i < n; i++){
280 printf("nespravne volana fcia %s\n", nazvy[i]);
283 return 0;
285 addLocal("a");
286 addLocal("b");
287 addLocal("c");
288 printf("loc a %d\n", varLocal("a"));
289 printf("loc b %d\n", varLocal("b"));
290 printf("loc c %d\n", varLocal("c"));
291 printf("loc d %d\n", varLocal("d"));
292 clearLocals();
293 addLocal("c");
294 addLocal("b");
295 addLocal("a");
296 printf("loc c %d\n", varLocal("c"));
297 printf("loc b %d\n", varLocal("b"));
298 printf("loc a %d\n", varLocal("a"));
300 addGlobal("A");
301 addGlobal("B");
302 addGlobal("C");
303 printf("glob A %s\n", varGlobal("A"));
304 printf("glob B %s\n", varGlobal("B"));
305 printf("glob C %s\n", varGlobal("C"));
306 printf("glob D %s\n", varGlobal("D"));
308 char *name;
309 i = 0;
310 while ((name = varGlobalNo(i++)) != NULL ){
311 printf("globalna iterovana %s\n", name);
314 return 0;
316 addFunction("kacka", 2);
317 addFunction("macka", 2);
318 addFunction("frantisek", 3);
319 addFunction("fero", 0);
321 printf("fero: %d\n", varFunction("fero"));
322 printf("frantisek: %d\n", varFunction("frantisek"));
323 printf("kacka: %d\n", varFunction("kacka"));
324 addFunction("macka1", 2);
325 addFunction("macka11", 2);
326 printf("fero: %d\n", varFunction("fero"));
327 printf("frantisek: %d\n", varFunction("frantisek"));
328 printf("kacka: %d\n", varFunction("kacka"));
329 printf("neni: %d\n", varFunction("neni"));