]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 2.0.10
[gob-dx.git] / src / main.c
index dfd87d0a60b7e3d365e382860171af3a56996e66..39bc2165c24ca715904fe9e2378bba815292c59b 100644 (file)
@@ -66,6 +66,8 @@ static char *ptypebase;
 
 char *output_dir = NULL;
 
+static char file_sep = '-';
+
 static int signals = 0; /* number of signals */
 static int set_properties = 0; /* number of named (set) properties */
 static int get_properties = 0; /* number of named (get) properties */
@@ -122,7 +124,7 @@ int method_unique_id = 1;
 static void
 make_bases (void)
 {
-       filebase = replace_sep (((Class *)class)->otype, '-');
+       filebase = replace_sep (((Class *)class)->otype, file_sep);
        gob_strdown (filebase);
 
        if (output_dir != NULL &&
@@ -1584,367 +1586,397 @@ make_argument (Argument *a)
 static void
 make_property (Property *p)
 {
-       GString *flags;
-       GList *l;
        char *s;
-       char *argflags[] = {
-               "CONSTRUCT",
-               "CONSTRUCT_ONLY",
-               "CHILD_ARG",
-               "MASK",
-               NULL
-       };
-
-       flags = g_string_new ("(GParamFlags)(");
-
-       if (p->get != NULL && p->set != NULL)
-               g_string_append (flags, "G_PARAM_READABLE | G_PARAM_WRITABLE");
-       else if (p->get != NULL)
-               g_string_append (flags, "G_PARAM_READABLE");
-       else
-               g_string_append (flags, "G_PARAM_WRITABLE");
 
        if (p->get == NULL && p->set == NULL) {
                error_print (GOB_ERROR, p->line_no,
                             "Property has no getter nor setter");
        }
 
-       for (l = p->flags; l != NULL; l = l->next) {
-               char *flag = l->data;
-               int i;
-               if(strcmp (flag, "READABLE") == 0 ||
-                  strcmp (flag, "WRITABLE") == 0) {
-                       error_print(GOB_WARN, p->line_no,
-                                   "READABLE and "
-                                   "WRITABLE argument flags are "
-                                   "set automatically");
-                       continue;
-               }
-               for(i = 0; argflags[i]; i++) {
-                       if(strcmp(argflags[i], flag)==0)
-                               break;
+       if (p->override) {
+               if (p->flags != NULL)
+                       error_print (GOB_WARN, p->line_no,
+                                    "Overriden property, flags ignored");
+               if (p->nick != NULL)
+                       error_print (GOB_WARN, p->line_no,
+                                    "Overriden property, nick ignored");
+               if (p->blurb != NULL)
+                       error_print (GOB_WARN, p->line_no,
+                                    "Overriden property, blurb ignored");
+               if (p->minimum != NULL)
+                       error_print (GOB_WARN, p->line_no,
+                                    "Overriden property, minimum ignored");
+               if (p->maximum != NULL)
+                       error_print (GOB_WARN, p->line_no,
+                                    "Overriden property, maximum ignored");
+               if (p->default_value != NULL)
+                       error_print (GOB_WARN, p->line_no,
+                                    "Overriden property, default_value ignored");
+
+               s = g_strdup (p->name);
+               gob_strup (s);
+               out_printf (out, "\tg_object_class_override_property (g_object_class,\n"
+                           "\t\tPROP_%s,\n"
+                           "\t\t\"%s\");\n", s, p->name);
+               g_free (s);
+       } else {
+               GString *flags;
+               GList *l;
+               char *argflags[] = {
+                       "CONSTRUCT",
+                       "CONSTRUCT_ONLY",
+                       "CHILD_ARG",
+                       "MASK",
+                       NULL
+               };
+
+               flags = g_string_new ("(GParamFlags)(");
+
+               if (p->get != NULL && p->set != NULL)
+                       g_string_append (flags, "G_PARAM_READABLE | G_PARAM_WRITABLE");
+               else if (p->get != NULL)
+                       g_string_append (flags, "G_PARAM_READABLE");
+               else
+                       g_string_append (flags, "G_PARAM_WRITABLE");
+
+
+               for (l = p->flags; l != NULL; l = l->next) {
+                       char *flag = l->data;
+                       int i;
+                       if(strcmp (flag, "READABLE") == 0 ||
+                          strcmp (flag, "WRITABLE") == 0) {
+                               error_print(GOB_WARN, p->line_no,
+                                           "READABLE and "
+                                           "WRITABLE argument flags are "
+                                           "set automatically");
+                               continue;
+                       }
+                       for(i = 0; argflags[i]; i++) {
+                               if(strcmp(argflags[i], flag)==0)
+                                       break;
+                       }
+                       /* if we haven't found it in our list */
+                       if( ! argflags[i]) {
+                               error_printf(GOB_WARN, p->line_no,
+                                            "Unknown flag '%s' used, "
+                                            "perhaps it was misspelled", flag);
+                       }
+                       g_string_sprintfa(flags, " | G_PARAM_%s", flag);
                }
-               /* if we haven't found it in our list */
-               if( ! argflags[i]) {
-                       error_printf(GOB_WARN, p->line_no,
-                                    "Unknown flag '%s' used, "
-                                    "perhaps it was misspelled", flag);
+
+               g_string_append (flags, ")");
+
+               if (strcmp (p->gtktype, "CHAR") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_char\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "-128"),
+                                   value_for_print (p->maximum, "127"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "UCHAR") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_uchar\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "0"),
+                                   value_for_print (p->maximum, "0xFF"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "BOOLEAN") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_boolean\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->default_value, "FALSE"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "INT") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_int\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "G_MININT"),
+                                   value_for_print (p->maximum, "G_MAXINT"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "UINT") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_uint\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "0"),
+                                   value_for_print (p->maximum, "G_MAXUINT"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "LONG") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_long\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "G_MINLONG"),
+                                   value_for_print (p->maximum, "G_MAXLONG"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "ULONG") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_ulong\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "0"),
+                                   value_for_print (p->maximum, "G_MAXULONG"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "INT64") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_int64\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "G_MININT64"),
+                                   value_for_print (p->maximum, "G_MAXINT64"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "UINT64") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_uint64\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "0"),
+                                   value_for_print (p->maximum, "G_MAXUINT64"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "UNICHAR") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_unichar\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "ENUM") == 0) {
+                       char *type = make_me_type (p->extra_gtktype,
+                                                  "G_TYPE_ENUM");
+                       out_printf (out, "\tparam_spec = g_param_spec_enum\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* enum_type */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   type,
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+                       g_free (type);
+               } else if (strcmp (p->gtktype, "FLAGS") == 0) {
+                       char *type = make_me_type (p->extra_gtktype,
+                                                  "G_TYPE_FLAGS");
+                       out_printf (out, "\tparam_spec = g_param_spec_flags\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* flags_type */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   type,
+                                   value_for_print (p->default_value, "0"),
+                                   flags->str);
+                       g_free (type);
+               } else if (strcmp (p->gtktype, "FLOAT") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_float\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "G_MINFLOAT"),
+                                   value_for_print (p->maximum, "G_MAXFLOAT"),
+                                   value_for_print (p->default_value, "0.0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "DOUBLE") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_double\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* minimum */,\n"
+                                   "\t\t %s /* maximum */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->minimum, "G_MINDOUBLE"),
+                                   value_for_print (p->maximum, "G_MAXDOUBLE"),
+                                   value_for_print (p->default_value, "0.0"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "STRING") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_string\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* default_value */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   value_for_print (p->default_value, "NULL"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "PARAM") == 0) {
+                       char *type = make_me_type (p->extra_gtktype,
+                                                  "G_TYPE_PARAM");
+                       out_printf (out, "\tparam_spec = g_param_spec_param\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* param_type */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   type,
+                                   flags->str);
+                       g_free (type);
+               } else if (strcmp (p->gtktype, "BOXED") == 0) {
+                       char *type = make_me_type (p->extra_gtktype,
+                                                  "G_TYPE_BOXED");
+                       out_printf (out, "\tparam_spec = g_param_spec_boxed\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* boxed_type */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   type,
+                                   flags->str);
+                       g_free (type);
+               } else if (strcmp (p->gtktype, "POINTER") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_pointer\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   flags->str);
+               /* FIXME: VALUE_ARRAY */
+               } else if (strcmp (p->gtktype, "CLOSURE") == 0) {
+                       out_printf (out, "\tparam_spec = g_param_spec_pointer\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   flags->str);
+               } else if (strcmp (p->gtktype, "OBJECT") == 0) {
+                       char *type = make_me_type (p->extra_gtktype,
+                                                  "G_TYPE_BOXED");
+                       out_printf (out, "\tparam_spec = g_param_spec_object\n"
+                                   "\t\t(\"%s\" /* name */,\n"
+                                   "\t\t %s /* nick */,\n"
+                                   "\t\t %s /* blurb */,\n"
+                                   "\t\t %s /* object_type */,\n"
+                                   "\t\t %s);\n",
+                                   p->name,
+                                   value_for_print (p->nick, "NULL"),
+                                   value_for_print (p->blurb, "NULL"),
+                                   type,
+                                   flags->str);
+                       g_free (type);
+               } else {
+                       error_printf (GOB_ERROR, p->line_no,
+                                     "%s type is not supported by properties",
+                                     p->gtktype);
                }
-               g_string_sprintfa(flags, " | G_PARAM_%s", flag);
-       }
 
