You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.7 KiB
C

/**
* @file
* @author Fabien Givors <fabien.givors@chezlefab.net>
* @version 1.0
*
* @section LICENSE
*
* Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le
* modifier suivant les termes de la GNU General Public License telle que
* publiée par la Free Software Foundation ; soit la version 3 de la licence,
* soit (à votre gré) toute version ultérieure.
*
* Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE
* GARANTIE ; pas même la garantie implicite de COMMERCIABILISABILITÉ ni
* d'ADÉQUATION à UN OBJECTIF PARTICULIER. Consultez la GNU General Public
* License pour plus de détails.
*
* Vous devriez avoir reçu une copie de la GNU General Public License en même
* temps que ce programme ; si ce n'est pas le cas, consultez
* <http://www.gnu.org/licenses>.
*
* @section DESCRIPTION
*
* Ce fichier contient un précurseur de shell se contentant de lire les lignes
* de commandes sur l'entrée standard, de la parser et d'en afficher les
* arguments un par un.
*/
// Pour strtok_r en c99:
#define _BSD_SOURCE
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXARGS 128
/**
* parse_cmd parse les arguments de la ligne de commande.
*
* parse_cmd stocke tous les arguments de la ligne de commande cmd dans un
* tableau de chaînes de caractères. Tout cela étant alloué dans le tas. Puis
* elle renvoie ce tableau.
*
* @param cmd la ligne de commande à découper.
* @return un tableau dont chaque case contient un des arguments de la ligne de
* commande.
**/
char** parse_cmd(char* cmd)
{
char** argv = (char**)malloc(MAXARGS*sizeof(char*));
int np = 0;
for(char* arg = NULL; (arg = strtok_r(cmd, " ",&cmd)); np++)
{
argv[np] = (char*)malloc(sizeof(arg));
strcpy(argv[np], arg);
}
argv[np]=NULL;
return argv;
}
/**
* free_cmd libère l'espace qui a été alloué lors du parsing.
*
* free_cmd libère l'espace qui a été alloué lors du parsing de la ligne de
* commande en détruisant le tableau des arguments.
*
* @param argv le tableau des arguments qui a été généré par parse_cmd.
**/
void free_cmd(char** argv)
{
for(int np = 0; argv[np]; np++)
free(argv[np]);
free(argv);
}
/**
* print_prompt affiche une invite de commande.
**/
void print_prompt(void)
{
char user[] = "moi";
char hostname[] = "mabécane";
char cwd[] = "~";
printf("%s@%s:%s$ ", user, hostname, cwd);
}
/**
* main fonction d'entrée du programme.
**/
int main(void)
{
char buf[256];
print_prompt();
while(gets(buf))
{
char* buf_temp = buf;
char* cmd = NULL;
while((cmd = strtok_r(buf_temp, ";", &buf_temp)))
{
char** cmd_argv = parse_cmd(cmd);
free_cmd(cmd_argv);
}
print_prompt();
}
return 0;
}