Я смотрел на то, как Red/System перехватывает с функциями библиотеки C из Windows, библиотек DLL, Linux/с Android .so разделяемых библиотек, и OS/X .dylib с #import
синтаксисом:Как создать привязку Red/System к функции, которая принимает указатель на указатель?
#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 *, поэтому он больше не равен null.
В первой попытки, я сделал:
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!
как-нибудь?
Спасибо! Это работает, хотя возврат из getline LIBC - это длина строки, полученной (а не строка), поэтому она будет целочисленной ... вы можете отредактировать свои ответы (я тоже могу). Но я позволю тебе это сделать. :-) – HostileFork
Действительно, спасибо, отредактирован. –