The interface is the function foreign-parser:process-foreign-file.
The following example uses this C source code in file test.c
. It needs to be slightly different depending on your platform.
#include <stdio.h>
#include <string.h>
__declspec(dllexport) void __cdecl modify(char *string)
{
char temp[256];
sprintf(temp, "'%s' modified in a C function", string);
strcpy(string, temp);
}
#include <stdio.h>
#include <string.h>
void modify(char *string)
{
char temp[256];
sprintf(temp, "'%s' modified in a C function", string);
strcpy(string, temp);
}
(require "foreign-parser")
(foreign-parser:process-foreign-file
"test.c"
:case-sensitive nil)
=>
;;; Output dff file #P"test-dff.lisp"
;;; Parsing source file "test.c"
;;; Process-foreign-file : Preprocessing file
;;; Process-foreign-file : Level 1 parsing
;;; Process-foreign-file : Selecting foreign forms
NIL
test-dff.lisp
containing a form like this:(fli:define-foreign-function
(modify "modify" :source)
((string (:pointer :char)))
:result-type
:void
:language
:c
:calling-convention
:cdecl)
:ef-mb-string
:(fli:define-foreign-function
(modify "modify" :source)
((string (:reference (:ef-mb-string :limit 256))))
:result-type
:void
:language
:c
:calling-convention
:cdecl)
=>
MODIFY
(fli:register-module "test.dll")
(fli:register-module "/tmp/test.so")
(modify "Hello, I am in LISP")
=>
NIL
"'Hello, I am in LISP' modified in a C function"