Transformation de votre système en librairie dynamique |
Au lieu de connecter votre système à TeXmacs via un tube, vous pouvez aussi le lier en tant que librairie dynamique. Bien que la communication via des tubes soit généralement plus facile à implémenter, plus robuste et compatible avec une sortie graduelle, la seconde option est plus rapide.
Voici les étapes à suivre pour lier votre système en tant que librairie dynamique :
Incluez une ligne de la forme :
(package-declare "myplugin" "libmyplugin.so" "get_name_package" "init")
dans le fichier init-myplugin.scm qui a été décrit dans le cas de la communication via des tubes. Ici, libmyplugin.so est la librairie partagée, get_name_package la fonction qui sera appelée par TeXmacs pour lier votre système à TeXmacs et init une chaîne d'initialisation pour votre package.
Le protocole de communication de TeXmacs est utilisé pour lier dynamiquement des librairies à TeXmacs. Le fichier $TEXMACS_PATH/include/TeXmacs.h contient les déclarations de toutes les structures de données et toutes les fonctions utilisées par le protocole. En fait, nous prévoyons une succession de différents protocoles. Ils possèdent tous en commun les structures de données abstraites TeXmacs_exports et package_exports, ainsi que des informations sur les versions du protocole, de TeXmacs et de votre package.
La nième version concrète du protocole de communication doit fournir deux structures de données TeXmacs_exports_n et package_exports_n. La première structure contient toutes les routines et données de TeXmacs nécessaires au package. La seconde structure contient toutes les routines et données de votre package qui doivent être visibles dans TeXmacs.
Pour lier votre système à TeXmacs, vous devez implémenter une fonction :
package_exports* get_my_package (int version);
Cette fonction prend en entrée le dernier protocole de communication de TeXmacs accepté par votre système. Il doit retourner un pointeur vers une instance d'une structure concrète package_exports_n, où n est inférieur ou égal à version.
Dans la première version du protocole de communication de TeXmacs, votre package doit exporter une instance de la structure de données suivante :
typedef struct package_exports_1 {
char* version_protocol; /* "TeXmacs communication protocol 1" */
char* version_package;
char* (*install) (TeXmacs_exports_1* TM, char* options, char** errors);
char* (*evaluate) (char* what, char* session, char** errors);
char* (*execute) (char* what, char* session, char** errors);
} package_exports_1;
La chaîne version_protocol doit contenir "TeXmacs communication protocol 1" et la chaîne version_package la version de votre package.
La routine install est appelée par TeXmacs pour initialiser votre système avec les options options. Elle communique à votre système les routines exportées par TeXmacs sous la forme de TM. La routine doit retourner un message de statut tel que :
"yourcas-version successfully linked to TeXmacs"
Si l'installation échoue, vous devez retourner NULL et *errors doit contenir un message d'erreur. what et la chaîne retournée ont tous les deux un format spécial, dans lequel il est possible d'encoder des documents TeXmacs. Ce format sera décrit dans la prochaine section.
La routine evaluate est utilisée pour évaluer l'expression what dans une session TeXmacs dont le nom est session. Elle doit retourner l'évaluation de what ou NULL en cas d'erreur. *errors contient soit un ou plusieurs message d'attention ou un message d'erreur, si l'évaluation échoue. La commande :
(package-format "yourcas" "input-format" "output-format")
est utilisée pour spécifier les formats d'entrée/sortie des évaluations, de la même façon que dans le cas des tubes.
La routine execute possède une spécification similaire à celle de evaluate, sauf qu'elle n'est pas utilisée pour l'évaluation d'expressions dans une session TeXmacs, mais plutôt pour d'autres besoins de communication entre TeXmacs et votre package.
La première version du protocole de communication de TeXmacs suppose aussi que TeXmacs exporte une instance de la structure de données :
typedef struct TeXmacs_exports_1 {
char* version_protocol; /* "TeXmacs communication protocol 1" */
char* version_TeXmacs;
} TeXmacs_exports_1;
La chaîne version_protocol contient la version "TeXmacs communication protocol 1" du protocole et version_TeXmacs la version courante de TeXmacs.