rishtik/src/boitoutil/parser.c

119 lines
2.5 KiB
C
Raw Permalink Normal View History

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 lentrée
* utilisateur.
2021-02-16 16:26:48 +00:00
* @file parser.c
* @author rick <rick@gnous.eu>
* @date 2021
*/
#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>
#include <errno.h>
2021-02-16 15:12:37 +00:00
/**
2021-02-16 16:26:48 +00:00
* get_input(): Permet de récupérer la saisie de lutilisateur
*
* Return: Entrée utilisateur ou NULL si ctrl d détecté
2021-02-16 15:12:37 +00:00
*/
char* get_input()
2021-02-16 15:12:37 +00:00
{
fflush(stdin);
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';
while (buffer[0] == '\n' && !stop)
2021-02-16 15:12:37 +00:00
{
2021-02-16 19:19:00 +00:00
printf("> ");
if(fgets(buffer, MAX_LENGTH, stdin) == NULL && errno != EINTR)
stop++;
errno = 0; /* réinitialiser le errno pour le prochain fgets */
2021-02-16 15:12:37 +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 */
return buffer;
2021-02-16 15:12:37 +00:00
}
/**
2021-02-17 09:51:41 +00:00
* get_command(): Récupère lentrée de lutilisateur 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 lentrée de lutilisateur avant de la parser avec le caractère
* find. Chaque string sera mise dans une case de args.
*
* Return: 0 si tout est OK, 1 sinon
2021-02-16 15:12:37 +00:00
*/
int get_command(char *args[], char find)
2021-02-16 15:12:37 +00:00
{
int ret = 0;
char *user_input = get_input();
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 sera stocker les mots
* @find: caractère à utilise pour parser la chaine orig
2021-02-16 16:26:48 +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.
* Sil 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);
int pred = 0, i = 0;
2021-02-16 15:12:37 +00:00
while (token != NULL && i < MAX_LENGTH)
{
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);
}
if (pred)
i++;
/** le dernier argument doit être NULL
2021-02-21 09:52:12 +00:00
pour lutilisation de execvp */
2021-02-16 15:12:37 +00:00
free(dest[i]);
dest[i] = NULL;
//free(token);
2021-02-16 15:12:37 +00:00
}