ctypes est une bibliothèque permettant de se lier aux bibliothèques C en utilisant OCaml pur. L'objectif principal est de rendre l'écriture d'extensions C aussi simple que possible.
Le cœur des ctypes est un ensemble de combinateurs permettant de décrire la structure des types C : types numériques, tableaux, pointeurs, structures, unions et fonctions. Vous pouvez utiliser ces combinateurs pour décrire les types de fonctions que vous souhaitez appeler, puis vous lier directement à ces fonctions, le tout sans écrire ni générer de C !
Supposons que vous souhaitiez vous lier aux fonctions C suivantes :
int sigemptyset ( sigset_t * set );
int sigfillset ( sigset_t * set );
int sigaddset ( sigset_t * set , int signum );
int sigdelset ( sigset_t * set , int signum );
int sigismember ( const sigset_t * set , int signum );
En utilisant les ctypes, vous pouvez décrire les interfaces de ces fonctions comme suit :
let sigemptyset = foreign " sigemptyset " (ptr sigset_t @-> returning int )
let sigfillset = foreign " sigfillset " (ptr sigset_t @-> returning int )
let sigaddset = foreign " sigaddset " (ptr sigset_t @-> int @-> returning int )
let sigdelset = foreign " sigdelset " (ptr sigset_t @-> int @-> returning int )
let sigismember = foreign " sigismember " (ptr sigset_t @-> int @-> returning int )
Les noms liés par ce code ont les types auxquels vous pouvez vous attendre :
val sigemptyset : sigset_t ptr -> int
val sigfillset : sigset_t ptr -> int
val sigaddset : sigset_t ptr -> int -> int
val sigdelset : sigset_t ptr -> int -> int
val sigismember : sigset_t ptr -> int -> int
C'est tout ce qu'il y a à dire. Contrairement à la manière habituelle d'écrire des extensions C, il n'y a pas de fonctions "stub" C à écrire, il y a donc beaucoup moins de risques d'erreur.
La documentation et la distribution des sources contiennent des exemples plus complexes, impliquant des structures, des unions, des tableaux, des fonctions de rappel, etc., et montrent comment créer et utiliser des valeurs C (comme des instances de sigset_t ptr
) dans OCaml.
Cstubs_structs
pour déterminer de manière fiable la disposition des données