]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 1.0.6
[gob-dx.git] / src / main.c
index bf205ac9d2f16c7062b2742eb2041e94a234ea03..6b233d780ecb1de7b818f640c89b0aabb2df71c9 100644 (file)
@@ -193,12 +193,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 +244,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 +291,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 +325,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 +408,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 +421,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 +475,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 +490,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 +500,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);
 }
@@ -1356,7 +1368,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 +1402,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 +1758,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 +1771,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 +1813,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 +1822,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 +1871,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 +1882,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 +2316,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);
                }
        }