Aapo Rantalainen's blog

Experiences with Information Technology and Open source

Hampaita kiristää toisinaan ohje-sivut (case: glib-genmarshal)

Posted by Aapo Rantalainen on December 16, 2010

Joskus ottaa päähän kun man-sivut on tehty liian matemaattisen formaaleiksi, ilman kunnon tosielämän esimerkkiä. Ihanko oikeasti joku ymmärtää miten ohjelmia/funktioita on tarkoitus kutsua ihan vain mania lukemalla?

Tämän illan itkun aihe oli glib-genmarshal

glib-genmarshal on pieni ohjelma joka generoi pienen pätkän c-koodia. Sanotaan yksinkertaisuuden vuoksi, että se generoi funktion, joka palauttaa tietyn tyyppisen muuttujan ja jolle voi antaa tietyn tyyppisiä muuttujia parametreina. Eli esim funktio, joka ei palauta mitään ja ottaa yhden int-tyyppisen parametrin:

void funktio(int a)
VOID:INT

Tai palauttaa floatin ja saa saa booleanin ja unsigned charin:
float funktio(gboolean b, uchar u)
FLOAT:BOOLEAN,UCHAR

Itkua väänsin manin (esim http://library.gnome.org/devel/gobject/stable/glib-genmarshal.html ) kanssa, että miten tuota nyt oikeasti sitten käytetään. Aikani tapeltuani loitsu löytyi.

Jos haluat ottaa haasteen vastaan, niin koetapa manin avulla keksiä miten generoit tämän ja siihen liittyvät pari makroa (minulla oli siis vahva aavistus miltä ulos tuleva näyttää)

void marshal_VOID__INT_OBJECT (GClosure     *closure,
 GValue       *return_value G_GNUC_UNUSED,
 guint         n_param_values,
 const GValue *param_values,
 gpointer      invocation_hint G_GNUC_UNUSED,
 gpointer      marshal_data)
{
 typedef void (*GMarshalFunc_VOID__INT_OBJECT) (gpointer     data1,
 gint         arg_1,
 gpointer     arg_2,
 gpointer     data2);
 register GMarshalFunc_VOID__INT_OBJECT callback;
 register GCClosure *cc = (GCClosure*) closure;
 register gpointer data1, data2;

 g_return_if_fail (n_param_values == 3);

 if (G_CCLOSURE_SWAP_DATA (closure))
 {
 data1 = closure->data;
 data2 = g_value_peek_pointer (param_values + 0);
 }
 else
 {
 data1 = g_value_peek_pointer (param_values + 0);
 data2 = closure->data;
 }
 callback = (GMarshalFunc_VOID__INT_OBJECT) (marshal_data ? marshal_data : cc->callback);

 callback (data1,
 g_marshal_value_peek_int (param_values + 1),
 g_marshal_value_peek_object (param_values + 2),
 data2);
}

Ratkaisu:

echo "VOID:INT,OBJECT" | glib-genmarshal --body --prefix=marshal

Onhan kaikki tarvittava tieto manissa, mutta yhden kutsuesimerkin lisääminen tekisi siitä mielestäni paremman (raportoitu tekijälle).

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: