www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - help on how to wrap a C macros when binding linux/spi/spidev.h

reply dangbinghoo <dangbinghoo gmail.com> writes:
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!
Mar 29 2018
next sibling parent dangbinghoo <dangbinghoo gmail.com> writes:
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!
Mar 29 2018
prev sibling parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
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);");
 }
Mar 29 2018
parent reply dangbinghoo <dangbinghoo gmail.com> writes:
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 ----
Mar 29 2018
parent reply dangbinghoo <dangbinghoo gmail.com> writes:
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!
Mar 29 2018
parent dangbinghoo <dangbinghoo gmail.com> writes:
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!
Mar 29 2018