File 0004-Add-g_option_context_parse_command_line.patch of Package mingw32-glib2
From af56bff915a81ced98c0d94880b5c5ccb825e138 Mon Sep 17 00:00:00 2001
From: Hib Eris <hib@hiberis.nl>
Date: Wed, 6 Feb 2013 09:46:33 +0100
Subject: [PATCH 4/4] Add g_option_context_parse_command_line()
https://bugzilla.gnome.org/show_bug.cgi?id=522131
---
docs/reference/glib/glib-sections.txt | 1 +
glib/goption.c | 52 +++++++++++++++++++++++++++++++++++
glib/goption.h | 4 +++
3 files changed, 57 insertions(+)
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index eee5647..89d5ba7 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -1174,6 +1174,7 @@ GTranslateFunc
g_option_context_set_translate_func
g_option_context_set_translation_domain
g_option_context_free
+g_option_context_parse_command_line
g_option_context_parse
g_option_context_parse_utf8
g_option_context_set_help_enabled
diff --git a/glib/goption.c b/glib/goption.c
index 3edb30a..8dcd2de 100644
--- a/glib/goption.c
+++ b/glib/goption.c
@@ -2148,6 +2148,58 @@ g_option_context_parse_utf8 (GOptionContext *context,
return option_context_parse_internal (context, TRUE, argc, argv, error);
}
+#ifndef G_OS_WIN32
+static
+void getmainargs(int *argc,
+ char ***argv)
+{
+ extern char **environ;
+ char ***argvp;
+ void *p;
+
+ asm ("mov %%esp, %0" : "=r" (p));
+ argvp = p;
+ while (*argvp != environ) {
+ argvp++;
+ }
+ argvp--;
+ *argv = *argvp;
+ argvp--;
+ *argc = (int) *argvp;
+}
+#endif
+
+gboolean
+g_option_context_parse_command_line (GOptionContext *context, GError **error)
+{
+#ifdef G_OS_WIN32
+ gboolean r;
+ int i, argc;
+ gchar **argv, **argv_tmp;
+
+ argv = g_win32_get_utf8_argv(TRUE, &argc);
+
+ argv_tmp = g_new (gchar *, argc + 1);
+ for (i = 0; i < argc; i++)
+ argv_tmp[i] = argv[i];
+ argv_tmp[argc] = NULL;
+
+ r = g_option_context_parse_utf8 (context, &argc, &argv_tmp, error);
+
+ g_strfreev (argv);
+ g_free (argv_tmp);
+
+ return r;
+#else
+ int argc;
+ char **argv;
+
+ getmainargs(&argc, &argv);
+
+ return g_option_context_parse (context, &argc, &argv, error);
+#endif
+}
+
/**
* g_option_group_new:
* @name: the name for the option group, this is used to provide
diff --git a/glib/goption.h b/glib/goption.h
index 8950430..d4ce4c9 100644
--- a/glib/goption.h
+++ b/glib/goption.h
@@ -348,6 +348,10 @@ gboolean g_option_context_parse_utf8 (GOptionContext *context,
gchar ***argv,
GError **error);
+GLIB_AVAILABLE_IN_2_36
+gboolean g_option_context_parse_command_line (GOptionContext *context,
+ GError **error);
+
GLIB_AVAILABLE_IN_ALL
void g_option_context_set_translate_func (GOptionContext *context,
GTranslateFunc func,
--
1.8.1.2