From: William S F. <ws...@fu...> - 2006-12-23 21:15:31
|
Mike Romberg wrote: > I'm attempting to add a new language module to SWIG to support D: > > http://www.digitalmars.com/d/ > > I've been following the documentation for extending SWIG and have > made some progress. Thanks to whoever wrote this. It has been a big > help. But I have a couple of questions. > > D provides for direct calls to functions and structs with C linkage. > One just needs to provide a declaration in D like so: > > --------------- C ----------------- > typedef struct foo { int x; int y; } foo; > void printFoo(foo f); > > --------------- D ----------------- > extern (C) { > struct foo { int x; int y; }; > void printFoo(foo f); > } > > Generating the D "wrappers" for C has not been too tough, so > far. C++ will require swig generated wrapper functions and a D > "shadow" class. This sounds similar to how python wraps C++. Is > there another SWIG module that might better match this model I should > look at? > > Second question. D does not like types such as "struct foo". For > example: > > --------------- C ----------------- > struct foo { int x; int y; }; > void printFoo(struct foo f); > > I've been able to detect that 'struct foo' is not typedefd in my > modules classHandler() method. And, it is easy to spit out the D > definition for foo: > > struct foo { int x; int y; }; > > But I also need to change the type in later uses of 'struct foo' so > they are just 'foo'. For example I need to generate printFoo() as > "void printFoo(foo f);" and not as "void printFoo(struct foo f);". In > effect, I want it to look like the original C had a typedef like so: > > struct foo { int x; int y; }; > typedef struct foo foo; > > I tried using some functions such as SwigType_typedef(). But this > did not seem to change any of the types in the parsed tree. So... I > am now walking the entire parse tree when I see one of these untypedefed > structs and change the types I find for ParmLists, etc.. > > This seems to work. But kinda feels wrong. If this makes sense to > anyone else :), does this sound like a reasonable thing to do? > Perhaps there is a better way to do this? > > Thanks, > Mike, There is a D language module already, see the SF requests page about a request for D support: http://sourceforge.net/tracker/index.php?func=detail&aid=1216181&group_id=1645&atid=351645 It has a link to an existing D language module. You may or may not want to use that version. If not, I think D looks and feels a lot like Java, so you might be better off just taking the current Java module, and adapting to suite. With regard to your 'struct foo' turning into 'foo', look at how this is handled in the Java module, especially JAVA::getProxyName(). William |