Les caractères possibles pour un ordinateur peuvent se diviser en trois catégories:
ADAPT vous permet d'indiquer un caractère de plusieurs façons différentes:
ADAPT vous donne donc tous les moyens nécessaires pour exprimer facilement n'importe quelle chaîne de caractères:
Les caractères de contrôle les plus utilisés sont:
$07 #07 ^G : sonner la cloche du terminal (BELL)
$08 #08 ^H : reculer le curseur de une colonne (Back-Space)
$09 #09 ^I : avancer d'une tabulation (Tab)
$0A #10 ^J : avancer d'une ligne (Line-Feed)
$0C #12 ^L : avancer à la page suivante (Form-Feed)
$0D #13 ^M : retour de chariot à la marge de gauche (Return)
$1B #27 ^[ : début d'une commande spéciale (Escape)
Dans un texte, une page est une suite de caractères se terminant par ^L ou par la fin du texte (dernière page):
/page = 0~(~^L, $00:$FF), ~1 ^L
Le type de donnée page extrait zéro ou plus caractères quelconques ( $00:$ FF ) sauf un caractère de saut de page ( ~^L ). Si un saut de page se trouve immédiatement après les caractères repérés, il est extrait lui aussi ( ~1 ^L ).
Une ligne est une suite de caractères se terminant par un retour de chariot et un changement de ligne ( ^M^J ) :
/ligne = 0~(~^M^J, $00:$FF), ^M^J
Le type de donnée ligne extrait zéro ou plus caractères quelconques ( $00:$ FF ) sauf une fin de ligne ( ^M^J ). Cette suite de caractères doit être suivie d'une fin de ligne.
Quel que soit le type d'ordinateur, ADAPT garantit qu'une fin de ligne est représentée par ^M^J : vous n'avez donc pas à modifier vos directives lorsque vous passez d'une machine à une autre.
Les caractères accentués utilisés en français sont, pour le IBM/PC :
à : $85 #133 è : $8A #138 ù : $97 #151
â : $83 #131 ê : $88 #136 û : $96 #150î : $8C #140
ô : $93 #147 ë : $89 #137 ü : $81 #129ï : $8B #139
ç : $87 #128 é : $82 #130
Lors de la recherche d'une chaîne de caractères, ADAPT peut ignorer la différence entre majuscules, minuscules et lettres accentuées : ADAPT connaît donc la correspondance entre les lettres accentuées de votre ordinateur et les lettres non accentuées.
Une chaîne de caractères est souvent constituée d'une suite de caractères appartenant à plusieurs catégories différentes : afin de permettre la définition de longues chaînes de caractères de tout type, ADAPT considère que toute suite de:
Cette possibilité d'inscrire des chaînes en plusieurs morceaux permet d'écrire des chaînes plus longues qu'une ligne de directives : il suffit de changer de ligne entre deux morceaux.
Le constructeur:
$82 "crivons" ^M^J "deux lignes !"
est donc défini par une seule et même chaîne de caractères. Sur un IBM/PC, la sortie correspondante serait:
écrivons
deux lignes !
Ceci a pour conséquence que des éléments distincts doivent alors être séparés
par des virgules.
Ainsi
2 $82 "crivons" ^M^J "deux lignes !"
affichera:
écrivons
deux lignes !écrivons
deux lignes !
tandis que
2 $82 "crivons", ^M^J "deux lignes !"
affichera:
écrivonsécrivons
deux lignes !
Dans le cas d'un patron de fouille, on ne peut pas inscrire dans une même chaîne, des chaînes de caractères entre apostrophes et des chaînes de caractères entre guillemets : ADAPT ne pourrait déterminer s'il doit retrouver la chaîne en tenant compte ou non des différences entre majuscules, minuscules et lettre accentuées. 'D',"estin" est permis mais 'D' "estin" ne l'est pas.
; Cette transformation traduit les caractères accentués
; du IBM/PC dans la séquence de codes nécessaires à une
; imprimante FACIT 4512.
/Accentuer :
$82 = $1B$38$46 '{' $1B$38$40. ; é $83 = 'a'^H'^'. ; â $85 = $1B$38$46 '@' $1B$38$40. ; à $87 = $1B$38$46 '``' $1B$38$40. ; ç $88 = 'e'^H'^'. ; ê $8A = $1B$38$46 '}' $1B$38$40. ; è $8B = 'i'^H $1B$38$46 '~' $1B$38$40. ; ï $89 = 'e'^H $1B$38$46 '~' $1B$38$40. ; ë $81 = $1B$38$43 '}' $1B$38$40. ; ü $8C = 'i'^H'^'. ; î $93 = 'o'^H'^'. ; ô $96 = 'u'^H'^'. ; û $97 = $1B$38$46 '|' $1B$38$40. ; ù
L'imprimante FACIT possède la plupart des lettres minuscules accentuées dans sa fonte. Il faut cependant changer de "nationalité" pour que ces lettres viennent remplacer des lettres de la fonte normale : lorsqu'on passe en mode français, { devient é , @ devient à , etc. Cette façon de faire est conforme aux anciennes normes ASCII et ISO, et se retrouve sur de nombreux modèles d'imprimantes. Seule la séquence de commande à envoyer pour changer de "nationalité" n'est pas standard.
Pour l'imprimante FACIT, la séquence $1B$38$46 permet de passer en mode " français", tandis que la séquence $1B$38$40 permet de revenir en mode " américain".
Curieusement, sur cette imprimante (comme sur toutes celles qui suivent les anciennes normes), les lettres avec tréma (ë et ï) et avec accent circonflexe ( â, ê, î, ô, û) manquent tout à fait. Il faut donc les produire par superposition : ^H est le caractère de contrôle <Back-Space> qui permet de revenir en arrière pour superposer ^ sur une voyelle.
Les majuscules accentuées peuvent aussi être produites par superposition : on doit cependant un peu remonter sur la ligne pour imprimer l'accent bien au dessus de la lettre.
Le chapitre NOMS DE CONSTRUCTEURS fournit des moyens permettant de rendre ces directives moins rébarbatives.
Dans un fichier de directives, la même définition de constructeurs peut devoir être répétée dans plusieurs règles.
L'énoncé:
/nom:= constructeur, ..., constructeur
permet d'associer un nom à une série de constructeurs. Ce nom peut ensuite être utilisé en lieu et place de ces constructeurs.
Par exemple:/fdl := ^M^J
associe le nom fdl au constructeur ^M^J. Vous pouvez alors utiliser fdl comme constructeur dans un résultat.
Ou encore:/Date := ANNEE, '-', MOIS, '-', JOUR
associe le nom Date aux constructeurs ANNEE, '-', MOIS, '-' et JOUR . Dans un rapport, vous pourrez donc produire une date simplement en utilisant Date dans les définitions des résultats.
Dans la transformation Accentuer, une séquence de codes permet de changer la "nationalité" de l'imprimante afin d'accéder aux lettres accentuées. Si on définit des noms de constructeurs pour ces séquences, Accentuer peut être réécrite :
(1)/Accentuer :
(2)$82 = France '{' USA. ; é
(3)$83 = 'a' circonflexe. ; â
(4)$85 = France '@' USA. ; à
(5)$87 = France '``' USA. ; ç
(6)$88 = 'e' circonflexe. ; ê
(7)$8A = France '}' USA. ; è
(8)$8B = 'i' tréma. ; ï
(9)$89 = 'e' tréma. ; ë
(10)$81 = Allemagne '}' USA. ; ü
(11)$8C = 'i' circonflexe. ; î
(12)$93 = 'o' circonflexe. ; ô
(13)$96 = 'u' circonflexe. ; û
(14)$97 = France '|' USA. ; ù
(15)/circonflexe := ^H '^' ; ^ sur la lettre préc.
(16)/tréma := ^H France '~' USA ; tréma sur la précéd.
(17)/USA := $1B $38 $40 ; fonte américaine
(18)/Allemagne := $1B $38 $43 ; fonte allemande
(19)/France := $1B $38 $46 ; fonte française
Comme vous pouvez le constater, les noms de constructeurs définis (ligne (15) à (19) ) permettent de rendre la transformation Accentuer plus compréhensible et plus facile à modifier.
Lorsque vous devrez programmer la table des codes d'impression des accents pour une autre imprimante (DEC writer III par exemple), vous n'aurez qu'à changer la définition de USA, Allemagne et France : seules les séquences de changement de "nationalité" diffèrent dans la plupart des cas.
Des noms de constructeurs peuvent être utilisés dans la définition d'autres noms de constructeurs: vous pouvez donc définir des structures de données à produire par raffinements successifs, en passant du global au particulier.
Les noms de constructeurs ne peuvent pas être utilisés directement dans un patron de fouille, car ce ne sont pas des types de données. Il faut les précéder d'un ou deux points d'interrogation (? ou ??), tel que le chapitre D'AUTRES OUTILS POUR VOS PATRONS DE FOUILLE l'explique en détail.
Par exemple, ?fdl dans un patron de fouille se vérifie lorsque ^M^J est rencontré dans les données.
Rappelez vous aussi de toujours mettre une virgule de séparation entre un nom et une parenthèse ouvrante lorsque un nom de constructeur ou de variable est immédiatement suivi par un regroupement entre parenthèses. Ceci évite toute confusion avec un appel à une sous-transformation tel que nous allons le voir plus loin.