-       g_string_append (flags, ")");
+               s = g_strdup (p->name);
+               gob_strup (s);
+               out_printf (out, "\tg_object_class_install_property (g_object_class,\n"
+                           "\t\tPROP_%s,\n"
+                           "\t\tparam_spec);\n", s);
+               g_free (s);
 
-       if (strcmp (p->gtktype, "CHAR") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_char\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "-128"),
-                           value_for_print (p->maximum, "127"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "UCHAR") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_uchar\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "0"),
-                           value_for_print (p->maximum, "0xFF"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "BOOLEAN") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_boolean\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->default_value, "FALSE"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "INT") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_int\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "G_MININT"),
-                           value_for_print (p->maximum, "G_MAXINT"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "UINT") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_uint\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "0"),
-                           value_for_print (p->maximum, "G_MAXUINT"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "LONG") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_long\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "G_MINLONG"),
-                           value_for_print (p->maximum, "G_MAXLONG"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "ULONG") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_ulong\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "0"),
-                           value_for_print (p->maximum, "G_MAXULONG"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "INT64") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_int64\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "G_MININT64"),
-                           value_for_print (p->maximum, "G_MAXINT64"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "UINT64") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_uint64\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "0"),
-                           value_for_print (p->maximum, "G_MAXUINT64"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "UNICHAR") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_unichar\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "ENUM") == 0) {
-               char *type = make_me_type (p->extra_gtktype,
-                                          "G_TYPE_ENUM");
-               out_printf (out, "\tparam_spec = g_param_spec_enum\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* enum_type */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           type,
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-               g_free (type);
-       } else if (strcmp (p->gtktype, "FLAGS") == 0) {
-               char *type = make_me_type (p->extra_gtktype,
-                                          "G_TYPE_FLAGS");
-               out_printf (out, "\tparam_spec = g_param_spec_flags\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* flags_type */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           type,
-                           value_for_print (p->default_value, "0"),
-                           flags->str);
-               g_free (type);
-       } else if (strcmp (p->gtktype, "FLOAT") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_float\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "G_MINFLOAT"),
-                           value_for_print (p->maximum, "G_MAXFLOAT"),
-                           value_for_print (p->default_value, "0.0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "DOUBLE") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_double\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* minimum */,\n"
-                           "\t\t %s /* maximum */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->minimum, "G_MINDOUBLE"),
-                           value_for_print (p->maximum, "G_MAXDOUBLE"),
-                           value_for_print (p->default_value, "0.0"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "STRING") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_string\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* default_value */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           value_for_print (p->default_value, "NULL"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "PARAM") == 0) {
-               char *type = make_me_type (p->extra_gtktype,
-                                          "G_TYPE_PARAM");
-               out_printf (out, "\tparam_spec = g_param_spec_param\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* param_type */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           type,
-                           flags->str);
-               g_free (type);
-       } else if (strcmp (p->gtktype, "BOXED") == 0) {
-               char *type = make_me_type (p->extra_gtktype,
-                                          "G_TYPE_BOXED");
-               out_printf (out, "\tparam_spec = g_param_spec_boxed\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* boxed_type */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           type,
-                           flags->str);
-               g_free (type);
-       } else if (strcmp (p->gtktype, "POINTER") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_pointer\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           flags->str);
-       /* FIXME: VALUE_ARRAY */
-       } else if (strcmp (p->gtktype, "CLOSURE") == 0) {
-               out_printf (out, "\tparam_spec = g_param_spec_pointer\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           flags->str);
-       } else if (strcmp (p->gtktype, "OBJECT") == 0) {
-               char *type = make_me_type (p->extra_gtktype,
-                                          "G_TYPE_BOXED");
-               out_printf (out, "\tparam_spec = g_param_spec_object\n"
-                           "\t\t(\"%s\" /* name */,\n"
-                           "\t\t %s /* nick */,\n"
-                           "\t\t %s /* blurb */,\n"
-                           "\t\t %s /* object_type */,\n"
-                           "\t\t %s);\n",
-                           p->name,
-                           value_for_print (p->nick, "NULL"),
-                           value_for_print (p->blurb, "NULL"),
-                           type,
-                           flags->str);
-               g_free (type);
-       } else {
-               error_printf (GOB_ERROR, p->line_no,
-                             "%s type is not supported by properties",
-                             p->gtktype);
+               g_string_free (flags, TRUE);
        }
-
-       s = g_strdup (p->name);
-       gob_strup (s);
-       out_printf (out, "\tg_object_class_install_property (g_object_class,\n"
-                   "\t\tPROP_%s,\n"
-                   "\t\tparam_spec);\n", s);
-       g_free (s);
-
-       g_string_free (flags, TRUE);
 }
 
 static void
