sous

Exécuter de sous-commandes
git clone git://git.asteride.xyz/~ldp/sous.git
Journaux | Fichiers | Références | LICENCE

commit 13dc4afa61e1c663e4b15e31e961c1a1359dac5f
parent 89c9107d3c24401d2f089375cc5b5abb98e32529
Auteur: ldp <ldp@asteride.xyz>
Date:   Fri, 18 Apr 2025 20:26:58 -0400

optimisation et commentaires

Diffstat:
Msous.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) {