]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 1.0.2
[gob-dx.git] / src / main.c
index 31cd849ed0f5a388d0a89bd879a69ad98738cc3f..691d5df6a54a802cebd31a49452b64a55fea1652 100644 (file)
@@ -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;