Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
March 29, 2018 help on how to wrap a C macros when binding linux/spi/spidev.h | ||||
---|---|---|---|---|
| ||||
hi, I'm doing a D binding myself to <linux/spi/spidev.h>, and has some problems to wrap the C macros. ``` import core.sys.posix.sys.ioctl; ... /* IOCTL commands */ enum SPI_IOC_MAGIC = 'k'; /** * Orginal C macros. * * #define SPI_MSGSIZE(N) \ ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) */ extern (D) size_t SPI_MSGSIZE(size_t N) { return ((N * (spi_ioc_transfer.sizeof)) < (1 << _IOC_SIZEBITS)) ? (N * (spi_ioc_transfer.sizeof)) : 0; } /* #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) */ extern (D) auto SPI_IOC_MESSAGE(size_t N) { size_t n = SPI_MSGSIZE(N); return _IOW!(char[static n])(SPI_IOC_MAGIC, 0); //mixin("return _IOW!(char[n])(SPI_IOC_MAGIC, 0);"); } ``` as shown in the above code, the SPI_IOC_MESSAGE C macro has a param `char[SPI_MSGSIZE(N)]`, what should it be wrapped to the D world? as you can see, I tried to use the type of `char[static n]` or `char[n]`, and the compile failed: ``` source/spidev.d-mixin-129(129,19): Error: expression expected, not static source/spidev.d-mixin-129(129,26): Error: found n when expecting ] source/spidev.d-mixin-129(129,27): Error: found ] when expecting ) following template argument list source/spidev.d-mixin-129(129,28): Error: found ) when expecting ; following return statement ``` or when removed static, ``` source/spidev.d-mixin-129(129,8): Error: variable n cannot be read at compile time ``` Can anyone help me? Thanks! |
March 29, 2018 Re: help on how to wrap a C macros when binding linux/spi/spidev.h | ||||
---|---|---|---|---|
| ||||
Posted in reply to dangbinghoo | On Thursday, 29 March 2018 at 08:47:50 UTC, dangbinghoo wrote:
> hi,
>
> I'm doing a D binding myself to <linux/spi/spidev.h>, and has some problems to wrap the C macros.
>
> [...]
PS: if I just _IOW!(char[])... it compiles, but does it mean it's unsafe? thanks!
|
March 29, 2018 Re: help on how to wrap a C macros when binding linux/spi/spidev.h | ||||
---|---|---|---|---|
| ||||
Posted in reply to dangbinghoo | On Thursday, 29 March 2018 at 08:47:50 UTC, dangbinghoo wrote: > * #define SPI_MSGSIZE(N) \ > ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ > ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) > */ > extern (D) size_t SPI_MSGSIZE(size_t N) > { > return ((N * (spi_ioc_transfer.sizeof)) < (1 << _IOC_SIZEBITS)) ? (N * (spi_ioc_transfer.sizeof)) : 0; > } > > /* #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) */ > extern (D) auto SPI_IOC_MESSAGE(size_t N) > { > size_t n = SPI_MSGSIZE(N); > return _IOW!(char[static n])(SPI_IOC_MAGIC, 0); > //mixin("return _IOW!(char[n])(SPI_IOC_MAGIC, 0);"); > } > ``` > try > extern (D) auto SPI_IOC_MESSAGE(size_t N)() > { > enum n = SPI_MSGSIZE(N); > return _IOW!(char[n])(SPI_IOC_MAGIC, 0); > //mixin("return _IOW!(char[n])(SPI_IOC_MAGIC, 0);"); > } |
March 29, 2018 Re: help on how to wrap a C macros when binding linux/spi/spidev.h | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On Thursday, 29 March 2018 at 09:02:16 UTC, Nicholas Wilson wrote: > On Thursday, 29 March 2018 at 08:47:50 UTC, dangbinghoo wrote: > >> * #define SPI_MSGSIZE(N) \ >> ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ >> ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) >> */ >> extern (D) size_t SPI_MSGSIZE(size_t N) >> { >> return ((N * (spi_ioc_transfer.sizeof)) < (1 << _IOC_SIZEBITS)) ? (N * (spi_ioc_transfer.sizeof)) : 0; >> } >> >> /* #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) */ >> extern (D) auto SPI_IOC_MESSAGE(size_t N) >> { >> size_t n = SPI_MSGSIZE(N); >> return _IOW!(char[static n])(SPI_IOC_MAGIC, 0); >> //mixin("return _IOW!(char[n])(SPI_IOC_MAGIC, 0);"); >> } >> ``` >> > > try > >> extern (D) auto SPI_IOC_MESSAGE(size_t N)() >> { >> enum n = SPI_MSGSIZE(N); >> return _IOW!(char[n])(SPI_IOC_MAGIC, 0); >> //mixin("return _IOW!(char[n])(SPI_IOC_MAGIC, 0);"); >> } thanks for your reply, but it will also fail, the compiler just gives me : ---- source/spidev.d-mixin-129(129,8): Error: variable n cannot be read at compile time ---- |
March 29, 2018 Re: help on how to wrap a C macros when binding linux/spi/spidev.h | ||||
---|---|---|---|---|
| ||||
Posted in reply to dangbinghoo | On Thursday, 29 March 2018 at 09:13:27 UTC, dangbinghoo wrote:
> On Thursday, 29 March 2018 at 09:02:16 UTC, Nicholas Wilson wrote:
>> On Thursday, 29 March 2018 at 08:47:50 UTC, dangbinghoo wrote:
>>
>>>[...]
>>
>> try
>>
>>> [...]
>
> thanks for your reply, but it will also fail, the compiler just gives me :
>
> ----
> source/spidev.d-mixin-129(129,8): Error: variable n cannot be read at compile time
> ----
sorry, I just don't notice the `()`.
yeah! it compiles, but can you explain it? thanks!
|
March 29, 2018 Re: help on how to wrap a C macros when binding linux/spi/spidev.h | ||||
---|---|---|---|---|
| ||||
Posted in reply to dangbinghoo | On Thursday, 29 March 2018 at 09:16:11 UTC, dangbinghoo wrote:
> On Thursday, 29 March 2018 at 09:13:27 UTC, dangbinghoo wrote:
>> On Thursday, 29 March 2018 at 09:02:16 UTC, Nicholas Wilson wrote:
>>> On Thursday, 29 March 2018 at 08:47:50 UTC, dangbinghoo wrote:
>>>
>>>>[...]
>>>
>>> try
>>>
>>>> [...]
>>
>> thanks for your reply, but it will also fail, the compiler just gives me :
>>
>> ----
>> source/spidev.d-mixin-129(129,8): Error: variable n cannot be read at compile time
>> ----
>
> sorry, I just don't notice the `()`.
> yeah! it compiles, but can you explain it? thanks!
just got it! `size_t N` need to be template param.
Thanks for the help!
|
Copyright © 1999-2021 by the D Language Foundation