Projet d’Introduction au Système |
Le sujet est susceptible d’être modifié. Dans ce cas, les modifications seront clairement marquées par un changement de couleur. Il est donc conseillé de relire cette page régulièrement. Les modifications du 1er mai 2014 sont en vert. Les modifications du 3 mai 2014 sont en bleu.
L’objectif de ce projet est d’écrire un interpréteur de commandes de manipulations listes de chaînes de caractères extensible par plugin. Le programme devra fournir une interface texte (en ligne de commande) capable de charger dynamiquement les plugins correspondants aux commandes tapées par l’utilisateur et leur passer les arguments.
Les plugins sont contenus dans une ou plusieurs bibliothèques partagées (.so
). Au
démarrage, l’application recherchent ces bibliothèques dans un
ensemble de répertoires. Ceux-ci sont précisés dans un fichier
~/.aloha.cfg
ou par la variable d’environnement
ALOHA_PATH sous la forme d’une listes de répertoires séparés
par des « :
».
Une bibliothèque de plugin contient une méthode char **getPlugins() qui retourne l’ensemble des noms de plugins de la bibliothèque sous la forme d’un tableau de chaînes de caractères, terminé par NULL. Ces noms correspondent à des noms de fonctions (qu’on appellera maintenant plugins) présents dans la bibliothèque.
Au démarrage l’application récupère l’ensemble des noms de plugins disponibles dans les bibliothèques et les stockent dans une structure de données adaptée à la recherche d’un plugin en fonction de son nom (par exemple un arbre lexicographique, une table de hachage ou une liste triée). Au démarrage, les fonctions correspondant aux plugins, ne sont pas chargées (par dlsym()). Elles sont chargées au moment de leur première utilisation par une fonction de chargement dynamique.
Chaque plugin prend en argument les arguments de la ligne de commande sous la forme d’un tableau de chaînes de caractères (type argv) ainsi qu’une pile de listes de chaîne de caractères. Il retourne une nouvelle pile, éventuellement modifiée.
Le prototype d’un plugin est pile plugin(char** argv, pile p). La pile sera représentée par une liste chainée de listes de chaînes de caractères. Le type de la liste de chaînes de caractères est liste. Les types pile et liste sont définis comme suit:
typedef struct l {
char* s;
struct l* suivant;
} *liste;
typedef struct p {
liste l;
struct p* suivant;
} *pile;
Une pile vide ou une liste de chaînes de caractères vide est représentée par NULL.
Vous veillerez dans vos plugins à libérer, si nécessaire, la mémoire liée à la pile ou aux listes.
Les plugins suivants devront être implantés et être placés dans plusieurs bibliothèques :
aa bb ca
, alors
tocommand grep a
affichera deux lignes, la première contenant aa
et la seconde ca
;
fromcommand echo a b
placera en sommet de pile un liste contenant l’unique élément "a b"
.
Le respect des noms de fichiers et de fonctions précisés dans ce sujet sont un aspect important de l’évaluation finale du projet car ceux-ci seront testés de façon automatique.
Le choix et l’utilisation d’une structure de données adaptée à la recherche des plugins seront pris en considération.
Une attention particulière devra être portée à la détection et à la gestion des erreurs qui pourront se produire lors de l’utilisation de votre bibliothèque.
Votre projet sera à rendre sous la forme d’une archive compressée tar.gz contenant : les sources dans un répertoire src, les bibliothèques dans un répertoire lib, les commandes dans un répertoire bin et une documentation de 5 pages maximum sur votre projet au format PDF dans un répertoire doc.
Ce document a été traduit de LATEX par HEVEA