Écriture de la fonction native pour exit, close #1

Ajout doc & suppression fonction inutile dans parser.
This commit is contained in:
rick 2021-02-23 18:23:36 +01:00
parent fa1aceadc6
commit 4018bd6b4c
Signed by: Rick
GPG key ID: 2B593F087240EE99
5 changed files with 36 additions and 44 deletions

View file

@ -17,7 +17,8 @@
#include <signal.h> #include <signal.h>
pid_t pid; pid_t pid;
int exit_code; int exit_code = 0;
int need_exit = 0;
/** /**
* native_command(): vérifie si la commande entrée par lutilisateur * native_command(): vérifie si la commande entrée par lutilisateur
@ -34,9 +35,12 @@ int exit_code;
int native_command(char *command[]) int native_command(char *command[])
{ {
int ret = 1; /* 0 si commande non native */ int ret = 1; /* 0 si commande non native */
if (!strcmp(command[0], "cd")) if (!strcmp(command[0], "cd"))
change_dir(command); change_dir(command);
if (!strcmp(command[0], "ouï-dire") || !strcmp(command[0], "oui-dire") else if (!strcmp(command[0], "exit"))
thus_exit(command);
else if (!strcmp(command[0], "ouï-dire") || !strcmp(command[0], "oui-dire")
|| !strcmp(command[0], "echo")) || !strcmp(command[0], "echo"))
{ {
char *tmp = calloc(MAX_LENGTH, sizeof(char)); char *tmp = calloc(MAX_LENGTH, sizeof(char));
@ -58,7 +62,9 @@ int native_command(char *command[])
/** /**
* change_dir(): fonction pour implémenter la commande cd * change_dir(): fonction pour implémenter la commande cd
* @dir: le répertoire à ouvrir * @command: la commande passée avec ses arguments
*
* Structure de la commande cd : cd dossier
*/ */
void change_dir(char *command[]) void change_dir(char *command[])
{ {
@ -75,10 +81,21 @@ void change_dir(char *command[])
} }
} }
//void thus_exit(char *command[]) /**
//{ * thus_exit(): fonction pour implémenter la commande exit
// exit_code = 0; * @command: la commande passée avec ses arguments
//} *
* Si lutilisateur ne met pas darguments,
* la valeur 0 sera utilisé par défaut.
* Cette valeur sera utilisée pour exit_code et
* need_exit sera mit à 1.
*/
void thus_exit(char *command[])
{
if (command[1] != NULL)
exit_code = atoi(command[1]);
need_exit = 1;
}
void ctrl_c_handler() void ctrl_c_handler()
{ {
@ -94,6 +111,9 @@ void ctrl_c_handler()
* @type: NON_FATAL_ERROR pour continuer lexécution * @type: NON_FATAL_ERROR pour continuer lexécution
* FATAL_ERROR pour stoper le programme * FATAL_ERROR pour stoper le programme
* @message: message à afficher pour + dinfos ou erreur non implémentée * @message: message à afficher pour + dinfos ou erreur non implémentée
*
* En cas derreur fatale, le code derreur sera mit dans exit_code
* et need_exit sera mit à 1.
*/ */
void error(int code, int type, char *message) void error(int code, int type, char *message)
{ {
@ -133,5 +153,8 @@ void error(int code, int type, char *message)
} }
if (type == FATAL_ERROR) if (type == FATAL_ERROR)
exit(code); {
need_exit = 1;
exit_code = code;
}
} }

View file

@ -21,10 +21,11 @@
extern pid_t pid; extern pid_t pid;
extern int exit_code; extern int exit_code;
extern int need_exit; /* 0 = pas besoin de sortir, 1 = commande exit appelée */
int native_command(char *command[]); int native_command(char *command[]);
void change_dir(char *command[]); void change_dir(char *command[]);
//void thus_exit(char *command[]) void thus_exit(char *command[]);
void ctrl_c_handler(); void ctrl_c_handler();
void error(int code, int type, char *message); void error(int code, int type, char *message);

View file

@ -113,34 +113,3 @@ void parse_string(char *orig, char *dest[], char find)
free(token); free(token);
} }
/**
* detect_exit(): vérifie si la commande entrée est exit
* @command: la première commande entrée par lutilisateur
*
* Return: 0 si ce nest pas exit, 1 sinon
*/
int detect_exit(char *command)
{
/*
* TODO cest dégueulasse, à changer pour un truc plus propre
*/
char *str = malloc(MAX_LENGTH * sizeof(char));
strcpy(str, command);
char find = ' ';
char *token = strtok(str, &find);
char *args[MAX_LENGTH];
int ret = 0, i = 0;
while (token != NULL)
{
args[i] = token;
token = strtok(NULL, &find);
i++;
}
if (i == 1 && !strcmp(args[0], "exit"))
ret++;
free(token);
return ret;
}

View file

@ -13,6 +13,5 @@
char* get_input(); char* get_input();
int get_command(char *args[], char find); int get_command(char *args[], char find);
void parse_string(char *args,char *commands[], char find); void parse_string(char *args,char *commands[], char find);
int detect_exit(char *command);
#endif #endif

View file

@ -28,7 +28,7 @@ int main()
char *commands[MAX_LENGTH]; char *commands[MAX_LENGTH];
char *args[MAX_LENGTH]; char *args[MAX_LENGTH];
int result, index = 0, end = 0; /* end permet de savoir quand sarreter */ int result, index = 0;
int my_pipe[2]; int my_pipe[2];
/* init pour la gestion du ctrl c */ /* init pour la gestion du ctrl c */
@ -50,7 +50,7 @@ int main()
commands[i] = (char *) calloc(MAX_LENGTH, sizeof(char)); commands[i] = (char *) calloc(MAX_LENGTH, sizeof(char));
} }
while (!get_command(commands, '|') && !detect_exit(commands[0])) while (!need_exit && !get_command(commands, '|'))
{ {
while (commands[index] != NULL) while (commands[index] != NULL)
{ {
@ -122,5 +122,5 @@ int main()
free(commands[i]); free(commands[i]);
free(args[i]); free(args[i]);
} }
return 0; return exit_code;
} }