@@ -1955,8 +1987,15 @@ make_arguments(Class *c)
                out_printf(out, "\tg_object_class->get_property = ___object_get_property;\n");
        if (set_properties > 0)
                out_printf(out, "\tg_object_class->set_property = ___object_set_property;\n");
-       out_printf (out, "    {\n"
-                   "\tGParamSpec   *param_spec;\n\n");
+       out_printf (out, "    {\n");
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if ((n->type == PROPERTY_NODE && ! ((Property *) n)->override)
+                   || n->type == ARGUMENT_NODE) {
+                       out_printf(out, "\tGParamSpec   *param_spec;\n\n");
+                       break;
+               }
+       }
 
        for (li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
@@ -2011,11 +2050,19 @@ print_destructor (Variable *v)
                if(v->destructor_line > 0)
                        out_addline_infile(out, v->destructor_line);
 
-               out_printf(out, "\tif(%s->%s) { "
-                          "((*(void (*)(void *))%s)) (%s->%s); "
-                          "%s->%s = NULL; }\n",
-                          root, v->id, v->destructor, root, v->id,
-                          root, v->id);
+               if (for_cpp) {
+                       out_printf(out, "\tif(%s->%s) { "
+                                  "(reinterpret_cast<void (*)(void *)>(%s)) ((gpointer)%s->%s); "
+                                  "%s->%s = NULL; }\n",
+                                  root, v->id, v->destructor, root, v->id,
+                                  root, v->id);
+               } else {
+                       out_printf(out, "\tif(%s->%s) { "
+                                  "%s ((gpointer) %s->%s); "
+                                  "%s->%s = NULL; }\n",
+                                  root, v->id, v->destructor, root, v->id,
+                                  root, v->id);
+               }
 
                if(v->destructor_line > 0)
                        out_addline_outfile(out);
@@ -2102,11 +2149,15 @@ add_finalize (Class *c)
                const char *unused = "";
                if ( ! no_gnu)
                        unused = " G_GNUC_UNUSED";
-               out_printf(out, "\t%s *self %s = %s (obj_self);\n",
+               out_printf(out, "\t%s *self%s = %s (obj_self);\n",
                           typebase, unused, macrobase);
        }
        if (privates > 0) {
-               out_printf(out, "\tgpointer priv = self->_priv;\n");
+               const char *unused = "";
+               if ( ! no_gnu)
+                       unused = " G_GNUC_UNUSED";
+               out_printf(out, "\tgpointer priv%s = self->_priv;\n",
+                          unused);
        }
 
        if(finalize_handler) {
@@ -2137,10 +2188,6 @@ add_finalize (Class *c)
                }
        }
 
