X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/c9914e54f16c3315d47040f4cca2d3788228c504..77fd2f2194af12f95959506910f3babe842c5f1f:/src/main.c diff --git a/src/main.c b/src/main.c index a614e31..6b233d7 100644 --- a/src/main.c +++ b/src/main.c @@ -60,7 +60,8 @@ static char *typebase; static char *ptypebase; static int signals = 0; /* number of signals */ -static int arguments = 0; /* number of named arguments */ +static int set_arguments = 0; /* number of named (set) arguments */ +static int get_arguments = 0; /* number of named (get) arguments */ static int overrides = 0; /* number of override methods */ static int privates = 0; /* number of private data members */ static int protecteds = 0; /* number of protected methods */ @@ -126,7 +127,7 @@ make_bases(void) } static char * -get_type(Type *t, gboolean postfix_to_stars) +get_type(const Type *t, gboolean postfix_to_stars) { char *s; int i; @@ -139,7 +140,7 @@ get_type(Type *t, gboolean postfix_to_stars) extra = 0; if(postfix_to_stars) { - char *p; + 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 @@ -162,9 +163,9 @@ get_type(Type *t, gboolean postfix_to_stars) } static char * -get_gtk_doc(char *id) +get_gtk_doc(const char *id) { - char *val, *s; + char *val; if(!gtk_doc_hash) return NULL; @@ -173,9 +174,7 @@ get_gtk_doc(char *id) if(val) return g_strdup_printf("/**\n * %s_%s:\n%s **/\n", funcbase, get_real_id(id), val); - s = g_strconcat(funcbase, "_", get_real_id(id), NULL); - val = g_hash_table_lookup(gtk_doc_hash, s); - g_free(s); + val = g_hash_table_lookup(gtk_doc_hash, get_real_id(id)); if(val) return g_strdup_printf("/**\n * %s_%s:\n%s **/\n", funcbase, get_real_id(id), val); @@ -183,7 +182,7 @@ get_gtk_doc(char *id) } static void -print_type(FILE *fp, Type *t, gboolean postfix_to_stars) +print_type(FILE *fp, const Type *t, gboolean postfix_to_stars) { char *s; @@ -194,15 +193,20 @@ print_type(FILE *fp, Type *t, gboolean postfix_to_stars) static void -print_method(FILE *fp, char *typeprefix, char *nameprefix, - char *subnameprefix, - char *namepostfix, char *postfix, Method *m, - gboolean one_arg_per_line, - gboolean no_funcbase, - gboolean kill_underscore) +print_method (FILE *fp, + const char *typeprefix, + const char *nameprefix, + const char *subnameprefix, + const char *namepostfix, + const char *afterargs, + const char *postfix, + const Method *m, + gboolean one_arg_per_line, + gboolean no_funcbase, + gboolean kill_underscore) { GList *li; - char *id; + const char *id; out_printf(fp, "%s", typeprefix); print_type(fp, m->mtype, TRUE); @@ -226,21 +230,21 @@ print_method(FILE *fp, char *typeprefix, char *nameprefix, print_type(fp, arg->atype, FALSE); if(li->next) out_printf(fp, "%s%s,%s", arg->name, - arg->atype->postfix? - arg->atype->postfix:"", - one_arg_per_line?"\n\t\t\t\t\t":" "); + arg->atype->postfix ? + arg->atype->postfix : "", + one_arg_per_line ? "\n\t\t\t\t\t" : " "); else out_printf(fp, "%s%s", arg->name, - arg->atype->postfix? - arg->atype->postfix:""); + arg->atype->postfix ? + arg->atype->postfix : ""); } if(m->vararg) out_printf(fp, ",%s...", - one_arg_per_line?"\n\t\t\t\t\t":" "); + one_arg_per_line ? "\n\t\t\t\t\t" : " "); } else { out_printf(fp, "void"); } - out_printf(fp, ")%s", postfix); + out_printf(fp, "%s)%s", afterargs, postfix); } static gboolean @@ -265,12 +269,13 @@ any_method_to_alias(Class *c) } +/* just the vararg macros, we use the same func pointers for these as in non-gnu */ static void make_method_gnu_aliases(Class *c) { GList *li; - for(li=c->nodes;li;li=g_list_next(li)) { + for(li = c->nodes; li != NULL; li = li->next) { Node *node = li->data; if(node->type == METHOD_NODE) { Method *m = (Method *)node; @@ -284,13 +289,14 @@ make_method_gnu_aliases(Class *c) if(for_cpp && strcmp(m->id, "new")==0) continue; - out_printf(out, "static const typeof(&%s_%s) %s " - "__attribute__ ((__unused__)) " - "= %s_%s;\n", funcbase, get_real_id(m->id), - m->id, funcbase, get_real_id(m->id)); - out_printf(out, "#define %s(args...) " - "%s_%s(##args)\n", m->id, - funcbase, get_real_id(m->id)); + if(m->args != NULL) + out_printf(out, "#define %s(args...) " + "%s_%s(args)\n", m->id, + funcbase, get_real_id(m->id)); + else + out_printf(out, "#define %s() " + "%s_%s()\n", m->id, + funcbase, get_real_id(m->id)); } } } @@ -299,6 +305,8 @@ static void make_method_nongnu_aliases(Class *c) { GList *li; + + gboolean local_made_aliases = FALSE; for(li=c->nodes; li; li=g_list_next(li)) { Node *node = li->data; @@ -314,14 +322,22 @@ make_method_nongnu_aliases(Class *c) if(for_cpp && strcmp(m->id, "new")==0) continue; - print_method(out, "static ", "(* ", "", ") ", "", + if( ! local_made_aliases) + out_printf(out, "\n/* Short form pointers */\n"); + + print_method(out, "static ", "(* const ", "", ") ", + "", "", m, FALSE, TRUE, FALSE); out_printf(out, " = %s_%s;\n", funcbase, get_real_id(m->id)); - made_aliases = TRUE; + local_made_aliases = TRUE; } } + if(local_made_aliases) { + out_printf(out, "\n"); + made_aliases = TRUE; + } } static void @@ -330,11 +346,11 @@ add_bad_hack_to_avoid_unused_warnings(Class *c) GList *li; /* if we haven't had any methods, just return */ - if(!made_aliases) + if( ! made_aliases) return; - if(!no_gnu) - out_printf(out, "\n\n#ifndef __GNUC__\n"); + if( ! no_gnu) + out_printf(out, "\n\n#if (!defined __GNUC__) || (defined __GNUC__ && defined __STRICT_ANSI__)\n"); out_printf(out, "/*REALLY BAD HACK\n" " This is to avoid unused warnings if you don't call\n" @@ -364,7 +380,7 @@ add_bad_hack_to_avoid_unused_warnings(Class *c) out_printf(out, "\t___%s_really_bad_hack_to_avoid_warnings();\n", funcbase); if(!no_gnu) - out_printf(out, "}\n#endif /* __GNUC__ */\n\n"); + out_printf(out, "}\n#endif /* !__GNUC__ || (__GNUC__ && __STRICT_ANSI__) */\n\n"); else out_printf(out, "}\n\n"); } @@ -383,7 +399,7 @@ put_variable(Variable *v, FILE *fp) } static void -put_vs_method(Method *m) +put_vs_method(const Method *m) { if(m->method != SIGNAL_LAST_METHOD && m->method != SIGNAL_FIRST_METHOD && @@ -392,71 +408,77 @@ put_vs_method(Method *m) /* if a signal mark it as such */ if(m->method != VIRTUAL_METHOD) - print_method(outh, "\t/*signal*/", "(* ", "", ") ", ";\n", + print_method(outh, "\t/*signal*/", "(* ", "", ") ", "", ";\n", m, FALSE, TRUE, TRUE); else - print_method(outh, "\t", "(* ", "", ") ", ";\n", + print_method(outh, "\t", "(* ", "", ") ", "", ";\n", m, FALSE, TRUE, TRUE); } static void -put_pub_method(Method *m) +put_pub_method(const Method *m) { if(m->scope != PUBLIC_SCOPE) return; - print_method(outh, "", "\t", "", "\t", ";\n", m, TRUE, FALSE, TRUE); + print_method(outh, "", "\t", "", "\t", "", ";\n", m, TRUE, FALSE, TRUE); } -/* I'm starting not to like this idea */ -#if 0 static void -put_signal_connect(Method *m) +put_signal_macro (const Method *m, gboolean gnu) { + char *id; + if(m->method != SIGNAL_LAST_METHOD && m->method != SIGNAL_FIRST_METHOD) return; - out_printf(outh, "guint \t%s_%s__connect_full\t(%s *object,\n" - "\t\t\t\t\tconst char *name,\n" - "\t\t\t\t\tGtkSignalFunc func,\n" - "\t\t\t\t\tGtkCallbackMarshal marshal,\n" - "\t\t\t\t\tgpointer data,\n" - "\t\t\t\t\tGtkDestroyNotify destroy_func,\n" - "\t\t\t\t\tgboolean object_signal,\n" - "\t\t\t\t\tgboolean after);\n", - funcbase, m->id, typebase); - - out_printf(outh, "#define %s_%s__connect(object,name,func,data) " - "%s_%s__connect_full((object),(name),(func),NULL," - "(data),NULL,FALSE,FALSE)\n", - funcbase, m->id, funcbase, m->id); - out_printf(outh, "#define %s_%s__connect_after(object,name,func,data) " - "%s__connect_%s_full((object),(name),(func),NULL," - "(data),NULL,FALSE,TRUE)\n", - funcbase, m->id, funcbase, m->id); - - out_printf(outh, "guint \t%s_%s__connect_while_alive\t(%s *object,\n" - "\t\t\t\t\tconst char *name,\n" - "\t\t\t\t\tGtkSignalFunc func,\n" - "\t\t\t\t\tgpointer data,\n" - "\t\t\t\t\tGtkObject *alive_object);\n\n", - funcbase, m->id, typebase); + id = g_strdup (m->id); + g_strup (id); + + if ( ! gnu) { + out_printf (outh, "#define %s_SIGNAL_%s(func)\t" + "\"%s\",GTK_SIGNAL_FUNC(func)\n", + macrobase, id, get_real_id (m->id)); + } else { + out_printf (outh, "#define %s_SIGNAL_%s(func)\t" + "\"%s\",GTK_SIGNAL_FUNC(({", + macrobase, id, get_real_id (m->id)); + print_method (outh, "", "(* ___", "", ") ", ", gpointer data ", + " = func; ", m, FALSE, TRUE, TRUE); + out_printf (outh, "___%s; }))\n", get_real_id (m->id)); + + } + g_free (id); +} + +static void +put_signal_macros (const Class *c, gboolean gnu) +{ + const GList *li; + + if (signals < 0) + return; + + for (li = c->nodes; li != NULL; li = li->next) { + const Node *n = li->data; + if (n->type == METHOD_NODE) + put_signal_macro ((Method *)n, gnu); + } } -#endif static void -put_prot_method(Method *m) +put_prot_method(const Method *m) { if(m->scope != PROTECTED_SCOPE) return; if(outph) - print_method(outph, "", "\t", "", "\t", ";\n", + print_method(outph, "", "\t", "", "\t", "", ";\n", m, FALSE, FALSE, TRUE); else - print_method(out, "", "\t", "", "\t", ";\n", + print_method(out, "", "\t", "", "\t", "", ";\n", m, FALSE, FALSE, TRUE); } @@ -468,7 +490,7 @@ put_priv_method_prot(Method *m) m->method == VIRTUAL_METHOD) { if(m->cbuf) print_method(out, - "static ", "___real_", "", " ", ";\n", + "static ", "___real_", "", " ", "", ";\n", m, FALSE, FALSE, TRUE); } /* no else, here, it might still have a private prototype, it's not @@ -478,14 +500,14 @@ put_priv_method_prot(Method *m) m->cbuf)) { /* add unique ID */ char *s = g_strdup_printf("___%x_", (guint)m->unique_id); - print_method(out, "static ", s, "", " ", + print_method(out, "static ", s, "", " ", "", no_gnu?";\n":" G_GNUC_UNUSED;\n", m, FALSE, FALSE, FALSE); g_free(s); } else if(m->scope == PRIVATE_SCOPE || - m->method == INIT_METHOD || - m->method == CLASS_INIT_METHOD) - print_method(out, "static ", "", "", " ", + m->method == INIT_METHOD || + m->method == CLASS_INIT_METHOD) + print_method(out, "static ", "", "", " ", "", no_gnu?";\n":" G_GNUC_UNUSED;\n", m, FALSE, FALSE, TRUE); } @@ -520,11 +542,11 @@ make_inits(Class *cl) Method *m = (Method *)n; if(m->method == INIT_METHOD) { if(got_init) - print_error(FALSE, "init defined more then once", m->line_no); + error_print(GOB_ERROR, m->line_no, "init defined more then once"); got_init = TRUE; } else if(m->method == CLASS_INIT_METHOD) { if(got_class_init) - print_error(FALSE, "class_init defined more then once", m->line_no); + error_print(GOB_ERROR, m->line_no, "class_init defined more then once"); got_class_init = TRUE; } } @@ -564,18 +586,16 @@ find_destroy(Class *cl) if(m->method == OVERRIDE_METHOD && strcmp(m->id, "destroy")==0) { if(strcmp(m->otype, "Gtk:Object") != 0) { - print_error(FALSE, + error_print(GOB_ERROR, m->line_no, "destroy method override " "of class other then " - "Gtk:Object", - m->line_no); + "Gtk:Object"); } if(g_list_length(m->args) != 1) { - print_error(FALSE, + error_print(GOB_ERROR, m->line_no, "destroy method override " "with more then one " - "parameter", - m->line_no); + "parameter"); } destroy_handler = m; break; @@ -596,19 +616,19 @@ find_finalize(Class *cl) Method *m = (Method *)n; if(m->method == OVERRIDE_METHOD && strcmp(m->id, "finalize")==0) { - if(strcmp(m->otype, "Gtk:Object") != 0) { - print_error(FALSE, + if(strcmp(m->otype, "Gtk:Object") != 0 && + strcmp(m->otype, "G:Object") != 0) { + error_print(GOB_ERROR, m->line_no, "finalize method override " "of class other then " - "Gtk:Object", - m->line_no); + "Gtk:Object (or G:Object" + "for GTK+ 2.0)"); } if(g_list_length(m->args) != 1) { - print_error(FALSE, + error_print(GOB_ERROR, m->line_no, "finalize method override " "with more then one " - "parameter", - m->line_no); + "parameter"); } finalize_handler = m; break; @@ -766,7 +786,7 @@ add_enums(Class *c) } out_printf(out, "\tLAST_SIGNAL\n};\n\n"); } - if(arguments>0) { + if(set_arguments > 0 || get_arguments > 0) { out_printf(out, "enum {\n\tARG_0"); for(li=c->nodes;li;li=g_list_next(li)) { Node *n = li->data; @@ -794,37 +814,40 @@ add_get_type(void) { char *chunk_size = ((Class*)class)->chunk_size; - out_printf(out, "guint\n" - "%s_get_type (void)\n" - "{\n" - "\tstatic guint type = 0;\n\n" - "\tif (!type) {\n" - "\t\tstatic const GtkTypeInfo info = {\n" - "\t\t\t\"%s\",\n" - "\t\t\tsizeof (%s),\n" - "\t\t\tsizeof (%sClass),\n" - "\t\t\t(GtkClassInitFunc) %s_class_init,\n" - "\t\t\t(GtkObjectInitFunc) %s_init,\n" - "\t\t\t/* reserved_1 */ NULL,\n" - "\t\t\t/* reserved_2 */ NULL,\n" - "\t\t\t(GtkClassInitFunc) NULL\n" - "\t\t};\n\n" - "\t\ttype = gtk_type_unique (%s_get_type(), &info);\n", - funcbase, typebase, typebase, typebase, - funcbase, funcbase, pfuncbase); + out_printf(out, + "GtkType\n" + "%s_get_type (void)\n" + "{\n" + "\tstatic guint type = 0;\n\n" + "\tif ( ! type) {\n" + "\t\tstatic const GtkTypeInfo info = {\n" + "\t\t\t\"%s\",\n" + "\t\t\tsizeof (%s),\n" + "\t\t\tsizeof (%sClass),\n" + "\t\t\t(GtkClassInitFunc) %s_class_init,\n" + "\t\t\t(GtkObjectInitFunc) %s_init,\n" + "\t\t\t/* reserved_1 */ NULL,\n" + "\t\t\t/* reserved_2 */ NULL,\n" + "\t\t\t(GtkClassInitFunc) NULL\n" + "\t\t};\n\n" + "\t\ttype = gtk_type_unique (%s_get_type(), &info);\n", + funcbase, typebase, typebase, typebase, + funcbase, funcbase, pfuncbase); if(chunk_size) { - out_printf(out, "#if %s > 0\n" - "\t\tgtk_type_set_chunk_alloc(type,%s);\n" - "#endif\n", - chunk_size, chunk_size); - } - out_printf(out,"\t}\n\n" - "\treturn type;\n" - "}\n\n"); + out_printf(out, + "#if %s > 0\n" + "\t\tgtk_type_set_chunk_alloc(type, %s);\n" + "#endif\n", + chunk_size, chunk_size); + } + out_printf(out, + "\t}\n\n" + "\treturn type;\n" + "}\n\n"); } static void -add_overrides(Class *c, char *oname, gboolean did_base_obj) +add_overrides(Class *c, const char *oname, gboolean did_base_obj) { GList *li; GHashTable *done; @@ -898,13 +921,11 @@ make_run_signal_flags(Method *m, gboolean last) break; } /* if we haven't found it in our list */ - if(!flags[i]) { - char *s; - s = g_strdup_printf("Unknown flag '%s' used, " - "perhaps it was misspelled", - flag); - print_error(TRUE, s, m->line_no); - g_free(s); + if( ! flags[i]) { + error_printf(GOB_WARN, m->line_no, + "Unknown flag '%s' used, " + "perhaps it was misspelled", + flag); } g_string_sprintfa(gs, " | GTK_RUN_%s", flag); } @@ -962,26 +983,67 @@ add_signals(Class *c) flags, typebase, get_real_id(m->id), mar, (char *)m->gtktypes->data, - is_none?0:g_list_length(m->gtktypes->next)); + is_none ? 0 : g_list_length(m->gtktypes->next)); g_free(mar); g_free(sig); g_free(flags); - if(!is_none) { + if( ! is_none) { GList *l; - for(l=m->gtktypes->next;l;l=g_list_next(l)) + for(l = m->gtktypes->next; l != NULL; l = l->next) out_printf(out, ",\n\t\t\tGTK_TYPE_%s", (char *)l->data); } out_printf(out, ");\n"); + + if(strcmp(m->gtktypes->data, "NONE") != 0 || + ! is_none) { + GList *gl, *al; + char *sep = ""; + out_printf(out, "\tif("); + if(strcmp(m->gtktypes->data, "NONE") != 0) { + out_printf(out, "%s sizeof(", sep); + print_type(out, m->mtype, FALSE); + out_printf(out, "%s", + m->mtype->postfix ? + m->mtype->postfix : ""); + out_printf(out, ") != sizeof(%s)", + get_cast(m->gtktypes->data, FALSE)); + + sep = " || "; + } + + for(al = m->args->next, gl = m->gtktypes->next; + al != NULL && gl != NULL; + al = al->next, gl = gl->next) { + FuncArg *arg = al->data; + char *gtkarg = gl->data; + + out_printf(out, "%ssizeof(", sep); + print_type(out, arg->atype, FALSE); + out_printf(out, "%s", + arg->atype->postfix ? + arg->atype->postfix : ""); + out_printf(out, ") != sizeof(%s)", + get_cast(gtkarg, FALSE)); + + sep = " || "; + } + out_printf(out, ") {\n" + "\t\tg_error(\"%s line %d: Type mismatch " + "of \\\"%s\\\" signal signature\");\n" + "\t}\n", + filename, m->line_no, get_real_id(m->id)); + + } } out_printf(out, "\tgtk_object_class_add_signals (gtk_object_class,\n" "\t\tobject_signals, LAST_SIGNAL);\n\n"); } static void -set_def_handlers(Class *c, char *oname) +set_def_handlers(Class *c, const char *oname) { GList *li; gboolean set_line = FALSE; @@ -1014,12 +1076,12 @@ set_def_handlers(Class *c, char *oname) if(need_destroy && destroy_handler && - strcmp(m->id, "destroy") == 0) + strcmp(get_real_id(m->id), "destroy") == 0) out_printf(out, "\tgtk_object_class->destroy " "= ___destroy;\n"); else if(need_finalize && finalize_handler && - strcmp(m->id, "finalize") == 0) + strcmp(get_real_id(m->id), "finalize") == 0) out_printf(out, "#ifdef G_OBJECT_CLASS\n" "\tg_object_class->finalize = ___finalize;\n" @@ -1029,19 +1091,19 @@ set_def_handlers(Class *c, char *oname) else if(m->cbuf) out_printf(out, "\t%s_class->%s = ___%x_%s_%s;\n", - s, m->id, (guint)m->unique_id, - funcbase, m->id); + s, get_real_id(m->id), (guint)m->unique_id, + funcbase, get_real_id(m->id)); else out_printf(out, "\t%s_class->%s = NULL;\n", - s, m->id); + s, get_real_id(m->id)); } else { if(m->cbuf) out_printf(out, "\t%s->%s = ___real_%s_%s;\n", - oname, get_real_id(m->id), - funcbase, get_real_id(m->id)); + oname, get_real_id(m->id), + funcbase, get_real_id(m->id)); else out_printf(out, "\t%s->%s = NULL;\n", - oname, get_real_id(m->id)); + oname, get_real_id(m->id)); } } if(set_line) @@ -1078,6 +1140,8 @@ make_arguments(Class *c) flags = g_string_new("GTK_ARG_READABLE"); else flags = g_string_new("GTK_ARG_WRITABLE"); + + g_assert(a->get || a->set); for(l=a->flags;l;l=g_list_next(l)) { char *flag = l->data; @@ -1085,23 +1149,21 @@ make_arguments(Class *c) if(strcmp(flag, "READWRITE")==0 || strcmp(flag, "READABLE")==0 || strcmp(flag, "WRITABLE")==0) { - print_error(TRUE, "READWRITE, READABLE and " + error_print(GOB_WARN, a->line_no, + "READWRITE, READABLE and " "WRITABLE argument flags are " - "set automatically", a->line_no); + "set automatically"); continue; } - for(i=0;argflags[i];i++) { + for(i = 0; argflags[i]; i++) { if(strcmp(argflags[i], flag)==0) break; } /* if we haven't found it in our list */ - if(!argflags[i]) { - char *s; - s = g_strdup_printf("Unknown flag '%s' used, " - "perhaps it was misspelled", - flag); - print_error(TRUE, s, a->line_no); - g_free(s); + if( ! argflags[i]) { + error_printf(GOB_WARN, a->line_no, + "Unknown flag '%s' used, " + "perhaps it was misspelled", flag); } g_string_sprintfa(flags, " | GTK_ARG_%s", flag); } @@ -1117,9 +1179,11 @@ make_arguments(Class *c) g_string_free(flags, TRUE); } - out_printf(out, - "\n\tgtk_object_class->set_arg = ___object_set_arg;\n" - "\tgtk_object_class->get_arg = ___object_get_arg;\n"); + out_printf(out, "\n"); + if(get_arguments > 0) + out_printf(out, "\tgtk_object_class->get_arg = ___object_get_arg;\n"); + if(set_arguments > 0) + out_printf(out, "\tgtk_object_class->set_arg = ___object_set_arg;\n"); } static void @@ -1199,7 +1263,7 @@ add_destroy(Class *c) c->otype); if(destructors > 0) { - out_printf(out, "\t%s *self G_GNUC_UNUSED = %s (obj_self);\n", + out_printf(out, "\t%s *self = %s (obj_self);\n", typebase, macrobase); } @@ -1230,6 +1294,9 @@ add_destroy(Class *c) } } + out_printf(out, "\treturn;\n"); + if(destructors > 0) + out_printf(out, "\tself = NULL;\n"); out_printf(out, "}\n" "#undef __GOB_FUNCTION__\n\n"); } @@ -1254,6 +1321,7 @@ add_finalize(Class *c) if(privates > 0) { out_printf(out, "\t%s *self = %s (obj_self);\n", typebase, macrobase); + out_printf(out, "\tgpointer priv = self->_priv;\n"); } if(finalize_handler) { @@ -1277,8 +1345,7 @@ add_finalize(Class *c) } if(privates > 0) { - out_printf(out, "\tg_free (self->_priv);\n" - "\tself->_priv = NULL;\n"); + out_printf(out, "\tg_free(priv);\n"); } out_printf(out, "}\n" @@ -1292,13 +1359,16 @@ add_inits(Class *c) for(li=c->nodes;li;li=g_list_next(li)) { Node *n = li->data; Method *m; + + gboolean add_unused_class = FALSE; + if(n->type != METHOD_NODE) continue; m = (Method *)n; if(m->method == INIT_METHOD) { if(m->line_no > 0) out_addline_infile(out, m->line_no); - print_method(out, "static ", "\n", "", " ", "\n", + print_method(out, "static ", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); if(m->line_no > 0) out_addline_outfile(out); @@ -1332,7 +1402,7 @@ add_inits(Class *c) if(m->line_no > 0) out_addline_infile(out, m->line_no); - print_method(out, "static ", "\n", "", " ", "\n", + print_method(out, "static ", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); if(m->line_no > 0) out_addline_outfile(out); @@ -1340,18 +1410,20 @@ add_inits(Class *c) "#define __GOB_FUNCTION__ \"%s::class_init\"\n", c->otype); if(signals > 0 || - arguments > 0 || + set_arguments > 0 || + get_arguments > 0 || need_destroy || need_finalize) { + add_unused_class = TRUE; out_printf(out, "\tGtkObjectClass *" - "gtk_object_class G_GNUC_UNUSED = " + "gtk_object_class = " "(GtkObjectClass*) %s;\n", ((FuncArg *)m->args->data)->name); out_printf(out, "#ifdef G_OBJECT_CLASS\n" "\tGObjectClass *" - "g_object_class G_GNUC_UNUSED = " + "g_object_class = " "(GObjectClass*) %s;\n" "#endif /* G_OBJECT_CLASS */\n", ((FuncArg *)m->args->data)->name); @@ -1370,10 +1442,9 @@ add_inits(Class *c) li = li->next) { Node *n = li->data; Variable *v = (Variable *)n; - if(n->type != VARIABLE_NODE || - v->scope != CLASS_SCOPE) - continue; - print_initializer(m, v); + if(n->type == VARIABLE_NODE && + v->scope == CLASS_SCOPE) + print_initializer(m, v); } } @@ -1401,7 +1472,7 @@ add_inits(Class *c) "\tgtk_object_class->finalize = ___finalize;\n" "#endif /* G_OBJECT_CLASS */\n"); - if(arguments > 0) + if(get_arguments > 0 || set_arguments > 0) make_arguments(c); } else @@ -1413,8 +1484,17 @@ add_inits(Class *c) out_printf(out, "%s\n", m->cbuf); out_addline_outfile(out); out_printf(out, " }\n"); - } else { - out_printf(out, "return;\n"); + } + out_printf(out, "\treturn;\n"); + out_printf(out, + "\t%s = NULL;\n", + ((FuncArg *)m->args->data)->name); + if(add_unused_class) { + out_printf(out, + "\tgtk_object_class = NULL;\n" + "#ifdef G_OBJECT_CLASS\n" + "\tg_object_class = NULL;\n" + "#endif /* G_OBJECT_CLASS */\n"); } out_printf(out, "}\n" "#undef __GOB_FUNCTION__\n"); @@ -1466,7 +1546,7 @@ add_getset_arg(Class *c, gboolean is_set) "((%s)GTK_VALUE_%s(*arg))\n", cast, a->gtktype); } else { - out_printf(out, "#ifdef __GNUC__\n"); + out_printf(out, "#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\n"); if(strcmp(a->gtktype, "OBJECT")==0) { out_printf(out, "#define ARG " "({%s foo = " @@ -1480,11 +1560,11 @@ add_getset_arg(Class *c, gboolean is_set) "foo; })\n", cast, a->gtktype); } - out_printf(out, "#else /* __GNUC__ */\n"); + out_printf(out, "#else /* __GNUC__ && !__STRICT_ANSI__ */\n"); out_printf(out, "#define ARG " "((%s)GTK_VALUE_%s(*arg))\n", cast, a->gtktype); - out_printf(out, "#endif /* __GNUC__ */\n\n"); + out_printf(out, "#endif /* __GNUC__ && !__STRICT_ANSI__ */\n\n"); } out_printf(out, "\t\t{\n"); g_free(cast); @@ -1507,7 +1587,8 @@ add_getset_arg(Class *c, gboolean is_set) out_printf(out, "\t\t}\n\t\tbreak;\n" "#undef ARG\n"); } - out_printf(out, "\tdefault:\n\t\tbreak;\n\t}\n}\n" + out_printf(out, "\tdefault:\n\t\tbreak;\n\t}\n" + "\treturn;\n\tself = NULL;\n\targ = NULL;\n}\n" "#undef __GOB_FUNCTION__\n"); } @@ -1677,10 +1758,10 @@ put_method(Method *m) if(m->line_no > 0) out_addline_infile(out, m->line_no); if(m->scope == PRIVATE_SCOPE) - print_method(out, "static ", "\n", "", " ", "\n", + print_method(out, "static ", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); else /* PUBLIC, PROTECTED */ - print_method(out, "", "\n", "", " ", "\n", + print_method(out, "", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); print_method_body(m, TRUE); /* the outfile line was added above */ @@ -1690,10 +1771,10 @@ put_method(Method *m) if(m->line_no > 0) out_addline_infile(out, m->line_no); if(m->scope == PRIVATE_SCOPE) - print_method(out, "static ", "\n", "", " ", "\n", + print_method(out, "static ", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); else /* PUBLIC, PROTECTED */ - print_method(out, "", "\n", "", " ", "\n", + print_method(out, "", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); out_addline_outfile(out); out_printf(out, "{\n"); @@ -1732,7 +1813,7 @@ put_method(Method *m) break; if(m->line_no > 0) out_addline_infile(out, m->line_no); - print_method(out, "static ", "\n___real_", "", " ", "\n", + print_method(out, "static ", "\n___real_", "", " ", "", "\n", m, FALSE, FALSE, TRUE); print_method_body(m, FALSE); /* the outfile line was added above */ @@ -1741,10 +1822,10 @@ put_method(Method *m) if(m->line_no > 0) out_addline_infile(out, m->line_no); if(m->scope==PRIVATE_SCOPE) - print_method(out, "static ", "\n", "", " ", "\n", + print_method(out, "static ", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); else /* PUBLIC, PROTECTED */ - print_method(out, "", "\n", "", " ", "\n", + print_method(out, "", "\n", "", " ", "", "\n", m, FALSE, FALSE, TRUE); out_addline_outfile(out); out_printf(out, "{\n" @@ -1790,7 +1871,7 @@ put_method(Method *m) break; if(m->line_no > 0) out_addline_infile(out, m->line_no); - print_method(out, "static ", "\n___real_", "", " ", "\n", + print_method(out, "static ", "\n___real_", "", " ", "", "\n", m, FALSE, FALSE, TRUE); print_method_body(m, FALSE); /* the outfile line was added above */ @@ -1801,7 +1882,7 @@ put_method(Method *m) if(m->line_no > 0) out_addline_infile(out, m->line_no); s = g_strdup_printf("\n___%x_", (guint)m->unique_id); - print_method(out, "static ", s, "", " ", "\n", + print_method(out, "static ", s, "", " ", "", "\n", m, FALSE, FALSE, FALSE); g_free(s); out_addline_outfile(out); @@ -1812,13 +1893,13 @@ put_method(Method *m) out_printf(out, "#define PARENT_HANDLER(%s) \\\n" "\t{ if(%s_CLASS(parent_class)->%s) \\\n" "\t\t(* %s_CLASS(parent_class)->%s)(%s); }\n", - args, s, m->id, s, m->id, args); + args, s, get_real_id(m->id), s, get_real_id(m->id), args); } else { out_printf(out, "#define PARENT_HANDLER(%s) \\\n" "\t((%s_CLASS(parent_class)->%s)? \\\n" "\t\t(* %s_CLASS(parent_class)->%s)(%s): \\\n" "\t\t(", - args, s, m->id, s, m->id, args); + args, s, get_real_id(m->id), s, get_real_id(m->id), args); out_printf(out, "("); print_type(out, m->mtype, TRUE); out_printf(out, ")%s))\n", @@ -1886,7 +1967,7 @@ put_argument_nongnu_wrappers(Class *c) { GList *li; - if(arguments<0) + if(get_arguments < 0 && set_arguments < 0) return; for(li=c->nodes;li;li=g_list_next(li)) { @@ -1935,7 +2016,7 @@ put_argument_gnu_wrappers(Class *c) { GList *li; - if(arguments<0) + if(get_arguments < 0 && set_arguments < 0) return; for(li=c->nodes;li;li=g_list_next(li)) { @@ -2204,11 +2285,13 @@ print_class_block(Class *c) out_printf(outh, "};\n\n"); out_printf(out, "/* here are local prototypes */\n"); - if(arguments > 0) { + if(set_arguments > 0) { out_printf(out, "static void ___object_set_arg " "(GtkObject *object, GtkArg *arg, " - "guint arg_id);\n" - "static void ___object_get_arg " + "guint arg_id);\n"); + } + if(get_arguments > 0) { + out_printf(out, "static void ___object_get_arg " "(GtkObject *object, GtkArg *arg, " "guint arg_id);\n"); } @@ -2217,7 +2300,13 @@ print_class_block(Class *c) " * Public methods\n" " */\n"); - out_printf(outh, "guint\t%s_get_type\t(void);\n", funcbase); + out_printf(outh, "GtkType\t%s_get_type\t(void)", funcbase); + if ( ! no_gnu) { + out_printf(outh, " G_GNUC_CONST;\n"); + } else { + out_printf(outh, ";\n"); + } + for(l = c->nodes; l != NULL; l = l->next) { Node *n = l->data; if(n->type == METHOD_NODE) { @@ -2227,39 +2316,36 @@ print_class_block(Class *c) } } -/* this idea is less and less apealing to me */ -#if 0 - if(!no_signal_connect) { - if(signals>0) { - out_printf(outh, "\n/*\n" - " * Signal connection methods\n" - " */\n"); - } - - for(l=c->nodes;l;l=g_list_next(l)) { - Node *n = l->data; - if(n->type == METHOD_NODE) - put_signal_connect((Method *)n); + /* this idea is less and less apealing to me */ + if (signals > 0) { + out_printf (outh, "\n/*\n" + " * Signal connection wrapper macros\n" + " */\n"); + if( ! no_gnu) { + out_printf(outh, "#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\n"); + put_signal_macros (c, TRUE); + out_printf(outh, "#else /* __GNUC__ && !__STRICT_ANSI__ */\n"); + put_signal_macros (c, FALSE); + out_printf(outh, "#endif /* __GNUC__ && !__STRICT_ANSI__ */\n\n"); + } else { + put_signal_macros (c, FALSE); } } -#endif - /* argument wrapping macros */ - if(arguments > 0 && ! no_gnu) { + if(get_arguments > 0 || set_arguments > 0) { out_printf(outh, "\n/*\n" " * Argument wrapping macros\n" " */\n"); - out_printf(outh, "#ifdef __GNUC__\n"); - put_argument_gnu_wrappers(c); - out_printf(outh, "#else /* __GNUC__ */\n"); - put_argument_nongnu_wrappers(c); - out_printf(outh, "#endif /* __GNUC__ */\n\n"); - } else if(arguments > 0 && no_gnu) { - out_printf(outh, "\n/*\n" - " * Argument wrapping macros\n" - " */\n"); - put_argument_nongnu_wrappers(c); + if( ! no_gnu) { + out_printf(outh, "#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\n"); + put_argument_gnu_wrappers(c); + out_printf(outh, "#else /* __GNUC__ && !__STRICT_ANSI__ */\n"); + put_argument_nongnu_wrappers(c); + out_printf(outh, "#endif /* __GNUC__ && !__STRICT_ANSI__ */\n\n"); + } else { + put_argument_nongnu_wrappers(c); + } } if(signals > 0) { @@ -2275,15 +2361,13 @@ print_class_block(Class *c) add_get_type(); if(any_method_to_alias(c)) { - if(no_gnu) - make_method_nongnu_aliases(c); - else { - out_printf(out, "\n#ifdef __GNUC__\n"); + if( ! no_gnu) { + out_printf(out, "/* Short form macros */\n"); + out_printf(out, "#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\n"); make_method_gnu_aliases(c); - out_printf(out, "#else /* __GNUC__ */\n"); - make_method_nongnu_aliases(c); - out_printf(out, "#endif /* __GNUC__ */\n\n"); + out_printf(out, "#endif /* __GNUC__ && !__STRICT_ANSI__ */\n"); } + make_method_nongnu_aliases(c); } out_printf(out, "/* a macro for creating a new object of our type */\n"); @@ -2299,8 +2383,11 @@ print_class_block(Class *c) add_inits(c); - if(arguments > 0) { + if(set_arguments > 0) { add_getset_arg(c, TRUE); + } + + if(get_arguments > 0) { add_getset_arg(c, FALSE); } @@ -2337,6 +2424,8 @@ print_file_comments(void) out_printf(out, "/* Generated by GOB (v%s) on %s" " (do not edit directly) */\n\n", VERSION, ctime(&curtime)); + + out_printf(out, "/* End world hunger, donate to the World Food Programme, http://www.wfp.org */\n\n"); } static void @@ -2346,12 +2435,14 @@ print_includes(void) char *p; /* We may need string.h for memset */ - if(destructors > 0) + if(destructors > 0 && + ! g_list_find_custom(include_files, "string.h", (GCompareFunc)strcmp)) { out_printf(out, "#include /* memset() */\n\n"); + } p = g_strconcat(filebase, ".h", NULL); found_header = TRUE; - if(!g_list_find_custom(include_files, p, (GCompareFunc)strcmp)) { + if( ! g_list_find_custom(include_files, p, (GCompareFunc)strcmp)) { out_printf(out, "#include \"%s.h\"\n\n", filebase); found_header = FALSE; } @@ -2360,11 +2451,12 @@ print_includes(void) /* if we are creating a private header see if it was included */ if(outph) { p = g_strconcat(filebase, "-private.h", NULL); - if(!g_list_find_custom(include_files, p, (GCompareFunc)strcmp)) { + if( ! g_list_find_custom(include_files, p, + (GCompareFunc)strcmp)) { out_printf(out, "#include \"%s-private.h\"\n\n", filebase); if(found_header) - print_error(TRUE, + error_printf(GOB_WARN, 0, "Implicit private header include " "added to top of\n" "\tsource file, while public " @@ -2372,7 +2464,7 @@ print_includes(void) "you should\n" "\texplicitly include " "the private header below the " - "public one.", 0); + "public one."); } g_free(p); } @@ -2392,7 +2484,7 @@ print_header_prefixes(void) "#include \"%s.h\"\n\n", p, p, filebase); g_free(p); - if(!no_extern_c) { + if( ! no_extern_c) { out_printf(outh, "#ifdef __cplusplus\n" "extern \"C\" {\n" "#endif /* __cplusplus */\n\n"); @@ -2406,13 +2498,13 @@ print_header_prefixes(void) static void print_header_postfixes(void) { - if(!no_extern_c) + if( ! no_extern_c) out_printf(outh, "\n#ifdef __cplusplus\n" "}\n" "#endif /* __cplusplus */\n"); out_printf(outh, "\n#endif\n"); if(outph) { - if(!no_extern_c) + if( ! no_extern_c) out_printf(outph, "\n#ifdef __cplusplus\n" "}\n" "#endif /* __cplusplus */\n"); @@ -2426,11 +2518,11 @@ print_all_top(void) GList *li; /* print the AT_CCODE blocks */ - for(li=nodes;li;li=g_list_next(li)) { + for(li = nodes; li != NULL; li = li->next) { Node *node = li->data; if(node->type == CCODE_NODE) { CCode *cc = (CCode *)node; - if(cc->cctype==AT_CCODE) + if(cc->cctype == AT_CCODE) print_ccode_block((CCode *)node); } } @@ -2449,7 +2541,7 @@ print_header_top(void) Node *node = li->data; if(node->type == CCODE_NODE) { CCode *cc = (CCode *)node; - if(cc->cctype==HT_CCODE) + if(cc->cctype == HT_CCODE) print_ccode_block((CCode *)node); } } @@ -2476,7 +2568,8 @@ generate_outfiles(void) Node *node = li->data; if(node->type == CCODE_NODE) { CCode *cc = (CCode *)node; - if(cc->cctype!=HT_CCODE) + if(cc->cctype != HT_CCODE && + cc->cctype != AT_CCODE) print_ccode_block((CCode *)node); } else if(node->type == CLASS_NODE) { print_class_block((Class *)node); @@ -2535,8 +2628,9 @@ parse_options(int argc, char *argv[]) filename = NULL; - for(i=1;i /dev/null", hf, hfnew); - if(system(s)==0) { - if(unlink(hfnew)!=0) - print_error(FALSE, - "Can't remove new header file", 0); + if(system(s) == 0) { + if(unlink(hfnew) != 0) + error_printf(GOB_ERROR, 0, + "Can't remove new header file"); g_free(hfnew); g_free(hf); g_free(s); return; } g_free(s); - if(unlink(hf)!=0) - print_error(FALSE, "Can't remove old header file", 0); + if(unlink(hf) != 0) + error_printf(GOB_ERROR, 0, + "Can't remove old header file"); } - if(rename(hfnew, hf)!=0) - print_error(FALSE, "Can't rename new header file", 0); + if(rename(hfnew, hf) != 0) + error_printf(GOB_ERROR, 0, + "Can't rename new header file"); g_free(hfnew); g_free(hf); } @@ -2658,17 +2754,20 @@ main(int argc, char *argv[]) } else filename = "stdin"; + /* This is where parsing is done */ /*yydebug = 1;*/ - if(yyparse()!=0) + if(yyparse() != 0) g_error("Parsing errors, quitting"); - if(!class) - print_error(FALSE, " no class defined", 0); + + if( ! class) + error_print(GOB_ERROR, 0, " no class defined"); exit_on_error = FALSE; signals = count_signals((Class *)class); - arguments = count_arguments((Class *)class); + set_arguments = count_set_arguments((Class *)class); + get_arguments = count_get_arguments((Class *)class); overrides = count_overrides((Class *)class); privates = count_privates((Class *)class); protecteds = count_protecteds((Class *)class); @@ -2717,7 +2816,8 @@ main(int argc, char *argv[]) fclose(outph); } - if(no_touch_headers && !no_write) + if(no_touch_headers && + ! no_write) compare_and_move_header(); return 0;