wildcard.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * File: wildcard.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 7 novembre 2018
  6. */
  7. #define _DEFAULT_SOURCE
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <dirent.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <unistd.h>
  14. #include <fnmatch.h>
  15. #include <string.h>
  16. #include "error.h"
  17. #include "wildcard.h"
  18. /* --- Fonctions privées --- */
  19. /**
  20. * Determine la position de separation entre le chemin et la wildcard
  21. * @param char* La chaine
  22. * @return int Position dans la chaine
  23. */
  24. int wilcard_begin(const char* seq) {
  25. int pos = 0, compteur = 1;
  26. while (*seq) {
  27. if (*seq == '/') {
  28. pos = compteur;
  29. }
  30. seq++;
  31. compteur++;
  32. }
  33. return pos;
  34. }
  35. /* --- Fonctions publiques --- */
  36. int wildcard_result(char* seq) {
  37. //Declaration variable
  38. struct dirent **namelist;
  39. int nbFile, nbRes = 0, wcpos;
  40. char* wc, *path;
  41. //Trouve la wildcard
  42. wcpos = wilcard_begin(seq);
  43. if (!wcpos) {
  44. path = malloc(sizeof (char) * 2);
  45. strcpy(path, ".");
  46. wc = seq;
  47. } else {
  48. path = malloc(sizeof (char) * wcpos);
  49. memset(path, 0, wcpos);
  50. strncpy(path, seq, wcpos - 1); //Pour ne pas prendre le / final
  51. wc = seq + wcpos;
  52. }
  53. //Recup la liste des fichiers dans le dossier courant
  54. nbFile = scandir(path, &namelist, 0, alphasort);
  55. if (nbFile < 0) {
  56. addperror("Erreur scandir()");
  57. return ERR;
  58. }
  59. //Parcours chaque fichier pour compter le nombre de resultat
  60. while (nbFile--) {
  61. //Si c'est bien un fichier (et non un dossier)
  62. if (namelist[nbFile]->d_type == DT_REG) {
  63. //Test par rapport au wildcard
  64. if (fnmatch(wc, namelist[nbFile]->d_name, 0) == 0) {
  65. //Regarde si le resultat est bien different de la wildcard
  66. if (strcmp(wc, namelist[nbFile]->d_name) != 0) {
  67. nbRes++;
  68. }
  69. }
  70. }
  71. free(namelist[nbFile]);
  72. }
  73. free(namelist);
  74. //Retour
  75. return nbRes;
  76. }
  77. int wildcard(char* seq, int size, char** result) {
  78. //Declaration variable
  79. struct dirent **namelist;
  80. int nbFile, nbRes = 0, wcpos;
  81. char* wc, *path;
  82. //Verification parametre
  83. if (size < 1) {
  84. return -1;
  85. }
  86. //Trouve la wildcard
  87. wcpos = wilcard_begin(seq);
  88. if (!wcpos) {
  89. path = malloc(sizeof (char) * 2);
  90. strcpy(path, ".");
  91. wc = seq;
  92. } else {
  93. path = malloc(sizeof (char) * wcpos);
  94. memset(path, 0, wcpos);
  95. strncpy(path, seq, wcpos - 1);
  96. wc = seq + wcpos;
  97. }
  98. //Recup la liste des fichiers dans le dossier courant
  99. nbFile = scandir(path, &namelist, 0, alphasort);
  100. if (nbFile < 0) {
  101. addperror("Erreur scandir()");
  102. return ERR;
  103. }
  104. //Parcours chaque fichier pour ajouter les resultats à result
  105. int i = 0;
  106. while (nbFile--) {
  107. //Si c'est bien un fichier (et non un dossier)
  108. if (namelist[nbFile]->d_type == DT_REG) {
  109. //Test par rapport au wildcard
  110. if (fnmatch(wc, namelist[nbFile]->d_name, 0) == 0) {
  111. //Si il y a un chemin
  112. if (wcpos) {
  113. result[i] = malloc(sizeof (char) * (strlen(path) + strlen(namelist[nbFile]->d_name) + 2));
  114. memset(result[i], 0, strlen(path) + strlen(namelist[nbFile]->d_name) + 2);
  115. sprintf(result[i++], "%s/%s", path, namelist[nbFile]->d_name);
  116. } else {
  117. result[i] = malloc(sizeof (char) * (strlen(namelist[nbFile]->d_name) + 1));
  118. memset(result[i], 0, strlen(namelist[nbFile]->d_name) + 1);
  119. sprintf(result[i++], "%s", namelist[nbFile]->d_name);
  120. }
  121. nbRes++;
  122. }
  123. }
  124. //Nettoyage
  125. free(namelist[nbFile]);
  126. //Si il n'y a plus de place dans le tableau on s'arrete
  127. if (i == size) {
  128. break;
  129. }
  130. }
  131. free(namelist);
  132. //Retourne
  133. return nbRes;
  134. }
  135. char** insert_array(int pos, char** array, int arraysize, char** insert, int insertsize, int* newsize) {
  136. //Erreur parametre
  137. if (pos < 0 || arraysize < 1 || insertsize < 1 || pos >= arraysize) {
  138. if (newsize != NULL) {
  139. *newsize = ERR;
  140. }
  141. return NULL;
  142. }
  143. //Si une seul valeur à insérer
  144. if (insertsize == 1) {
  145. //Vide la chaine precedente
  146. free(array[pos]);
  147. //Remplace
  148. array[pos] = malloc(strlen(insert[0]) * sizeof (char));
  149. strcpy(array[pos], insert[0]);
  150. //Nettoyage
  151. free(insert[0]);
  152. free(insert);
  153. //Retourne le tableau
  154. if (newsize != NULL) {
  155. *newsize = arraysize;
  156. }
  157. return array;
  158. }
  159. //Sinon generation d'un nouveau tableau
  160. char ** newarray;
  161. int size = arraysize + insertsize - 1, i;
  162. newarray = malloc(sizeof (char*) * size);
  163. //Ajout des elements avant la postion
  164. for (i = 0; i < pos; i++) {
  165. //Si l'element est null
  166. if (array[i] == NULL) {
  167. newarray[i] = NULL;
  168. } //Sinon on le copie
  169. else {
  170. newarray[i] = malloc(strlen(array[i]) * sizeof (char));
  171. strcpy(newarray[i], array[i]);
  172. free(array[i]);
  173. }
  174. }
  175. //Ajout des nouveaux elements
  176. for (int j = 0; j < insertsize; j++, i++) {
  177. //Si l'element est null
  178. if (insert[j] == NULL) {
  179. newarray[i] = NULL;
  180. } //Sinon on le copie
  181. else {
  182. newarray[i] = malloc(strlen(insert[j]) * sizeof (char));
  183. strcpy(newarray[i], insert[j]);
  184. free(insert[j]);
  185. }
  186. }
  187. //Ajout fin
  188. for (int j = pos + 1; j < arraysize; j++, i++) {
  189. //Si l'element est null
  190. if (array[j] == NULL) {
  191. newarray[i] = NULL;
  192. } //Sinon on le copie
  193. else {
  194. newarray[i] = malloc(strlen(array[j]) * sizeof (char));
  195. strcpy(newarray[i], array[j]);
  196. free(array[j]);
  197. }
  198. }
  199. //Nettoyage et changement tableau
  200. free(array[pos]);
  201. free(array);
  202. free(insert);
  203. //Indique la nouvelle taille
  204. if (newsize != NULL) {
  205. *newsize = size;
  206. }
  207. //Retourne le nombre d'element
  208. return newarray;
  209. }