dimanche 27 juillet 2014

Réalisation d'un éditeur de texte en utilisant les listes chaînées



I- Le cadre général :

a.      But du Mini-projet:

Ce projet consiste à concevoir un éditeur de texte contenant les fonctionnalités de base communes à tous les éditeur en utilisant les listes  chaînées.

b.      Présentation du sujet :

Un éditeur de texte est un logiciel destiné à la création et l'édition de fichiers textes. Chaque système d'exploitation fournit un éditeur, tant son usage est courant, voire incontournable pour certaines tâches (souvent informatiques (administration de système et développement logiciel)).
                      
Les éditeurs de texte se divisent en deux catégories:
·         Les éditeurs plein écran (ou full-screen),
·         Les éditeurs en mode caractère.
Un éditeur plein écran n'interagit avec l'unité centrale que lorsqu'elle est pressée une touche comme Entrée ou l'une des touches de fonction (Fn) ou d'action (PAn) du terminal. Le reste du temps, ce sont les capacités d'insertion native fournies par l'unité de contrôle du terminal qui permettent l'ajout, la suppression ou l'insertion de caractères dans toutes les lignes affichées sur l'écran.

c.      Quelques opérations de base :

Les fonctionnalités les plus élémentaires d'un éditeur sont:
      
-          Ouvrir un fichier (en proposant parfois une liste de fichiers récemment ouverts, ou déjà existants, voire en permettant de restreindre cette liste par un filtre)
-          Ajouter du texte dans une ligne, ou des lignes dans un fichier
-          Ôter des caractères dans une ligne, ou des lignes d'un fichier
-          Rechercher/remplacer une chaîne texte (la recherche n'est pas toujours disponible).
-       Sauvegarder le fichier, ou au contraire sortir en renonçant aux modifications (en cas de grosse erreur comme un effacement involontaire de texte).    

d.     Analyse générale :

Editer un texte semble très intuitif à toute personne sachant utiliser un ordinateur et un éditeur. Du point de vue d’un programmeur, il faut penser à toutes les fonctionnalités que doit proposer un tel programme. De l’ouverture d’un fichier à sa sauvegarde, en passant par les différentes opérations possibles sur le texte et l’annulation de celles-ci. Toutes ces fonctionnalités s’appliquent à des données.

Les fonctionnalités de l'éditeur à réaliser :

Parmi celles-ci certaines sont « indispensables » au bon fonctionnement de l'éditeur et au respect du cahier des charges. En voici une synthèse :

·    Ouvrir ou créer un fichier ;
·         Sauvegarde du fichier sous ;
·         Sauvegarde du fichier si le fichier existe déjà ;
·         Insertion du texte à la position courante ;
·         Suppression du texte à la position courante ;
·         Ajouter du texte après la ligne courante ;
·         Donner la position du curseur ;
·         Faire la recherche ;
·     Et d’autres fonctionnalités….

Un éditeur de texte porte bien son nom : son rôle est en effet d’éditer du texte… La donnée fondamentale est donc un texte. Texte qui peut provenir d’un fichier chargé en mémoire, ou qui peut également être créé de « toute pièce » dans l’éditeur.
                        
Afin que cet éditeur puisse servir de manière effective,il faut disposer de données persistantes qui permettent de stocker de manière définitive ce texte (dans un fichier). Lors de son chargement en mémoire, le texte est placé ligne par ligne dans une liste chaînée et devient une donnée résidente jusqu’à un nouvel enregistrement.

En dehors du texte, des données relatives aux opérations que l’on veut effectuer sont indispensables : les coordonnées x et y de la position courante par exemple. Nombre de lignes et nombre de caractères dans la ligne courante sont également des données q'on aura besoin d’extraire du texte.

Un dernier type de données est utilisé, il s’agit de la liste des commandes acceptées et reconnues par l’interpréteur de commande. Ces données sont réunies dans une liste les faisant correspondre aux fonctions voulues. On traite ces données en les comparants à une saisie de l’utilisateur.

II- Architecture de l'application :

Lors du lancement du programme, on obtient la fenêtre suivante qui demande soit d’ouvrir un fichier existant soit la création d’un nouveau fichier. Cette opération aboutira à la création d’une liste doublement chaînée contenant le texte en cours d’édition, chaque ligne étant rattachée à celle la précédant et à celle la suivant.

Une fois cette opération effectuée, Une fenêtre de saisie s’ouvre, permettant de d’éditer le texte avec toutes les fonctionnalités habituelles de déplacement du curseur ou des lignes, de la saisie du texte ou encore sa suppression.


Lorsqu’on clique sur ECHAP,  un prompt «  EDITEUR> » s’affiche nous permettant de saisir la fonctionnalité qu’on veut  effectuer. La plus simple étant « help » ; l’aide nous permet de consulter les différentes commandes relatives à chaque fonctionnalité disponible sur notre éditeur.


Ainsi, l’utilisateur peut saisir les commandes qu’il désire suivies éventuellement de leurs paramètres. Ces commandes appelleront les fonctions voulues afin qu’elles s’exécutent et laissent à nouveau la place à l’interpréteur de commande, déjà prêt pour la commande suivante. 
Les fonctions réalisant des opérations sur le texte reçoivent toutes un pointeur sur la liste doublement chaînée. Elles peuvent être appelées les unes à la suite des autres. 
En fin d’édition, il pourra être utile de sauvegarder les modifications du texte dans un fichier.



Réalisation d'un éditeur de texte en utilisant les listes chaînées(suite)

III- Analyse détaillée:

3.1 - Présentation et justification de la structure :

Afin de stocker le texte en mémoire, on a utilisé deux structures représentant respectivement les caractères et les lignes:
Les caractères :


Les lignes : 







    Différentes structures de données auraient pu être utilisées mais la plus simple s’est avérée être deux listes doublement chaînées, permettant d’accéder à tous les caractères stockés via un compteur tout en restant liés aux caractères précédents et suivants.

3.2 – Présentation et justification des fichiers :

Les fichiers que peut ouvrir cet éditeur n’obéissent à aucun format particulier. Il est cependant logique d’ouvrir des fichiers ASCII, qui contiennent du texte brut. Cependant nous n’avons pas fixé de barrières : avec ou sans extension, d’un *.txt à un *.c ou *.exe, tous les fichiers peuvent être chargés. Il suffit d’en indiquer le nom complet accompagné de l’extension éventuelle.

3.3 – Architecture détaillée :

On a séparé le code source du projet en plusieurs modules, réunis autour d’une fonction principale « main ». On va ici vous présenter l’architecture de ce découpage modulaire :



3.4  – Description des modules :

a.      main :

Le rôle de la fonction main est axé essentiellement sur l’initialisation des différents modules composant cet éditeur, en plus de l’ouverture du fichier directement à partir du système d’exploitation ou le chargement du fichier si on l’ouvre à partir de l’application proprement dite.

b.      Structure de donnée :

Ce module comporte les structures qui mettent en place les listes doublement chaînées déjà citées.

c.     Opérations élémentaires   :

Ce module assure la gestion élémentaire de l’éditeur du texte, ceci via la gestion du fichier et celle des structures

·         Gestion du fichier : Cette opération consiste au chargement du fichier et l’enregistrement des caractères dans la structure d’une part. Et, lors d’une opération de sauvegarde, enregistrer les caractères dans le fichier à partir de la structure, d’autre part.

·         Gestion des structures : Ce fichier comprend :
o    une fonction qui assure l’ajout des lignes ajouterLigne(ptr_ligne *ligneEnCour),

o    une autre fonction qui assure leur surpression supprimerLigne(ptr_ligne *ligneEncour )
o   Une troisième qui permet l’insertion du caractère avant le caractère en cours ajouterCaractere(ptr_ligne *LigneEnCour, ptr_charLigne *charEncour,long val),
o    une qui  libère l’espace du caractère en cour de la structure et renvoi au caractère suivant supprimerCaractere(ptr_ligne *premiereLigne, ptr_ligne *LigneEnCour, ptr_charLigne *charEncour) ;
 o   Une fonction qui effectue la recherche d’un mot depuis le 1er caractère jusqu’au dernier, rechercherMot(ptr_charLigne *charDebut, ptr_charLigne charFin, ptr_ligne *r *mot),
o   Et une dernière qui permet de remplacer un mot donné par l’utilisateur par un autre au choix, remplacerMot(ptr_ligne *premierLigne,ptr_ligne *ligneEnCour, ptr_charLigne *CharEnCour, char *mot, char *mot2,ptr_charLigne dernierChar,ptr_buffer *lebuffer).

d.      Module pleine page :
En plus du sous modèle qui permet de gérer le curseur en fonction des flèches et autres, Ce module comprend :
·         Module pleine page : qui contient 4 fonctions qui gèrent les actions propres aux touches:
o   ‘ del’ qui permet de supprimer le caractère où est basé le curseur ;
o   ‘retour’ ou ‘ß’ qui permet de supprimer le caractère à gauche du curseur avec le même principe de la touche ‘del’ seulement avec des conditions différentes ;
o   ‘ajouter caractère’ qui permet d’ajouter le caractère saisie su r l’emplacement de celui-ci tout en le déplaçant vers la droite ;
o   ‘entrée’ qui permet de créer une nouvelle ligne et de faire passer les caractères après le curseur à la ligne.


e.        Module commande :
Ce module permet de gérer les fonctionnalité basées sur un jeu de commandes (relatées dans le help), et ceci grâce au :
·         Menu commande  qui comprend une fonction Menucommande( ) qui permet, après récupération de la commande , d’assurer sa traduction, avant de passer à l’exécution en cas d’absence d’une erreur de syntaxe.
·         Module commande :qui contient les différentes fonctions traitant chaque commande à part. dont voici la liste :



Ce module joue un rôle essentiel quand à la sauvegarde temporaire de la saisie avant que l’utilisateur décide d’enregistrer lui-même. En effet, on a représenté ce buffer sous forme d’une structure de pile :



h.      Module Conio :
Ce module, comporte les différentes fonctions assurant des fonctionnalités techniques dont on a eu besoin pour la bonne exécution de notre éditeur ;
Exemple: la fonction gotoxy( ).