Explorar o código

:tada: Ajout arraylist

Arthur Brandao %!s(int64=6) %!d(string=hai) anos
pai
achega
50582aae9a
Modificáronse 4 ficheiros con 225 adicións e 2 borrados
  1. 149 0
      Serveur/arraylist.c
  2. 40 0
      Serveur/arraylist.h
  3. 34 1
      Serveur/main.c
  4. 2 1
      Serveur/makefile

+ 149 - 0
Serveur/arraylist.c

@@ -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;
+}

+ 40 - 0
Serveur/arraylist.h

@@ -0,0 +1,40 @@
+/* 
+ * File:   arraylist.h
+ * Author: Arthur Brandao
+ *
+ * Created on 14 novembre 2018
+ */
+
+#ifndef ARRAYLIST_H
+#define ARRAYLIST_H
+
+/* --- Include --- */
+#include "constante.h"
+
+/* --- Structure --- */
+typedef struct al_node al_node;
+struct al_node{
+    char* key;
+    char* val;
+    al_node* prev;
+    al_node* next;
+};
+typedef struct{
+    al_node* first;
+    al_node* last;
+    int size;
+}arraylist;
+
+/* --- Fonctions --- */
+void arraylist_ini(arraylist*);
+al_node* arraylist_add(arraylist*, char*, char*);
+al_node* arraylist_search(arraylist*, char*);
+char* arraylist_get(arraylist*, char*);
+int arraylist_getint(arraylist*, char*);
+double arraylist_getdouble(arraylist*, char*);
+void arraylist_delete(arraylist*, al_node*);
+boolean arraylist_remove(arraylist*, char*);
+void arraylist_clean(arraylist*);
+
+#endif /* ARRAYLIST_H */
+

+ 34 - 1
Serveur/main.c

@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "json.h"
+#include "arraylist.h"
 
 int parse(){
     char str[200];
@@ -87,7 +88,39 @@ int encode(){
     return 0;
 }
 
+int array_list(){
+    arraylist al;
+    arraylist_ini(&al);
+    arraylist_add(&al, "clef1", "val1");
+    arraylist_add(&al, "clef2", "val2");
+    arraylist_add(&al, "clef3", "val3");
+    arraylist_add(&al, "clef3", "val4");
+    for(al_node* aln = al.first; aln != NULL; aln = aln->next){
+        printf("%s: %s\n", aln->key, aln->val);
+    }
+    al_node* aln = arraylist_search(&al, "clef2");
+    printf("Search clef2  : %d\n", aln != NULL);
+    aln = arraylist_search(&al, "clef22");
+    printf("Search clef22 : %d\n-----\n", aln != NULL);
+    arraylist_remove(&al, "clef1");
+    arraylist_add(&al, "clef4", "val4");
+    for(al_node* aln = al.first; aln != NULL; aln = aln->next){
+        printf("%s: %s\n", aln->key, aln->val);
+    }
+    printf("Size : %d\n-----\n", al.size);
+    arraylist_remove(&al, "clef3");
+    for(al_node* aln = al.first; aln != NULL; aln = aln->next){
+        printf("%s: %s\n", aln->key, aln->val);
+    }
+    printf("Size : %d\n-----\n", al.size);
+    arraylist_clean(&al);
+    printf("Size : %d\n", al.size);
+    
+    return 0;
+}
+
 int main(){
     //return parse();
-    return encode();
+    //return encode();
+    return array_list();
 }

+ 2 - 1
Serveur/makefile

@@ -3,7 +3,7 @@
 #
 
 EXEC = main
-OBJETS = str.o json_parser.o json_encoder.o error.o
+OBJETS = str.o json_parser.o json_encoder.o error.o arraylist.o
 NOM_PROJET = Porjet Reseau
 
 #
@@ -92,4 +92,5 @@ str.o: str.c str.h
 json_parser.o: json_parser.c json.h str.h constante.h
 json_encoder.o: json_encoder.c json.h str.h constante.h
 error.o: error.c str.h error.h
+arraylist.o: arraylist.c str.h arraylist.h constante.h
 main.o: main.c json.h str.h constante.h