Здравствуйте, коллеги!
Нужда приперла реализовать некую функцию на С для последующего использования ее в коде на python. Подтягивать ее намерен через ctypes. Хотя тут могут быть варианты. Открыт вашим предложениям.
Функция довольно заковыристая. Вот ее прототип на С
char * func4py(char * data, int data_size, int pos, char * buf, int buf_size);
char * res = (char *) malloc(buf_size + pos);
// ...
return res;
Функция принимает 2 указателя на области памяти, кое-что магичит с данными и результат закидывет в выделенный res, который и возвращает в качестве указателя.
И тут я сталкиваюсь со всей глубиной своего незнания…
В python я бы хотел вызывать эту функцию в виде:
buf3 = func4py(buf1: bytes, pos: int, buf2: bytes)
Ведь python же всегда знает размеры своих объектов!
Но как передать это сокральное знание с С?
Можно, конечно:
buf3 = func4py(buf1: bytes, buf1_size: int = len(buf1), pos: int, buf2: bytes, buf2_size: int = len(buf2))
Жуть какая-то, на мой взгляд. Можно, конечно, сделать обертку в виде питоновской функции, но может есть способ более элегантный?
Еще непонятка с выделением памяти.
Для результирующего буфера мне память приходится выделять, а python ее в дальнейшем сам корректно освободит?
И еще, наверное, стоит как-то генерировать исключение если malloc вернет NULL.
в общем, прошу совета как все это грамотно реализовать?
Ну и вишенка на торте:
Как вернуть не только указатель на буфер, а еще и измененный pos? Типа как tuple или list
PS Я нормально знаю С, так что с реализацией функции ни каких проблем. Но я никогда еще не писал сишные функции для python.