X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/38fac18bf81df672821ebbac4130ce41f0a6c61f..308dc7bdfb924370cfd205f656eb0e83191d01a9:/src/main.c diff --git a/src/main.c b/src/main.c index 7613bc0..296cf0d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,7 @@ /* GOB C Preprocessor * Copyright (C) 1999,2000 the Free Software Foundation. * Copyright (C) 2000 Eazel, Inc. - * Copyright (C) 2001 George Lebl + * Copyright (C) 2001-2004 George Lebl * * Author: George Lebl * @@ -82,8 +82,8 @@ static gboolean made_aliases = FALSE; /* if we made any shorthand aliases static gboolean special_array[SPECIAL_LAST] = {0}; static gboolean any_special = FALSE; -static gboolean need_shutdown = FALSE; -static Method * shutdown_handler = NULL; +static gboolean need_dispose = FALSE; +static Method * dispose_handler = NULL; static gboolean need_finalize = FALSE; static Method * finalize_handler = NULL; @@ -120,16 +120,16 @@ static void make_bases (void) { filebase = replace_sep (((Class *)class)->otype, '-'); - g_strdown (filebase); + gob_strdown (filebase); funcbase = replace_sep (((Class *)class)->otype, '_'); - g_strdown (funcbase); + gob_strdown (funcbase); pfuncbase = replace_sep (((Class *)class)->ptype, '_'); - g_strdown (pfuncbase); + gob_strdown (pfuncbase); macrobase = replace_sep (((Class *)class)->otype, '_'); - g_strup (macrobase); + gob_strup (macrobase); macrois = make_pre_macro (((Class *)class)->otype, "IS"); pmacrois = make_pre_macro (((Class *)class)->ptype, "IS"); @@ -142,42 +142,6 @@ make_bases (void) ptypebase = remove_sep (((Class *)class)->ptype); } -static char * -get_type (const Type *t, gboolean postfix_to_stars) -{ - char *s; - int i; - int extra; - GString *gs; - - s = remove_sep(t->name); - gs = g_string_new(s); - g_free(s); - - extra = 0; - if (postfix_to_stars) { - const char *p; - /*XXX: this is ugly perhaps we can do this whole postfix thing - in a nicer way, we just count the number of '[' s and from - that we deduce the number of dimensions, so that we can print - that many stars */ - for (p = t->postfix; p && *p; p++) - if(*p == '[') extra++; - } - g_string_append_c(gs, ' '); - - if (t->pointer != NULL) { - g_string_append (gs, t->pointer); - for (i=0; i < extra; i++) - g_string_append_c (gs, '*'); - g_string_append_c (gs, ' '); - } - - s = gs->str; - g_string_free (gs, FALSE); - return s; -} - static char * get_gtk_doc (const char *id) { @@ -346,7 +310,7 @@ make_method_nongnu_aliases(Class *c) } static void -add_bad_hack_to_avoid_unused_warnings(Class *c) +add_bad_hack_to_avoid_unused_warnings(const Class *c) { GList *li; @@ -392,7 +356,7 @@ add_bad_hack_to_avoid_unused_warnings(Class *c) } static void -put_variable(Variable *v, FILE *fp) +put_variable(const Variable *v, FILE *fp) { out_printf(fp, "\t"); print_type(fp, v->vtype, FALSE); @@ -454,7 +418,7 @@ put_signal_macro (const Method *m, gboolean gnu) out_printf (outh, "#define %s_connect_data__%s" "(object,func,data,destroy_data,flags)\t" "g_signal_connect_data(%s(object),\"%s\"," - "(GCallback)(func),(data),(destroy_data),(flags))\n", + "(GCallback)(func),(data),(destroy_data),(GConnectFlags)(flags))\n", funcbase, m->id, macrobase, m->id); } else { /* connect */ @@ -489,7 +453,7 @@ put_signal_macro (const Method *m, gboolean gnu) funcbase, m->id, macrobase, typebase, m->id); print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ", " = (func); ", m, FALSE, TRUE, TRUE); - out_printf (outh, "___%s; }), (data), (destroy_data), (flags))\n", m->id); + out_printf (outh, "___%s; }), (data), (destroy_data), (GConnectFlags)(flags))\n", m->id); } } @@ -562,7 +526,7 @@ put_prot_method(const Method *m) } static void -put_priv_method_prot(Method *m) +put_priv_method_prot(const Method *m) { if(m->method == SIGNAL_LAST_METHOD || m->method == SIGNAL_FIRST_METHOD || @@ -672,30 +636,30 @@ make_inits(Class *cl) } static void -find_shutdown(Class *cl) +find_dispose(const Class *cl) { GList *li; - shutdown_handler = NULL; + dispose_handler = NULL; for(li=cl->nodes;li;li=g_list_next(li)) { Node *n = li->data; if(n->type == METHOD_NODE) { Method *m = (Method *)n; if(m->method == OVERRIDE_METHOD && - strcmp(m->id, "shutdown")==0) { + strcmp(m->id, "dispose")==0) { if(strcmp(m->otype, "G:Object") != 0) { error_print(GOB_ERROR, m->line_no, - "shutdown method override " + "dispose method override " "of class other then " "G:Object"); } if(g_list_length(m->args) != 1) { error_print(GOB_ERROR, m->line_no, - "shutdown method override " + "dispose method override " "with more then one " "parameter"); } - shutdown_handler = m; + dispose_handler = m; break; } } @@ -703,7 +667,7 @@ find_shutdown(Class *cl) } static void -find_finalize(Class *cl) +find_finalize(const Class *cl) { GList *li; @@ -744,7 +708,7 @@ static GList *eq_signal_methods = NULL; /* compare a list of strings */ static gboolean -is_list_equal(GList *a, GList *b) +is_list_equal(const GList *a, const GList *b) { for(;a && b; a=a->next, b=b->next) { if(strcmp(a->data, b->data)!=0) { @@ -758,7 +722,7 @@ is_list_equal(GList *a, GList *b) } static Method * -find_same_type_signal(Method *m) +find_same_type_signal(const Method *m) { GList *li; for(li=eq_signal_methods;li;li=li->next) { @@ -770,7 +734,7 @@ find_same_type_signal(Method *m) } static void -print_signal_marsal_args (Method *m) +print_signal_marsal_args (const Method *m) { if (strcmp (m->gtktypes->next->data, "NONE") != 0) { GList *li; @@ -778,9 +742,16 @@ print_signal_marsal_args (Method *m) for (i = 0, li = m->gtktypes->next; li != NULL; i++, li = li->next) { - char *get_func = g_strdup_printf - ("g_value_get_%s", (char *)li->data); - g_strdown (get_func); + char *get_func; + + if (strcmp (li->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + get_func = g_strdup ("g_value_get_uint"); + else + get_func = g_strdup_printf + ("g_value_get_%s", (char *)li->data); + + gob_strdown (get_func); out_printf (out, ",\n\t\t(%s) " "%s (param_values + %d)", get_cast (li->data, FALSE), @@ -893,11 +864,18 @@ add_signal_prots(Method *m) gboolean take_ownership = (strcmp ((char *)m->gtktypes->data, "STRING") == 0 || strcmp ((char *)m->gtktypes->data, "BOXED") == 0); - char *set_func = g_strdup_printf ("g_value_set_%s%s", - (char *)m->gtktypes->data, - take_ownership ? + char *set_func; + + + if (strcmp (m->gtktypes->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + set_func = g_strdup ("g_value_set_uint"); + else + set_func = g_strdup_printf ("g_value_set_%s%s", + (char *)m->gtktypes->data, + take_ownership ? "_take_ownership" : ""); - g_strdown (set_func); + gob_strdown (set_func); out_printf (out, "\n\t%s (return_value, v_return);\n", set_func); @@ -921,7 +899,7 @@ add_enums(Class *c) if(m->method == SIGNAL_LAST_METHOD || m->method == SIGNAL_FIRST_METHOD) { char *s = g_strdup(m->id); - g_strup(s); + gob_strup(s); out_printf(out, "\t%s_SIGNAL,\n", s); g_free(s); } @@ -937,13 +915,13 @@ add_enums(Class *c) if (n->type == PROPERTY_NODE) { Property *p = (Property *)n; char *s = g_strdup (p->name); - g_strup (s); + gob_strup (s); out_printf (out, ",\n\tPROP_%s", s); g_free(s); } else if (n->type == ARGUMENT_NODE) { Argument *a = (Argument *)n; char *s = g_strdup(a->name); - g_strup(s); + gob_strup (s); out_printf(out, ",\n\tPROP_%s", s); g_free(s); } @@ -1001,13 +979,25 @@ add_interface_inits (Class *c) for (li = c->interfaces; li != NULL; li = li->next) { const char *interface = li->data; + const char *end; char *name = replace_sep (interface, '_'); char *type = remove_sep (interface); + /* EEEK! evil, we should have some sort of option + * to force this for arbitrary interfaces, since + * some are Class and some are Iface. Glib is shite + * in consistency. */ + if (strcmp (type, "GtkEditable") == 0 || + strcmp (type, "GTypePlugin") == 0) + end = "Class"; + else + /* We'll assume Iface is the standard ending */ + end = "Iface"; + out_printf (out, "\nstatic void\n" - "___%s_init (%sIface *iface)\n" + "___%s_init (%s%s *iface)\n" "{\n", - name, type); + name, type, end); add_interface_methods (c, interface); @@ -1063,13 +1053,13 @@ static void add_get_type(void) { /*char *chunk_size = ((Class*)class)->chunk_size;*/ - + out_printf(out, "GType\n" "%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n\n" - "\tif (type == 0) {\n" + "\tif ___GOB_UNLIKELY(type == 0) {\n" "\t\tstatic const GTypeInfo info = {\n" "\t\t\tsizeof (%sClass),\n" "\t\t\t(GBaseInitFunc) NULL,\n" @@ -1122,7 +1112,7 @@ add_bonobo_object_get_type (void) "%s_get_type (void)\n" /* 1 */ "{\n" "\tstatic GType type = 0;\n\n" - "\tif (type == 0) {\n" + "\tif ___GOB_UNLIKELY(type == 0) {\n" "\t\tstatic const GTypeInfo info = {\n" "\t\t\tsizeof (%sClass),\n" /* 2 */ "\t\t\t(GBaseInitFunc) NULL,\n" @@ -1198,7 +1188,7 @@ add_overrides(Class *c, const char *oname, g_hash_table_insert(done, s, s); f = replace_sep(m->otype, '_'); - g_strdown(f); + gob_strdown(f); out_printf(out, "\t%sClass *%s_class = (%sClass *)%s;\n", s, f, s, oname); @@ -1292,7 +1282,7 @@ add_signals(Class *c) is_none = (strcmp(m->gtktypes->next->data, "NONE")==0); sig = g_strdup (m->id); - g_strup (sig); + gob_strup (sig); flags = make_run_signal_flags (m, last); out_printf (out, "\tobject_signals[%s_SIGNAL] =\n" "\t\tg_signal_new (\"%s\",\n" @@ -1323,8 +1313,8 @@ add_signals(Class *c) if(strcmp(m->gtktypes->data, "NONE") != 0 || ! is_none) { GList *gl, *al; - char *sep = ""; - out_printf(out, "\tif("); + const char *sep = ""; + out_printf(out, "\tif ___GOB_UNLIKELY("); if(strcmp(m->gtktypes->data, "NONE") != 0) { out_printf(out, "%s sizeof(", sep); print_type(out, m->mtype, FALSE); @@ -1393,13 +1383,13 @@ set_def_handlers(Class *c, const char *oname) if (m->method == OVERRIDE_METHOD) { char *s; s = replace_sep (m->otype, '_'); - g_strdown (s); + gob_strdown (s); - if (need_shutdown && - shutdown_handler != NULL && - strcmp (m->id, "shutdown") == 0) - out_printf (out, "\tg_object_class->shutdown " - "= ___shutdown;\n"); + if (need_dispose && + dispose_handler != NULL && + strcmp (m->id, "dispose") == 0) + out_printf (out, "\tg_object_class->dispose " + "= ___dispose;\n"); else if (need_finalize && finalize_handler && strcmp(m->id, "finalize") == 0) @@ -1479,7 +1469,7 @@ make_argument (Argument *a) g_string_append (flags, ")"); s = g_strdup(a->name); - g_strup(s); + gob_strup (s); if (!strcmp (a->gtktype, "ENUM")) out_printf(out, "\tparam_spec = g_param_spec_enum (\"%s\", NULL, NULL,\n" "\t\tG_TYPE_ENUM, 0,\n" @@ -1548,6 +1538,18 @@ make_argument (Argument *a) "\t\t0,\n" "\t\t%s);\n", a->name, flags->str); + else if (!strcmp (a->gtktype, "INT64")) + out_printf(out, "\tparam_spec = g_param_spec_int64 (\"%s\", NULL, NULL,\n" + "\t\tG_MININT64, G_MAXINT64,\n" + "\t\t0,\n" + "\t\t%s);\n", + a->name, flags->str); + else if (!strcmp (a->gtktype, "UINT64")) + out_printf(out, "\tparam_spec = g_param_spec_uint64 (\"%s\", NULL, NULL,\n" + "\t\t0, G_MAXUINT64,\n" + "\t\t0,\n" + "\t\t%s);\n", + a->name, flags->str); else if (!strcmp (a->gtktype, "FLOAT")) out_printf(out, "\tparam_spec = g_param_spec_float (\"%s\", NULL, NULL,\n" "\t\tG_MINFLOAT, G_MAXFLOAT,\n" @@ -1579,6 +1581,21 @@ make_argument (Argument *a) #define value_for_print(str, alt) (str != NULL ? str : alt) +static char * +make_me_type (const char *type, const char *alt) +{ + if (type == NULL) + return g_strdup (alt); + /* HACK! just in case someone made this + * work with 2.0.0 by using the TYPE + * macro directly */ + if ((strstr (type, "_TYPE_") != NULL || + strstr (type, "TYPE_") == type) && + strchr (type, ':') == NULL) + return g_strdup (type); + return make_pre_macro (type, "TYPE"); +} + static void make_property (Property *p) { @@ -1633,7 +1650,7 @@ make_property (Property *p) g_string_append (flags, ")"); - if (strcmp (p->gtktype, "CHAR") == 0) + if (strcmp (p->gtktype, "CHAR") == 0) { out_printf (out, "\tparam_spec = g_param_spec_char\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1649,7 +1666,7 @@ make_property (Property *p) value_for_print (p->maximum, "127"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "UCHAR") == 0) + } else if (strcmp (p->gtktype, "UCHAR") == 0) { out_printf (out, "\tparam_spec = g_param_spec_uchar\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1665,7 +1682,7 @@ make_property (Property *p) value_for_print (p->maximum, "0xFF"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "BOOLEAN") == 0) + } else if (strcmp (p->gtktype, "BOOLEAN") == 0) { out_printf (out, "\tparam_spec = g_param_spec_boolean\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1677,7 +1694,7 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "FALSE"), flags->str); - else if (strcmp (p->gtktype, "INT") == 0) + } else if (strcmp (p->gtktype, "INT") == 0) { out_printf (out, "\tparam_spec = g_param_spec_int\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1693,7 +1710,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXINT"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "UINT") == 0) + } else if (strcmp (p->gtktype, "UINT") == 0) { out_printf (out, "\tparam_spec = g_param_spec_uint\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1709,7 +1726,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXUINT"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "LONG") == 0) + } else if (strcmp (p->gtktype, "LONG") == 0) { out_printf (out, "\tparam_spec = g_param_spec_long\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1725,7 +1742,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXLONG"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "ULONG") == 0) + } else if (strcmp (p->gtktype, "ULONG") == 0) { out_printf (out, "\tparam_spec = g_param_spec_ulong\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1741,7 +1758,39 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXULONG"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "UNICHAR") == 0) + } else if (strcmp (p->gtktype, "INT64") == 0) { + out_printf (out, "\tparam_spec = g_param_spec_int64\n" + "\t\t(\"%s\" /* name */,\n" + "\t\t %s /* nick */,\n" + "\t\t %s /* blurb */,\n" + "\t\t %s /* minimum */,\n" + "\t\t %s /* maximum */,\n" + "\t\t %s /* default_value */,\n" + "\t\t %s);\n", + p->name, + value_for_print (p->nick, "NULL"), + value_for_print (p->blurb, "NULL"), + value_for_print (p->minimum, "G_MININT64"), + value_for_print (p->maximum, "G_MAXINT64"), + value_for_print (p->default_value, "0"), + flags->str); + } else if (strcmp (p->gtktype, "UINT64") == 0) { + out_printf (out, "\tparam_spec = g_param_spec_uint64\n" + "\t\t(\"%s\" /* name */,\n" + "\t\t %s /* nick */,\n" + "\t\t %s /* blurb */,\n" + "\t\t %s /* minimum */,\n" + "\t\t %s /* maximum */,\n" + "\t\t %s /* default_value */,\n" + "\t\t %s);\n", + p->name, + value_for_print (p->nick, "NULL"), + value_for_print (p->blurb, "NULL"), + value_for_print (p->minimum, "0"), + value_for_print (p->maximum, "G_MAXUINT64"), + value_for_print (p->default_value, "0"), + flags->str); + } else if (strcmp (p->gtktype, "UNICHAR") == 0) { out_printf (out, "\tparam_spec = g_param_spec_unichar\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1753,7 +1802,9 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "ENUM") == 0) + } else if (strcmp (p->gtktype, "ENUM") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_ENUM"); out_printf (out, "\tparam_spec = g_param_spec_enum\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1764,10 +1815,13 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_ENUM"), + type, value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "FLAGS") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "FLAGS") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_FLAGS"); out_printf (out, "\tparam_spec = g_param_spec_flags\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1778,10 +1832,11 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_FLAGS"), + type, value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "FLOAT") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "FLOAT") == 0) { out_printf (out, "\tparam_spec = g_param_spec_float\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1797,7 +1852,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXFLOAT"), value_for_print (p->default_value, "0.0"), flags->str); - else if (strcmp (p->gtktype, "DOUBLE") == 0) + } else if (strcmp (p->gtktype, "DOUBLE") == 0) { out_printf (out, "\tparam_spec = g_param_spec_double\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1813,7 +1868,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXDOUBLE"), value_for_print (p->default_value, "0.0"), flags->str); - else if (strcmp (p->gtktype, "STRING") == 0) + } else if (strcmp (p->gtktype, "STRING") == 0) { out_printf (out, "\tparam_spec = g_param_spec_string\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1825,7 +1880,9 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "NULL"), flags->str); - else if (strcmp (p->gtktype, "PARAM") == 0) + } else if (strcmp (p->gtktype, "PARAM") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_PARAM"); out_printf (out, "\tparam_spec = g_param_spec_param\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1835,9 +1892,12 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_PARAM"), + type, flags->str); - else if (strcmp (p->gtktype, "BOXED") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "BOXED") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_BOXED"); out_printf (out, "\tparam_spec = g_param_spec_boxed\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1847,9 +1907,10 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_BOXED"), + type, flags->str); - else if (strcmp (p->gtktype, "POINTER") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "POINTER") == 0) { out_printf (out, "\tparam_spec = g_param_spec_pointer\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1860,7 +1921,7 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), flags->str); /* FIXME: VALUE_ARRAY */ - else if (strcmp (p->gtktype, "CLOSURE") == 0) + } else if (strcmp (p->gtktype, "CLOSURE") == 0) { out_printf (out, "\tparam_spec = g_param_spec_pointer\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1870,7 +1931,9 @@ make_property (Property *p) value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), flags->str); - else if (strcmp (p->gtktype, "OBJECT") == 0) + } else if (strcmp (p->gtktype, "OBJECT") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_BOXED"); out_printf (out, "\tparam_spec = g_param_spec_object\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1880,15 +1943,17 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_OBJECT"), + type, flags->str); - else + g_free (type); + } else { error_printf (GOB_ERROR, p->line_no, "%s type is not supported by properties", p->gtktype); + } s = g_strdup (p->name); - g_strup (s); + gob_strup (s); out_printf (out, "\tg_object_class_install_property (g_object_class,\n" "\t\tPROP_%s,\n" "\t\tparam_spec);\n", s); @@ -1947,7 +2012,7 @@ print_initializer(Method *m, Variable *v) static void print_destructor (Variable *v) { - char *root; + const char *root; if(v->destructor == NULL) return; @@ -1988,13 +2053,13 @@ print_destructor (Variable *v) } static void -add_shutdown (Class *c) +add_dispose (Class *c) { out_printf(out, "\nstatic void\n" - "___shutdown (GObject *obj_self)\n" + "___dispose (GObject *obj_self)\n" "{\n"); out_printf(out, - "#define __GOB_FUNCTION__ \"%s::shutdown\"\n", + "#define __GOB_FUNCTION__ \"%s::dispose\"\n", c->otype); if (unreftors > 0) { @@ -2002,18 +2067,18 @@ add_shutdown (Class *c) typebase, macrobase); } - if (shutdown_handler != NULL) { + if (dispose_handler != NULL) { /* so we get possible bad argument warning */ - if (shutdown_handler->line_no > 0) - out_addline_infile (out, shutdown_handler->line_no); - out_printf (out, "\t___%x_%s_shutdown(obj_self);\n", - (guint)shutdown_handler->unique_id, funcbase); - if (shutdown_handler->line_no > 0) + if (dispose_handler->line_no > 0) + out_addline_infile (out, dispose_handler->line_no); + out_printf (out, "\t___%x_%s_dispose(obj_self);\n", + (guint)dispose_handler->unique_id, funcbase); + if (dispose_handler->line_no > 0) out_addline_outfile (out); } else { out_printf (out, - "\tif (G_OBJECT_CLASS (parent_class)->shutdown) \\\n" - "\t\t(* G_OBJECT_CLASS (parent_class)->shutdown) (obj_self);\n"); + "\tif (G_OBJECT_CLASS (parent_class)->dispose) \\\n" + "\t\t(* G_OBJECT_CLASS (parent_class)->dispose) (obj_self);\n"); } if (unreftors > 0) { @@ -2187,7 +2252,7 @@ add_inits(Class *c) if (set_properties > 0 || get_properties > 0 || signals > 0 || - need_shutdown || + need_dispose || need_finalize) { out_printf(out, "\tGObjectClass *" @@ -2229,9 +2294,9 @@ add_inits(Class *c) /* if there are no handlers for these things, we * need to set them up here */ - if(need_shutdown && !shutdown_handler) - out_printf(out, "\tg_object_class->shutdown " - "= ___shutdown;\n"); + if(need_dispose && !dispose_handler) + out_printf(out, "\tg_object_class->dispose " + "= ___dispose;\n"); if(need_finalize && !finalize_handler) out_printf(out, "\tg_object_class->finalize = " "___finalize;\n"); @@ -2282,11 +2347,17 @@ add_argument (Argument *a, gboolean is_set) if (cbuf == NULL) return; s = g_strdup(a->name); - g_strup(s); + gob_strup (s); out_printf(out, "\tcase PROP_%s:\n\t{", s); the_type_lower = g_strdup (a->gtktype); - g_strdown (the_type_lower); + gob_strdown (the_type_lower); + + /* HACK because there is no g_value_set/get for unichar */ + if (strcmp (the_type_lower, "unichar") == 0) { + g_free (the_type_lower); + the_type_lower = g_strdup ("uint"); + } if (is_set) { char *cast; @@ -2360,9 +2431,9 @@ add_property (Property *p, gboolean is_set) return; name_upper = g_strdup (p->name); - g_strup (name_upper); + gob_strup (name_upper); the_type_lower = g_strdup (p->gtktype); - g_strdown (the_type_lower); + gob_strdown (the_type_lower); out_printf (out, "\tcase PROP_%s:\n", name_upper); @@ -2535,11 +2606,21 @@ put_signal_args (Method *m) { GList *li; GList *ali; - for (ali = m->gtktypes->next, li=m->args->next; + int i; + + if (m->args->next == NULL) + return; + + for (ali = m->gtktypes->next, li = m->args->next, i = 1; li != NULL && ali != NULL; - li = li->next, ali = ali->next) { + li = li->next, ali = ali->next, i++) { FuncArg *fa = li->data; char *cast = g_strdup (get_cast (ali->data, FALSE)); + /* FIXME: This code is so fucking ugly it hurts */ + gboolean do_static = + (strcmp ((char *)ali->data, "STRING") == 0 || + strcmp ((char *)ali->data, "BOXED") == 0); + char *set_func; if (cast == NULL) { cast = get_type (fa->atype, TRUE); @@ -2548,28 +2629,60 @@ put_signal_args (Method *m) the we know all the types */ g_assert (cast != NULL); - out_printf (out, ",\n\t\t(%s)%s", cast, - fa->name); + out_printf (out, + "\t___param_values[%d].g_type = 0;\n" + "\tg_value_init (&___param_values[%d], G_TYPE_%s);\n", + i, i, (char *)ali->data); + + if (strcmp (ali->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + set_func = g_strdup ("g_value_set_uint"); + else + set_func = g_strdup_printf ("g_value_set%s_%s", + do_static ? "_static" : "", + (char *)ali->data); + gob_strdown (set_func); + + out_printf (out, "\t%s (&___param_values[%d], (%s) %s);\n\n", + set_func, i, cast, fa->name); + g_free (set_func); g_free (cast); } } +static void +clear_signal_args (Method *m) +{ + GList *li; + int i; + + out_printf (out, "\n\tg_value_unset (&___param_values[0]);\n"); + + if (m->args->next == NULL) + return; + + for (li = m->args->next, i = 1; + li != NULL; + li = li->next, i++) { + out_printf (out, + "\tg_value_unset (&___param_values[%d]);\n", i); + } +} + static char * -get_arg_names_for_macro(Method *m) +get_arg_names_for_macro (Method *m) { - char *p; + const char *sep; GList *li; GString *gs = g_string_new(NULL); - p = ""; + sep = ""; for(li=m->args;li;li=g_list_next(li)) { FuncArg *arg = li->data; - g_string_sprintfa(gs, "%s___%s", p, arg->name); - p = ","; + g_string_sprintfa (gs, "%s___%s", sep, arg->name); + sep = ","; } - p = gs->str; - g_string_free(gs, FALSE); - return p; + return g_string_free (gs, FALSE); } static void @@ -2610,38 +2723,114 @@ put_method(Method *m) else /* PUBLIC, PROTECTED */ print_method(out, "", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); - out_addline_outfile(out); - out_printf(out, "{\n"); - s = g_strdup(m->id); - g_strup(s); - if(strcmp(m->mtype->name, "void") == 0 && - m->mtype->pointer == NULL) { - print_preconditions(m); - if(((FuncArg *)m->args->data)->name) - out_printf(out, "\tg_signal_emit (G_OBJECT (%s),\n" - "\t\tobject_signals[%s_SIGNAL], 0", - ((FuncArg *)m->args->data)->name, s); - put_signal_args (m); - out_printf(out, ");\n}\n"); - } else { - out_printf(out, "\t"); - print_type(out, m->mtype, TRUE); - out_printf(out, "return_val = ("); - print_type(out, m->mtype, TRUE); - if(m->defreturn) - out_printf(out, ")(%s);\n", m->defreturn); - else if(m->onerror) - out_printf(out, ")(%s);\n", m->onerror); + out_addline_outfile (out); + + out_printf (out, "{\n"); + + out_printf (out, + "\tGValue ___param_values[%d];\n" + "\tGValue ___return_val = {0};\n\n", + g_list_length (m->args)); + + print_preconditions (m); + + out_printf (out, + "\n\t___param_values[0].g_type = 0;\n" + "\tg_value_init (&___param_values[0], G_TYPE_FROM_INSTANCE (%s));\n" + "\tg_value_set_instance (&___param_values[0], (gpointer) %s);\n\n", + ((FuncArg *)m->args->data)->name, + ((FuncArg *)m->args->data)->name); + + put_signal_args (m); + + if (strcmp (m->gtktypes->data, "NONE") != 0) { + const char *defret = NULL; + + out_printf (out, "\tg_value_init (&___return_val, G_TYPE_%s);\n", + (char *)m->gtktypes->data); + + if (m->defreturn != NULL) + defret = m->defreturn; + else if (m->onerror != NULL) + defret = m->onerror; + + if (defret != NULL) { + char *set_func; + /* FIXME: This code is so fucking ugly it hurts */ + gboolean do_static = + (strcmp ((char *)m->gtktypes->data, "STRING") == 0 || + strcmp ((char *)m->gtktypes->data, "BOXED") == 0); + char *cast = g_strdup (get_cast (m->gtktypes->data, FALSE)); + if (cast == NULL) + cast = get_type (m->mtype, TRUE); + + if (strcmp (m->gtktypes->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + set_func = g_strdup ("g_value_set_uint"); + else + set_func = g_strdup_printf ("g_value_set%s_%s", + do_static ? "_static" : "", + (char *)m->gtktypes->data); + gob_strdown (set_func); + + out_printf (out, "\t%s (&___return_val, (%s) (%s));\n", + set_func, cast, defret); + + g_free (set_func); + g_free (cast); + } + out_printf (out, "\n"); + } + + s = g_strdup (m->id); + gob_strup (s); + + out_printf(out, "\tg_signal_emitv (___param_values,\n" + "\t\tobject_signals[%s_SIGNAL],\n" + "\t\t0 /* detail */,\n" + "\t\t&___return_val);\n", s); + + g_free (s); + + clear_signal_args (m); + + if (strcmp (m->gtktypes->data, "NONE") != 0) { + char *cast = g_strdup (get_cast (m->gtktypes->data, FALSE)); + char *getfunc; + /* Hack because glib is very very braindead */ + gboolean do_dup = + (strcmp ((char *)m->gtktypes->data, "STRING") == 0 || + strcmp ((char *)m->gtktypes->data, "BOXED") == 0 || + strcmp ((char *)m->gtktypes->data, "OBJECT") == 0 || + strcmp ((char *)m->gtktypes->data, "PARAM") == 0); + + if (strcmp (m->gtktypes->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + getfunc = g_strdup ("g_value_get_uint"); else - out_printf(out, ")(0);\n"); - print_preconditions(m); - out_printf(out, "\tg_signal_emit (G_OBJECT (%s),\n" - "\t\tobject_signals[%s_SIGNAL], 0", - ((FuncArg *)m->args->data)->name, s); - put_signal_args(m); - out_printf(out, ",\n\t\t&return_val);\n" - "\treturn return_val;\n}\n"); + getfunc = g_strdup_printf ("g_value_%s_%s", + do_dup ? "dup" : "get", + (char *)m->gtktypes->data); + gob_strdown (getfunc); + + if (cast == NULL) + cast = get_type (m->mtype, TRUE); + + out_printf (out, + "\n\t{\n" + "\t\t"); + print_type (out, m->mtype, TRUE); + out_printf (out, + " ___ret = (%s) %s (&___return_val);\n" + "\t\tg_value_unset (&___return_val);\n" + "\t\treturn ___ret;\n" + "\t}\n", + cast, getfunc); + + g_free (cast); + g_free (getfunc); } + out_printf(out, "}\n"); if(!m->cbuf) break; @@ -2721,7 +2910,7 @@ put_method(Method *m) g_free(s); out_addline_outfile(out); s = replace_sep(m->otype, '_'); - g_strup(s); + gob_strup (s); args = get_arg_names_for_macro(m); if(is_void) { out_printf(out, "#define PARENT_HANDLER(%s) \\\n" @@ -2775,7 +2964,7 @@ open_files(void) if (no_write) { devnull = fopen ("/dev/null", "w"); if (devnull == NULL) - g_error ("Cannot open null device"); + error_print (GOB_ERROR, 0, "Cannot open null device"); out = devnull; outh = devnull; if (outfileph != NULL) @@ -2783,15 +2972,21 @@ open_files(void) } else { out = fopen (outfile, "w"); if (out == NULL) { - g_error ("Cannot open outfile: %s", outfile); + error_printf (GOB_ERROR, 0, + "Cannot open outfile: %s", outfile); } outh = fopen (outfileh, "w"); - if (outh == NULL) - g_error ("Cannot open outfile: %s", outfileh); + if (outh == NULL) { + error_printf (GOB_ERROR, 0, + "Cannot open outfile: %s", outfileh); + } if (outfileph != NULL) { outph = fopen (outfileph, "w"); - if (outph == NULL) - g_error ("Cannot open outfile: %s", outfileh); + if (outph == NULL) { + error_printf (GOB_ERROR, 0, + "Cannot open outfile: %s", + outfileph); + } } } } @@ -2831,7 +3026,7 @@ put_argument_nongnu_wrappers (Class *c) } aname = g_strdup (name); - g_strup (aname); + gob_strup (aname); if (atype != NULL) cast = get_type (atype, TRUE); @@ -2897,7 +3092,7 @@ put_argument_gnu_wrappers(Class *c) } aname = g_strdup (name); - g_strup (aname); + gob_strup (aname); if (atype != NULL) cast = get_type (atype, TRUE); @@ -3057,7 +3252,7 @@ print_class_block(Class *c) " * Main object structure\n" " */\n"); s = replace_sep (c->otype, '_'); - g_strup (s); + gob_strup (s); out_printf (outh, "#ifndef __TYPEDEF_%s__\n" "#define __TYPEDEF_%s__\n", s, s); g_free (s); @@ -3172,12 +3367,7 @@ print_class_block(Class *c) " */\n"); if ( ! overrode_get_type) { - out_printf (outh, "GType\t%s_get_type\t(void)", funcbase); - if ( ! no_gnu) { - out_printf (outh, " G_GNUC_CONST;\n"); - } else { - out_printf (outh, ";\n"); - } + out_printf (outh, "GType\t%s_get_type\t(void);\n", funcbase); } for(li = c->nodes; li != NULL; li = li->next) { @@ -3277,8 +3467,8 @@ print_class_block(Class *c) no_gnu ? "" : " G_GNUC_UNUSED", typebase, typebase, typebase, funcbase); - if (need_shutdown) - add_shutdown (c); + if (need_dispose) + add_dispose (c); if (need_finalize) add_finalize (c); @@ -3319,6 +3509,23 @@ print_useful_macros(void) out_printf (out, "#define selfp (self->_priv)\n\n"); } +static void +print_more_useful_macros (void) +{ + if (no_gnu) { + out_printf (out, "#define ___GOB_LIKELY(expr) (expr)\n"); + out_printf (out, "#define ___GOB_UNLIKELY(expr) (expr)\n"); + } else { + out_printf (out, "#ifdef G_LIKELY\n"); + out_printf (out, "#define ___GOB_LIKELY(expr) G_LIKELY(expr)\n"); + out_printf (out, "#define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr)\n"); + out_printf (out, "#else /* ! G_LIKELY */\n"); + out_printf (out, "#define ___GOB_LIKELY(expr) (expr)\n"); + out_printf (out, "#define ___GOB_UNLIKELY(expr) (expr)\n"); + out_printf (out, "#endif /* G_LIKELY */\n"); + } +} + static void print_file_comments(void) { @@ -3384,7 +3591,7 @@ print_header_prefixes(void) char *p; p = replace_sep(((Class *)class)->otype, '_'); - g_strup(p); + gob_strup (p); out_printf(outh, "#ifndef __%s_H__\n#define __%s_H__\n\n", p, p); if(outph) out_printf(outph, "#ifndef __%s_PRIVATE_H__\n" @@ -3465,7 +3672,7 @@ print_enum (EnumDef *enode) char *str; funcprefix = replace_sep (enode->etype, '_'); - g_strdown (funcprefix); + gob_strdown (funcprefix); out_printf (out, "static const GEnumValue _%s_values[] = {\n", funcprefix); type = remove_sep (enode->etype); @@ -3475,7 +3682,7 @@ print_enum (EnumDef *enode) for (li = enode->values; li != NULL; li = li->next) { EnumValue *value = li->data; char *p; - char *sname = g_strdown (g_strdup (value->name)); + char *sname = gob_strdown (g_strdup (value->name)); while ((p = strchr (sname, '_')) != NULL) *p = '-'; @@ -3511,7 +3718,7 @@ print_enum (EnumDef *enode) "GType\n%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n" - "\tif (type == 0)\n" + "\tif ___GOB_UNLIKELY(type == 0)\n" "\t\ttype = g_enum_register_static (\"%s\", _%s_values);\n" "\treturn type;\n" "}\n\n", @@ -3531,7 +3738,7 @@ print_flags (Flags *fnode) int i; funcprefix = replace_sep (fnode->ftype, '_'); - g_strdown (funcprefix); + gob_strdown (funcprefix); out_printf (out, "static const GFlagsValue _%s_values[] = {\n", funcprefix); type = remove_sep (fnode->ftype); @@ -3541,7 +3748,7 @@ print_flags (Flags *fnode) for (i = 0, li = fnode->values; li != NULL; i++, li = li->next) { const char *name = li->data; char *p; - char *sname = g_strdown (g_strdup (name)); + char *sname = gob_strdown (g_strdup (name)); while ((p = strchr (sname, '_')) != NULL) *p = '-'; @@ -3576,7 +3783,7 @@ print_flags (Flags *fnode) "GType\n%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n" - "\tif (type == 0)\n" + "\tif ___GOB_UNLIKELY(type == 0)\n" "\t\ttype = g_flags_register_static (\"%s\", _%s_values);\n" "\treturn type;\n" "}\n\n", @@ -3595,7 +3802,7 @@ print_error (Error *enode) char *str; funcprefix = replace_sep (enode->etype, '_'); - g_strdown (funcprefix); + gob_strdown (funcprefix); out_printf (out, "static const GEnumValue _%s_values[] = {\n", funcprefix); type = remove_sep (enode->etype); @@ -3605,7 +3812,7 @@ print_error (Error *enode) for (li = enode->values; li != NULL; li = li->next) { const char *name = li->data; char *p; - char *sname = g_strdown (g_strdup (name)); + char *sname = gob_strdown (g_strdup (name)); while ((p = strchr (sname, '_')) != NULL) *p = '-'; @@ -3639,7 +3846,7 @@ print_error (Error *enode) "GType\n%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n" - "\tif (type == 0)\n" + "\tif ___GOB_UNLIKELY(type == 0)\n" "\t\ttype = g_enum_register_static (\"%s\", _%s_values);\n" "\treturn type;\n" "}\n\n", @@ -3649,7 +3856,7 @@ print_error (Error *enode) out_printf (outh, "GQuark %s_quark (void);\n\n", funcprefix); str = replace_sep (enode->etype, '-'); - g_strdown (str); + gob_strdown (str); out_printf (out, "GQuark\n%s_quark (void)\n" @@ -3684,6 +3891,8 @@ generate_outfiles(void) print_includes(); + print_more_useful_macros (); + for (li = nodes; li != NULL; li = li->next) { Node *node = li->data; if (node->type == CCODE_NODE) { @@ -3955,7 +4164,7 @@ main(int argc, char *argv[]) /* This is where parsing is done */ /*yydebug = 1;*/ if(yyparse() != 0) - g_error("Parsing errors, quitting"); + error_print (GOB_ERROR, 0, "Parsing errors, quitting"); /* close input file */ if(use_m4) pclose(yyin); @@ -3963,7 +4172,7 @@ main(int argc, char *argv[]) yyin=stdin; if( ! class) - error_print(GOB_ERROR, 0, " no class defined"); + error_print (GOB_ERROR, 0, "no class defined"); exit_on_error = FALSE; @@ -3984,8 +4193,8 @@ main(int argc, char *argv[]) make_bases (); make_inits ((Class *)class); if(unreftors > 0) { - need_shutdown = TRUE; - find_shutdown ((Class *)class); + need_dispose = TRUE; + find_dispose ((Class *)class); } if (destructors > 0 || privates > 0) { @@ -4004,6 +4213,7 @@ main(int argc, char *argv[]) check_property_types ((Class *)class); check_argument_types ((Class *)class); check_func_arg_checks ((Class *)class); + check_for_class_destructors ((Class *)class); exit_on_error = TRUE;