-       if (privates > 0) {
-               out_printf(out, "\tg_free (priv);\n");
-       }
-
        out_printf(out, "}\n"
                   "#undef __GOB_FUNCTION__\n\n");
 }
@@ -2201,11 +2248,12 @@ add_inits(Class *c)
                        out_printf(out, "{\n"
                                   "#define __GOB_FUNCTION__ \"%s::init\"\n",
                                   c->otype);
-                       if(privates > 0) {
+                       if (privates > 0) {
                                out_printf(out, "\t%s->_priv = "
-                                          "g_new0 (%sPrivate, 1);\n",
-                                          ((FuncArg *)m->args->data)->name,
-                                          typebase);
+                                               "G_TYPE_INSTANCE_GET_PRIVATE(%s,TYPE_SELF,%sPrivate);\n",
+                                               ((FuncArg *)m->args->data)->name,
+                                               ((FuncArg *)m->args->data)->name,
+                                               typebase);
                        } else if(always_private_struct) {
                                out_printf(out, "\t%s->_priv = NULL;\n",
                                           ((FuncArg *)m->args->data)->name);
@@ -2249,6 +2297,12 @@ add_inits(Class *c)
                                did_base_obj = TRUE;
                        }
 
+                       if (privates > 0)
+                               out_printf (out,
+                                           "\n\tg_type_class_add_private(%s,sizeof(%sPrivate));\n",
+                                           ((FuncArg *)m->args->data)->name,
+                                           typebase);
+                       
                        if (overrides > 0)
                                add_overrides (c,
                                               ((FuncArg *)m->args->data)->name,
@@ -2973,10 +3027,14 @@ open_files(void)
 
        if ((privates > 0 || protecteds > 0 ||
             private_header == PRIVATE_HEADER_ALWAYS) &&
-           private_header != PRIVATE_HEADER_NEVER)
-               outfileph = g_strconcat (fullfilebase, "-private.h", NULL);
-       else
+           private_header != PRIVATE_HEADER_NEVER) {
+               char sep[2] = {0,0};
+               if (file_sep != 0)
+                       sep[0] = file_sep;
+               outfileph = g_strconcat (fullfilebase, sep, "private.h", NULL);
+       } else {
                outfileph = NULL;
+       }
 
        
        if (no_write) {
@@ -3563,8 +3621,7 @@ print_includes(void)
        char *p;
 
        /* We may need string.h for memset */
-       if(destructors > 0 &&
-          ! g_list_find_custom(include_files, "string.h", (GCompareFunc)strcmp)) {
+       if ( ! g_list_find_custom(include_files, "string.h", (GCompareFunc)strcmp)) {
                out_printf(out, "#include <string.h> /* memset() */\n\n");
        }
 
@@ -3971,7 +4028,9 @@ print_help(void)
                                          "aliases\n"
                "\t--no-kill-underscores   Ignored for compatibility\n"
                "\t-o,--output-dir         The directory where output "
-                                         "should be placed\n");
+                                         "should be placed\n"
+               "\t--file-sep[=c]          replace default \'-\' file "
+                                         "name separator\n");
 }
 
 static void
@@ -4088,6 +4147,19 @@ parse_options(int argc, char *argv[])
                        char *p = strchr (argv[i], '=');
                        g_assert (p != NULL);
                        output_dir = g_strdup (p+1);
+               } else if (strncmp (argv[i], "--file-sep=",
+                                    strlen ("--file-sep=")) == 0) {
+                       char *p = strchr (argv[i], '=');
+                       g_assert (p != NULL);
+                       file_sep = *(p+1);
+               } else if (strncmp (argv[i], "--file-sep",
+                                    strlen ("--file-sep")) == 0) {
+                       if (i+1 < argc) {
+                               file_sep = (argv[i+1])[0];
+                               i++;
+                       } else {
+                               file_sep = 0;
+                       }
                } else if(strcmp(argv[i], "--")==0) {
                        /*further arguments are files*/
                        no_opts = TRUE;