strings
Description
Manipulation des chaînes et des caractères.
ForthEx utilise les caractères ASCII.
BL ( -- c )
Constante qui retourne la valeur ASCII 32 (espace).
arguments:
aucun
retourne:
c Valeur ASCII 32 qui représente l'espace.
>CHAR ( n -- c )
Vérifie que 'n' est dans l'intervalle ASCII 32..126, sinon remplace c par '_'
arguments:
n Entier à convertir en caractère.
retourne:
c Valeur ASCII entre 32 et 126
CHARS ( n1 -- n2 )
Retourne l'espace occupée par n caractères en octets.
Puisque ForthEx utilise les caractères ASCII et que ceux-ci occupe 1 seul octet
n1==n2.
arguments:
n1 Nombre de caractères
retourne:
n2 Espace requis pour n1 caractères.
CHAR+ ( c-addr -- c-addr' )
Incrémente l'adresse de l'espace occupé par un caractère.
arguments:
c-addr Adresse alignée sur un caractère.
retourne:
c-addr' Adresse alignée sur caractère suivant.
CHAR ( cccc S: -- c )
Recherche le prochain mot dans le flux d'entrée et empile le premier caractère de ce mot.
A la suite de cette opération la variable >IN pointe après le mot.
arguments:
cccc Chaîne de caractère dans le flux d'entré.
retourne:
c Le premier caractère du mot extrait du flux d'entrée.
[CHAR] ( cccc S: -- )
Mot immédiat à n'utiliser qu'à l'intérieur d'une définition.
Mot compilant le premier caractère du mot suivant dans le flux d'entré.
Après cette opération la variable >IN pointe après le mot trouvé.
Lors de L'exécution de cette définition le caractère compilé est empilé.
exemple:
: test [char] Hello ;
test \ S: H
arguments:
cccc Chaîne de caractère dans le flux d'entré.
retourne:
rien
FILL ( c-addr u c -- )
Initialise un bloc mémoire RAM de dimension 'u' avec le caractère 'c'.
Si c-addr > 32767 la mémoire réside en EDS.
arguments:
c-addr Adresse du début de la zone RAM.
u Nombre de caractères à remplir.
c Caractère de remplissage.
retourne:
rien
-TRAILING ( c-addr u1 -- c-addr u2 )
Raccourci la chaîne 'c-addr' 'u1' du nombre d'espace qu'il y a à la fin de celle-ci.
Tous les caractères <=32 sont considérés comme des espaces.
Si c-addr > 32767 accède la mémoire EDS.
arguments:
c-addr Adresse du début de la chaîne.
u1 Longueur initiale de la chaîne.
retourne:
c-addr Adresse du début de la chaîne.
u2 Longueur de la chaîne tronquée.
/STRING ( c-addr1 u1 n -- c-addr2 u2 )
Avance 'c-addr' de 'n' caractères et réduit 'u' d'autant.
arguments:
c-addr1 Adresse du premier caractère de la chaîne.
u1 Longueur de la chaîne.
n Nombre de caractères à avancer.
retourne:
c-addr2 c-addr1+n
u2 u1-n
UPPER ( c-addr -- c-addr )
Convertie la chaîne comptée en majuscules. Le vocabulaire de ForthEx est
est insensible à la casse. Les noms sont tous convertis en majuscules avant
d'être ajoutés dans le dictionnaire.
arguments:
c-addr Adressse du début de la chaîne comptée.
retourne:
c-addr La même adresse.
SCAN ( c-addr1 u1 c -- c-addr1 u2 )
Recherche du caractère 'c' dans la chaîne débutant à l'adresse
'c-addr1' et de longueur 'u1' octets.
retourne la position de 'c' et le nombre de caractères restant dans la chaîne.
arguments:
c-addr1 Adresse du début de la chaîne.
u1 Longueur de la chaîne.
c Caractère recherché.
retourne:
c-addr2 Adresse du premier 'c' trouvé dans la chaîne.
u2 Longueur restante de la chaîne à partir de c-addr2.
SKIP ( c-addr1 u1 c -- c-addr2 u2 )
Avance au delà de 'c'. Retourne l'adresse du premier caractère
différent de 'c' et la longueur restante de la chaîne.
arguments:
c-addr Adresse début de la chaîne.
u Longueur de la chaîne.
c Caractère recherché.
retourne:
c-addr2 Adresse premier caractère après 'c'.
u2 Longueur restante de la chaîne à partir c-addr2.
GETLINE ( c-addr u1 -- c-addr u2 )
Scan une mémoire tampon contenant du texte jusqu'au prochain caractère de fin de ligne.
arguments:
c-addr Adresse du premier caractère.
u1 Longueur du tampon.
retourne:
c-addr Adresse du premier caractère de la ligne.
u2 Longueur de la ligne excluant le caractère de fin de ligne.
MOVE ( c-addr1 c-addr2 u -- )
Copie un bloc mémoire RAM en évitant la propagation. La propagation se
produit lorsque les 2 régions se superposent et qu'un octet copié est recopié
parce qu'il a écrasé l'octet original dans la région source.
arguments:
c-addr1 Adresse de la source.
c-addr2 Adresse de la destination.
u Nombre d'octets à copier.
retourne:
rien
CMOVE ( c-addr1 c-addr2 u -- )
Copie un bloc d'octets RAM.
Débute la copie à partir de l'adresse du début du bloc en adresse croissante.
arguments:
c-addr1 Adresse source.
c-addr2 Adresse destination.
u Compte en octets.
retourne:
rien
CMOVE> ( c-addr1 c-addr2 u -- )
Copie un bloc d'octets RAM.
La copie débute à la fin du bloc en adresses décroissantes.
arguments:
c-addr1 Adresse source.
c-addr2 Adresse destination.
u Compte en octets.
retourne:
rien
EC@+ ( c-addr1 -- c-addr2 c )
Retourne le caractère à l'adresse pointée par 'c-addr1' et avance le pointeur au caractère suivant.
À utiliser si 'c-addr1' pointe vers la mémoire RAM ou EDS.
arguments:
c-addr1 Pointeur sur la chaîne de caractères.
retourne:
addr2 Pointeur avancée d'un caractère.
c Caractère à l'adresse c-addr1.
C@+ ( c-addr1 -- c-addr2 c )
Retourne le caractère à l'adresse pointée par 'c-addr1' et avance le pointeur au caractère suivant.
À utiliser si 'c-addr1' pointe la mémoire RAM ou FLASH.
arguments:
c-addr1 Pointeur sur la chaîne de caractères.
retourne:
c-addr' Pointeur avancée d'un caractère.
c Caractère à l'adresse 'c-addr1'.
CSTR>RAM ( c-addr1 c-addr2 -- )
Copie une chaine comptée de la mémoire FLASH vers la mémoire RAM.
arguments:
c-addr1 Adresse de la chaîne en mémoire flash.
c-addr2 Adresse destination en mémoire RAM.
retourne:
rien
S= ( c-addr1 u1 c-addr2 u2 -- f )
Comparaison de 2 chaînes. Retourne VRAI si égales sinon FAUX.
Les 2 chaînes doivent-être en mémoire RAM ou EDS.
arguments:
c-addr1 Adresse du premier caractère de la chaîne 1.
u1 Longueur de la chaîne 1.
c-addr2 Adresse du premier caractère de la chaîne 2.
u2 Longueur de la chaîne 2.
retourne:
f Indicateur Booléen d'égalité, vrai si les chaînes sont identiques.
BLANK ( c-addr u -- )
Dépose 'u' caractères espace (BL) à partir de l'adresse c-addr
arguments:
c-addr Adresse début RAM
u Nombre d'espaces à déposer dans cette région.
retourne:
rien
C-COMP ( c1 c2 -- -1|0|1 )
Compare les 2 caractères et retourne une des 3 valeur suivante:
-1 si c1 < c2
0 si c1==c2
1 si c1>c2
arguments:
c1 Premier caractère à comparer
c2 Deuxième caractère à comparer
retourne:
-1|0|1 Indique la relation entre les 2 caractères.
COMPARE ( c-addr1 u1 c-addr2 u2 -- -1|0?1 )
Compare la chaîne de caractère débutant à l'adresse 'c-addr1' de longueur 'u1'
avec la chaîne de caractère débutant à l'adresse 'c-addr2' de longueur 'u2'
Cette comparaison se fait selon l'orde des caractères dans la table ASCII.
Si 'u1'=='u2' et que tous les caractères correspondent la valeur 0 est retournée,
sinon le premier caractère qui diverge détermine la valeur retournée c1<c2
retourne -1 autrement retourne 1.
Si u1<u2 et que tous les caractères de cette chaîne sont en correspondance avec
l'autre chaîne la valeur -1 est retournée.
Si u1>u2 et que tous les caractères de c-addr2 correspondent avec ceux de c-addr1
la valeur 1 est retournée.
arguments:
c-addr1 Adresse du premier caractère de la chaîne 1.
u1 Longueur de la chaîne 1.
c-addr2 Adresse du premier caractère de la chaîne 2.
u2 Longueur de la chaîne 2.
retourne:
-1|0|1 Retourne -1 si chaîne1<chaîne2, 0 si chaîne1==chaîne2, 1 si chaîne1>chaîne2
SEARCH ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 f )
Recherche la chaîne 2 dans la chaîne 1. Si f est vrai c'est que la chaîne 2
est sous-chaîne de la chaîne 1, alors c-addr3 u3 indique la position et le
nombre de caractères restants. En cas d'échec c-addr3==c-addr1 et u3==u1.
exemple:
: s1 s" A la claire fontaine." ;
: s2 s" claire" ;
s1 s2 SEARCH \ c-addr3=c-addr1+5 u3=16 f=VRAI
arguments:
c-addr1 Adresse du premier carcactère de la chaîne principale.
u1 Longueur de la chaîne principale.
c-addr2 Adresse du premier caractère de la sous-chaîne recherchée.
u2 Longueur de la sous-chaîne recherchée.
retourne:
c-addr3 Si f est VRAI Adresse du premier caractère de la sous-chaîne, sinon = c-addr1
u3 Si f est VRAI nombre de caractère restant dans la chaîne à partir de c-addr3
f Indicateur Booléen succès/échec.
SLITERAL ( c-addr u -- )
Mot immédiat à n'utiliser qu'à l'intérieur d'une définition.
Compile le descripteur d'une chaîne qui est sur la pile des arguments.
A l'exécution le descripteur est empilé.
exemple:
: s1 s" test" ; immediate
: type-s1 s1 sliteral type ;
type-s1 test OK
arguments:
c-addr Adresse du premier caractère de la chaîne.
u Longueur de la chaîne.
retourne:
rien
Description
Commentaires.
( ( cccc S: -- )
Ce mot introduit un commentaire qui se termine par ')'.
Tous les caractères dans le tampon d'entrée sont sautés jusqu'après le ')'.
Il doit y avoir un espace de chaque côté de '(' car c'est un mot Forth.
Il s'agit d'un mot immédiat, il s'exécute donc même en mode compilation.
arguments:
cccc commentaire dans le texte d'entrée terminé par ')'.
retourne:
rien
\ ( cccc S: -- )
Ce mot introduit un commentaire qui se termine à la fin de la ligne.
Tous les caractères dans le tampon d'entré sont sautés jusqu'à la fin de ligne.
Il s'agit d'un mot immédiat, il s'éxécute donc même en mode compilation.
arguments:
cccc Caractères dans le texte d'entrée terminé par une fin de ligne.
retourne:
rien
.( cccc) ( -- )
Mot immédiat, affiche le texte délimité par ).
Extrait tous les caractères du texte d'entrée jusqu'après le caractère ')'.
Le délimiteur ')' n'est pas imprimé.
arguments:
cccc Caractères dans le texte d'entrée terminés par ')'.
retourne:
rien
Description
Mots utilisés dans la conversion d'entiers en chaînes de caractères.
La chaîne est construite à la fin dun tampon PAD. La variable HP (Hold Pointer)
est utilisée pour indiquée l'endroit où doit-être déposé le prochain caractère
de la chaîne construite.
DIGIT ( u -- c )
Convertion d'un chiffre en caractère ASCII selon la valeur de BASE.
arguments:
u Un entier entre 0..BASE-1
retourne:
c Représentation ASCII de cet entier qui représente 1 seul digit dans la base active.
Extrait le chiffre le moins significatif de 'ud1' et le convertie en caractère
en accord avec la valeur de la base 'u'.
arguments:
ud1 Entier double non signé qui est le nombre à convertir en chaîne ASCII.
u Entier simple non signé, valeur de la base numérique.
retourne:
ud2 Entier double qui est le quotient de ud/u, c'est la partie du nombre qui reste à convertir.
c Caractère ASCII qui représente le digit résultant de ud%u (modulo de ud par u ).
<# ( -- )
Initalise le début de la conversion d'un entier en chaîne ASCII.
La valeur de la variable HP est modifiée pour pointer à la fin du PAD.
Lors de la conversion les caractères sont ajoutés de la fin vers le début.
À chaque caractère ajouté à la chaîne la variable HP est décrémentée.
arguments:
aucun
retourne:
rien
HOLD ( c -- )
Dépose le caractère 'c' dans le PAD et décrémente la variable HP.
arguments:
c Caractère à insérer dans la chaîne.
retourne:
rien
# ( ud1 -- ud2 )
Convertion du digit le moins significatif de ud1 en ASCII et l'ajoute à la chaîne
dans PAD. Retourne le restant de ud1.
arguments:
ud1 Entier double non signé à convertir.
retourne:
ud2 Entier double non signé restant, i.e. ud1/base
#S ( ud1 -- ud2 )
Convertie tous les digits d'un entier double en chaîne ASCII.
arguments:
ud1 Entier double non signé à convertir en chaîne.
retourne:
ud2 Entier double de valeur nulle qui reste après la conversion.
SIGN ( n -- )
Ajoute le signe au début de la chaîne numérique dans le PAD.
Si 'n' est négatif alors on ajoute un signe '-' au début de la chaîne.
arguments:
n Entier qui représente le signe du nombre qui a été convertie.
retourne:
rien
#> ( ud -- addr u )
Termine la conversion d'un entier en chaîne ASCII en empilant le descripteur
de la chaîne.
arguments:
ud N'est pas utilisé c'est le relicat du mot #S. Cette valeur est simplement jetée.
retourne:
c-addr Adresse du premier caractère de la chaîne numérique.
u Longueur de la chaîne.
STR ( d -- c-addr u )
Convertion d'un entier double en chaîne ASCII, utilise le tampon PAD pour
développer la chaîne ASCII. La variable HP est aussi utilisée dans cette procédure.
arguments:
d Entier double à convertir en chaîne ASCII.
retourne:
c-addr Adresse premier caractère de la chaîne.
u Longueur de la chaîne.
COLFILL ( n1+ n2+ -- )
Ajoute les espaces nécessaires au début de la colonne pour que le nombre
soit aligné à droite d'une colonne de largeur fixe.
arguments:
n1+ Largeur de la colonne
n2+ Longueur de la chaîne numérique.
retourne:
rien
.R ( n n+ -- )
Affiche un nombre dans un colonne de largeur fixe aligné à droite.
arguments:
n Nombre à afficher.
n+ Largeur de la colonne.
retourne:
rien
U.R ( u +n -- )
Affiche un entier non signé dans une colonne de largeur fixe aligné à droite.
arguments:
u Entier simple non signé à afficher.
n+ Largeur de la colonne.
retourne:
rien
U. ( u -- )
Affiche un entier simple non signé en format libre.
arguments:
u Entier à afficher.
retourne:
rien
. ( n -- )
Affiche un entier simple signé en format libre.
arguments:
n Entier à afficher.
retourne:
rien
? ( addr -- )
Affiche l'entier simple à l'adresse donnée. On s'assure de l'alignement sur
une adresse paire. Si 'addr' est impaire l'adresse paire précédente est utilisée.
arguments:
addr Adresse dont le contenu sera affiché.
retourne:
rien
C? ( c-addr )
Lit et affiche l'octet à l'adresse c-addr.
arguments:
c-addr Adresse dont le contenu sera affiché.
retourne:
rien
UD. ( ud -- )
Affiche un entier double non signé en format libre.
arguments:
ud Entier double non signé.
retourne:
rien
D. ( d -- )
Affiche un entier double signé en format libre.
arguments:
d Entier double à afficher.
retourne:
rien
D.R ( d n+ -- )
Affiche un entier double dans une colonne de largeur fixe alignée à droite.
arguments:
d Entier double à afficher.
n+ Largeur de la colonne.
retourne:
rien
UD.R ( ud n+ -- )
Affiche un entier double non signé dans une colonne de largeur fixe alignée à droite.
arguments:
ud Entier double non signé à afficher.
n+ Largeur de la colonne.
retourne:
rien
Description
Mots utilisés dans la conversion d'une chaîne de caractères en entier.
DECIMAL? ( c -- f )
vérifie si 'c' est dans l'ensemble ASCII {'0'..'9'}
arguments:
c caractère ASCII à vérifier.
retourne:
f indicateur booléen.
>BASE10 ( u1 c -- u2 )
étape de conversion d'une chaîne de caractères en
entier décimal.
arguments:
u1 Entier résultant de la conversion d'une chaîne en décimal
c Caractère ASCII dans l'intervalle {'0'..'9'}
retourne:
u2 = u1*10+digit(c)
DIGIT? ( c -- x 0 | n -1 )
Vérifie si le caractère est un digit valide dans la base actuelle.
Si valide retourne la valeur du digit et -1
Si invalide retourne x 0
arguments:
c Caractère à convertir dans la base active.
retourne:
x 0 Faux et un entier quelconque qui doit-être ignoré car ce n'est pas un digit.
ou
n -1 Vrai et le caractère convertie en digit de la base active.
PONCT? ( c -- f )
Vérifie si le caractère 'c' est un point ou une virgule et retourne un
indicateur vrai si c'est le cas.
arguments:
c Caractère à vérifier.
retourne:
f Indicateur booléen, vrai si c est ','|'.'
>NUMBER (ud1 c-addr1 u1 -- ud2 c-addr2 u2 )
Convertie la chaîne en nombre en utilisant la valeur de BASE.
La conversion s'arrête au premier caractère non numérique.
arguments:
'ud1' Est initialisé à zéro
c-addr1 Adresse du début de la chaîne à convertir en entier.
u1 Longueur de la chaîne à analyser.
retourne:
ud2 Entier double résultant de la conversion.
c-addr2 Adresse pointant après le nombre dans le tampon.
u2 Longueur restante dans le tampon.
NEG? ( c-addr u -- c-addr' u' f )
Vérifie s'il y a un signe '-' à la première postion de la chaîne spécifiée par <c-addr u>
Retourne f=VRAI si '-' sinon f=FAUX.
S'il y a un signe avance au delà du signe.
arguments:
c-addr Adresse où débute l'analyse.
u Longueur de la chaîne à analyser.
retourne:
c-addr' Adresse incrémentée au delà du signe '-' s'il y a lieu.
u' Longueur restante dans le tampon.
f Indicateur Booléen, VRAI s'il le premier caractère est '-'.
BASE-MOD? ( c-addr u1 -- c-addr' u1' )
Vérifie s'il y a un modificateur de base
Si vrai, modifie la valeur de BASE en conséquence et avance le pointeur c-addr.
arguments:
c-addr Adresse du début de la chaîne à analyser.
u1 Longueur de la chaîne.
retourne:
c-addr' Adresse incrémentée au delà du caractère modificateur de BASE.
u' Longueur restante de la chaîne.
QUOTED-CHAR? ( c-addr -- c-addr 0 | n -1 )
Vérifie si la chaîne est un caractère entre 2 apostrophe si c'est le cas
Empile la valeur ASCII du caractère et TRUE, sinon retourne 'c-addr' et FALSE.
arguments:
c-addr Adresse de la chaîne comptée.
retourne:
c-addr 0 Faux et adresse orignale si ce n'est pas un quoted char.
ou
n -1 Vrai et valeur ASCII du caractère.
DOUBLE? ( c-addr -- f )
Vérifie si le mot contient un point ou une virgule et retourne vrai
si c'est le cas.
arguments:
c-addr Adresse de la chaîne comptée qui contient le mot à vérifier.
retourne:
f Retourne vrai si la chaîne contient un point ou une virgule.
NUMBER? ( c-addr -- c-addr 0 | n -1 )
Conversion d'un mot extrait par PARSE-NAME en entier. Ce mot est invoqué par
INTERPRET lorsqu'un mot n'a pas été trouvé dans le dictionnaire. L'interpréteur
s'attend donc à ce que le mot soit un entier (simple ou double). ?NUMBER
invoque >NUMBER et s'attend à ce que >NUMBER retourne 0 au sommet de la pile
car si >NUMBER ne convertie pas tous les caractères ça signifit que le mot
n'est pas un entier valide.
NUMBER? utilise la base active sauf si la chaîne débute par '$'|'#'|'%'
NUMBER? accepte aussi un caractère ASCII imprimable entre 2 apostrophes.
Dans ce cas la valeur de l'entier est la valeur ASCII du caractère.
Pour entrer un nombre double précision il faut mettre un point ou une virgule
à une position quelconque de la chaîne saisie sauf à la première position.
Il peut y avoir pleusieurs ponctuations, par exemple 12,267,324 est une
entier double valide.
arguments:
c-addr Adresse du mot à analyser.
retourne:
c-addr 0 Faux et l'adresse si ce n'est pas un entier.
ou
n -1 Vrai et l'entier.
Index