commit 13dc4afa61e1c663e4b15e31e961c1a1359dac5f
parent 89c9107d3c24401d2f089375cc5b5abb98e32529
Auteur: ldp <ldp@asteride.xyz>
Date: Fri, 18 Apr 2025 20:26:58 -0400
optimisation et commentaires
Diffstat:
M | sous.c | | | 36 | +++++++++++++++++++++--------------- |
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/sous.c b/sous.c
@@ -19,11 +19,6 @@ main(int argc, char **argv)
int tll; /* taille de ch */
DIR *dos;
- /* argv[0], est nécessaire pour identifier le dossier;
- * argv[1], est nécessaire pour lancer le programme */
- if (argc < 2)
- fatal("trop peu d’arguments");
-
/* Trouver le dossier de base dans les variables d’environnement et
* régler le suffixe en conséquence. */
if ((base = getenv("SOUS_CH")) != NULL)
@@ -35,27 +30,37 @@ main(int argc, char **argv)
else
fatal("$HOME est introuvable");
- /* ch est formé au moins de la base, du suffixe et du nom par lequel ce
- * programme a été lancé. Le tampon vers lequel il pointe doit donc
- * être assez grand pour stocker ces trois fragments. 1 est ajouté à la
- * somme pour laisser de la place à caractère terminal NUL. */
- tll = strlen(base) + strlen(suff) + strlen(argv[0]) + 1;
+ /* argv[0], est nécessaire pour identifier le dossier;
+ * argv[1], est nécessaire pour lancer le programme ou trouver un
+ * sous-dossier */
+ if (argc < 2)
+ fatal("trop peu d’arguments");
+
+ /* ch est formé au moins de la base, du suffixe et des deux premiers
+ * arguments du programme. Le tampon vers lequel il pointe doit donc
+ * être assez grand pour stocker ces quatre fragments. 2 est ajouté à
+ * la somme pour laisser de la place au séparateur « / » et au
+ * caractère terminal NUL. */
+ tll = strlen(base) + strlen(suff) + strlen(argv[0]) + \
+ strlen(argv[1]) + 2;
if ((ch = malloc(tll)) == NULL)
fatal(strerror(errno));
- /* Copier les trois segments dans ch. */
+ /* Copier les quatre fragments dans ch. */
strcpy(ch, base);
strcat(ch, suff);
strcat(ch, argv[0]);
+ strcat(ch, "/");
+ strcat(ch, argv[1]);
/* Tant que ch pointe vers un dossier, l’ouvrir et y ajouter le
- * prochain argument donné au programme. argc contient l’indice de cet
- * argument. */
- argc = 0;
+ * prochain argument donné au programme. Il faut à chaque fois agrandir
+ * ch. argc contient l’indice de cet argument. */
+ argc = 1;
while ((dos = opendir(ch)) != NULL) {
closedir(dos);
if (argv[++argc] == NULL)
- fatal("sous-commande manquante");
+ fatal("trop peu d’arguments");
tll += strlen(argv[argc]) + 1; /* +1 pour « / » */
if ((ch = realloc(ch, tll)) == NULL)
fatal(strerror(errno));
@@ -73,6 +78,7 @@ main(int argc, char **argv)
return 0;
}
+/* Afficher un message d’erreur et quitter. */
static void
fatal(char *msg)
{