Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
August 30, 2009 problem creating a berkeley db binding | ||||
---|---|---|---|---|
| ||||
i'm trying to create a binding for berkeley db dll and quickly ran into some problems, how do i translate statement below. int DB->open(DB *db, DB_TXN *txnid, const char *file, const char *database, DBTYPE type, u_int32_t flags, int mode); my normal approach would be, extern (C) { int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) DB->open; } but real problem is 'DB->open', can anoybody suggest a workaround for this. DB is just a simple struct (struct DB;) |
August 30, 2009 Re: problem creating a berkeley db binding | ||||
---|---|---|---|---|
| ||||
Posted in reply to JT | Sun, 30 Aug 2009 11:28:16 -0400, JT wrote: > i'm trying to create a binding for berkeley db dll and quickly ran into some problems, how do i translate statement below. > > int DB->open(DB *db, DB_TXN *txnid, const char *file, > const char *database, DBTYPE type, u_int32_t flags, int mode); This is not a valid C or C++ statement, nor a declaration. It's usually hard to translate an invalid code to a different language. > my normal approach would be, > > extern (C) { > int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) DB->open; > } If open() is a method of DB struct then it uses some sort of C++ calling convention, probably thiscall. Thiscall is incompatilbe with cdecl, so extern(C) won't work. > but real problem is 'DB->open', can anoybody suggest a workaround for this. DB is just a simple struct (struct DB;) I can only guess here that what you want is extern(C++) interface DB { int open(DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode); } But, without a link to source you try to bind to, it's only a wild guess. |
August 31, 2009 Re: problem creating a berkeley db binding | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sergey Gromov | Sergey Gromov Wrote:
> Sun, 30 Aug 2009 11:28:16 -0400, JT wrote:
>
> > i'm trying to create a binding for berkeley db dll and quickly ran into some problems, how do i translate statement below.
> >
> > int DB->open(DB *db, DB_TXN *txnid, const char *file,
> > const char *database, DBTYPE type, u_int32_t flags, int mode);
>
> This is not a valid C or C++ statement, nor a declaration. It's usually hard to translate an invalid code to a different language.
>
> > my normal approach would be,
> >
> > extern (C) {
> > int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) DB->open;
> > }
>
> If open() is a method of DB struct then it uses some sort of C++ calling
> convention, probably thiscall. Thiscall is incompatilbe with cdecl, so
> extern(C) won't work.
>
> > but real problem is 'DB->open', can anoybody suggest a workaround for this. DB is just a simple struct (struct DB;)
>
> I can only guess here that what you want is
>
> extern(C++) interface DB {
> int open(DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode);
> }
>
> But, without a link to source you try to bind to, it's only a wild guess.
thanks, unfortunately the source is too long to include here, it was a Berkeley DB from Oracle. is there a binding already made for this library. :P
|
September 01, 2009 Re: problem creating a berkeley db binding | ||||
---|---|---|---|---|
| ||||
Posted in reply to JT | JT wrote:
> i'm trying to create a binding for berkeley db dll and quickly ran into some problems, how do i translate statement below.
>
> int DB->open(DB *db, DB_TXN *txnid, const char *file,
> const char *database, DBTYPE type, u_int32_t flags, int mode);
>
> my normal approach would be,
>
> extern (C) {
> int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) DB->open;
> }
>
> but real problem is 'DB->open', can anoybody suggest a workaround for this. DB is just a simple struct (struct DB;)
The function name is not 'DB->open'. That's something used in the comments. Nearly all functions in Berkeley DB are declared as function pointers used as struct fields. So what you'll want is something like this:
extern(C):
struct DB
{
int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) open;
}
Along with all of the rest of the DB function pointers and the numerous inner structs declared in the C headers.
|
September 01, 2009 Re: problem creating a berkeley db binding | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | Mike Parker Wrote:
> JT wrote:
> > i'm trying to create a binding for berkeley db dll and quickly ran into some problems, how do i translate statement below.
> >
> > int DB->open(DB *db, DB_TXN *txnid, const char *file,
> > const char *database, DBTYPE type, u_int32_t flags, int mode);
> >
> > my normal approach would be,
> >
> > extern (C) {
> > int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) DB->open;
> > }
> >
> > but real problem is 'DB->open', can anoybody suggest a workaround for this. DB is just a simple struct (struct DB;)
>
> The function name is not 'DB->open'. That's something used in the comments. Nearly all functions in Berkeley DB are declared as function pointers used as struct fields. So what you'll want is something like this:
>
> extern(C):
>
> struct DB
> {
> int function(DB* db, DB_TXN* txnid, char* file, char* database,
> DBTYPE type, u_int32_t flags, int mode) open;
> }
>
> Along with all of the rest of the DB function pointers and the numerous inner structs declared in the C headers.
thank you so much Mike. yeah i just noticed that.
|
September 03, 2009 Re: problem creating a berkeley db binding | ||||
---|---|---|---|---|
| ||||
Posted in reply to JT | JT wrote: > i'm trying to create a binding for berkeley db dll and quickly ran into some problems, how do i translate statement below. > > int DB->open(DB *db, DB_TXN *txnid, const char *file, > const char *database, DBTYPE type, u_int32_t flags, int mode); > > my normal approach would be, > > extern (C) { > int function(DB* db, DB_TXN* txnid, char* file, char* database, DBTYPE type, u_int32_t flags, int mode) DB->open; > } > > but real problem is 'DB->open', can anoybody suggest a workaround for this. DB is just a simple struct (struct DB;) Maybe this project is interesting. last update may 2007 http://code.google.com/p/db4d/ |
Copyright © 1999-2021 by the D Language Foundation