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