22 bump_verbosity(
const gchar *option_name,
const gchar *optarg, gpointer
data, GError **error) {
47 free_common_args(gpointer
data) {
63 GOptionGroup **output_group) {
65 GOptionContext *context;
66 GOptionGroup *main_group;
68 GOptionEntry main_entries[3] = {
69 {
"version",
'$', 0, G_OPTION_ARG_NONE, &(common_args->
version),
70 "Display software version and exit",
72 {
"verbose",
'V', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, bump_verbosity,
73 "Increase debug output (may be specified multiple times)",
79 main_group = g_option_group_new(NULL,
"Application Options:", NULL, common_args, free_common_args);
80 g_option_group_add_entries(main_group, main_entries);
82 context = g_option_context_new(NULL);
83 g_option_context_set_summary(context, common_args->
summary);
84 g_option_context_set_description(context, desc);
85 g_option_context_set_main_group(context, main_group);
88 GOptionEntry output_entries[3] = {
89 {
"output-as", 0, 0, G_OPTION_ARG_STRING, &(common_args->
output_ty),
92 {
"output-to", 0, 0, G_OPTION_ARG_STRING, &(common_args->
output_dest),
93 "Specify file name for output (or \"-\" for stdout)",
"DEST" },
98 if (*output_group == NULL) {
99 *output_group = g_option_group_new(
"output",
"Output Options:",
"Show output help", NULL, NULL);
104 g_option_group_add_entries(*output_group, output_entries);
105 g_option_context_add_group(context, *output_group);
115 if (context == NULL) {
119 g_option_context_free(context);
125 GOptionGroup *main_group = g_option_context_get_main_group(context);
127 g_option_group_add_entries(main_group, entries);
132 const char *header,
const char *desc,
133 GOptionEntry entries[])
135 GOptionGroup *group = NULL;
137 group = g_option_group_new(name, header, desc, NULL, NULL);
138 g_option_group_add_entries(group, entries);
139 g_option_context_add_group(context, group);
144 char **retval = NULL;
145 GPtrArray *arr = g_ptr_array_new();
146 bool saw_dash_dash =
false;
148 for (
int i = 0; i < argc; i++) {
154 if (saw_dash_dash ==
false && strcmp(argv[i],
"--") == 0) {
155 saw_dash_dash =
true;
158 if (saw_dash_dash ==
true) {
159 g_ptr_array_add(arr, strdup(argv[i]));
167 g_ptr_array_add(arr, strdup(argv[i]));
174 if (g_str_has_prefix(argv[i],
"-") && !g_str_has_prefix(argv[i],
"--")) {
176 char *ch = argv[i]+1;
178 while (*ch !=
'\0') {
184 if (strchr(special, *ch) != NULL) {
188 if (*(ch+1) !=
'\0') {
190 g_ptr_array_add(arr, strdup(ch+1));
214 g_ptr_array_add(arr, strdup(argv[i]));
222 retval = calloc(arr->len+1,
sizeof(
char *));
223 for (
int i = 0; i < arr->len; i++) {
224 retval [i] = (
char *) g_ptr_array_index(arr, i);
227 g_ptr_array_free(arr, FALSE);
237 gchar **extra_args = NULL;
239 gboolean retval = TRUE;
241 va_start(ap, format);
242 len = vasprintf(&buf, format, ap);
246 if (!g_shell_parse_argv(buf, NULL, &extra_args, error)) {
247 g_strfreev(extra_args);
252 retval = g_option_context_parse_strv(context, &extra_args, error);
254 g_strfreev(extra_args);