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
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 fichient 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;
|
|
}
|