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