X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/853c670e4b839fd435507201f04d16080590a894..c9d96fcfcf9b74099775a3a260eccdfdc31474c7:/src/main.c diff --git a/src/main.c b/src/main.c index e145d64..bf205ac 100644 --- a/src/main.c +++ b/src/main.c @@ -127,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; @@ -140,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 @@ -163,7 +163,7 @@ get_type(Type *t, gboolean postfix_to_stars) } static char * -get_gtk_doc(char *id) +get_gtk_doc(const char *id) { char *val; @@ -182,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; @@ -193,15 +193,15 @@ 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, +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) { GList *li; - char *id; + const char *id; out_printf(fp, "%s", typeprefix); print_type(fp, m->mtype, TRUE); @@ -225,17 +225,17 @@ 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"); } @@ -264,12 +264,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; @@ -283,13 +284,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)); } } } @@ -298,6 +300,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; @@ -313,14 +317,21 @@ 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 @@ -329,10 +340,10 @@ 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) + if( ! no_gnu) out_printf(out, "\n\n#if (!defined __GNUC__) || (defined __GNUC__ && defined __STRICT_ANSI__)\n"); out_printf(out, "/*REALLY BAD HACK\n" @@ -382,7 +393,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 && @@ -399,7 +410,7 @@ put_vs_method(Method *m) } static void -put_pub_method(Method *m) +put_pub_method(const Method *m) { if(m->scope != PUBLIC_SCOPE) return; @@ -446,7 +457,7 @@ put_signal_connect(Method *m) static void -put_prot_method(Method *m) +put_prot_method(const Method *m) { if(m->scope != PROTECTED_SCOPE) return; @@ -791,37 +802,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; @@ -1017,7 +1031,7 @@ add_signals(Class *c) } static void -set_def_handlers(Class *c, char *oname) +set_def_handlers(Class *c, const char *oname) { GList *li; gboolean set_line = FALSE; @@ -1073,11 +1087,11 @@ set_def_handlers(Class *c, char *oname) } 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) @@ -2274,7 +2288,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) { @@ -2334,15 +2354,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#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\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__ && !__STRICT_ANSI__ */\n"); - make_method_nongnu_aliases(c); - out_printf(out, "#endif /* __GNUC__ && !__STRICT_ANSI__ */\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"); @@ -2399,6 +2417,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