|
@@ -96,16 +96,16 @@ boolean div_node(subdiv* sd, node* n) {
|
|
|
newn->end = n->end;
|
|
|
newn->length = n->length / 2;
|
|
|
newn->type = MEMEMPTY;
|
|
|
- newn->prev = n;
|
|
|
+ newn->prev = n->index;
|
|
|
newn->next = n->next;
|
|
|
//Modifie node suivant la nouvelle
|
|
|
- if (n->next != NULL) {
|
|
|
- n->next->prev = newn;
|
|
|
+ if (n->next != -1) {
|
|
|
+ sd->mem[n->next].prev = newn->index;
|
|
|
}
|
|
|
//Modifie node origine
|
|
|
n->end = n->start + (n->length / 2);
|
|
|
n->length /= 2;
|
|
|
- n->next = newn;
|
|
|
+ n->next = newn->index;
|
|
|
//Indique que la node est utilisé
|
|
|
sd->use[i] = true;
|
|
|
return true;
|
|
@@ -113,10 +113,10 @@ boolean div_node(subdiv* sd, node* n) {
|
|
|
|
|
|
boolean fusion_node(subdiv* sd, node* n) {
|
|
|
//Verif que la node et la node suivante sont vide
|
|
|
- if (!(n->type == MEMEMPTY && n->next != NULL && n->next->type == MEMEMPTY)) {
|
|
|
+ if (!(n->type == MEMEMPTY && n->next != -1 && sd->mem[n->next].type == MEMEMPTY)) {
|
|
|
return false;
|
|
|
}
|
|
|
- node* n2 = n->next;
|
|
|
+ node* n2 = &sd->mem[n->next];
|
|
|
//Verif qu'elles ont la meme taille
|
|
|
if (n->length != n2->length) {
|
|
|
return false;
|
|
@@ -125,8 +125,8 @@ boolean fusion_node(subdiv* sd, node* n) {
|
|
|
n->end = n2->end;
|
|
|
n->length *= 2;
|
|
|
n->next = n2->next;
|
|
|
- if (n2->next != NULL) {
|
|
|
- n2->next->prev = n;
|
|
|
+ if (n2->next != -1) {
|
|
|
+ sd->mem[n2->next].prev = n->index;
|
|
|
}
|
|
|
//Indique que l'autre node n'est plus utilisée
|
|
|
sd->use[n2->index] = false;
|
|
@@ -136,7 +136,7 @@ boolean fusion_node(subdiv* sd, node* n) {
|
|
|
/* --- Fonctions publiques --- */
|
|
|
|
|
|
void ini_subdiv(subdiv* sd) {
|
|
|
- sd->mem[0] = (node){0, 0, MEM_SIZE, MEM_SIZE, MEMEMPTY, NULL, NULL};
|
|
|
+ sd->mem[0] = (node){0, 0, MEM_SIZE, MEM_SIZE, MEMEMPTY, -1, -1};
|
|
|
sd->use[0] = true;
|
|
|
for (int i = 1; i < MEM_SIZE / 2; i++) {
|
|
|
sd->use[i] = false;
|
|
@@ -152,7 +152,12 @@ boolean add_data_subdiv(subdiv* sd, char* mem, char* key, char* data) {
|
|
|
if (n->type == MEMEMPTY && n->length >= length) {
|
|
|
break;
|
|
|
}
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
//Si plus de place
|
|
|
if (n == NULL) {
|
|
@@ -191,7 +196,12 @@ boolean add_fdata_subdiv(subdiv* sd, char* mem, char* data) {
|
|
|
if (n->type == MEMEMPTY && n->length >= length) {
|
|
|
break;
|
|
|
}
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
//Si plus de place
|
|
|
if (n == NULL) {
|
|
@@ -242,16 +252,31 @@ boolean remove_data_subdiv(subdiv* sd, char* mem, char* key) {
|
|
|
if (fusion_node(sd, n)) {
|
|
|
n = &sd->mem[0];
|
|
|
} else {
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
- } else if (n->prev->length != n->length) {
|
|
|
+ } else if (sd->mem[n->prev].length != n->length) {
|
|
|
if (fusion_node(sd, n)) {
|
|
|
n = &sd->mem[0];
|
|
|
} else {
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
} else {
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
@@ -261,7 +286,12 @@ void show_subdiv(subdiv* sd) {
|
|
|
node* n = &sd->mem[0];
|
|
|
while (n != NULL) {
|
|
|
printf("Deb : %d, Fin : %d, Length : %d, Real length : %d, Use : %d\n", n->start, n->end, n->length, n->end - n->start, (int) n->type);
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -278,7 +308,12 @@ void show_data_subdiv(subdiv* sd, char* mem){
|
|
|
printf("%s\n", str);
|
|
|
free(str);
|
|
|
}
|
|
|
- n = n->next;
|
|
|
+ //Charge le prochain noeud
|
|
|
+ if(n->next == -1){
|
|
|
+ n = NULL;
|
|
|
+ } else {
|
|
|
+ n = &sd->mem[n->next];
|
|
|
+ }
|
|
|
}
|
|
|
//Si vide
|
|
|
if(vide){
|