Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - Gestion des chaînes de caractères
(Article écrit par Max et extrait d'Amiga News Tech - décembre 1990)
|
|
Il est parfois utile, nécessaire ou inévitable dans un programme Assembleur, d'avoir à manipuler des chaînes
de caractères. Or, si tout langage dit "évolué" offre un minimum de fonctions pour ce faire, le programmeur
machine est obligé de se taper lui-même tout le boulot. D'où la petite bibliothèque de fonctions que voici.
C'est sur un plateau d'argent que je vous offre ce mois-ci non pas une, ni deux, ni même trois mais une dizaine de
routines destinées à résoudre les problèmes les plus fréquemment rencontrés lorsqu'on doit s'amuser avec les
chaînes de caractères. On y retrouve les inévitables recherche de la longueur d'une chaîne, comparaison de deux
chaînes et transformations en minuscules et majuscules, mais aussi les moins fréquentes concaténation,
inversion ou recherche d'un caractère.
Quelques petites précisions cependant, avant de passer à la description de ces fonctions. Il fallait faire
un choix quant au format des chaînes que nous allons traiter ; le langage C étant par définition le
roi sur Amiga, j'ai adopté son principe : une chaîne est définie comme une suite de caractères dont la fin
est marquée par un caractère nul (zéro). L'avantage de la méthode, c'est qu'une chaîne peut avoir n'importe
quelle longueur. L'inconvénient, c'est que chaque fois que l'on a besoin de connaître cette longueur,
il faut la calculer - ou plutôt, la compter. Pour comparaison, en BCPL, comme en BASIC d'ailleurs, une
chaîne de caractères contient d'abord une indication sur sa longueur, suivie des caractères qui la compose.
Avantage : on connaît tout de suite la longueur. Inconvénient : cette même longueur est limitée à 255 caractères
si elle est codée sur 1 octet. Ce qui prouve bien, une fois de plus s'il en était besoin, qu'on ne peut
pas avoir le beurre, l'argent du beurre et la fermière en prime...
Des chaînes qui ne manquent pas de caractère(s)
Mais laissons-là les considérations laitières, et voyons de plus près de quoi il retourne, si j'ose
dire. Voici sans plus tarder une brève mais succincte description des routines ci-dessus citées.
Les plus attentifs d'entre vous auront remarqué que non seulement, j'ai piqué au C le format de ses
chaînes, mais qu'en plus, j'ai également piqué le nom de ses fonctions. Messieurs Kernigan et Ritchie
s'en retourneraient dans leur tombe s'ils étaient morts, bien que je ne sois même pas sûr que ce ne soit pas
le cas.
Pour simplifier et uniformiser (argh ! voilà pourtant un terme que je n'aime guère en ce moment...) les
choses, toutes les chaînes sont pointées par a0 (et al lorsqu'il en faut une seconde) et les fonctions retournent
leur valeur de réponse dans d0 ou dans rien du tout suivant les cas. Mais quoiqu'il arrive, tous les
registres sont préservés, c'est la moindre des choses.
- strlen : retourne dans d0 la longueur de la chaîne pointée par a0.
- strcmp : compare la chaîne pointée par a1 à celle pointée par a0. En retour, d0 contient 0
si les chaînes sont identiques, -1 si la première et inférieure à la seconde, et +1 dans le cas contraire.
- strcpy : copie la chaîne pointée par a1 dans le tampon mémoire pointé par a0. Aucune valeur en réponse.
- strncpy : copie au maximum d0 caractères de la chaîne pointée par a1 dans le tampon mémoire
pointé par a0. La copie s'arrête lorsque la fin de la chaîne est rencontrée ou le maximum atteint.
- strcat : concatène la chaîne pointée par a1 à celle pointée par a0. Attention à ne pas empiéter
n'importe où en mémoire, prévoyez un tampon mémoire assez large.
- strncat concatène au maximum d0 caractère de la chaîne pointée par a1 à celle pointée par a0.
Même remarque que précédemment concernant la taille du tampon mémoire.
- strchr : recherche la première apparition du caractère d0 dans la chaîne pointée par a0.
Retourne dans d0 la position de ce caractère ou -1 s'il ne figure pas dans la chaîne.
- strrev : inverse la chaîne pointée par a0. Par exemple, "Max" devient "xaM".
- toupper : transforme toutes les lettres minuscules de la chaîne pointée par a0 en majuscules.
- tolower : c'est l'inverse ; cette fonction transforme toutes les lettres majuscules de la
chaîne pointée par a0 en minuscule.
Voilà, y'a de quoi en faire beaucoup d'autres, mais on n'est pas là non plus pour vous mâcher tout le
travail. Comme disait si justement Fucius, qui avait oublié de l'être "ce n'est pas parce que y'en a qui
aiment le travail qu'il faut le leur laisser".
|