| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | /*  * File:   wildcard.c * Author: Arthur Brandao * * Created on 7 novembre 2018 */#define _DEFAULT_SOURCE#include <stdio.h>#include <stdlib.h>#include <dirent.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fnmatch.h>#include <string.h>#include "error.h"#include "wildcard.h"/* --- Fonctions privées --- *//** * Determine la position de separation entre le chemin et la wildcard * @param char* La chaine * @return int Position dans la chaine */int wilcard_begin(const char* seq) {    int pos = 0, compteur = 1;    while (*seq) {        if (*seq == '/') {            pos = compteur;        }        seq++;        compteur++;    }    return pos;}/* --- Fonctions publiques --- */int wildcard_result(char* seq) {    //Declaration variable    struct dirent **namelist;    int nbFile, nbRes = 0, wcpos;    char* wc, *path;    //Trouve la wildcard    wcpos = wilcard_begin(seq);    if (!wcpos) {        path = malloc(sizeof (char) * 2);        strcpy(path, ".");        wc = seq;    } else {        path = malloc(sizeof (char) * wcpos);        memset(path, 0, wcpos);        strncpy(path, seq, wcpos - 1); //Pour ne pas prendre le / final        wc = seq + wcpos;    }    //Recup la liste des fichiers dans le dossier courant    nbFile = scandir(path, &namelist, 0, alphasort);    if (nbFile < 0) {        addperror("Erreur 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(wc, namelist[nbFile]->d_name, 0) == 0) {                //Regarde si le resultat est bien different de la wildcard                if (strcmp(wc, namelist[nbFile]->d_name) != 0) {                    nbRes++;                }            }        }        free(namelist[nbFile]);    }    free(namelist);    //Retour    return nbRes;}int wildcard(char* seq, int size, char** result) {    //Declaration variable    struct dirent **namelist;    int nbFile, nbRes = 0, wcpos;    char* wc, *path;    //Verification parametre    if (size < 1) {        return -1;    }    //Trouve la wildcard    wcpos = wilcard_begin(seq);    if (!wcpos) {        path = malloc(sizeof (char) * 2);        strcpy(path, ".");        wc = seq;    } else {        path = malloc(sizeof (char) * wcpos);        memset(path, 0, wcpos);        strncpy(path, seq, wcpos - 1);        wc = seq + wcpos;    }    //Recup la liste des fichiers dans le dossier courant    nbFile = scandir(path, &namelist, 0, alphasort);    if (nbFile < 0) {        addperror("Erreur 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(wc, namelist[nbFile]->d_name, 0) == 0) {                //Si il y a un chemin                if (wcpos) {                    result[i] = malloc(sizeof (char) * (strlen(path) + strlen(namelist[nbFile]->d_name) + 2));                    memset(result[i], 0, strlen(path) + strlen(namelist[nbFile]->d_name) + 2);                    sprintf(result[i++], "%s/%s", path, namelist[nbFile]->d_name);                } else {                    result[i] = malloc(sizeof (char) * (strlen(namelist[nbFile]->d_name) + 1));                    memset(result[i], 0, strlen(namelist[nbFile]->d_name) + 1);                    sprintf(result[i++], "%s", 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;}
 |