Re: Passing parameters to a C function - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Passing parameters to a C function
Date
Msg-id 3825.1180537239@sss.pgh.pa.us
Whole thread Raw
In response to Re: Passing parameters to a C function  (Martijn van Oosterhout <kleptog@svana.org>)
List pgsql-hackers
Martijn van Oosterhout <kleptog@svana.org> writes:
> On Wed, May 30, 2007 at 11:26:01AM -0300, Rodrigo Sakai wrote:
>> But using version 1 calling convention it won't work! So, how can I pass the
>> 'a' and 'b' variables in complex_add(?, ?)?

> Use the DirectFunctionCalln functions in fmgr.

There are boatloads of examples in the existing datatype code, for
instance this function in geo_ops.c, which is just applying
close_sb() followed by dist_pb():

Datum
dist_sb(PG_FUNCTION_ARGS)
{   LSEG        *lseg = PG_GETARG_LSEG_P(0);   BOX         *box = PG_GETARG_BOX_P(1);   Point       *tmp;   Datum
result;
 
   tmp = DatumGetPointP(DirectFunctionCall2(close_sb,                                            LsegPGetDatum(lseg),
                                        BoxPGetDatum(box)));   result = DirectFunctionCall2(dist_pb,
           PointPGetDatum(tmp),                                BoxPGetDatum(box));
 
   PG_RETURN_DATUM(result);
}

All that casting to and from Datum is a bit of a pain, but it's worth it
to have a uniform, portable function API.

I strongly suggest adding some appropriate cast macros for your own
datatype, like the ones being used here, instead of dealing directly
with low-level operations like PG_GETARG_POINTER.
        regards, tom lane


pgsql-hackers by date:

Previous
From: Martijn van Oosterhout
Date:
Subject: Re: Passing parameters to a C function
Next
From: Gregory Stark
Date:
Subject: Re: TOAST usage setting