ADAPT vous permet d'indiquer des nombres à plusieurs endroits, tant dans les patrons de fouille que dans les constructeurs. Mais il arrive souvent que la longueur d'une information varie selon un compteur contenu dans les données et qu'elle ne puisse donc pas être connue à l'avance. Heureusement, tout ces nombres peuvent être calculés dynamiquement :
Une expression arithmétique peut être spécifiée
partout où un nombre est permis dans les directives
Vous pouvez donc utiliser des expressions arithmétiques comme facteurs de répétitions dans les patrons de fouille:
n patron : vérifier n fois un patron
min ~ ou min ~ max patron : vérifier un patron au moins min fois.
~ max ou min ~ max patron : vérifier un patron au plus max fois.
Vous pouvez aussi les utiliser dans les constructeurs:
n constructeur: copier n fois ce que produit le constructeur.
^>n ou ^<n constructeur: cadrer ce que produit le constructeur dans n colonnes.
#n , ##n ou ###n : produire la séquence de caractères correspondant à la représentation interne du nombre n (simple, double ou quadruple précision). Plus de détails sur ce constructeur au chapître CONSTRUCTEURS ET VALEURS NUMÉRIQUES .
Les expressions arithmétiques peuvent être très simples:
nombre :Un simple entier en base 10, positif ou négatif.
% constructeurfournit la longueur de la séquence de caractères produite
par le constructeur indiqué après le pourcent ( % ). Par exemple:
% "Bonjour" vaut 7
% MOIS retourne la longueur du contenu de la variable MOIS
Vous pouvez aussi avoir comme résultat à une règle :
= NOM, ^M^J, %NOM '-', ^M^J
pour écrire un nom et, juste en dessous, autant de tirets qu'il y avait de caractères dans ce nom.
Des crochets ( [ ... ] ) doivent entourer les expressions arithmétiques plus sophistiquées. Celles-ci peuvent être de véritables formules mathématiques avec opérandes, opérateurs et sous-expressions.
Les opérandes possibles sont :
Ceci permet de rendre des directives plus lisibles et plus faciles à modifier.
Vous pouvez donc écrire les patrons de fouille suivant :
LONGUEUR c, NOM [LONGUEUR] c
pour extraire, d'un fichier encodé, un nom dont la longueur est fournie par l' octet qui le précède.
Seuls les quatre premiers octets contenus dans la variable sont utilisés.
Seuls les quatre premiers octets de la séquence de caractères produite sont utilisés.
Par exemple :
[^10 "0123"] vaut 123, [^16 "1F"] vaut 31
[^10 MOIS] retourne le numéro indiqué par les caractères contenus dans
la variable MOIS.
Les opérateurs permis sont :
+: l'additionEx. :[LONGUEUR+1]
-: la soustractionEx. :[FIN-DEBUT+1]
*: la multiplicationEx. :[MINUTES*60]
/: la divisionEx. :[DOUBLET / 256]
/*: le modulo (reste de la division)Ex. :[DOUBLET /* 256]
L'évaluation d'une expression arithmétique se fait de gauche à droite. Cependant, la multiplication, la division et le modulo sont calculés en premier :
[1+2*3]équivaut à[1+[2*3]]donc 7
et non à[[1+2]*3](qui vaut 9 ).
Ce dernier exemple utilise une dernière possibilité dans les expressions arithm étiques : les sous-expressions entre crochets ( [ ... ] ). Celles-ci permettent d'imposer l'ordre d'évaluation des opérateurs.
Dans la construction d'un résultat, on peut vouloir inscrire sous forme de caractères numériques (donc lisibles par un être humain et pas seulement par l' ordinateur) des valeurs numériques :
^base nombre permet de décoder un nombre. Par exemple :
^10 123 retourne les caractères 1 , 2 et 3
^10 [LONGUEUR]retourne la chaîne des caractères 2 et 5
si la variable LONGUEUR contient le nombre 25 .
^10 %NOM retourne aussi la chaîne des caractères 2 et 5
si la variable NOM contient 25 caractères.
Les bases possibles vont de deux à trente-six.
Par ailleurs, pour produire un fichier encodé, il peut être nécessaire de mettre un nombre sous la forme d'une chaîne de caractères mais sans le décoder. # nombre fournit un caractère dont le code est le nombre indiqué. ## nombre fournit deux caractères qui peuvent représenter un nombre entre zéro et 65535. ###nombre fournit quatre caractères qui peuvent représenter un entier positif ou négatif jusqu'à +/- 2147483647.
Par exemple :
#%NOM, NOM produit le fichier que le patron de fouille LONGUEUR c, NOM [LONGUEUR] c peut relire.
Ou encore, #[MINUSCULE - 'a' + 'A'] transforme en majuscule une lettre contenue dans la variable MINUSCULE .