digitalmars.D.learn - Basics of calling C from D
- belkin (11/11) Jun 11 2014 Example: I have this C function that is compiled into a library
- Adam D. Ruppe (6/7) Jun 11 2014 Write the prototype in your D file with extern(C):
- simendsjo (2/10) Jun 11 2014 I believe the correct answer should be "Buy my book!".
- Adam D. Ruppe (4/5) Jun 11 2014 ah, of course! I should just make a .sig file lol
- belkin (2/7) Jun 11 2014 Thanks. This book is on my "To Buy" list.
- simendsjo (7/16) Jun 11 2014 Yeah, I was skimming through that chapter just minutes before I saw this
- Adam D. Ruppe (4/9) Jun 11 2014 Based on the pace of dconf posting, it'll probably be early July
- Joseph Rushton Wakeling via Digitalmars-d-learn (3/8) Jun 11 2014 My copy arrived today.
- John Colvin (20/31) Jun 11 2014 //File: blah.d
- belkin (5/41) Jun 11 2014 This is great.
- Colin (12/64) Jun 11 2014 You can do a lot of it by simply doing a find and replace in the
- Colin (3/68) Jun 11 2014 And here:
- Mike Parker (3/11) Jun 12 2014 And:
- John Colvin (7/59) Jun 11 2014 By hand it's just laborious, but it's very simple.
Example: I have this C function that is compiled into a library //File: factorial.h int factorial(int n); //File: factorial.c #include "factorial.h" int factorial(int n) { if(n!=1) return n*factorial(n-1); } Question: How do I use it from D?
Jun 11 2014
On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:Question: How do I use it from D?Write the prototype in your D file with extern(C): extern(C) int factorial(int n); then just call the function normally in D. Make sure you include all the C object files when you compile the D program too so it all links together.
Jun 11 2014
On 06/11/2014 03:54 PM, Adam D. Ruppe wrote:On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:I believe the correct answer should be "Buy my book!".Question: How do I use it from D?Write the prototype in your D file with extern(C): extern(C) int factorial(int n); then just call the function normally in D. Make sure you include all the C object files when you compile the D program too so it all links together.
Jun 11 2014
On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote:I believe the correct answer should be "Buy my book!".ah, of course! I should just make a .sig file lol http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book chapter 4 talks about this kind of thing :P
Jun 11 2014
On Wednesday, 11 June 2014 at 14:22:51 UTC, Adam D. Ruppe wrote:On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote:Thanks. This book is on my "To Buy" list.I believe the correct answer should be "Buy my book!".ah, of course! I should just make a .sig file lol http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book chapter 4 talks about this kind of thing :P
Jun 11 2014
On 06/11/2014 04:22 PM, Adam D. Ruppe wrote:On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote:Yeah, I was skimming through that chapter just minutes before I saw this post :) I must say I really like your writing-style as well as the down-to-earth and precise and concise presentation of the material. So kudos to you! Really looking forward to reading some of the more advanced material as well as seeing your dconf presentation.I believe the correct answer should be "Buy my book!".ah, of course! I should just make a .sig file lol http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book chapter 4 talks about this kind of thing :P
Jun 11 2014
On Wednesday, 11 June 2014 at 14:45:22 UTC, simendsjo wrote:I must say I really like your writing-style as well as the down-to-earth and precise and concise presentation of the material. So kudos to you!thanks, don't forget to tell that to amazon review readers too :PReally looking forward to reading some of the more advanced material as well as seeing your dconf presentation.Based on the pace of dconf posting, it'll probably be early July before it is online :(
Jun 11 2014
On 11/06/14 16:22, Adam D. Ruppe via Digitalmars-d-learn wrote:On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote:My copy arrived today. Life is clearly going to be more fun. :-)I believe the correct answer should be "Buy my book!".ah, of course! I should just make a .sig file lol http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book chapter 4 talks about this kind of thing :P
Jun 11 2014
On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:Example: I have this C function that is compiled into a library //File: factorial.h int factorial(int n); //File: factorial.c #include "factorial.h" int factorial(int n) { if(n!=1) return n*factorial(n-1); } Question: How do I use it from D?//File: blah.d extern(C) int factorial(int n); //coincidentally identical to the C declaration. void main() { assert(factorial(3) == 6); } $ gcc -c factorial.c -ofactorial.o $ dmd blah.d factorial.o $ ./blah or $ gcc -c factorial.c -ofactorial.o $ ar rcs libfactorial.a factorial.o $ dmd blah.d -L-lfactorial $ ./blah Basically, you just translate the header files from C to D, then link to the C implementation. See http://code.dlang.org/packages/dstep for automatic translation of headers.
Jun 11 2014
On Wednesday, 11 June 2014 at 14:02:08 UTC, John Colvin wrote:On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:This is great. How practical (reliable ) is it to translate a large and complex header file like oci.h ( the interface for Oracle's database API ) to D?Example: I have this C function that is compiled into a library //File: factorial.h int factorial(int n); //File: factorial.c #include "factorial.h" int factorial(int n) { if(n!=1) return n*factorial(n-1); } Question: How do I use it from D?//File: blah.d extern(C) int factorial(int n); //coincidentally identical to the C declaration. void main() { assert(factorial(3) == 6); } $ gcc -c factorial.c -ofactorial.o $ dmd blah.d factorial.o $ ./blah or $ gcc -c factorial.c -ofactorial.o $ ar rcs libfactorial.a factorial.o $ dmd blah.d -L-lfactorial $ ./blah Basically, you just translate the header files from C to D, then link to the C implementation. See http://code.dlang.org/packages/dstep for automatic translation of headers.
Jun 11 2014
On Wednesday, 11 June 2014 at 14:28:49 UTC, belkin wrote:On Wednesday, 11 June 2014 at 14:02:08 UTC, John Colvin wrote:You can do a lot of it by simply doing a find and replace in the file. For example, all C definitions of: unsigned char x become: ubyte x So a find an replace will do that for you quite easily. Other things like structs and typedefs are a bit more difficult to do with a find & replace. All the info you need is here anyway: wiki.dlang.org/Bind_D_to_COn Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:This is great. How practical (reliable ) is it to translate a large and complex header file like oci.h ( the interface for Oracle's database API ) to D?Example: I have this C function that is compiled into a library //File: factorial.h int factorial(int n); //File: factorial.c #include "factorial.h" int factorial(int n) { if(n!=1) return n*factorial(n-1); } Question: How do I use it from D?//File: blah.d extern(C) int factorial(int n); //coincidentally identical to the C declaration. void main() { assert(factorial(3) == 6); } $ gcc -c factorial.c -ofactorial.o $ dmd blah.d factorial.o $ ./blah or $ gcc -c factorial.c -ofactorial.o $ ar rcs libfactorial.a factorial.o $ dmd blah.d -L-lfactorial $ ./blah Basically, you just translate the header files from C to D, then link to the C implementation. See http://code.dlang.org/packages/dstep for automatic translation of headers.
Jun 11 2014
On Wednesday, 11 June 2014 at 15:14:19 UTC, Colin wrote:On Wednesday, 11 June 2014 at 14:28:49 UTC, belkin wrote:And here: http://dlang.org/interfaceToC.htmlOn Wednesday, 11 June 2014 at 14:02:08 UTC, John Colvin wrote:You can do a lot of it by simply doing a find and replace in the file. For example, all C definitions of: unsigned char x become: ubyte x So a find an replace will do that for you quite easily. Other things like structs and typedefs are a bit more difficult to do with a find & replace. All the info you need is here anyway: wiki.dlang.org/Bind_D_to_COn Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:This is great. How practical (reliable ) is it to translate a large and complex header file like oci.h ( the interface for Oracle's database API ) to D?Example: I have this C function that is compiled into a library //File: factorial.h int factorial(int n); //File: factorial.c #include "factorial.h" int factorial(int n) { if(n!=1) return n*factorial(n-1); } Question: How do I use it from D?//File: blah.d extern(C) int factorial(int n); //coincidentally identical to the C declaration. void main() { assert(factorial(3) == 6); } $ gcc -c factorial.c -ofactorial.o $ dmd blah.d factorial.o $ ./blah or $ gcc -c factorial.c -ofactorial.o $ ar rcs libfactorial.a factorial.o $ dmd blah.d -L-lfactorial $ ./blah Basically, you just translate the header files from C to D, then link to the C implementation. See http://code.dlang.org/packages/dstep for automatic translation of headers.
Jun 11 2014
On 6/12/2014 12:17 AM, Colin wrote:And: http://www.gamedev.net/page/resources/_/technical/game-programming/binding-d-to-c-r3122So a find an replace will do that for you quite easily. Other things like structs and typedefs are a bit more difficult to do with a find & replace. All the info you need is here anyway: wiki.dlang.org/Bind_D_to_CAnd here: http://dlang.org/interfaceToC.html
Jun 12 2014
On Wednesday, 11 June 2014 at 14:28:49 UTC, belkin wrote:On Wednesday, 11 June 2014 at 14:02:08 UTC, John Colvin wrote:By hand it's just laborious, but it's very simple. Using dstep: It doesn't handle any pre-processor stuff, so a lot of complicated headers are out of the question. One approach is to run the pre-processor in gcc over the file, use dstep on the output, then reconstruct the conditional compilation stuff manually.On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:This is great. How practical (reliable ) is it to translate a large and complex header file like oci.h ( the interface for Oracle's database API ) to D?Example: I have this C function that is compiled into a library //File: factorial.h int factorial(int n); //File: factorial.c #include "factorial.h" int factorial(int n) { if(n!=1) return n*factorial(n-1); } Question: How do I use it from D?//File: blah.d extern(C) int factorial(int n); //coincidentally identical to the C declaration. void main() { assert(factorial(3) == 6); } $ gcc -c factorial.c -ofactorial.o $ dmd blah.d factorial.o $ ./blah or $ gcc -c factorial.c -ofactorial.o $ ar rcs libfactorial.a factorial.o $ dmd blah.d -L-lfactorial $ ./blah Basically, you just translate the header files from C to D, then link to the C implementation. See http://code.dlang.org/packages/dstep for automatic translation of headers.
Jun 11 2014