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:
| M | execrom.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)
;