2021-02-16 16:26:48 +00:00
|
|
|
|
/**
|
2021-02-17 14:05:38 +00:00
|
|
|
|
* Code source pour la bibliothèque servant à parser et récupérer l’entrée
|
|
|
|
|
* utilisateur.
|
2021-02-16 16:26:48 +00:00
|
|
|
|
* @file parser.c
|
|
|
|
|
* @author rick <rick@gnous.eu>
|
|
|
|
|
* @date 2021
|
|
|
|
|
*/
|
|
|
|
|
|
2021-02-20 17:33:22 +00:00
|
|
|
|
#include "vars.h"
|
2021-02-16 16:26:48 +00:00
|
|
|
|
#include "parser.h"
|
|
|
|
|
|
2021-02-16 15:12:37 +00:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
/**
|
2021-02-16 16:26:48 +00:00
|
|
|
|
* get_input(): Permet de récupérer la saisie de l’utilisateur
|
2021-02-16 18:36:05 +00:00
|
|
|
|
*
|
2021-02-22 14:48:35 +00:00
|
|
|
|
* Return: Entrée utilisateur ou NULL si ctrl d détecté
|
2021-02-16 15:12:37 +00:00
|
|
|
|
*/
|
2021-02-16 17:25:37 +00:00
|
|
|
|
char* get_input()
|
2021-02-16 15:12:37 +00:00
|
|
|
|
{
|
2021-02-22 14:48:35 +00:00
|
|
|
|
int stop = 0; /* en cas de ctrl d */
|
2021-02-17 14:36:34 +00:00
|
|
|
|
char *buffer = (char *) calloc(MAX_LENGTH, sizeof(char));
|
2021-02-16 19:19:00 +00:00
|
|
|
|
buffer[0] = '\n';
|
2021-02-16 17:25:37 +00:00
|
|
|
|
|
2021-02-22 14:48:35 +00:00
|
|
|
|
while (buffer[0] == '\n' && !stop)
|
2021-02-16 15:12:37 +00:00
|
|
|
|
{
|
2021-02-16 19:19:00 +00:00
|
|
|
|
printf("> ");
|
2021-02-22 14:48:35 +00:00
|
|
|
|
if(fgets(buffer, MAX_LENGTH, stdin) == NULL)
|
|
|
|
|
stop++;
|
2021-02-16 15:12:37 +00:00
|
|
|
|
}
|
2021-02-22 14:48:35 +00:00
|
|
|
|
|
|
|
|
|
if (stop)
|
|
|
|
|
{
|
|
|
|
|
free(buffer);
|
|
|
|
|
buffer = NULL;
|
|
|
|
|
putchar('\n'); /* pour un affichage propre */
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
buffer[strlen(buffer)-1] = '\0'; /* pour ne pas avoir un retour à la ligne */
|
|
|
|
|
|
2021-02-16 17:25:37 +00:00
|
|
|
|
return buffer;
|
2021-02-16 15:12:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2021-02-17 09:51:41 +00:00
|
|
|
|
* get_command(): Récupère l’entrée de l’utilisateur avant de la parser
|
2021-02-16 16:26:48 +00:00
|
|
|
|
* @args: Tableau de string
|
|
|
|
|
* @find: caractère utilisé pour parser
|
2021-02-16 15:12:37 +00:00
|
|
|
|
*
|
2021-02-16 16:26:48 +00:00
|
|
|
|
* Récupère l’entrée de l’utilisateur avant de la parser avec le caractère
|
|
|
|
|
* find. Chaque string sera mise dans une case de args.
|
2021-02-22 14:48:35 +00:00
|
|
|
|
*
|
|
|
|
|
* Return: 0 si tout est OK, 1 sinon
|
2021-02-16 15:12:37 +00:00
|
|
|
|
*/
|
2021-02-22 14:48:35 +00:00
|
|
|
|
int get_command(char *args[], char find)
|
2021-02-16 15:12:37 +00:00
|
|
|
|
{
|
2021-02-22 14:48:35 +00:00
|
|
|
|
int ret = 0;
|
2021-02-16 17:25:37 +00:00
|
|
|
|
char *user_input = get_input();
|
2021-02-22 14:48:35 +00:00
|
|
|
|
|
|
|
|
|
if (user_input == NULL)
|
|
|
|
|
ret = 1;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
parse_string(user_input, args, find);
|
|
|
|
|
free(user_input);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
2021-02-16 15:12:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-02-16 16:26:48 +00:00
|
|
|
|
/**
|
2021-02-17 09:51:41 +00:00
|
|
|
|
* parse_string(): Découpe la chaine orig et met chaque mot dans le tableau dest
|
2021-02-16 16:26:48 +00:00
|
|
|
|
* @orig: chaine à découper
|
|
|
|
|
* @dest: tableau de string où sera stocker les mots
|
2021-02-16 19:31:09 +00:00
|
|
|
|
* @find: caractère à utilise pour parser la chaine orig
|
2021-02-16 16:26:48 +00:00
|
|
|
|
*
|
2021-02-16 19:31:09 +00:00
|
|
|
|
* La chaine de caractères orig est découpée selon le caractère find
|
|
|
|
|
* et chaques mots sont mis dans le tableau dest.
|
2021-02-20 11:49:14 +00:00
|
|
|
|
* S’il y a un \ avant le caractère find, celui-ce sera ignoré.
|
2021-02-16 16:26:48 +00:00
|
|
|
|
*/
|
2021-02-17 09:51:41 +00:00
|
|
|
|
void parse_string(char *orig, char *dest[], char find)
|
2021-02-16 15:12:37 +00:00
|
|
|
|
{
|
|
|
|
|
char *token = strtok(orig, &find);
|
2021-02-20 11:49:14 +00:00
|
|
|
|
int pred = 0, i = 0;
|
2021-02-16 15:12:37 +00:00
|
|
|
|
|
|
|
|
|
while (token != NULL && i < MAX_LENGTH)
|
|
|
|
|
{
|
2021-02-20 11:49:14 +00:00
|
|
|
|
if (pred)
|
|
|
|
|
{
|
|
|
|
|
dest[i][strlen(dest[i])-1] = find;
|
|
|
|
|
strcat(dest[i], token);
|
|
|
|
|
pred = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
strcpy(dest[i], token);
|
|
|
|
|
|
|
|
|
|
if (dest[i][strlen(dest[i])-1] == '\\')
|
|
|
|
|
pred = 1;
|
|
|
|
|
else
|
|
|
|
|
i++;
|
|
|
|
|
|
2021-02-16 15:12:37 +00:00
|
|
|
|
token = strtok(NULL, &find);
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-23 13:00:18 +00:00
|
|
|
|
if (pred)
|
|
|
|
|
i++;
|
|
|
|
|
|
2021-02-20 11:49:14 +00:00
|
|
|
|
/** le dernier argument doit être NULL
|
2021-02-21 09:52:12 +00:00
|
|
|
|
pour l’utilisation de execvp */
|
2021-02-16 15:12:37 +00:00
|
|
|
|
free(dest[i]);
|
|
|
|
|
dest[i] = NULL;
|
|
|
|
|
|
|
|
|
|
free(token);
|
|
|
|
|
}
|