diff --git a/b-tree.c b/b-tree.c index ab56ae42dd0847bf0a2bb65ef1d5d5d9177003f2..19b1e39c3787cad1e778993e104f51efc9ea6354 100644 --- a/b-tree.c +++ b/b-tree.c @@ -19,7 +19,7 @@ b_tree create_node(){ } for(int i = 0; i < M; i++){ root->keys[i] = 0; - root->data[i] = create_P_and_val(NULL, 0); + root->data[i] = NULL; } root->count = 0; return root; @@ -49,6 +49,19 @@ void print_tree(b_tree tree, int depth){ } } +void list(b_tree node){ + while (!is_leaf(node)) { + node = node->children[0]; + } + while (node != NULL) { + for(int i = 0; i<node->count; i++){ + print_record(*node->data[i]); + printf("\n"); + } + node = node->children[M]; + } +} + void print_p_list(void** lst, int start ,int end, char* stater, char* separator, char* ender){ printf("%s", stater); for(int i = start; i < end-1; i++){ @@ -104,7 +117,7 @@ P_and_val split(b_tree node){ newNode->keys[i - M/2] = node->keys[i]; newNode->data[i - M/2] = node->data[i]; node->keys[i] = 0; - node->data[i] = create_P_and_val(NULL, 0); + node->data[i] = NULL; } // resize two nodes node->count = M/2; @@ -130,7 +143,7 @@ P_and_val split(b_tree node){ return create_P_and_val(newNode, pivot); } -P_and_val insert_into_node(b_tree node, uint64_t key, P_and_val data){ +P_and_val insert_into_node(b_tree node, uint64_t key, record_t* data){ int index = find_insertion_index(node->keys, node->count, key); // insert key and data into list their respective list @@ -150,7 +163,7 @@ P_and_val insert_into_node(b_tree node, uint64_t key, P_and_val data){ } } -P_and_val insert(b_tree tree, uint64_t key, P_and_val data){ +P_and_val insert(b_tree tree, uint64_t key, record_t* data){ P_and_val retenue = create_P_and_val(NULL, 0); if (is_leaf(tree)){ retenue = insert_into_node(tree, key, data); @@ -170,7 +183,7 @@ P_and_val insert(b_tree tree, uint64_t key, P_and_val data){ return retenue; } -b_tree insert_into_tree(b_tree tree, uint64_t key, P_and_val data){ +b_tree insert_into_tree(b_tree tree, uint64_t key, record_t* data){ P_and_val retenue = insert(tree, key, data); if(retenue.pointer != NULL){ b_tree newRoot = create_node(); @@ -183,7 +196,7 @@ b_tree insert_into_tree(b_tree tree, uint64_t key, P_and_val data){ return tree; } -P_and_val search(b_tree tree, uint64_t key){ +record_t* search(b_tree tree, uint64_t key){ int index = find_insertion_index(tree->keys, tree->count, key); if(!is_leaf(tree)){ return search(tree->children[index], key); @@ -194,7 +207,7 @@ P_and_val search(b_tree tree, uint64_t key){ return tree->data[index-1]; } else{ - return create_P_and_val(NULL, 0); + return NULL; } } } @@ -208,7 +221,7 @@ void free_b(b_tree node){ } } for(int i = 0; i < node->count; i++){ - record_t* data = node->data[i].pointer; + record_t* data = node->data[i]; if(data != NULL){ free(data); } diff --git a/b-tree.h b/b-tree.h index c499b4ee910c3d3191e2ce768b456dedfb4e40e9..2f57306df1ed2e79b8c8bf3177ad0e1f9706e707 100644 --- a/b-tree.h +++ b/b-tree.h @@ -15,7 +15,7 @@ typedef struct _P_and_val{ typedef struct _b_node{ struct _b_node* children[M+1]; uint64_t keys[M]; - P_and_val data[M]; + record_t* data[M]; int count; }b_node; @@ -24,14 +24,15 @@ typedef b_node* b_tree; P_and_val create_P_and_val(void* pointer, uint64_t val); b_tree create_node(); bool is_leaf(b_tree node); +void list(b_tree node); void print_node(b_tree node); void print_tree(b_tree tree, int depth); int find_insertion_index(uint64_t* lst, int size, uint64_t val); P_and_val split(b_tree node); -P_and_val insert_into_node(b_tree node, uint64_t key, P_and_val data); -P_and_val insert(b_tree tree, uint64_t key, P_and_val data); -b_tree insert_into_tree(b_tree tree, uint64_t key, P_and_val data); -P_and_val search(b_tree tree, uint64_t key); +P_and_val insert_into_node(b_tree node, uint64_t key, record_t* data); +P_and_val insert(b_tree tree, uint64_t key, record_t* data); +b_tree insert_into_tree(b_tree tree, uint64_t key, record_t* data); +record_t* search(b_tree tree, uint64_t key); void free_b(b_tree node); #endif \ No newline at end of file diff --git a/main.c b/main.c index 042f468cc414489b10d83e8b25b84b4c7c1e290c..7a8e6a00b44ab45d3eb614bb3f6b44fe5a4ce8ae 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include <openssl/sha.h> +#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> @@ -38,7 +39,7 @@ void write_database_to_disk(char* fileName, b_tree node){ } while (node != NULL) { for(int i = 0; i < node->count; i++){ - record_t* truc = node->data[i].pointer; + record_t* truc = node->data[i]; //print_record(*truc); fwrite(truc, sizeof(record_t), 1, f); } @@ -52,68 +53,112 @@ record_t* read_data_from_disk(char* fileName, int index){ FILE* f; f = fopen(fileName, "rb"); if(f == NULL){ + printf("Failed to open file\n"); assert(false); } + fseek(f, 0, SEEK_END); + unsigned long file_length = ftell(f); + //printf("%lu, %lu\n",file_length, index*sizeof(record_t)); + + if(file_length <= index*sizeof(record_t)){ + //printf("exit: %lu\n",index*sizeof(record_t)); + free(data); + return NULL; + } fseek(f, index*sizeof(record_t), SEEK_SET); fread(data, sizeof(record_t), 1, f); + //printf("%p\n", data); fclose(f); return data; } +b_tree import_b_tree_from_save(b_tree node, char* fileName){ + FILE* f; + f = fopen(fileName, "rb"); + if(f == NULL){ + printf("Failed to open file\n"); + assert(false); + } + int i = 0; + while (true) { + record_t* data = read_data_from_disk(fileName, i); + if(data == NULL){ + break; + } + insert_into_tree(node, record_hash(data), data); + i += 1; + } + return node; +} int main(){ - record_t* r0 = create_record(2000, 0, 0, "0", "daniel", "rodriguez"); - record_t* r1 = create_record(2001, 1, 1, "1", "pierre", "roden"); - record_t* r2 = create_record(2002, 2, 2, "2", "gagaetan", "siffert"); - record_t* r3 = create_record(2003, 3, 3, "3", "lucas", "tschaler"); - record_t* r4 = create_record(2004, 4, 4, "4", "antoine", "gilles"); - record_t* r5 = create_record(2005, 5, 5, "5", "william", "ho"); + b_tree node = create_node(); + char saveName[30]; + bool isSaving = false; + char choice; - //record_t* a = record_prompt(); - //record_t* b = record_prompt(); + printf("Bienvenue dans votre annuaire\n"); + printf("Voulez vous importer l'annuaire depuis un fichier local? [y/n]\n"); + scanf("%c", &choice); + flush_input(); - b_tree node = create_node(); - - node = insert_into_tree(node, record_hash(r0), create_P_and_val(r0, 0)); - node = insert_into_tree(node, record_hash(r1), create_P_and_val(r1, 0)); - node = insert_into_tree(node, record_hash(r2), create_P_and_val(r2, 0)); - node = insert_into_tree(node, record_hash(r3), create_P_and_val(r3, 0)); - node = insert_into_tree(node, record_hash(r4), create_P_and_val(r4, 0)); - node = insert_into_tree(node, record_hash(r5), create_P_and_val(r5, 0)); - print_tree(node, 0); - - write_database_to_disk("test.dat", node); - - record_t* s0 = search(node, record_hash(r0)).pointer;//daniel - if(s0 == NULL){ - printf("\n"); - printf("could not find\n"); + if(choice == 'y'){ + printf("Entrez le nom du fichier du fichier à importer(max 29 char)\n"); + scanf(" %29s", saveName); + flush_input(); + node = import_b_tree_from_save(node, saveName); + } + + while(true){ + printf("\nVoulez vous ajouter(a), rechercher(r), quitter(q), lister(l)?\n"); + + scanf("%c", &choice); + flush_input(); + while (choice != 'a' && choice != 'r' && choice != 'q' && choice != 'l'){ + printf("Cette commande n'est pas valide\n"); + printf("Voulez vous ajouter(a), rechercher(r), quitter(q) ?\n"); + scanf("%c", &choice); + flush_input(); + } + if(choice == 'a'){ + record_t* r = record_prompt(); + node = insert_into_tree(node, record_hash(r), r); + printf("Cette entrée à été ajoutée à l'annuaire\n"); + } + if(choice == 'r'){ + printf("Indiquer le numéro de téléphone de la personne que vous cherchez(max 9 char)\n"); + char tel[10]; + scanf(" %9s", tel); + flush_input(); + record_t* r = search(node, hash(tel)); + if(r == NULL){ + printf("Ce numéro n'est pas dans l'annuaire\n"); + } + else{ + printf("\n"); + print_record(*r); + } + } + if(choice == 'q'){ + printf("Avant de quitter vouler vous sauvegarder l'annuaire? [y/n]\n"); + scanf("%c", &choice); + flush_input(); + if(choice == 'y'){ + isSaving = true; + printf("Entrez le nom du fichier de sauvegarde à créer(max 29 char)\n"); + scanf(" %29s", saveName); + flush_input(); + } + break; + } + if(choice == 'l'){ + list(node); + } } - else{ - print_record(*s0); + if(isSaving){ + write_database_to_disk(saveName, node); } - printf("\n"); - record_t* s1 = search(node, record_hash(r2)).pointer;//gaetan - print_record(*s1); - printf("\n"); - record_t* s2 = search(node, record_hash(r4)).pointer;//antoine - print_record(*s2); - - /* - record_t* test = read_data_from_disk("test.dat", 0); - print_record(*test); - free(test); - printf("\n"); - record_t* test1 = read_data_from_disk("test.dat", 1); - print_record(*test1); - free(test1); - free(r0); - free(r1); - free(r2); - free(r3); - free(r4); - free(r5); - */ + free_b(node); return EXIT_SUCCESS; } \ No newline at end of file diff --git a/record.c b/record.c index e864e8821c7349cf2d6f020657f59cf7552a4052..809b5f764542bb249bd4a65b862332ff92802b94 100644 --- a/record.c +++ b/record.c @@ -29,95 +29,42 @@ record_t* create_record(uint16_t year, uint8_t month, uint8_t day, char phone[10 } void print_record(record_t record){ - printf("first name: %s\n", record.forename); - printf("last name: %s\n", record.surname); - printf("phone number: %s\n", record.phone); - printf("birth date: %hu-%hhu-%hhu\n", record.birth_date.year, record.birth_date.month, record.birth_date.day); + printf("\nprénom: %s\n", record.forename); + printf("nom de famille: %s\n", record.surname); + printf("numéro de teléphone: %s\n", record.phone); + printf("date de naissance: %hu-%hhu-%hhu\n", record.birth_date.year, record.birth_date.month, record.birth_date.day); } record_t* record_prompt(){ - printf("what is your first name ?\n"); + printf("\nentrez le prénom\n"); char first_name[20]; scanf(" %19s", first_name); flush_input(); - printf("what is your last name ?\n"); + printf("entrez le nom de famille\n"); char last_name[20]; scanf(" %19s", last_name); flush_input(); - printf("what is your phone number ?\n"); + printf("entrez le numéro de teléphone\n"); char phone[10]; scanf(" %9s", phone); flush_input(); - printf("what is your birth year ? (input as number)\n"); + printf("entrez l'année de naissance\n"); uint16_t year; scanf("%hu", &year); flush_input(); - printf("what is your birth month ? (input as number)\n"); + printf("entrez le mois de naissance (en chiffres)\n"); uint8_t month; scanf("%hhu", &month); flush_input(); - printf("what is your birth day ? (input as number)\n"); + printf("entrez le jour de naissance (en chiffres)\n"); uint8_t day; scanf("%hhu", &day); flush_input(); - + printf("\n"); return create_record(year, month, day, phone, first_name, last_name); -} - -/* -void handle_bounds(database_t* d, int index){ - if(index < 0 || index >= d->count){ - assert(0); - } -} - -database_t* create_database(){ - database_t* d = malloc(sizeof(database_t)); - d->size = 4; - d->count = 0; - d->data = malloc(d->size * sizeof(record_t)); - return d; -} - -void database_add(database_t* d, record_t* record){ - if(d->count >= d->size){ - d->size *= 2; - d->data = realloc(d->data, d->size * sizeof(record_t)); - } - d->data[d->count] = *record; - d->count += 1; -} - -void database_remove(database_t* v, int index){ - handle_bounds(v, index); - for(int i = index; i < v->count-1; i++){ - v->data[i] = v->data[i+1]; - } - - v->count -= 1; - if(v->count < 0){ - assert(0); - } - if(v->count < (v->size/4)){ - v->size /= 2; - v->data = realloc(v->data, v->size * sizeof(record_t)); - } -} - -void database_print(database_t* d){ - for(int i = 0; i < d->count; i++){ - print_record(d->data[i]); - printf("\n"); - } -} - -void database_free(database_t* d){ - free(d->data); - free(d); -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/record.h b/record.h index 14a2cd75c113c6165c8654565e11cb8cfa1fb77e..eb304e8e2331d54443187caa9e2fbe3750e6a61b 100644 --- a/record.h +++ b/record.h @@ -9,9 +9,9 @@ typedef struct _date{ }date_t; typedef struct _record{ - char phone[11]; - char forename[21]; - char surname[21]; + char phone[10]; + char forename[20]; + char surname[20]; date_t birth_date; }record_t; @@ -21,15 +21,10 @@ typedef struct _database{ int count; }database_t; +void flush_input(); date_t create_date(uint16_t year, uint8_t month, uint8_t day); record_t* create_record(uint16_t year, uint8_t month, uint8_t day, char phone[10], char first_name[20], char last_name[20]); record_t* record_prompt(); void print_record(record_t record); -database_t* create_database(); -void database_add(database_t* d, record_t* record); -void database_remove(database_t* v, int index); -void database_print(database_t* d); -void database_free(database_t* d); - #endif \ No newline at end of file