strings

index
index principal

Description

Manipulation des chaînes et des caractères.
ForthEx utilise les caractères ASCII.
REF: http://www.asciitable.com/
index principal

BL ( -- c )

Constante qui retourne la valeur ASCII 32 (espace).

arguments:
aucun   
retourne:
c   Valeur ASCII 32 qui représente l'espace.
index
haut
index principal

>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
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

[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  
index
haut
index principal

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  
index
haut
index principal

-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.
index
haut
index principal

/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
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

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  
index
haut
index principal

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  
index
haut
index principal

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  
index
haut
index principal

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.
index
haut
index principal

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'.
index
haut
index principal

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  
index
haut
index principal

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.
index
haut
index principal

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   
index
haut
index principal

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.
index
haut
index principal

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
index
haut
index principal

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.
index
haut
index principal

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   
index
haut
index principal

Description

Commentaires.
index principal

( ( 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  
index
haut
index principal

\ ( 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  
index
haut
index principal

.( 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  
index
haut
index principal

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.
index principal

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.
index
haut
index principal

EXTRACT ( ud1 u -- ud2 c )

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 ).
index
haut
index principal

<# ( -- )

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  
index
haut
index principal

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  
index
haut
index principal

# ( 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
index
haut
index principal

#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.
index
haut
index principal

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  
index
haut
index principal

#> ( 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.
index
haut
index principal

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.
index
haut
index principal

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  
index
haut
index principal

.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  
index
haut
index principal

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  
index
haut
index principal

U. ( u -- )

Affiche un entier simple non signé en format libre.

arguments:
u   Entier à afficher.
retourne:
rien  
index
haut
index principal

. ( n -- )

Affiche un entier simple signé en format libre.

arguments:
n   Entier à afficher.
retourne:
rien  
index
haut
index principal

? ( 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  
index
haut
index principal

C? ( c-addr )

Lit et affiche l'octet à l'adresse c-addr.

arguments:
c-addr   Adresse dont le contenu sera affiché.
retourne:
rien  
index
haut
index principal

UD. ( ud -- )

Affiche un entier double non signé en format libre.

arguments:
ud   Entier double non signé.
retourne:
rien  
index
haut
index principal

D. ( d -- )

Affiche un entier double signé en format libre.

arguments:
d   Entier double à afficher.
retourne:
rien  
index
haut
index principal

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  
index
haut
index principal

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  
index
haut
index principal

Description

Mots utilisés dans la conversion d'une chaîne de caractères en entier.
index principal

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.
index
haut
index principal

>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)
index
haut
index principal

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.
index
haut
index principal

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 ','|'.'
index
haut
index principal

>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.
index
haut
index principal

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 '-'.
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

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.
index
haut
index principal

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
haut
index principal

Index


haut
index principal