help on how to wrap a C macros when binding linux/spi/spidev.h
dangbinghoo
dangbinghoo at gmail.com
Thu Mar 29 08:47:50 UTC 2018
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!
More information about the Digitalmars-d-learn
mailing list