|  | @@ -0,0 +1,149 @@
 | 
	
		
			
				|  |  | +/* 
 | 
	
		
			
				|  |  | + * File:   arraylist.c
 | 
	
		
			
				|  |  | + * Author: Arthur Brandao
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Created on 14 novembre 2018
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include <stdio.h>
 | 
	
		
			
				|  |  | +#include <stdlib.h>
 | 
	
		
			
				|  |  | +#include "str.h"
 | 
	
		
			
				|  |  | +#include "arraylist.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* --- Fonctions publiques --- */
 | 
	
		
			
				|  |  | +void arraylist_ini(arraylist* al){
 | 
	
		
			
				|  |  | +    al->first = NULL;
 | 
	
		
			
				|  |  | +    al->last = NULL;
 | 
	
		
			
				|  |  | +    al->size = 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +al_node* arraylist_add(arraylist* al, char* key, char* val){
 | 
	
		
			
				|  |  | +    int length;
 | 
	
		
			
				|  |  | +    al_node* aln;
 | 
	
		
			
				|  |  | +    //Regarde si la clef existe
 | 
	
		
			
				|  |  | +    if((aln = arraylist_search(al, key)) != NULL){
 | 
	
		
			
				|  |  | +        arraylist_delete(al, aln);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //Ajout des valeurs
 | 
	
		
			
				|  |  | +    aln = malloc(sizeof(al_node));
 | 
	
		
			
				|  |  | +    length = strlen(key);
 | 
	
		
			
				|  |  | +    aln->key = malloc(sizeof(char) * (length + 1));
 | 
	
		
			
				|  |  | +    memset(aln->key, 0, length + 1);
 | 
	
		
			
				|  |  | +    strncpy(aln->key, key, length);
 | 
	
		
			
				|  |  | +    length = strlen(val);
 | 
	
		
			
				|  |  | +    aln->val = malloc(sizeof(char) * (length + 1));
 | 
	
		
			
				|  |  | +    memset(aln->val, 0, length + 1);
 | 
	
		
			
				|  |  | +    strncpy(aln->val, val, length);
 | 
	
		
			
				|  |  | +    //Lien entre les noeuds
 | 
	
		
			
				|  |  | +    aln->next = NULL;
 | 
	
		
			
				|  |  | +    if (al->first == NULL) {
 | 
	
		
			
				|  |  | +        aln->prev = NULL;
 | 
	
		
			
				|  |  | +        al->first = aln;
 | 
	
		
			
				|  |  | +        al->last = aln;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        aln->prev = al->last;
 | 
	
		
			
				|  |  | +        al->last->next = aln;
 | 
	
		
			
				|  |  | +        al->last = aln;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    al->size++;
 | 
	
		
			
				|  |  | +    return aln;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +al_node* arraylist_search(arraylist* al, char* key){
 | 
	
		
			
				|  |  | +    //Liste vide
 | 
	
		
			
				|  |  | +    if(al->first == NULL){
 | 
	
		
			
				|  |  | +        return NULL;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //Cherche dans la liste
 | 
	
		
			
				|  |  | +    al_node* aln = al->first;
 | 
	
		
			
				|  |  | +    int length = strlen(aln->key) + 1;
 | 
	
		
			
				|  |  | +    while (aln != NULL) {
 | 
	
		
			
				|  |  | +        if (strncmp(aln->key, key, length) == 0) {
 | 
	
		
			
				|  |  | +            return aln;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        aln = aln->next;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return NULL;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +char* arraylist_get(arraylist* al, char* key){
 | 
	
		
			
				|  |  | +    al_node* aln = arraylist_search(al, key);
 | 
	
		
			
				|  |  | +    if(aln == NULL){
 | 
	
		
			
				|  |  | +        return NULL;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return aln->val;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int arraylist_getint(arraylist* al, char* key){
 | 
	
		
			
				|  |  | +    al_node* aln = arraylist_search(al, key);
 | 
	
		
			
				|  |  | +    if(aln == NULL){
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return atoi(aln->val);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +double arraylist_getdouble(arraylist* al, char* key){
 | 
	
		
			
				|  |  | +    al_node* aln = arraylist_search(al, key);
 | 
	
		
			
				|  |  | +    if(aln == NULL){
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return atof(aln->val);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void arraylist_delete(arraylist* al, al_node* aln){
 | 
	
		
			
				|  |  | +    //Liste vide
 | 
	
		
			
				|  |  | +    if(al->first == NULL){
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //Si 1er et seul
 | 
	
		
			
				|  |  | +    if (aln->prev == NULL && aln->next == NULL) {
 | 
	
		
			
				|  |  | +        al->first = NULL;
 | 
	
		
			
				|  |  | +        al->last = NULL;
 | 
	
		
			
				|  |  | +    }        
 | 
	
		
			
				|  |  | +    //Si 1er et non seul
 | 
	
		
			
				|  |  | +    else if (aln->prev == NULL && aln->next != NULL) {
 | 
	
		
			
				|  |  | +        aln->next->prev = NULL;
 | 
	
		
			
				|  |  | +        al->first = aln->next;
 | 
	
		
			
				|  |  | +    }        
 | 
	
		
			
				|  |  | +    //Si dernier
 | 
	
		
			
				|  |  | +    else if (aln->next == NULL) {
 | 
	
		
			
				|  |  | +        aln->prev->next = NULL;
 | 
	
		
			
				|  |  | +        al->last = aln->prev;
 | 
	
		
			
				|  |  | +    }        
 | 
	
		
			
				|  |  | +    //Sinon si il est au milieu
 | 
	
		
			
				|  |  | +    else {
 | 
	
		
			
				|  |  | +        aln->prev->next = aln->next;
 | 
	
		
			
				|  |  | +        aln->next->prev = aln->prev;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //Free
 | 
	
		
			
				|  |  | +    free(aln->key);
 | 
	
		
			
				|  |  | +    free(aln->val);
 | 
	
		
			
				|  |  | +    free(aln);
 | 
	
		
			
				|  |  | +    al->size--;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +boolean arraylist_remove(arraylist* al, char* key){
 | 
	
		
			
				|  |  | +    al_node* aln = arraylist_search(al, key);
 | 
	
		
			
				|  |  | +    if(aln == NULL){
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    arraylist_delete(al, aln);
 | 
	
		
			
				|  |  | +    return true;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void arraylist_clean(arraylist* al){
 | 
	
		
			
				|  |  | +    //Liste vide
 | 
	
		
			
				|  |  | +    if(al->first == NULL){
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    //Vide liste
 | 
	
		
			
				|  |  | +    al_node* tmp, * aln = al->first;
 | 
	
		
			
				|  |  | +    while (aln != NULL) {
 | 
	
		
			
				|  |  | +        tmp = aln->next;
 | 
	
		
			
				|  |  | +        arraylist_delete(al, aln);
 | 
	
		
			
				|  |  | +        aln = tmp;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    al->first = NULL;
 | 
	
		
			
				|  |  | +    al->last = NULL;
 | 
	
		
			
				|  |  | +    al->size = 0;
 | 
	
		
			
				|  |  | +}
 |