Вызов подпрограммы perl с параметрами

Мне нужно вызвать процедуру Perl в моей C-программе. Процедура perl принимает следующие аргументы: $a, $b, $c, где $a а также $b целые числа, $c является строкой (может содержать двоичные символы) Согласно perlcall, вот средства совершения звонка.

I32 call_sv(SV* sv, I32 flags);
I32 call_pv(char *subname, I32 flags);
I32 call_method(char *methname, I32 flags);
I32 call_argv(char *subname, I32 flags, char **argv);

Кажется, я могу использовать только call_argv(...), но есть два вопроса

  • как передать целое число в рутину perl
  • Как передать (двоичную) строку в Perl?

Жаль, что есть такая функция, как

I32 call_argv(char *subname, I32 flags, int numOfArgs, SV* a, SV* b, SV *c ...);

1 ответ

Решение

Смотрите раздел "Параметры передачи" в perlcall. Аргументы помещаются в стек Perl. call_argv бесполезно для передачи ничего, кроме строк. Соглашение о вызовах будет выглядеть примерно так

PUSHMARK(SP);
mPUSHi(some_integer);
mPUSHp(binary_data, len);
XPUSHs(some_SV_I_had_laying_around);
PUTBACK;
call_pv("sub_name", G_DISCARD);

или вы можете использовать call_sv если у вас есть имя в SV*, или же call_method вызвать метод по имени на некотором объекте.

Если подпрограмма возвращает значение или значения, вы можете вызвать G_SCALAR или же G_ARRAY и использовать POP макросы для доступа к возвращаемым значениям; это подробно описано в следующих двух разделах. Не забудь SPAGAIN,

Другие вопросы по тегам