!Unjustify

Par
Benoît Gilon

Ce petit utilitaire couvre un besoin fonctionnel et un besoin d'auto-formation aux mécanismes liés à l'adoption du module FrontEnd d'Acorn pour développer des outils de type "ligne de commande" dans l'environnement WIMP.

Le besoin fonctionnel est le suivant:

Malheureusement ces fichiers de documentation, lorsqu'ils sont fournis sous forme de fichiers plats (cad non DVI, PosScript ou LaTEX), sont déjà formattés par l'auteur grâce à un outil de type nroff. Cela implique qu'ils sont déjà justifiés pour une impression dans un format déterminé (US Letter ou A4). Ce qui rend pour le moins laborieux la tâche de supprimer tous les espaces et fins de ligne artificiels insérés par le progamme (cas de l'utilisation du mode "justification totale").

Utilisation

Bien que n'assurant pas une tache liée au développement logiciel, le programme se présente comme un module s'intégrant dans le DDE (Desktop Development Environment) d'Acorn.

Il n'est toutefois pas censé faire remonter des messages d'erreur directement liés à une ligne source (du fichier à "déformatter"); aussi il n'y a pas d'interface avec le mécanisme "throwback" (NDA: les lecteurs intéressés pourront se reporter au programme DDE front end pour !TLA sur la disquette FFF01).

Les règles de déformattage appliquées au fichier source sont:

  1. Supression de toute fin de ligne physique qui ne soit pas une fin de paragraphe (la remplace par un caractère espace si il y lieu);
  2. Si le dernier caractère non espace d'une ligne physique est dans le jeu ".;:!?", alors la ligne physique conclue un paragraphe;
  3. Considère toute succession d'une fin de ligne physique par une autre ligne physique ne comportant au plus que des espaces comme une fin de paragraphe;
  4. Conserve tout espace en début de paragraphe;
  5. Retire tout caractère espace d'une ligne sans contenu (ne subsiste que le saut de ligne);
  6. Remplace toute occurence d'un nombre d'espaces supérieur à 1 à l'intérieur d'un paragraphe par un seul espace.
En mode ligne de commandes et en admettant que l'exécutable unjustify se trouve accessible à travers la variable d'environnemnt Run$Path:
*unjustify [options] [fichier_entrée [fichier_sortie]]
les options possibles sont:
-H ou -HELP affiche la syntaxe possible d'utilisation à l'écran;
-D: affiche une courte description de ce que fait le programme;
Si le paramètre fichier_entrée n'est pas spécifié, le flux d'entrée standard est sélectionné.
Si le paramètre fichier_sortie n'est pas précisé, le flux de sortie standard est choisi.

Etude des sources

D'un point de vue source, le programme est divisé en deux modules:
  1. un module main chargé de traiter les aguments, d'ouvrir les fichiers si il y lieu, de retourner des messages d'erreur sur le flux d'erreur si besoin et enfin d'appeler la fonction translate() chargée de la transformatin proprement dite; ce module étant FORTEMENT inspiré par les programme !ToPCC et !ToANSI délivrés en accompagnement du compilateur C d'Acorn (C++ comme Destop C), il n'est nul besoin de le détailler ici.
  2. un module translate chargé du travail noble.
Le travail du traducteur est basé sur l'évolution d'une variable mode entre 4 états:
NO_PAR
nous parcourons ce qui pourrait être le dèbut d'un paragraphe: le traitement effectué dans cet état assure le respect des règles 4 et 5;
PARA_NOSPACE
participe à l'assurance des règles 1 et 2;
PARA_SPACE
indique un parcours de caractères d'espaces au milieu d'un paragraphe; assure le respect de la règle 6 et participe à l'assurance des règles 1 et 2;
ATTENTE
détermine si une ligne physique vide peut indiquer la fin de paragraphe: assure le respect de la ligne 3;
Quelques remarques utiles sur le code: