16 void reallocFunctions(int newSize
){
17 functions
= realloc(functions
, newSize
* sizeof(Function
));
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
));
33 for (i
= maxVars
; i
< newSize
; i
++) {
34 globals
[i
].name
= NULL
;
35 globals
[i
].tname
= NULL
;
37 locals
[i
].name
= NULL
;
38 locals
[i
].tname
= NULL
;
47 for (i
= 0; i
< maxVars
; i
++){
49 free(locals
[i
].tname
);
50 locals
[i
].name
= NULL
;
51 locals
[i
].tname
= NULL
;
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
;
67 void clearFunctions(){
68 //destruktor - funkcie sa uz nebudu dat pridavat
70 while ((i
< maxFunctions
) && (functions
[i
].name
!= NULL
)) {
71 free(functions
[i
].name
);
74 functions
= realloc(functions
, 0);
78 void destroyVariables(){
82 int varLocal(char *name
){
84 for (i
= 0; i
< maxVars
; i
++){
85 if (locals
[i
].name
!= NULL
&& strcmp(locals
[i
].name
, name
) == 0){
92 char *varGlobal(char *name
){
94 for (i
= 0; i
< maxVars
; i
++){
95 if (globals
[i
].name
!= NULL
&& strcmp(globals
[i
].name
, name
) == 0){
96 return globals
[i
].tname
;
102 char *varGlobalNo(int i
){
107 return globals
[i
].tname
;
110 int varFunction(char *name
){
112 for (i
= 0; i
< maxFunctions
; i
++){
113 if (functions
[i
].name
!= NULL
&& strcmp(functions
[i
].name
, name
) == 0){
114 return functions
[i
].paramcount
;
120 int varFunctionCall(char *name
){
122 while ((pos
< maxCalls
) && (calls
[pos
].name
!= NULL
)){
123 if (strcmp(name
, calls
[pos
].name
) == 0){
124 return calls
[pos
].paramcountSize
;
132 void varInvalidFunctionCalls(char ***names
, int *n
){
133 char **invfns
= malloc(maxCalls
);
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
;
149 void addFunctionCall(char *name
, int paramcount
){
151 while ((pos
< maxCalls
)
152 && (calls
[pos
].name
!= NULL
)
153 && (strcmp(calls
[pos
].name
, name
) != 0)) {
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
));
162 for (i
= pos
; i
< newSize
; i
++){
163 calls
[i
].name
= NULL
;
164 calls
[i
].paramcountSize
= 0;
170 calls
[pos
].name
= strdup(name
);
175 (paramPos
< calls
[pos
].paramcountSize
)
176 && (calls
[pos
].paramcount
[paramPos
] != paramcount
))
181 if (paramPos
== calls
[pos
].paramcountSize
){
182 calls
[pos
].paramcountSize
++;
185 calls
[pos
].paramcount
[paramPos
] = paramcount
;
188 void pushVariable(char *name
, int isGlobal
){
201 while ((i
< maxVars
) && (vars
[i
].name
!= NULL
)) {
206 reallocVariables(maxVars
* 2 + 1);
207 //zmenili sa nam smerniky
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
){
236 while ((i
< maxFunctions
) && (functions
[i
].name
!= NULL
)) {
240 if (i
== maxFunctions
) {
241 reallocFunctions(maxFunctions
* 2 + 1);
244 functions
[i
].name
= strdup(name
);
246 functions
[i
].paramcount
= paramcount
;
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"));
278 varInvalidFunctionCalls(&nazvy, &n);
279 for (i = 0; i < n; i++){
280 printf("nespravne volana fcia %s\n", nazvy[i]);
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"));
296 printf("loc c %d\n", varLocal("c"));
297 printf("loc b %d\n", varLocal("b"));
298 printf("loc a %d\n", varLocal("a"));
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"));
310 while ((name = varGlobalNo(i++)) != NULL ){
311 printf("globalna iterovana %s\n", name);
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"));