trafi

Transducteurs finis
git clone git://git.asteride.xyz/trafi.git
Journaux | Fichiers | Références

itfd.h (3051B)


      1 #ifndef ITFD_H
      2 #define ITFD_H
      3 
      4 #include <stdbool.h>
      5 #include <stdint.h>
      6 #include <sys/types.h>
      7 
      8 /* Interpréter un transducteur fini sur le disque. */
      9 
     10 #define ITFD_SYMB_BAS ((256 << 1) | 0x00) /* N’importe quel symbole du bas. */
     11 
     12 struct itfd {
     13 	int df; /* Descripteur de fichier. */
     14 	uint8_t *f; /* Contenu du fichier. */
     15 	off_t lngr; /* Longueur du fichier, en octets. */
     16 	int version; /* Version du format tfd. */
     17 	uint8_t *symbs; /* Position de la liste de symboles. */
     18 	size_t symbs_lngr; /* Longueur de la liste de symboles. */
     19 	uint8_t *se; /* Position de la liste de symboles d’entrée. */
     20 	size_t se_lngr; /* Longueur de la liste de symboles d’entrée. */
     21 	uint8_t *ss; /* Position de la liste de symboles de sortie. */
     22 	size_t ss_lngr; /* Longueur de la liste de symboles de sortie. */
     23 	uint8_t *segm; /* Position du segmenteur. */
     24 	size_t segm_lngr; /* Longueur du segmenteur. */
     25 	uint8_t *trans; /* Position du transducteur. */
     26 	size_t trans_lngr; /* Longueur du transducteur. */
     27 };
     28 
     29 /* Mémoire d’interprétation. */
     30 struct interp {
     31 	struct itfd *itfd;
     32 	struct option *opt; /* Tampex d’options. */
     33 	uint16_t *css; /* Chaîne de symboles de sortie. */
     34 };
     35 
     36 /* Ouvrir un fichier tfd pour l’interpréter.
     37  * Renvoie un pointeur vers une structure itfd, ou NULL en cas d’erreur. */
     38 struct itfd *itfd_ouvrir(int df);
     39 
     40 /* Fermer un fichier tfd.
     41  * Renvoie 0, ou -1 en cas d’erreur. */
     42 int itfd_fermer(struct itfd *itfd);
     43 
     44 /* Segmenter le tampon tp de longueur lngr selon itfd et en placer les
     45  * identifiants de symbole dans symbs.
     46  * Le tampon symbs doit être au moins aussi grand que lngrcc. Puisqu’un
     47  * symbole compte pour au moins un caractère, il ne peut jamais y avoir plus de
     48  * lngrcc symboles dans symbs. Aussi, les symboles contenus dans symbs ont un
     49  * drapeau dans leur bit de poids faible. S’il est brandi, il s’agit d’un
     50  * symbole reconnu par le segmenteur et symbs[i] >> 1 donne le symbole; sinon,
     51  * c’est qu’il en est absent et symbs[i] >> 1 donne le caractère non reconnu.
     52  * Renvoie le nombre de symboles placés dans symbs. */
     53 size_t segmenter(struct itfd *itfd, uint8_t *cc, size_t lngrcc,
     54 		uint16_t *symbs);
     55 
     56 #define ITFD_SYMB_AUTRE (0x100 | ITFD_SYMB_NREC)
     57 
     58 #define ITFD_SYMB_REC  0x01
     59 #define ITFD_SYMB_NREC 0x00
     60 
     61 /* Initialiser un interpréteur du transducteur itfd.
     62  * Renvoie une mémoire d’interprétation, ou NULL.*/
     63 struct interp *interp_init(struct itfd *itfd);
     64 
     65 /* Libérer la mémoire d’interprétation interp. */
     66 void interp_libr(struct interp *interp);
     67 
     68 /* Réinitialiser la mémoire d’interprétation interp pour interpréter itfd.
     69  * Renvoie 0, ou -1 en cas d’erreur. */
     70 int interp_reinit(struct interp *interp, struct itfd *itfd);
     71 
     72 /* Appliquer l’interpréteur interp à la chaîne de symboles d’entrée cse
     73  * contenant nsymbs symboles.
     74  * Renvoie 0 si aucune correspondance n’a été trouvée ou le nombre de symboles
     75  * de sorties produits + 1, ou -1 en cas d’erreur. */
     76 ssize_t interpreter(struct interp *interp, uint16_t *cse, size_t nsymbs);
     77 
     78 #endif