X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/c9d96fcfcf9b74099775a3a260eccdfdc31474c7..refs/tags/v1.0.7:/src/main.c diff --git a/src/main.c b/src/main.c index bf205ac..d94361a 100644 --- a/src/main.c +++ b/src/main.c @@ -67,6 +67,7 @@ static int privates = 0; /* number of private data members */ static int protecteds = 0; /* number of protected methods */ static int destructors = 0; /* number of variable destructors */ static int initializers = 0; /* number of variable initializers */ +static gboolean overrode_get_type = FALSE; /* provided your won _get_type */ static gboolean made_aliases = FALSE; /* if we made any shorthand aliases and need the REALLY UGLY HACK to @@ -193,12 +194,17 @@ print_type(FILE *fp, const Type *t, gboolean postfix_to_stars) static void -print_method(FILE *fp, const char *typeprefix, const char *nameprefix, - const char *subnameprefix, - const char *namepostfix, const char *postfix, const 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; const char *id; @@ -239,7 +245,7 @@ print_method(FILE *fp, const char *typeprefix, const char *nameprefix, } else { out_printf(fp, "void"); } - out_printf(fp, ")%s", postfix); + out_printf(fp, "%s)%s", afterargs, postfix); } static gboolean @@ -286,7 +292,7 @@ make_method_gnu_aliases(Class *c) if(m->args != NULL) out_printf(out, "#define %s(args...) " - "%s_%s(##args)\n", m->id, + "%s_%s(args)\n", m->id, funcbase, get_real_id(m->id)); else out_printf(out, "#define %s() " @@ -320,7 +326,8 @@ make_method_nongnu_aliases(Class *c) if( ! local_made_aliases) out_printf(out, "\n/* Short form pointers */\n"); - print_method(out, "static ", "(* const ", "", ") ", "", + print_method(out, "static ", "(* const ", "", ") ", + "", "", m, FALSE, TRUE, FALSE); out_printf(out, " = %s_%s;\n", funcbase, get_real_id(m->id)); @@ -402,10 +409,10 @@ put_vs_method(const 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); } @@ -415,45 +422,51 @@ 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 @@ -463,10 +476,10 @@ put_prot_method(const Method *m) 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); } @@ -478,7 +491,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 @@ -488,14 +501,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 ", "", "", " ", + print_method(out, "static ", "", "", " ", "", no_gnu?";\n":" G_GNUC_UNUSED;\n", m, FALSE, FALSE, TRUE); } @@ -806,8 +819,8 @@ add_get_type(void) "GtkType\n" "%s_get_type (void)\n" "{\n" - "\tstatic guint type = 0;\n\n" - "\tif ( ! type) {\n" + "\tstatic GtkType type = 0;\n\n" + "\tif (type == 0) {\n" "\t\tstatic const GtkTypeInfo info = {\n" "\t\t\t\"%s\",\n" "\t\t\tsizeof (%s),\n" @@ -1356,7 +1369,7 @@ add_inits(Class *c) 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); @@ -1390,7 +1403,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); @@ -1746,10 +1759,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 */ @@ -1759,10 +1772,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"); @@ -1801,7 +1814,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 */ @@ -1810,10 +1823,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" @@ -1859,7 +1872,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 */ @@ -1870,7 +1883,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); @@ -2304,39 +2317,34 @@ 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(get_arguments > 0 || set_arguments > 0) { + out_printf(outh, "\n/*\n" + " * Argument wrapping macros\n" + " */\n"); if( ! no_gnu) { - out_printf(outh, "\n/*\n" - " * Argument wrapping macros\n" - " */\n"); 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 { - out_printf(outh, "\n/*\n" - " * Argument wrapping macros\n" - " */\n"); put_argument_nongnu_wrappers(c); } } @@ -2351,7 +2359,8 @@ print_class_block(Class *c) add_enums(c); - add_get_type(); + if ( ! overrode_get_type) + add_get_type(); if(any_method_to_alias(c)) { if( ! no_gnu) { @@ -2766,6 +2775,7 @@ main(int argc, char *argv[]) protecteds = count_protecteds((Class *)class); destructors = count_destructors((Class *)class); initializers = count_initializers((Class *)class); + overrode_get_type = find_get_type((Class *)class); make_bases(); make_inits((Class *)class);