[Moscow.pm] XS и Windows DWORD

Ruslan Zakirov ruz на bestpractical.com
Вт Дек 25 10:02:04 PST 2012


2012/12/25 Alex Varyanick <q на cono.org.ua>:
> Портирую c++ либу писвашуюся изначально для Windows.
> На данный момент существует полное компатибилити с C типами и также: port.h
> в котором в зависимости от ОС (win, mac, linux), делаются typdef для всяких
> DWORD, HANDLE и т.д.
> В своём XS делаю:
> #include "port.h"
>
> Далее использую в XS:
> bool do_something(priority)
>    DWORD priority
>
> в port.h имею для linux:
>   typedef unsigned int   DWORD;
>
> Но беда в том, что xsubpp не делает преобразований к базовым типам
> изначально и не проганяет код сквозь gcc -E и т.д. (ругается на отсутствие
> типа в typemap)
>
> Есть какие-то методики как такое разрулить (не хочется дулировать каждый тип
> уже предусмотренный в port.h либы, дублировать также в typemap), или же
> стоит делать так как сделано к примеру тут:
> https://metacpan.org/source/JDB/Win32-Pipe-0.024/Pipe.xs
>
> Т.е. без использование xsubpp'шных макросов (prototyping, OUTPUT, ...)
> И приведения типов к перловым - руками, без typemap.
>
> Спасибо.

Есть вариант заменить DWORD на U32 в описании типов аргументов и
проверить, что потом оно совпадает с тем что либа использует на каждой
платформе.

Следующий вариант с TYPEMAP, ну не сотня же у вас типов. Саму карту
можно своровать из perl.

Или разбирать аргументы самому, но не обязательно как в Pipe.xs. Ведь
любой аргумент можно определить как указатель на SV, а далее макросом
или функцией сконвертить в нужный тип.

bool do_something(priority)
   SV* spriority
   INIT:
       DWORD priority = SV_TO_DWORD(spriority)
   CODE:
       RETVAL = do_something(priority)
   OUTPUT: RETVAL

Фактически ручная эмуляция typemap получается.

Возможно еще есть 10ок вариантов, я мало знаю в этой области.

> --
> Varyanick I. Alex
> skype: cono..
> q на cono.org.ua
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm