View mode: basic / threaded / horizontal-split · Log in · Help
July 14, 2012
Some guidance on writing a Deimos C library interface
Hi,

there is some documentation on writing a Deimos interface.
E.g.
http://prowiki.org/wiki4d/wiki.cgi?LanguageDevel/DIPs/DIP12
http://dlang.org/interfaceToC.html

I'd like to get a list of rules that one has to follow.

First you have to convert the name of the header file to a valid D
module name. Therefore, I found/came up with the following rules:
* a slash (/) has to be replaced by a dot (.)
* a dash (-) has to be replaced by a dot (.)
* a D keyword gets a underscore (_) appended

Maybe someone can commented on them. I suppose there are even more.
These are just the ones I encountered.

Some questions on module names I could not find a definite answer for:
1. The D page says they should be lower case. Should Deimos module names
  also be made lower case?
2. Should all interfaces be put in a common package, say deimos?

Translating the header file itself is pretty straightforward following
http://dlang.org/interfaceToC.html. Though some cases are not covered:
* E.g. use core.stdc.stdint for standard C types.
* const T* should be replaced with const(T)*
* How to deal with macros?

Can we write a recipe like guide for writing a Deimos interface?

Jens
July 14, 2012
Re: Some guidance on writing a Deimos C library interface
Hi Jens.

> 1. The D page says they should be lower case. Should Deimos 
> module names
>    also be made lower case?

Yes.

> 2. Should all interfaces be put in a common package, say deimos?

Yes.


> * const T* should be replaced with const(T)*

Yes.


> * How to deal with macros?

http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=146873


Also please check this guide
http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/
July 14, 2012
Re: Some guidance on writing a Deimos C library interface
Am Sat, 14 Jul 2012 05:24:50 +0200
schrieb Jens Mueller <jens.k.mueller@gmx.de>:

> * const T* should be replaced with const(T)*

When it's a function parameter you could even make it const(T*):
void hello(const char *name);
--> extern(C) void hello(const(char*) name);

as the pointer itself is passed by value, there's no way it could be
modified by hello. DMD should be able to figure that out and treat
const(char)* exactly the same, but last time I checked it didn't.

> * How to deal with macros?
There are different solutions. Some people prefer to make those
templates, so the binding can be used as a .di file and doesn't need to
be compiled. Others just use functions and hope the optimizer will
inline it ;-)

> 
> Can we write a recipe like guide for writing a Deimos interface?
> 
> Jens
July 14, 2012
Re: Some guidance on writing a Deimos C library interface
On 2012-07-14 05:24, Jens Mueller wrote:
> Hi,
>
> there is some documentation on writing a Deimos interface.
> E.g.
> http://prowiki.org/wiki4d/wiki.cgi?LanguageDevel/DIPs/DIP12
> http://dlang.org/interfaceToC.html
>
> I'd like to get a list of rules that one has to follow.
>
> First you have to convert the name of the header file to a valid D
> module name. Therefore, I found/came up with the following rules:
> * a slash (/) has to be replaced by a dot (.)
> * a dash (-) has to be replaced by a dot (.)
> * a D keyword gets a underscore (_) appended
>
> Maybe someone can commented on them. I suppose there are even more.
> These are just the ones I encountered.
>
> Some questions on module names I could not find a definite answer for:
> 1. The D page says they should be lower case. Should Deimos module names
>     also be made lower case?
> 2. Should all interfaces be put in a common package, say deimos?
>
> Translating the header file itself is pretty straightforward following
> http://dlang.org/interfaceToC.html. Though some cases are not covered:
> * E.g. use core.stdc.stdint for standard C types.

I would say that when a C typedef has a corresponding type in D, use 
that instead of an alias. For example:

int8_t -> use byte
int32_t -> use int

But one need to make sure that the typedef resolves to the same D type 
on all platforms.

> * const T* should be replaced with const(T)*
> * How to deal with macros?
>
> Can we write a recipe like guide for writing a Deimos interface?

You can have a look at dstep for automatically translate C/Objective-C 
headers: https://github.com/jacob-carlborg/dstep

-- 
/Jacob Carlborg
July 15, 2012
Re: Some guidance on writing a Deimos C library interface
dnewbie wrote:
> >2. Should all interfaces be put in a common package, say deimos?
> 
> Yes.

Why is this? What is the rational behind it?
Because some Deimos projects seem not to follow it.

> >* How to deal with macros?
> 
> http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=146873
> 
> 
> Also please check this guide
> http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/

Most of this is covered by http://dlang.org/interfaceToC.html, isn't it?

