execrom

Exécuteur de roms
git clone git://git.asteride.xyz/execrom.git
Journaux | Fichiers | Références | LISEZ-MOI | LICENCE

commit a4d71e51e83521fc9f74d87e7c3558675e208f24
parent b0c4f7a191b4e855dc9b57cef628dfe32ef5a4b1
Auteur: Loïc Daignault-Pichette <ldp@asteride.xyz>
Date:   Sun, 21 Sep 2025 13:27:39 -0400

[doc] Ajouter des commentaires

Diffstat:
Mexecrom.c | 38+++++++++++++++++++++-----------------
1 fichier modifié, 21 insertions(+), 17 suppressions(-)

diff --git a/execrom.c b/execrom.c @@ -23,22 +23,25 @@ extern char **environ; int main(int argc, char **argv) { - size_t taille; - char *chems, *chem, *chemrom, *interp; - char nomrom[NAME_MAX+1]; - char **args; + size_t taille; /* Taille du nom de la ROM */ + char *chems; /* Pointeur vers le contenu d’EXECROM_CHEM */ + char *chem; /* Variable temporaire vers un chemin */ + char *chemrom; /* Chemin vers la ROM */ + char *interp; /* Nom de l’interpréteur */ + char nomrom[NAME_MAX+1]; /* nom de la ROM */ + char **args; /* Vecteur d’arguments à transmettre à l’interpréteur */ DIR *dossier; struct dirent *dp; /* execrom a besoin du nom du programme, car c’est ce qui lui permet - d’identifier la rom à lancer. */ + d’identifier la ROM à lancer. */ if (argc < 1) { fprintf(stderr, "execrom: programme lancé sans nom\n"); return 1; } /* La variable d’environnement EXECROM_CHEM doit contenir une liste de - chemins où trouver les roms. Il n’y a pas de chemin par défaut. */ + chemins où trouver les ROMs. Il n’y a pas de chemin par défaut. */ if ((chems = getenv("EXECROM_CHEM")) == NULL || chems[0] == '\0') { fprintf(stderr, "execrom: EXECROM_CHEM est vide\n"); return 1; @@ -50,20 +53,20 @@ main(int argc, char **argv) for (chem = strtok(argv[0], "/"); chem; chem = strtok(NULL, "/")) argv[0] = chem; - /* La taille du nom de la rom est fournie en argument à strncmp. */ + /* La taille du nom de la ROM est fournie en argument à strncmp. */ taille = strlen(argv[0]); - /* Chaque dossier contenu dans la liste de chemins est parcouru. La - recherche s’arrête lorsqu’un fichier commence par argv[0], suivi d’un - point (« . ») */ + /* Chaque dossier contenu dans EXECROM_CHEM est parcouru. La recherche + s’arrête lorsqu’un fichier commence par argv[0], suivi d’un point + (« . ») */ for (chem = strtok(chems, ":"); chem; chem = strtok(NULL, ":")) { + /* Tenter d’ouvrir le dossier. */ if ((dossier = opendir(chem)) == NULL) { fprintf(stderr, "execrom: %s: %s\n", chem, strerror(errno)); return 1; } - while ((dp = readdir(dossier)) != NULL) { if (strncmp(dp->d_name, argv[0], taille) != 0) continue; @@ -82,23 +85,24 @@ main(int argc, char **argv) closedir(dossier); } + /* La ROM n’a pas été trouvée. */ fprintf(stderr, "execrom: %s n’est pas dans EXECROM_CHEM\n", argv[0]); return 1; + /* La ROM a été trouvée. */ trouve: - taille = strlen(nomrom) + strlen(chem) + 2; - if ((chemrom = malloc(taille)) == NULL) - goto erreur; - if ((args = malloc((argc + 2) * (sizeof(char*)))) == NULL) + /* Bâtir le chemin vers la ROM. */ + if ((chemrom = malloc(strlen(nomrom) + strlen(chem) + 2)) == NULL) goto erreur; - strcpy(chemrom, chem); strcat(chemrom, "/"); strcat(chemrom, nomrom); + /* Remplir le vecteur d’arguments. */ + if ((args = malloc((argc + 2) * (sizeof(char*)))) == NULL) + goto erreur; args[0] = interp; args[1] = chemrom; - argc = 2; while ((args[argc++] = *++argv) != NULL) ;