Re: C Bitfields in D
On 08/12/2010 02:23, Simen kjaeraas wrote: Andrej Mitrovic andrej.mitrov...@gmail.com wrote: Cool! But, when is ctod.exe coming out? :p That should have been cpptod. ;) As soon as you write it. See d.announce SWIG for D :)
C Bitfields in D
Okay. I'm trying to get some C code to be properly callable from some D code, which naturally involves some extern(C) blocks. One of the types that I have to deal with looks something like this: typedef struct { unsigned i:1; } my_struct; I have no idea how to do such a bitfield in D. Does a std.bitmanip.bitfield work? I wouldn't have thought so, but I don't know. What would be the proper way to create a properly compatible struct in D? - Jonathan M Davis
Re: C Bitfields in D
07.12.2010 11:58, Jonathan M Davis пишет: Okay. I'm trying to get some C code to be properly callable from some D code, which naturally involves some extern(C) blocks. One of the types that I have to deal with looks something like this: typedef struct { unsigned i:1; } my_struct; I have no idea how to do such a bitfield in D. Does a std.bitmanip.bitfield work? I wouldn't have thought so, but I don't know. What would be the proper way to create a properly compatible struct in D? - Jonathan M Davis I'm under the impression that struct my_struct { mixin(bitfields!( uint, i, 1, uint, , 31)); } should do the trick.
Re: C Bitfields in D
I haven't tried but maybe htod can help, try copypasting the code to a header file and run it through htod. There's also some flags htod can take to simplify the output, iirc. But maybe htod isn't clever enough to do bitfields.. On 12/7/10, Stanislav Blinov bli...@loniir.ru wrote: 07.12.2010 11:58, Jonathan M Davis пишет: Okay. I'm trying to get some C code to be properly callable from some D code, which naturally involves some extern(C) blocks. One of the types that I have to deal with looks something like this: typedef struct { unsigned i:1; } my_struct; I have no idea how to do such a bitfield in D. Does a std.bitmanip.bitfield work? I wouldn't have thought so, but I don't know. What would be the proper way to create a properly compatible struct in D? - Jonathan M Davis I'm under the impression that struct my_struct { mixin(bitfields!( uint, i, 1, uint, , 31)); } should do the trick.
Re: C Bitfields in D
Stanislav Blinov: I'm under the impression that struct my_struct { mixin(bitfields!( uint, i, 1, uint, , 31)); } should do the trick. But bitfields in C may not use the same alignments used by bitfields!() on DMD so I think you have to test the sanity of the whole thing for each combination of D compiler, operating system and C compiler. Bye, bearophile
Re: C Bitfields in D
bearophile wrote: Stanislav Blinov: I'm under the impression that struct my_struct { mixin(bitfields!( uint, i, 1, uint, , 31)); } should do the trick. But bitfields in C may not use the same alignments used by bitfields!() on DMD so I think you have to test the sanity of the whole thing for each combination of D compiler, operating system and C compiler. Bye, bearophile hm... what alignments are you talking about? bitfields template uses the smallest suitable type for all fields, which is uint for the above struct. The trouble may come from bit order, mayhaps. bitfields positions fields in LSb order.
Re: C Bitfields in D
Stanislav Blinov wrote: But bitfields in C may not use the same alignments used by bitfields!() on DMD so I think you have to test the sanity of the whole thing for each combination of D compiler, operating system and C compiler. hm... what alignments are you talking about? bitfields template uses the smallest suitable type for all fields, which is uint for the above struct. The trouble may come from bit order, mayhaps. bitfields positions fields in LSb order. There is almost no guarantee in C (and C++) on how the bitfields are layed out. I had implemented a C++ template solution once just to overcome that lack of layout. We needed to have our bits layed out exactly in certain ways. Ali
Re: C Bitfields in D
Jonathan M Davis Wrote: Okay. I'm trying to get some C code to be properly callable from some D code, which naturally involves some extern(C) blocks. One of the types that I have to deal with looks something like this: typedef struct { unsigned i:1; } my_struct; I have no idea how to do such a bitfield in D. Does a std.bitmanip.bitfield work? I wouldn't have thought so, but I don't know. What would be the proper way to create a properly compatible struct in D? - Jonathan M Davis I had some help from htod translating Fuse headers: https://github.com/he-the-great/Fused/blob/master/src/fuse_common.d#L47 struct my_struct { uint __bitfield1; @property uint i() { return (__bitfield1 0) 0x1; } @property uint i(uint value) { __bitfield1 = (__bitfield1 0xfffe) | (value 0); return value; } } I think I got the copy/past/modify right.
Re: C Bitfields in D
On 12/8/10, Walter Bright newshou...@digitalmars.com wrote: Andrej Mitrovic wrote: I haven't tried but maybe htod can help, try copypasting the code to a header file and run it through htod. There's also some flags htod can take to simplify the output, iirc. But maybe htod isn't clever enough to do bitfields.. htod does bitfields. Give it a try! Cool! But, when is ctod.exe coming out? :p
Re: C Bitfields in D
On 12/8/10, Andrej Mitrovic andrej.mitrov...@gmail.com wrote: On 12/8/10, Walter Bright newshou...@digitalmars.com wrote: Andrej Mitrovic wrote: I haven't tried but maybe htod can help, try copypasting the code to a header file and run it through htod. There's also some flags htod can take to simplify the output, iirc. But maybe htod isn't clever enough to do bitfields.. htod does bitfields. Give it a try! Cool! But, when is ctod.exe coming out? :p That should have been cpptod. ;)
Re: C Bitfields in D
Andrej Mitrovic andrej.mitrov...@gmail.com wrote: Cool! But, when is ctod.exe coming out? :p That should have been cpptod. ;) As soon as you write it. -- Simen