Projet d’Introduction au Système
Licence 2ème année

Gilles Roussel

À réaliser seul.
http://igm.univ-mlv.fr/ens/Licence/L2/2012-2013/System/projet.html
À rendre avant le 22 mai 2014, en envoyant un mail contenant l’archive de votre projet à votre chargé de TD : Sylvain.Cherrier@u-pem.fr ou Michel.Landschoot@u-pem.fr.

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.

1  Le mécanisme de plugin

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.

2  Les plugins à implanter

Les plugins suivants devront être implantés et être placés dans plusieurs bibliothèques :

3  Évaluation

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