]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 1.0.5
[gob-dx.git] / src / main.c
index e145d643c73114aab8ad778355f358e21a4c0e7e..bf205ac9d2f16c7062b2742eb2041e94a234ea03 100644 (file)
@@ -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