Нужно конвертировать Perl распаковывать в Inline::C AV*
Я изо всех сил пытаюсь конвертировать Perl unpack
в линию:: C
@array = unpack("C*", $buf);
Это то, что я имею до сих пор, но я новичок в Inline::C, поэтому у меня возникли проблемы с тем, что делать дальше:
STRLEN len;
char* test = SvPVbyte(buf, len);
...
AV* arr = SvRV(?);
Кто-нибудь может дать совет, как это сделать?
2 ответа
Решение
Умная вещь здесь, вероятно, чтобы избежать звонка unpack
и делать то, что unpack
сделал бы, что проще.
STRLEN len;
char *str = SvPVbyte(buf, len);
AV *arr = newAV();
char *ptr;
for (ptr = str; ptr < str + len ; ptr++) {
SV *char_value = newSViv(*ptr);
av_push(arr, char_value);
}
Или, конечно, просто написать цикл и оставить массив, если он вам не нужен:)
Тело функции может выглядеть так:
STRLEN len;
char* buf;
AV* av = newAV();
SvGETMAGIC(sv);
buf = SvPVbyte(sv, len);
while (len--)
av_push(av, newSViv(*(buf++)));
У вас есть два варианта для возвращаемого значения.
SV* my_unpack(SV* sv) {
...
return newRV_noinc(av); // Will get mortalized by typemap.
}
или же
AV* my_unpack(SV* sv) {
...
return sv_2mortal(av); // Typemap will create a reference.
}