X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/072bb12e618b26cce359784aa56f9a2b70e1ce52..486240dc4c5d57b0afaddba60d87fe375112bed5:/src/main.c diff --git a/src/main.c b/src/main.c index 31cd849..691d5df 100644 --- a/src/main.c +++ b/src/main.c @@ -98,6 +98,7 @@ gboolean no_write = FALSE; gboolean no_lines = FALSE; gboolean no_self_alias = FALSE; gboolean no_kill_underscores = FALSE; +gboolean always_private_struct = FALSE; int method_unique_id = 1; @@ -147,10 +148,14 @@ get_type(Type *t, gboolean postfix_to_stars) if(*p == '[') extra++; } g_string_append_c(gs, ' '); - - for(i=0; i<(t->stars+extra); i++) - g_string_append_c(gs, '*'); + if(t->pointer) { + 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; @@ -497,7 +502,7 @@ make_func_arg(char *typename, int is_class, char *name) else tn = g_strdup(typename); - type = new_type(1, tn, NULL); + type = new_type(tn, g_strdup("*"), NULL); node = new_funcarg((Type *)type, name, NULL); return g_list_prepend(NULL, node); } @@ -526,7 +531,8 @@ make_inits(Class *cl) } if(!got_class_init) { node = new_method(NO_SCOPE, CLASS_INIT_METHOD, - (Type *)new_type(0, g_strdup("void"), NULL), + (Type *)new_type(g_strdup("void"), + NULL, NULL), NULL, NULL, NULL, g_strdup("class_init"), make_func_arg(cl->otype, TRUE, g_strdup("c")), NULL, NULL, NULL, 0, 0, FALSE, @@ -535,7 +541,8 @@ make_inits(Class *cl) } if(!got_init) { node = new_method(NO_SCOPE, INIT_METHOD, - (Type *)new_type(0, g_strdup("void"), NULL), + (Type *)new_type(g_strdup("void"), + NULL, NULL), NULL, NULL, NULL, g_strdup("init"), make_func_arg(cl->otype, FALSE, g_strdup("o")), NULL, NULL, NULL, 0, 0, FALSE, @@ -548,7 +555,6 @@ static void find_destroy(Class *cl) { GList *li; - Node *node; destroy_handler = NULL; for(li=cl->nodes;li;li=g_list_next(li)) { @@ -582,7 +588,6 @@ static void find_finalize(Class *cl) { GList *li; - Node *node; finalize_handler = NULL; for(li=cl->nodes;li;li=g_list_next(li)) { @@ -787,6 +792,8 @@ add_enums(Class *c) static void add_get_type(void) { + char *chunk_size = ((Class*)class)->chunk_size; + out_printf(out, "guint\n" "%s_get_type (void)\n" "{\n" @@ -802,12 +809,18 @@ add_get_type(void) "\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" - "\t}\n\n" - "\treturn type;\n" - "}\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"); } static void @@ -975,7 +988,6 @@ set_def_handlers(Class *c, char *oname) for(li = c->nodes; li; li = g_list_next(li)) { Node *n = li->data; Method *m = (Method *)n; - char *id; if(n->type != METHOD_NODE || (m->method != SIGNAL_FIRST_METHOD && @@ -1255,12 +1267,17 @@ add_inits(Class *c) m, FALSE, FALSE, TRUE); if(m->line_no > 0) out_addline_outfile(out); - out_printf(out, "{\n"); + out_printf(out, "{\n" + "#define __GOB_FUNCTION__ \"%s::init\"\n", + c->otype); if(privates > 0) { out_printf(out, "\t%s->_priv = " "g_new0 (%sPrivate, 1);\n", ((FuncArg *)m->args->data)->name, typebase); + } else if(always_private_struct) { + out_printf(out, "\t%s->_priv = NULL;\n", + ((FuncArg *)m->args->data)->name); } if(initializers > 0) { GList *li; @@ -1284,7 +1301,9 @@ add_inits(Class *c) m, FALSE, FALSE, TRUE); if(m->line_no > 0) out_addline_outfile(out); - out_printf(out, "{\n"); + out_printf(out, "{\n" + "#define __GOB_FUNCTION__ \"%s::class_init\"\n", + c->otype); if(signals > 0 || arguments > 0 || need_destroy || @@ -1351,7 +1370,8 @@ add_inits(Class *c) } else { out_printf(out, "return;\n"); } - out_printf(out, "}\n"); + out_printf(out, "}\n" + "#undef __GOB_FUNCTION__\n"); } } @@ -1363,11 +1383,14 @@ add_getset_arg(Class *c, gboolean is_set) "___object_%s_arg (GtkObject *object,\n" "\tGtkArg *arg,\n" "\tguint arg_id)\n" + "#define __GOB_FUNCTION__ \"%s::%s_arg\"\n" "{\n" "\t%s *self;\n\n" "\tself = %s (object);\n\n" "\tswitch (arg_id) {\n", - is_set?"set":"get", typebase, macrobase); + is_set ? "set" : "get", + c->otype, is_set ? "set" : "get", + typebase, macrobase); for(li=c->nodes;li;li=g_list_next(li)) { Node *n = li->data; @@ -1438,7 +1461,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}\n" + "#undef __GOB_FUNCTION__\n"); } static void @@ -1448,9 +1472,9 @@ print_checks(Method *m, FuncArg *fa) gboolean is_void; gboolean checked_null = FALSE; is_void = (strcmp(m->mtype->name, "void")==0 && - m->mtype->stars == 0); + m->mtype->pointer == NULL); - for(li=fa->checks;li;li=g_list_next(li)) { + for(li = fa->checks; li; li = g_list_next(li)) { Check *ch = li->data; char *s; /* point to the method prot in .gob for failed checks */ @@ -1522,7 +1546,10 @@ print_preconditions(Method *m) static void print_method_body(Method *m, int pre) { - out_printf(out, "{\n"); + out_printf(out, "{\n" + "#define __GOB_FUNCTION__ \"%s::%s\"\n", + ((Class *)class)->otype, + get_real_id(m->id)); if(pre) print_preconditions(m); @@ -1538,10 +1565,14 @@ print_method_body(Method *m, int pre) out_printf(out, "\t%s}", m->cbuf); } + /* Note, there is no \n between the last } and this } so that + * errors/warnings reported on the end of the body get pointed to the + * right line in the .gob source */ out_printf(out, "}\n"); if(m->cbuf) out_addline_outfile(out); + out_printf(out, "#undef __GOB_FUNCTION__\n"); } static void @@ -1586,7 +1617,7 @@ put_method(Method *m) char *s, *args, *doc; gboolean is_void; is_void = (strcmp(m->mtype->name, "void")==0 && - m->mtype->stars == 0); + m->mtype->pointer == NULL); out_printf(out, "\n"); if(m->method != OVERRIDE_METHOD) { doc = get_gtk_doc(m->id); @@ -1622,8 +1653,8 @@ put_method(Method *m) out_printf(out, "{\n"); s = g_strdup(get_real_id(m->id)); g_strup(s); - if(strcmp(m->mtype->name, "void")==0 && - m->mtype->stars==0) { + if(strcmp(m->mtype->name, "void") == 0 && + m->mtype->pointer == NULL) { print_preconditions(m); if(((FuncArg *)m->args->data)->name) out_printf(out, "\tgtk_signal_emit (GTK_OBJECT (%s),\n" @@ -1677,8 +1708,8 @@ put_method(Method *m) "\tif(klass->%s)\n", macrobase, ((FuncArg *)m->args->data)->name, get_real_id(m->id)); - if(strcmp(m->mtype->name, "void")==0 && - m->mtype->stars==0) { + if(strcmp(m->mtype->name, "void") == 0 && + m->mtype->pointer == NULL) { GList *li; out_printf(out, "\t\t(*klass->%s)(%s", get_real_id(m->id), @@ -1990,7 +2021,7 @@ print_class_block(Class *c) "GTK_CHECK_TYPE((obj),%s_get_type ())\n\n", macrois, funcbase); - if(!no_self_alias) { + if( ! no_self_alias) { out_printf(out, "/* self casting macros */\n"); out_printf(out, "#define SELF(x) %s(x)\n", macrobase); out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois); @@ -2002,10 +2033,13 @@ print_class_block(Class *c) out_printf(out, "typedef %sClass SelfClass;\n\n", typebase); } - if(privates > 0) { + if(privates > 0 || always_private_struct) { out_printf(outh, "\n/* Private structure type */\n"); out_printf(outh, "typedef struct _%sPrivate %sPrivate;\n", typebase, typebase); + if(privates == 0) + out_printf(outh, "/* There are no privates, this " + "structure is thus never defined */\n"); } out_printf(outh, "\n/*\n" @@ -2020,13 +2054,13 @@ print_class_block(Class *c) "#endif\n", typebase, typebase); out_printf(outh, "struct _%s {\n\t%s __parent__;\n", typebase, ptypebase); - for(l=c->nodes;l;l=g_list_next(l)) { + for(l=c->nodes; l; l=g_list_next(l)) { static gboolean printed_public = FALSE; Node *n = l->data; Variable *v = (Variable *)n; if(n->type == VARIABLE_NODE && v->scope == PUBLIC_SCOPE) { - if(!printed_public) { + if( ! printed_public) { out_printf(outh, "\t/*< public >*/\n"); printed_public = TRUE; } @@ -2034,20 +2068,20 @@ print_class_block(Class *c) } } /* put protecteds always AFTER publics */ - for(l=c->nodes;l;l=g_list_next(l)) { + for(l=c->nodes; l; l=g_list_next(l)) { Node *n = l->data; Variable *v = (Variable *)n; if(n->type == VARIABLE_NODE && v->scope == PROTECTED_SCOPE) { - if(!printed_private) { + if( ! printed_private) { out_printf(outh, "\t/*< private >*/\n"); printed_private = TRUE; } put_variable((Variable *)n, outh); } } - if(privates>0) { - if(!printed_private) + if(privates > 0 || always_private_struct) { + if( ! printed_private) out_printf(outh, "\t/*< private >*/\n"); out_printf(outh, "\t%sPrivate *_priv;\n", typebase); } @@ -2066,7 +2100,7 @@ print_class_block(Class *c) out_printf(outfp, "struct _%sPrivate {\n", typebase); - for(l=c->nodes;l;l=l->next) { + for(l=c->nodes; l; l=l->next) { Node *n = l->data; Variable *v = (Variable *)n; if(n->type == VARIABLE_NODE && @@ -2390,6 +2424,7 @@ static void print_help(void) { fprintf(stderr, "Gob version %s\n\n", VERSION); + fprintf(stderr, "gob [options] file.gob\n\n"); fprintf(stderr, "Options:\n" "\t--help,-h,-? Display this help\n" "\t--version Display version\n" @@ -2411,13 +2446,17 @@ print_help(void) "put private\n" "\t structure and protected " "prototypes inside c file\n" + "\t--always-private-struct Always create a private pointer " + "in\n" + "\t the object structure\n" "\t--no-write,-n Don't write output files, just " "check syntax\n" "\t--no-lines Don't print '#line' to output\n" "\t--no-self-alias Don't create self type and macro " "aliases\n" "\t--no-kill-underscores Don't remove the leading underscore " - "from short id names"); + "from\n" + "\t short id names\n"); } static void @@ -2471,6 +2510,8 @@ parse_options(int argc, char *argv[]) no_self_alias = TRUE; } else if(strcmp(argv[i], "--no-kill-underscores")==0) { no_kill_underscores = TRUE; + } else if(strcmp(argv[i], "--always-private-struct")==0) { + always_private_struct = TRUE; } else if(strcmp(argv[i], "--")==0) { /*further arguments are files*/ no_opts = TRUE; @@ -2587,6 +2628,7 @@ main(int argc, char *argv[]) check_nonvoidempty((Class *)class); check_signal_args((Class *)class); check_argument_types((Class *)class); + check_func_arg_checks((Class *)class); exit_on_error = TRUE;