EXPRESSIONS ARITHMÉTIQUES

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 :

nombre
Nombre entier en base 10;

% constructeur
Longueur de ce que produit le constructeur;

nom d'expression arithmétique
L'énoncé /nom := nombre (ou expression arithmétique) permet d'associer un nom à une expression arithmétique. Ce nom peut être utilisé dans toute expression arithmétique. Par exemple :
LIGNE [LARGEUR_LIGNE] $00:$FF := LIGNE.
/LARGEUR_LIGNE := 132

Ceci permet de rendre des directives plus lisibles et plus faciles à modifier.

variable
Utilise le contenu de la variable comme un nombre déjà encodé. Cette variable a donc obtenu son contenu d'un fichier encodé (et non d'un fichier-texte directement lisible à l'écran) ou par l'encodage d'une suite de caractères numériques (voir ^base plus bas).

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.

transformation ( constructeur, ... , constructeur )
La transformation est appelée avec ce que produisent les constructeurs comme données à traiter : seuls les quatre premiers octets de la sortie produite par la transformation sont utilisés.

( constructeur, ... , constructeur ) ou
nom de constructeur ou
chaînes de caractères
Utilise ce que produisent les constructeurs comme un nombre déjà encodé.

Seuls les quatre premiers octets de la séquence de caractères produite sont utilisés.

^10 constructeur
Fournit le nombre correspondant à l'encodage (base 10 ou autre) des caractères numériques produits par le constructeur. Un nombre fixe (sans expression arithm étique) entre 2 et 36 peut être mis à la place de 10 pour spécifier une autre base (2: binaire, 16: hexadécimal).

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.

CONSTRUCTEURS ET VALEURS NUMÉRIQUES

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 .