Projet-Systemes-Informatiques/table.c
2023-04-06 11:03:34 +02:00

86 lines
2.2 KiB
C

#include <table.h>
/*
Suppress variable dont la profondeur est plus grande
add element */
/* a avoir
tableau, length, esp, indexTab */
/* Fonction d'affichage des erreurs */
void error(char * mess){
printf("ERROR : %s\n", &mess);
exit(-1);
}
/* Récupérer l'addresse à partir du nom */
int getOffset(int esp, char* name, Symbol *tab, int endingIndex){
return (esp + getStruct(&tab, endingIndex, &name).offset);
}
/* Récupérer la structure d'un élement à partir du nom */
Symbol getStruct(Symbol* tab, int endingIndex, char* name){
for(int i=0; i < endingIndex; i++){
if (tab[i].name == name){
return tab[i];
}
}
error("No structure found");
}
/* Récupérer l'index d'une valeur dans le tableau*/
int getIndex(Symbol* tab, int endingIndex, char* name){
for(int i=0; i < endingIndex; i++){
if (strcmp(tab[i].name, &name) == 0){
return i;
}
}
error("No index found");
}
/* Toggle le init */
void toggleInit(char *name, Symbol *tab, int endingIndex){
tab[getIndex(&tab, endingIndex, &name)].init = true;
}
/* Ajoute un élément */
void addElement(Symbol *tab, int endingIndex, Symbol element){
if (endingIndex == 0){
tab[0] = element;
}
else {
tab[endingIndex].name = element.name;
tab[endingIndex].init = element.init;
tab[endingIndex].varType = element.varType;
tab[endingIndex].offset = initOffset(&tab, endingIndex -1);
tab[endingIndex].deep = element.deep;
}
endingIndex ++; // faudra la mettre en variable globale
}
/* Calcule l'offset à partir de l'offset de l'élément précédent */
int initOffset(Symbol *tab, int index){
int offset = 0;
switch (tab[index].varType){
case INT:
return (tab[index].offset + 1);
break;
case FLOAT:
return (tab[index].offset + 1);
break;
default:
error("Impossible to compute the nexw offset");
}
}
/* Supprimer un élément de la table des symboles */
suppressElement(Symbol *tab, int endingIndex, Symbol element){
for(int i = getIndex(&tab, endingIndex, element.name); i < (endingIndex - 1); i ++){
tab[i] = tab[i+1];
}
endingIndex --; // variable globale
}