Нужно конвертировать Perl распаковать в Inline :: C AV * - PullRequest
3 голосов
/ 12 января 2012

Я немного изо всех сил пытаюсь преобразовать Perl unpack в Inline :: C

@array = unpack("C*", $buf);

Это то, что у меня есть, но я новичок в Inline :: C, поэтому у меняБеда в том, что делать дальше:

STRLEN len;
char* test = SvPVbyte(buf, len);
...
AV* arr = SvRV(?);

Может кто-нибудь дать совет, как это сделать?

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Самое умное здесь, вероятно, состоит в том, чтобы избежать вызова 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);
}

Или, конечно, просто написать цикл и пропустить массив, если он вам не нужен:)

2 голосов
/ 12 января 2012

Тело функции может выглядеть следующим образом:

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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...