commit cb0d23c75e3188b976c701f19b00de348e71a98d
parent 8cf0e957550bdf5145869f7030ed3f9eca56b770
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date: Sun, 15 Feb 2026 15:18:07 -0500
Traiter le caractère NUL comme un symble complexe
L’interprétation de l’identifiant de symbole 0 est fixée. L’identifiant dénote
désormais un symbole placé dans le tampon des symboles et le symbole NUL doit y
être placé.
Diffstat:
2 fichiers modifiés, 8 insertions(+), 5 suppressions(-)
diff --git a/tfm.c b/tfm.c
@@ -109,9 +109,9 @@ tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr, ssize_t *id)
if (lngr > 0xFF)
return -1;
- /* Si la taille est 1, l’identifiant du symbole est le symbole
- * lui-même. */
- if (lngr == 1) {
+ /* Si la taille du symbole est 1 et qu’il n’est pas le caractère NUL, il
+ * est son propre identifiant. */
+ if (lngr == 1 && *symb != '\0') {
*id = *(unsigned char *)symb;
assert(*id > 0);
return 0;
diff --git a/tfm.h b/tfm.h
@@ -17,7 +17,7 @@
* c’est-à-dire que les caractères d’une chaîne sont précédés d’un octet qui en
* indique la taille. Un symbole peut donc contenir le caractère NUL, mais il
* est limité à une longueur maximale de 255 octets. Tous les symboles stockés
- * de cette manière font au moins 2 octets. */
+ * de cette manière font au moins 2 octets, sauf le caractère NUL. */
#define TFM_TLL_SYMB_MAX 255 /* Taille maximale d’un symbole. */
@@ -43,7 +43,10 @@ struct etat {
* directement dans se ou dans ss; s’il est plus long, il est stocké dans le
* tampon symbs d’un tfm et c’est la négation de l’identifiant de ce symbole qui
* est placé dans se ou dans ss. C’est le signe qui distingue les deux
- * méthodes. */
+ * méthodes. Seul le caractère NUL fait exception à cette règle, car dans les
+ * systèmes qui utilisent le complément à deux, 0 et -0 ont la même
+ * représentation. Dans ce programme, le caractère NUL est traité comme un
+ * caractère de plus d’un octet. */
struct trans {
ssize_t se; /* Symbole d’entrée. */