Return an error if an option is missing its argument. (#305576, Björn
authorMatthias Clasen <mclasen@redhat.com>
Fri, 27 May 2005 18:30:34 +0000 (18:30 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 27 May 2005 18:30:34 +0000 (18:30 +0000)
2005-05-27  Matthias Clasen  <mclasen@redhat.com>

* glib/goption.c (parse_short_option, parse_long_option):
Return an error if an option is missing its argument.  (#305576,
Björn Lindqvist)

* tests/option-test.c (missing_arg_test): Add a testcase.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-8
glib/goption.c
tests/option-test.c

index 5610d08..30ba5c9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-05-27  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/goption.c (parse_short_option, parse_long_option):
+       Return an error if an option is missing its argument.  (#305576,
+       Björn Lindqvist)
+
+       * tests/option-test.c (missing_arg_test): Add a testcase.
+
 Wed May 25 15:33:51 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/goption.c (print_help): rest_description should be const.
index 5610d08..30ba5c9 100644 (file)
@@ -1,3 +1,11 @@
+2005-05-27  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/goption.c (parse_short_option, parse_long_option):
+       Return an error if an option is missing its argument.  (#305576,
+       Björn Lindqvist)
+
+       * tests/option-test.c (missing_arg_test): Add a testcase.
+
 Wed May 25 15:33:51 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/goption.c (print_help): rest_description should be const.
index 5610d08..30ba5c9 100644 (file)
@@ -1,3 +1,11 @@
+2005-05-27  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/goption.c (parse_short_option, parse_long_option):
+       Return an error if an option is missing its argument.  (#305576,
+       Björn Lindqvist)
+
+       * tests/option-test.c (missing_arg_test): Add a testcase.
+
 Wed May 25 15:33:51 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/goption.c (print_help): rest_description should be const.
index 5610d08..30ba5c9 100644 (file)
@@ -1,3 +1,11 @@
+2005-05-27  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/goption.c (parse_short_option, parse_long_option):
+       Return an error if an option is missing its argument.  (#305576,
+       Björn Lindqvist)
+
+       * tests/option-test.c (missing_arg_test): Add a testcase.
+
 Wed May 25 15:33:51 2005  Manish Singh  <yosh@gimp.org>
 
        * glib/goption.c (print_help): rest_description should be const.
index 8fdbdd9..4cfd459 100644 (file)
@@ -907,8 +907,13 @@ parse_short_option (GOptionContext *context,
                  *new_index = index + 1;
                }
              else
-               value = "";
-
+               {
+                 g_set_error (error, 
+                              G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                              _("Missing argument for %s"), option_name);
+                 g_free (option_name);
+                 return FALSE;
+               }
 
              option_name = g_strdup_printf ("-%c", group->entries[j].short_name);
              
@@ -964,7 +969,8 @@ parse_long_option (GOptionContext *context,
              gchar *option_name;
 
              add_pending_null (context, &((*argv)[*index]), NULL);
-             
+             option_name = g_strconcat ("--", group->entries[j].long_name, NULL);
+                     
              if (arg[len] == '=')
                value = arg + len + 1;
              else if (*index < *argc - 1)
@@ -974,10 +980,14 @@ parse_long_option (GOptionContext *context,
                  (*index)++;
                }
              else
-               value = "";
+               {
+                 g_set_error (error, 
+                              G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                              _("Missing argument for %s"), option_name);
+                 g_free (option_name);
+                 return FALSE;
+               }
 
-             option_name = g_strconcat ("--", group->entries[j].long_name, NULL);
-             
              if (!parse_arg (context, group, &group->entries[j], value, option_name, error))
                {
                  g_free (option_name);
index 1383b27..3c4035f 100644 (file)
@@ -883,6 +883,41 @@ void lonely_dash_test (void)
   g_option_context_free (context);
 }
 
+void
+missing_arg_test (void)
+{
+  GOptionContext *context;
+  gboolean retval;
+  GError *error = NULL;
+  gchar **argv;
+  int argc;
+  gchar *arg = NULL;
+  GOptionEntry entries [] =
+    { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL },
+      { NULL } };
+
+  context = g_option_context_new (NULL);
+  g_option_context_add_main_entries (context, entries, NULL);
+
+  /* Now try parsing */
+  argv = split_string ("program --test", &argc);
+
+  retval = g_option_context_parse (context, &argc, &argv, &error);
+  g_assert (retval == FALSE);
+  g_clear_error (&error);
+
+  g_strfreev (argv);
+
+  /* Try parsing again */
+  argv = split_string ("program --t", &argc);
+
+  retval = g_option_context_parse (context, &argc, &argv, &error);
+  g_assert (retval == FALSE);
+
+  g_strfreev (argv);
+  g_option_context_free (context);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -931,5 +966,8 @@ main (int argc, char **argv)
   /* test for bug 168008 */
   lonely_dash_test ();
 
+  /* test for bug 305576 */
+  missing_arg_test ();
+
   return 0;
 }