ctypes é uma biblioteca para ligação a bibliotecas C usando OCaml puro. O objetivo principal é tornar a escrita de extensões C o mais simples possível.
O núcleo dos ctypes é um conjunto de combinadores para descrever a estrutura dos tipos C – tipos numéricos, arrays, ponteiros, estruturas, uniões e funções. Você pode usar esses combinadores para descrever os tipos de funções que deseja chamar e, em seguida, vincular diretamente a essas funções - tudo sem escrever ou gerar qualquer C!
Suponha que você queira vincular às seguintes funções C:
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 );
Usando ctypes você pode descrever as interfaces para essas funções da seguinte maneira:
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 )
Os nomes vinculados a este código têm os tipos que você espera:
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
Isso é tudo que há para fazer. Ao contrário da maneira usual de escrever extensões C, não há funções "stub" em C para escrever, portanto há muito menos oportunidades para erros.
A documentação e a distribuição do código-fonte contêm exemplos mais complexos, envolvendo estruturas, uniões, arrays, funções de retorno de chamada e assim por diante, e mostram como criar e usar valores C (como instâncias de sigset_t ptr
) no OCaml.
Cstubs_structs
para determinar de forma confiável o layout dos dados