/* * File: wildcard.c * Author: Arthur Brandao * * Created on 7 novembre 2018 */ #define _DEFAULT_SOURCE #include #include #include #include #include #include #include #include #include "error.h" #include "wildcard.h" int wildcard_result(const char* seq) { //Declaration variable struct dirent **namelist; int nbFile, nbRes = 0; //Recup la liste des fichiers dans le dossier courant nbFile = scandir(".", &namelist, 0, alphasort); if (nbFile < 0) { perror("scandir() : "); return ERR; } //Parcours chaque fichier pour compter le nombre de resultat while (nbFile--) { //Si c'est bien un fichier (et non un dossier) if (namelist[nbFile]->d_type == DT_REG) { //Test par rapport au wildcard if (fnmatch(seq, namelist[nbFile]->d_name, 0) == 0) { //Regarde si le resultat est bien different de la wildcard if (strcmp(seq, namelist[nbFile]->d_name) != 0) { nbRes++; } } } free(namelist[nbFile]); } free(namelist); //Retour return nbRes; } int wildcard(const char* seq, int size, char** result) { //Declaration variable struct dirent **namelist; int nbFile, nbRes = 0; //Verification parametre if (size < 1) { return ERR; } //Recup la liste des fichiers dans le dossier courant nbFile = scandir(".", &namelist, 0, alphasort); if (nbFile < 0) { perror("scandir() : "); return ERR; } //Parcours chaque fichier pour ajouter les resultats à result int i = 0; while (nbFile--) { //Si c'est bien un fichier (et non un dossier) if (namelist[nbFile]->d_type == DT_REG) { //Test par rapport au wildcard if (fnmatch(seq, namelist[nbFile]->d_name, 0) == 0) { result[i] = malloc(strlen(namelist[nbFile]->d_name) * sizeof (char)); strcpy(result[i++], namelist[nbFile]->d_name); nbRes++; } } //Nettoyage free(namelist[nbFile]); //Si il n'y a plus de place dans le tableau on s'arrete if (i == size) { break; } } free(namelist); //Retourne return nbRes; } char** insert_array(int pos, char** array, int arraysize, char** insert, int insertsize, int* newsize) { //Erreur parametre if (pos < 0 || arraysize < 1 || insertsize < 1 || pos >= arraysize) { if (newsize != NULL) { *newsize = ERR; } return NULL; } //Si une seul valeur à insérer if (insertsize == 1) { //Vide la chaine precedente free(array[pos]); //Remplace array[pos] = malloc(strlen(insert[0]) * sizeof (char)); strcpy(array[pos], insert[0]); //Nettoyage free(insert[0]); free(insert); //Retourne le tableau if (newsize != NULL) { *newsize = arraysize; } return array; } //Sinon generation d'un nouveau tableau char ** newarray; int size = arraysize + insertsize - 1, i; newarray = malloc(sizeof (char*) * size); //Ajout des elements avant la postion for (i = 0; i < pos; i++) { //Si l'element est null if (array[i] == NULL) { newarray[i] = NULL; } //Sinon on le copie else { newarray[i] = malloc(strlen(array[i]) * sizeof (char)); strcpy(newarray[i], array[i]); free(array[i]); } } //Ajout des nouveaux elements for (int j = 0; j < insertsize; j++, i++) { //Si l'element est null if (insert[j] == NULL) { newarray[i] = NULL; } //Sinon on le copie else { newarray[i] = malloc(strlen(insert[j]) * sizeof (char)); strcpy(newarray[i], insert[j]); free(insert[j]); } } //Ajout fin for (int j = pos + 1; j < arraysize; j++, i++) { //Si l'element est null if (array[j] == NULL) { newarray[i] = NULL; } //Sinon on le copie else { newarray[i] = malloc(strlen(array[j]) * sizeof (char)); strcpy(newarray[i], array[j]); free(array[j]); } } //Nettoyage et changement tableau free(array[pos]); free(array); free(insert); //Indique la nouvelle taille if (newsize != NULL) { *newsize = size; } //Retourne le nombre d'element return newarray; }