glib-genmarshal: add --output option to write output to a file

https://bugzilla.gnome.org/show_bug.cgi?id=770175
This commit is contained in:
Tim-Philipp Müller
2016-08-22 16:32:25 +01:00
committed by Matthias Clasen
parent 10c490cdfe
commit 0fbc98097f

View File

@@ -122,6 +122,9 @@ static const GScannerConfig scanner_config_template =
}; };
static gchar * const std_marshaller_prefix = "g_cclosure_marshal"; static gchar * const std_marshaller_prefix = "g_cclosure_marshal";
static gchar *marshaller_prefix = "g_cclosure_user_marshal"; static gchar *marshaller_prefix = "g_cclosure_user_marshal";
static gchar *output_fn = NULL;
static gint output_fd = -1;
static gchar *output_tmpfn = NULL;
static GHashTable *marshallers = NULL; static GHashTable *marshallers = NULL;
static FILE *fout = NULL; static FILE *fout = NULL;
static gboolean gen_cheader = FALSE; static gboolean gen_cheader = FALSE;
@@ -807,9 +810,23 @@ main (int argc,
/* setup auxiliary structs */ /* setup auxiliary structs */
scanner = g_scanner_new (&scanner_config_template); scanner = g_scanner_new (&scanner_config_template);
fout = stdout;
marshallers = g_hash_table_new (g_str_hash, g_str_equal); marshallers = g_hash_table_new (g_str_hash, g_str_equal);
if (output_fn)
{
output_tmpfn = g_strconcat (output_fn, ".XXXXXX", NULL);
if ((output_fd = g_mkstemp (output_tmpfn)) == -1)
{
g_printerr ("Failed to create temp file \"%s\": %s\n", output_tmpfn, g_strerror (errno));
return EXIT_FAILURE;
}
fout = fdopen (output_fd, "wb");
g_assert (fout != NULL);
}
else
fout = stdout;
/* add standard marshallers of the GObject library */ /* add standard marshallers of the GObject library */
if (std_includes) if (std_includes)
for (i = 0; i < G_N_ELEMENTS (gobject_marshallers); i++) for (i = 0; i < G_N_ELEMENTS (gobject_marshallers); i++)
@@ -939,6 +956,19 @@ main (int argc,
g_hash_table_foreach_remove (marshallers, string_key_destroy, NULL); g_hash_table_foreach_remove (marshallers, string_key_destroy, NULL);
g_hash_table_destroy (marshallers); g_hash_table_destroy (marshallers);
if (output_fn)
{
fclose (fout);
if (g_rename (output_tmpfn, output_fn) != 0)
{
g_printerr ("Failed to rename \"%s\" to \"%s\": %s\n", output_tmpfn, output_fn, g_strerror (errno));
g_unlink (output_tmpfn);
exit_status = EXIT_FAILURE;
}
g_free (output_tmpfn);
}
return exit_status; return exit_status;
} }
@@ -1002,6 +1032,21 @@ parse_args (gint *argc_p,
} }
argv[i] = NULL; argv[i] = NULL;
} }
else if ((strcmp ("--output", argv[i]) == 0) ||
(strncmp ("--output=", argv[i], 9) == 0))
{
gchar *equal = argv[i] + 8;
if (*equal == '=')
output_fn = equal + 1;
else if (i + 1 < argc)
{
output_fn = argv[i + 1];
argv[i] = NULL;
i += 1;
}
argv[i] = NULL;
}
else if (strcmp ("-h", argv[i]) == 0 || else if (strcmp ("-h", argv[i]) == 0 ||
strcmp ("-?", argv[i]) == 0 || strcmp ("-?", argv[i]) == 0 ||
strcmp ("--help", argv[i]) == 0) strcmp ("--help", argv[i]) == 0)
@@ -1072,6 +1117,7 @@ print_blurb (FILE *bout,
g_fprintf (bout, " --header Generate C headers\n"); g_fprintf (bout, " --header Generate C headers\n");
g_fprintf (bout, " --body Generate C code\n"); g_fprintf (bout, " --body Generate C code\n");
g_fprintf (bout, " --prefix=string Specify marshaller prefix\n"); g_fprintf (bout, " --prefix=string Specify marshaller prefix\n");
g_fprintf (bout, " --output=file Write output into the specified file\n");
g_fprintf (bout, " --skip-source Skip source location comments\n"); g_fprintf (bout, " --skip-source Skip source location comments\n");
g_fprintf (bout, " --stdinc, --nostdinc Include/use standard marshallers\n"); g_fprintf (bout, " --stdinc, --nostdinc Include/use standard marshallers\n");
g_fprintf (bout, " --internal Mark generated functions as internal\n"); g_fprintf (bout, " --internal Mark generated functions as internal\n");