Я смотрел, как Red/System подключается к библиотечным функциям C из Windows DLL, общих библиотек Linux/Android .so и OS/X .dylib с синтаксисом #import
:
#import [
"libc.so.6" cdecl [
allocate: "malloc" [
size [integer!]
return: [byte-ptr!]
]
free: "free" [
block [byte-ptr!]
]
/* ... */
]
Работает для всех основных типов, но что делать, когда функции нужен указатель на указатель? Например, что, если вы пытаетесь выполнить привязку к чему-то вроде getline()
, у которого есть прототип:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
Один из способов вызвать это (как я хочу это назвать...) состоит в том, что входящий lineptr является не предварительно выделенным буфером, а скорее null
. В этом случае getline выделяет для вас буфер и изменяет char*, чтобы он больше не был нулевым.
В качестве первой попытки я сделал:
getline: "getline" [
lineptr [byte-ptr!] ;-- char **
n [pointer! [integer!]] ;-- size_t *
stream [byte-ptr!] ;-- FILE *
return: [integer!] ;-- ssize_t
]
Но поскольку не существует такой вещи, как pointer! [c-string!]
или что-то подобное, я не понимаю, как это назвать. Могу ли я получить адрес локальной переменной c-string!
и как-то передать ее как byte-ptr!
?