Jens
July 15, 2012
Re: Some guidance on writing a Deimos C library interface
On Sunday, July 15, 2012 08:14:22 Jens Mueller wrote:
> dnewbie wrote:
> > >2. Should all interfaces be put in a common package, say deimos?
> > 
> > Yes.
> 
> Why is this? What is the rational behind it?
> Because some Deimos projects seem not to follow it.

It thought that it was decided that that it was _bad_ idea to have any kind of 
deimos package when it was discussed previously, but I don't remember what all 
was discussed about it or when. Presumably, it's in the newsgroup archives 
somewhere though.

- jonathan M Davis
July 16, 2012
Re: Some guidance on writing a Deimos C library interface
Jonathan M Davis wrote:
> On Sunday, July 15, 2012 08:14:22 Jens Mueller wrote:
> > dnewbie wrote:
> > > >2. Should all interfaces be put in a common package, say deimos?
> > > 
> > > Yes.
> > 
> > Why is this? What is the rational behind it?
> > Because some Deimos projects seem not to follow it.
> 
> It thought that it was decided that that it was _bad_ idea to have any kind of 
> deimos package when it was discussed previously, but I don't remember what all 
> was discussed about it or when. Presumably, it's in the newsgroup archives 
> somewhere though.

I found
http://www.digitalmars.com/d/archives/digitalmars/D/Deimos_Consistent_structure_149602.html#N149602

But there is no consensus.

Jens
July 16, 2012
Re: Some guidance on writing a Deimos C library interface
Johannes Pfau wrote:
> Am Sat, 14 Jul 2012 05:24:50 +0200
> schrieb Jens Mueller <jens.k.mueller@gmx.de>:
> 
> > * const T* should be replaced with const(T)*
> 
> When it's a function parameter you could even make it const(T*):
> void hello(const char *name);
> --> extern(C) void hello(const(char*) name);
> 
> as the pointer itself is passed by value, there's no way it could be
> modified by hello. DMD should be able to figure that out and treat
> const(char)* exactly the same, but last time I checked it didn't.

Very true. But just to be on the safe side I think replacing it with
const(T)* is better.

> > * How to deal with macros?
> There are different solutions. Some people prefer to make those
> templates, so the binding can be used as a .di file and doesn't need to
> be compiled. Others just use functions and hope the optimizer will
> inline it ;-)

I see.

Jens
July 16, 2012
Re: Some guidance on writing a Deimos C library interface
Jacob Carlborg wrote:
> On 2012-07-14 05:24, Jens Mueller wrote:
> >Hi,
> >
> >there is some documentation on writing a Deimos interface.
> >E.g.
> >http://prowiki.org/wiki4d/wiki.cgi?LanguageDevel/DIPs/DIP12
> >http://dlang.org/interfaceToC.html
> >
> >I'd like to get a list of rules that one has to follow.
> >
> >First you have to convert the name of the header file to a valid D
> >module name. Therefore, I found/came up with the following rules:
> >* a slash (/) has to be replaced by a dot (.)
> >* a dash (-) has to be replaced by a dot (.)
> >* a D keyword gets a underscore (_) appended
> >
> >Maybe someone can commented on them. I suppose there are even more.
> >These are just the ones I encountered.
> >
> >Some questions on module names I could not find a definite answer for:
> >1. The D page says they should be lower case. Should Deimos module names
> >    also be made lower case?
> >2. Should all interfaces be put in a common package, say deimos?
> >
> >Translating the header file itself is pretty straightforward following
> >http://dlang.org/interfaceToC.html. Though some cases are not covered:
> >* E.g. use core.stdc.stdint for standard C types.
> 
> I would say that when a C typedef has a corresponding type in D, use
> that instead of an alias. For example:
> 
> int8_t -> use byte
> int32_t -> use int
> 
> But one need to make sure that the typedef resolves to the same D
> type on all platforms.

By using core.stdc.stdint I'm safe, right? I mean int8_t is just an
alias in core.stdc.stdint. I'd like to change the header file as little
as possible.

> >* const T* should be replaced with const(T)*
> >* How to deal with macros?
> >
> >Can we write a recipe like guide for writing a Deimos interface?
> 
> You can have a look at dstep for automatically translate
> C/Objective-C headers: https://github.com/jacob-carlborg/dstep

Usually, the changes are straightforward. It's just these little things
where is no clear rule that cost time.

Jens
July 16, 2012
Re: Some guidance on writing a Deimos C library interface
On 2012-07-16 06:10, Jens Mueller wrote:

> By using core.stdc.stdint I'm safe, right? I mean int8_t is just an
> alias in core.stdc.stdint. I'd like to change the header file as little
> as possible.

Sure it's safe. Fair enough but I think it's pointless.

-- 
/Jacob Carlborg
Top | Discussion index | About this forum | D home