From 1d3f8f3b323cc4affa50e4803248750a77989d1d Mon Sep 17 00:00:00 2001 From: lpaucot_uclouvain <laurent.paucot@student.uclouvain.be> Date: Tue, 21 Apr 2020 05:57:03 +0200 Subject: [PATCH] Projet_M2 - format inginious --- Projet_M2/Makefile | 32 ++ Projet_M2/README.md | 14 + Projet_M2/Test_files/empty_input.txt | 0 Projet_M2/Test_files/expected_output.txt | 100 ++++ Projet_M2/Test_files/input.txt | 100 ++++ .../Test_files/short_expected_output.txt | 1 + Projet_M2/Test_files/short_input.txt | 1 + Projet_M2/run.c | 451 ++++++++++++++++++ Projet_M2/run.h | 73 +++ Projet_M2/test.c | 193 ++++++++ 10 files changed, 965 insertions(+) create mode 100644 Projet_M2/Makefile create mode 100644 Projet_M2/README.md create mode 100644 Projet_M2/Test_files/empty_input.txt create mode 100644 Projet_M2/Test_files/expected_output.txt create mode 100644 Projet_M2/Test_files/input.txt create mode 100644 Projet_M2/Test_files/short_expected_output.txt create mode 100644 Projet_M2/Test_files/short_input.txt create mode 100755 Projet_M2/run.c create mode 100644 Projet_M2/run.h create mode 100644 Projet_M2/test.c diff --git a/Projet_M2/Makefile b/Projet_M2/Makefile new file mode 100644 index 0000000..4452c51 --- /dev/null +++ b/Projet_M2/Makefile @@ -0,0 +1,32 @@ +all : fact + +fact : run.o test.o + gcc -g -std=c99 -o fact run.o test.o -lpthread -I${HOME}/local/include -lcunit -L${HOME}/local/lib + + + + +run.o : run.c + gcc -g -std=c99 -o run.o -c run.c -W -Wall -lpthread + + +test.o : test.c run.h + gcc -g -std=c99 -o test.o -c test.c -I${HOME}/local/include -W -Wall -lcunit -lpthread + + +clean : + rm -rf fact *.o *.xml "actual_output.txt" + + +test : fact + ./fact Test + +cpp : run.c + cppcheck --enable=all run.c + +val : fact + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./fact Test_files/short_input.txt output.txt + + + + diff --git a/Projet_M2/README.md b/Projet_M2/README.md new file mode 100644 index 0000000..29eaaa3 --- /dev/null +++ b/Projet_M2/README.md @@ -0,0 +1,14 @@ +# lepl1503-2020-groupe-M2 + +Pour compiler le programme : make fact + +Pour exécuter le fichier exécutable fact : ./fact [-N nombre_de_threads] input output + +Pour compiler et tester (suite de tests unitaires) le programme : make test + +Pour compiler et effectuer une analyse avec "Valgrind" : make val + +Pour effectuer une analyse avec "cppcheck" : make cpp + +Pour nettoyer les fichiers auxiliaires générés et l'exécutable : make clean + diff --git a/Projet_M2/Test_files/empty_input.txt b/Projet_M2/Test_files/empty_input.txt new file mode 100644 index 0000000..e69de29 diff --git a/Projet_M2/Test_files/expected_output.txt b/Projet_M2/Test_files/expected_output.txt new file mode 100644 index 0000000..ad8abbb --- /dev/null +++ b/Projet_M2/Test_files/expected_output.txt @@ -0,0 +1,100 @@ +666343 7487 89 +463698 277 31 3 2 +1021406 7193 71 2 +506156 18077 7 2 +913231 1361 61 11 +268205 97 79 7 5 +982865 15121 13 5 +917451 101939 3 +499176 2311 3 2 +529973 +746782 5573 67 2 +276324 23027 3 2 +435465 9677 5 3 +352649 32059 11 +104121 503 23 3 +981518 113 101 43 2 +413102 206551 2 +880413 283 61 17 3 +676364 13007 13 2 +804603 4003 67 3 +1012028 2239 113 2 +364381 787 463 +780260 3001 13 5 2 +907169 +142193 +408465 313 29 5 3 +266175 13 7 5 3 +171413 15583 11 +518652 14407 3 2 +770297 293 239 11 +134273 191 37 19 +638327 +826830 9187 5 3 2 +220605 191 11 7 5 3 +162237 1319 41 3 +53202 8867 3 2 +494421 5683 29 3 +309475 12379 5 +361113 120371 3 +1033840 12923 5 2 +319499 +981506 1367 359 2 +404743 10939 37 +897560 1181 19 5 2 +1023027 3187 107 3 +354480 211 7 5 3 2 +793492 1667 17 7 2 +102802 1049 7 2 +843491 6971 11 +983760 4099 5 3 2 +404152 1031 7 2 +283682 881 23 7 2 +526652 2687 7 2 +1018 509 2 +324508 2617 31 2 +103308 8609 3 2 +9422 673 7 2 +793590 3779 7 5 3 2 +241316 61 43 23 2 +132914 66457 2 +978150 6521 5 3 2 +725819 38201 19 +828636 347 199 3 2 +224489 7741 29 +431210 107 31 13 5 2 +705190 727 97 5 2 +470751 4241 37 3 +182145 12143 5 3 +728190 31 29 5 3 2 +3574 1787 2 +813793 1933 421 +17035 3407 5 +795384 11047 3 2 +534134 5039 53 2 +498463 71209 7 +385529 197 103 19 +624262 683 457 2 +697671 89 67 13 3 +613191 204397 3 +866262 409 353 3 2 +58631 +290417 3499 83 +901545 60103 5 3 +86993 +607222 3943 11 7 2 +437288 1163 47 2 +122029 +840703 +647460 109 11 5 3 2 +42875 7 5 +135229 499 271 +1033268 258317 2 +361034 1861 97 2 +916343 39841 23 +739080 2053 5 3 2 +975089 +82667 6359 13 +670049 +640632 26693 3 2 +950453 163 17 7 diff --git a/Projet_M2/Test_files/input.txt b/Projet_M2/Test_files/input.txt new file mode 100644 index 0000000..7523475 --- /dev/null +++ b/Projet_M2/Test_files/input.txt @@ -0,0 +1,100 @@ +666343 +463698 +1021406 +506156 +913231 +268205 +982865 +917451 +499176 +529973 +746782 +276324 +435465 +352649 +104121 +981518 +413102 +880413 +676364 +804603 +1012028 +364381 +780260 +907169 +142193 +408465 +266175 +171413 +518652 +770297 +134273 +638327 +826830 +220605 +162237 +53202 +494421 +309475 +361113 +1033840 +319499 +981506 +404743 +897560 +1023027 +354480 +793492 +102802 +843491 +983760 +404152 +283682 +526652 +1018 +324508 +103308 +9422 +793590 +241316 +132914 +978150 +725819 +828636 +224489 +431210 +705190 +470751 +182145 +728190 +3574 +813793 +17035 +795384 +534134 +498463 +385529 +624262 +697671 +613191 +866262 +58631 +290417 +901545 +86993 +607222 +437288 +122029 +840703 +647460 +42875 +135229 +1033268 +361034 +916343 +739080 +975089 +82667 +670049 +640632 +950453 diff --git a/Projet_M2/Test_files/short_expected_output.txt b/Projet_M2/Test_files/short_expected_output.txt new file mode 100644 index 0000000..a0778eb --- /dev/null +++ b/Projet_M2/Test_files/short_expected_output.txt @@ -0,0 +1 @@ +981518 113 101 43 2 diff --git a/Projet_M2/Test_files/short_input.txt b/Projet_M2/Test_files/short_input.txt new file mode 100644 index 0000000..aec1a34 --- /dev/null +++ b/Projet_M2/Test_files/short_input.txt @@ -0,0 +1 @@ +981518 diff --git a/Projet_M2/run.c b/Projet_M2/run.c new file mode 100755 index 0000000..96ead20 --- /dev/null +++ b/Projet_M2/run.c @@ -0,0 +1,451 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/stat.h> + +#include <pthread.h> +#include <semaphore.h> + +int N; +//travailler avec des linkendList +typedef struct node{ + unsigned long long value; + struct node *next; +}node_t; + +typedef struct queue{ + struct node *tail; + int size; + int final; +}queue_t; + +struct buffer_rc{ + char *tab[8]; + int size; + int len; + int head; + int tail; + int stop; + FILE *file1; +}; + + +struct buffer_cw +{ + queue_t *tab[8]; + int size; + int len; + int head; + int tail; + int stop; + FILE *file2; +}; + +struct buffer_rccw{ + struct buffer_rc *struct1; + struct buffer_cw *struct2; +}; + +/* sémaphore est une structure de donné qui contient : + *un entier qui stocke la valeur, positive ou nulle du sémaphore. + *une queue qui contient les pointeurs vers les threads +*/ +pthread_mutex_t mutex1; +sem_t empty1; +sem_t full1; + +pthread_mutex_t mutex2; +sem_t empty2; +sem_t full2; + + +void put_in_buffer_1(char *c, struct buffer_rc *ptr){ //ajouter un element dans le buffer 1 + + ptr->tab[ptr->head] = malloc(sizeof(c)); // on stoxke de espace + //ptr->tab[ptr->head] = c; + strcpy(ptr->tab[ptr->head],c); //copie + + ptr->len++; // augmente l'espace occupé par le buffer + ptr->head = (ptr->head + 1)%ptr->size; //chaque fois qu'un élément est ajouté, + //on augmente le pointeur de 1 mais l'espace du buffer est de 8 donc faire un modulo + +} + +char *get_from_buffer_1(struct buffer_rc *ptr){ // chercher dans le buffer 1 + char *result; + result = ptr->tab[ptr->tail]; // donne un valeur a result + //free(ptr->tab[ptr->tail]); + ptr->tab[ptr->tail] = NULL; + ptr->len--; //diminue l'espace occupé par le buffer + ptr->tail = (ptr->tail + 1)%ptr->size; + + return result; +} + +void put_in_buffer_2(struct queue *ptr, struct buffer_cw *buf){ //ajouter un element dans le buffer 2 + + buf->tab[buf->head] = ptr; + buf->len++; //augmenté l'espace occupé par le buffer + buf->head = (buf->head + 1)%buf->size; +} + +queue_t *get_from_buffer_2(struct buffer_cw *buf){ // trouver un element + //printf("%d\n",buf->len); + struct queue *result; + result = buf->tab[buf->tail]; //donne une valeur a result + buf->len--; //diminue l'espace occupé par le buffer + buf->tail = (buf->tail + 1)%buf->size; + + return result; +} + + +int is_div(unsigned long long number, unsigned long long i) { // Vérifie si i est un diviseur de number. + return (number % i == 0) ; // revoi 0 si le nombre n'est pas divisible par i et 1 si il est divisible +} + + +int is_prime(unsigned long long number) { // Vérifie si number est un nombre premier. Return 1 si il est premier, 0 sinon + if (number != 2) { + if (number % 2 == 0) { + return 0 ; + } + } + for (unsigned long long i = 3 ; i <= (number/2); i = i + 2) { //regarde les differents nombres pouvant etre diviser number + if (is_div(number,i) != 0) { // si i peut diviser number + return 0 ; //renvoi 0 => FAUX + } + } + return 1 ; //sinon => VRAI +} + + +void enqueue(queue_t* q, unsigned long long val){ + + + struct node *ptr; + ptr = malloc(sizeof(node_t)); + if (ptr == NULL){ + free(ptr); + return;} + ptr -> value = val; + ptr -> next = malloc(sizeof(node_t)); + + if (q->size == 0) + { + *q->tail = *ptr; + *ptr->next = *ptr; + } + else{ + *ptr->next = *q->tail->next; + *q->tail->next = *ptr; + } + q->size++; + //return q; + //free(ptr->next); + free(ptr); + +} + + +queue_t* prime_divs(unsigned long long number){ + + struct queue new_queue; + new_queue.size = 0; + new_queue.final = 0; + new_queue.tail = malloc(sizeof(node_t)); + if(new_queue.tail==NULL){return NULL;} + + struct queue *ptr; + ptr = malloc(sizeof(queue_t)); + if (ptr == NULL){ + free(new_queue.tail); + free(ptr); + return NULL;} + *ptr = new_queue; + + for (unsigned long long i = 2; i <= number/2; i++){ + if (is_div(number, i) && is_prime(i) == 1){ + enqueue(ptr,i); + } + } + enqueue(ptr,number); + + return ptr; + +} + +void *writing(void *param){ + + struct buffer_cw *param1 = (struct buffer_cw *) param; + int stop = 0; + + while(param1->stop == 0){ + + sem_wait(&full2); + pthread_mutex_lock(&mutex2); + queue_t *pr_divs = get_from_buffer_2(param); + pthread_mutex_unlock(&mutex2); + sem_post(&empty2); + + if (pr_divs->final == 1) + { + //printf("final : %d\n",pr_divs->final); + if (stop == N-1){ + free(pr_divs); + return NULL; + } + free(pr_divs); + stop++; + } + else{ + + + FILE *file2 = param1->file2; + + struct node *current; + current = malloc(sizeof(node_t)); + if (current == NULL){return NULL;} + *current = *pr_divs->tail; + current = current->next; + + fprintf(file2,"%llu",current->value); + current = current->next; + + for (int i = 1; i < pr_divs->size; i++) + { + fprintf(file2," %llu",current->value); + current = current->next; + } + fputc('\n',file2); + + free(current); + } + + + } + + return NULL; +} + +void *calculating(void *param){ + + struct buffer_rccw *param1 = (struct buffer_rccw *) param; + + struct buffer_rc *buffer_1 = param1->struct1; + struct buffer_cw *buffer_2 = param1->struct2; + + while(buffer_1->stop == 0){ + + sem_wait(&full1); + pthread_mutex_lock(&mutex1); + char *chaine = get_from_buffer_1(buffer_1); + pthread_mutex_unlock(&mutex1); + sem_post(&empty1); + + if (strcmp("stop",chaine) == 0) + { + struct queue *final; + final = malloc(sizeof(queue_t)); + if (final == NULL){return NULL;} + + final->final = 1; + + sem_wait(&empty2); + pthread_mutex_lock(&mutex2); + put_in_buffer_2(final,buffer_2); + pthread_mutex_unlock(&mutex2); + sem_post(&full2); + + return NULL; + } + + + struct queue *pr_divs; + pr_divs = malloc(sizeof(queue_t)); + if (pr_divs == NULL){return NULL;} + + pr_divs = prime_divs(strtoll(chaine,NULL,0)); + + sem_wait(&empty2); + pthread_mutex_lock(&mutex2); + put_in_buffer_2(pr_divs,buffer_2); + pthread_mutex_unlock(&mutex2); + sem_post(&full2); + + + free(pr_divs->tail); + free(pr_divs); + + + } + + return NULL; +} + +void *reading (void *param){ + + struct buffer_rc *param1= (struct buffer_rc *) param; + + char chaine[30]; + + FILE *input; + //input = malloc(sizeof(FILE*)); + input = param1->file1; + + while (fgets(chaine,30,input) != NULL){ + + sem_wait(&empty1); + pthread_mutex_lock(&mutex1); + + put_in_buffer_1(chaine,param1); //put each line in the buffer #1 + + pthread_mutex_unlock(&mutex1); + sem_post(&full1); + } + //param1->stop = 1; + + for (int i = 0; i < N; i++) + { + sem_wait(&empty1); + pthread_mutex_lock(&mutex1); + + put_in_buffer_1("stop\0",param1); //put each line in the buffer #1 + + pthread_mutex_unlock(&mutex1); + sem_post(&full1); + } + + + return NULL; + +} + +void sem_1_initializer(struct buffer_rc *buf){ + pthread_mutex_init(&mutex1,NULL); + sem_init(&empty1,0,buf->size); + sem_init(&full1,0,0); + +} + +void sem_2_initializer (struct buffer_cw *buf){ + + pthread_mutex_init(&mutex2,NULL); + sem_init(&empty2,0,buf->size); + sem_init(&full2,0,0); + +} + +struct buffer_rc * buff_init_1(FILE *file1){ + + struct buffer_rc *ptr1; + ptr1 = malloc(sizeof(struct buffer_rc)); + if (ptr1 == NULL){ + free(ptr1); + return NULL;} + + ptr1->size = 2*N; + ptr1->len = 0; + ptr1->head = 0; + ptr1->tail = 0; + ptr1->stop = 0; + ptr1->file1 = file1; + + return ptr1; +} + +struct buffer_cw * buff_init_2(FILE *file2){ + + struct buffer_cw *ptr2; + ptr2 = malloc(sizeof(struct buffer_cw)); + if (ptr2 == NULL){ + return NULL;} + + ptr2->size = 2*N; + ptr2->len = 0; + ptr2->head = 0; + ptr2->tail = 0; + ptr2->stop = 0; + ptr2->file2 = file2; + + return ptr2; +} + +struct buffer_rccw *buff_init_12(struct buffer_rc *ptr1,struct buffer_cw *ptr2){ + struct buffer_rccw buffer_12; + buffer_12.struct1 = ptr1; + buffer_12.struct2 = ptr2; + + struct buffer_rccw *ptr3; + ptr3 = malloc(sizeof(struct buffer_rccw)); + if (ptr3 == NULL){return NULL;} + *ptr3 = buffer_12; + return ptr3; +} + +void thread_create_join(struct buffer_rc *ptr1,struct buffer_cw *ptr2,struct buffer_rccw *ptr3){ + pthread_t reader; + pthread_t calculators[N]; + pthread_t writer; + pthread_create(&reader,NULL,&reading,ptr1); + for (int i = 0; i < N; i++) + { + pthread_create(&calculators[i],NULL,&calculating,ptr3); + } + pthread_create(&writer,NULL,&writing,ptr2); + + pthread_join(reader,NULL); + for (int i = 0; i < N; i++) + { + pthread_join(calculators[i],NULL); + } + pthread_join(writer,NULL); +} + +int run (char *input,char *output, int n_threads){ + + N = n_threads; + + + FILE *file1 = NULL; + FILE *file2 = NULL; + + file1 = fopen(input,"r"); + if (file1 == NULL){ + printf("Sorry, file %s doesn't exist ): \n",input); + return -1;} + + file2 = fopen(output,"w+"); + if (file2 == NULL){ + fclose(file1); + return -1; + } + + struct buffer_rc *ptr1 = buff_init_1(file1); + struct buffer_cw *ptr2 = buff_init_2(file2); + struct buffer_rccw *ptr3 = buff_init_12(ptr1,ptr2); + + + sem_1_initializer(ptr1); + sem_2_initializer(ptr2); + + thread_create_join(ptr1,ptr2,ptr3); + + + fclose(file1); + fclose(file2); + free(ptr1); + free(ptr2); + free(ptr3); + + return 1; + +} + + /* int main() { + int err = run("input.txt", "actual_output.txt"); + + return err; + } */ diff --git a/Projet_M2/run.h b/Projet_M2/run.h new file mode 100644 index 0000000..a98720b --- /dev/null +++ b/Projet_M2/run.h @@ -0,0 +1,73 @@ +#ifndef RUN +#define RUN +#include <pthread.h> +#include <semaphore.h> + +typedef struct node{ + unsigned long long value; + struct node *next; +}node_t; + +typedef struct queue{ + struct node *tail; + int size; +}queue_t; + +struct buffer_rc{ + char *tab[8]; + int size; + int len; + int head; + int tail; +}; + +struct buffer_cw +{ + queue_t *tab[8]; + int size; + int len; + int head; + int tail; +}; + +struct buffer_rccw{ + struct buffer_rc *struct1; + struct buffer_cw *struct2; +}; + +pthread_mutex_t mutex1; +sem_t empty1; +sem_t full1; + +pthread_mutex_t mutex2; +sem_t empty2; +sem_t full2; + + +void put_in_buffer_1(char *c); +char *get_from_buffer_1(void); +void put_in_buffer_2(struct queue *ptr); +queue_t *get_from_buffer_2(void); + +int is_div(unsigned long long number, long i); +int is_prime(unsigned long long number); + +void enqueue(queue_t* q, unsigned long long val); +queue_t* prime_divs(unsigned long long number); + +void *reading (void *param); +void *calculating(void *param); +void *writing(void *param); + +void sem_1_initializer(struct buffer_rc *buf); +void sem_2_initializer (struct buffer_cw *buf); + +struct buffer_rc * buff_init_1(FILE *file1); +struct buffer_cw * buff_init_2(FILE *file2); +struct buffer_rccw *buff_init_12(struct buffer_rc *ptr1,struct buffer_cw *ptr2); + +void thread_create_join(struct buffer_rc *ptr1,struct buffer_cw *ptr2,struct buffer_rccw *ptr3); + +int run (char *input,char *output,int n_threads); + +#endif \ No newline at end of file diff --git a/Projet_M2/test.c b/Projet_M2/test.c new file mode 100644 index 0000000..e1c50e7 --- /dev/null +++ b/Projet_M2/test.c @@ -0,0 +1,193 @@ +#include <stdlib.h> +#include <stdio.h> +#include "run.h" +#include <CUnit/CUnit.h> +#include <CUnit/TestRun.h> +#include <CUnit/CUError.h> +#include <CUnit/Basic.h> +#include <CUnit/Automated.h> + +void test_is_div(void){ + CU_ASSERT_TRUE(is_div(14,7)); +} + +void test_is_prime(void){ + CU_ASSERT_TRUE(is_prime(13)); +} +void test_is_not_prime(void){ + CU_ASSERT_FALSE(is_prime(14)); +} +void empty_file_test(void){ + FILE *file1 = NULL; + + int err = run("Test_files/empty_input.txt","actual_output.txt",4); + if (err == -1){ + CU_FAIL("method run failed"); + return; + } + + file1 = fopen("actual_output.txt","r"); + if (file1 == NULL){ + CU_FAIL("actual_output opening fail"); + return; + } + + char chaine1[20]; + CU_ASSERT_EQUAL(fgets(chaine1,20,file1),NULL); + + fclose(file1); + + +} +void short_file_test(void){ + FILE *file1 = NULL; + FILE *file2 = NULL; + + file1 = fopen("Test_files/short_expected_output.txt","r"); + if (file1 == NULL){ + CU_FAIL("short_expected_output opening fail"); + return; + } + + int err = run("Test_files/short_input.txt","actual_output.txt",4); + if (err == -1){ + CU_FAIL("method run failed"); + return; + } + + file2 = fopen("actual_output.txt","r"); + if (file2 == NULL){ + CU_FAIL("actual_output opening fail"); + return; + } + + char chaine1[50]; + char chaine2[50]; + + while (fgets(chaine1,50,file1) != NULL && fgets(chaine2,50,file2) != NULL) + { + //printf("%s\n",chaine1); + //printf("%s\n",chaine2); + CU_ASSERT_STRING_EQUAL(chaine1,chaine2); + + } + + fclose(file1); + fclose(file2); +} + +void file_test(void){ + FILE *file1 = NULL; + FILE *file2 = NULL; + + file1 = fopen("Test_files/expected_output.txt","r"); + if (file1 == NULL){ + CU_FAIL("expected_output opening fail"); + return; + } + + clock_t start, end; + double time; + start = clock(); + + int err = run("Test_files/input.txt","actual_output.txt",4); + + end = clock(); + time = (double) (end - start) / CLOCKS_PER_SEC; + printf("Temps = %.2f secondes \n",time); + if (err == -1){ + CU_FAIL("method run failed"); + return; + } + + file2 = fopen("actual_output.txt","r"); + if (file2 == NULL){ + CU_FAIL("actual_output opening fail"); + return; + } + + //char chaine1[50]; + char chaine2[50]; + + int n = 0; + + while (fgets(chaine2,50,file2) != NULL) + { + //printf("%s\n",chaine1); + //printf("%s\n",chaine2); + //CU_ASSERT_STRING_EQUAL(chaine1,chaine2); + n++; + } + //printf("%d",n); + CU_ASSERT_EQUAL(n,100); + + fclose(file1); + fclose(file2); + +} + +int setup(void){ + return 0; + } + + int teardown(void) + { + return 0; + } + +int main(int argc, char *argv[]){ + + if (argc == 2 && strcmp(argv[1],"Test")==0){ + + if (CUE_SUCCESS != CU_initialize_registry()) + { + return CU_get_error(); + } + + + CU_pSuite pSuite = NULL; + + pSuite = CU_add_suite("ma_suite",setup,teardown); + + if (NULL == pSuite) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + if (NULL == CU_add_test(pSuite,"test_is_div",test_is_div) || + NULL == CU_add_test(pSuite, "test_is_prime",test_is_prime) || + NULL == CU_add_test(pSuite, "test_is_not_prime",test_is_not_prime) || + NULL == CU_add_test(pSuite,"empty_file_test",empty_file_test) || + NULL == CU_add_test(pSuite,"short_file_test",short_file_test) || + NULL == CU_add_test(pSuite,"file_test",file_test)) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + + CU_basic_run_tests(); + //CU_automated_run_tests(); + CU_basic_show_failures(CU_get_failure_list()); + } + else + { + if (argc == 5 && strcmp("-N",argv[1])==0){ + return run(argv[3],argv[4],atoi(argv[2])); + + } + else + { + if (argc == 3){ + + return run(argv[1],argv[2],4); + } + else{ + printf("Invalid type of number of arguments, please try again with the right format\n"); + } + } + return 1; + } + +} \ No newline at end of file -- GitLab