commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2400] 2009-07-07 Pavel Roskin <address@hidden>


From: Pavel Roskin
Subject: [2400] 2009-07-07 Pavel Roskin <address@hidden>
Date: Tue, 07 Jul 2009 19:54:19 +0000

Revision: 2400
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2400
Author:   proski
Date:     2009-07-07 19:54:19 +0000 (Tue, 07 Jul 2009)
Log Message:
-----------
2009-07-07  Pavel Roskin  <address@hidden>

        * lib/arg.c (find_long_option): Remove.
        (find_long): Add `len' argument, make `s' const char *.
        (grub_arg_parse): Parse long options in place, not in a
        temporary buffer.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/lib/arg.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-07-07 03:05:01 UTC (rev 2399)
+++ trunk/grub2/ChangeLog       2009-07-07 19:54:19 UTC (rev 2400)
@@ -1,3 +1,10 @@
+2009-07-07  Pavel Roskin  <address@hidden>
+
+       * lib/arg.c (find_long_option): Remove.
+       (find_long): Add `len' argument, make `s' const char *.
+       (grub_arg_parse): Parse long options in place, not in a
+       temporary buffer.
+
 2009-07-06  Pavel Roskin  <address@hidden>
 
        * commands/search.c (search_fs): Fix potential NULL pointer

Modified: trunk/grub2/lib/arg.c
===================================================================
--- trunk/grub2/lib/arg.c       2009-07-07 03:05:01 UTC (rev 2399)
+++ trunk/grub2/lib/arg.c       2009-07-07 19:54:19 UTC (rev 2400)
@@ -76,21 +76,8 @@
   return found;
 }
 
-static char *
-find_long_option (char *s)
-{
-  char *argpos = grub_strchr (s, '=');
-
-  if (argpos)
-    {
-      *argpos = '\0';
-      return ++argpos;
-    }
-  return 0;
-}
-
 static struct grub_arg_option *
-find_long (const struct grub_arg_option *options, char *s)
+find_long (const struct grub_arg_option *options, const char *s, int len)
 {
   struct grub_arg_option *found = 0;
   auto struct grub_arg_option *fnd_long (const struct grub_arg_option *opt);
@@ -99,7 +86,8 @@
     {
       while (opt->doc)
        {
-         if (opt->longarg && ! grub_strcmp (opt->longarg, s))
+         if (opt->longarg && ! grub_strncmp (opt->longarg, s, len) &&
+             opt->longarg[len] == '\0')
            return (struct grub_arg_option *) opt;
          opt++;
        }
@@ -244,7 +232,7 @@
                struct grub_arg_list *usr, char ***args, int *argnum)
 {
   int curarg;
-  char *longarg = 0;
+  int arglen;
   int complete = 0;
   char **argl = 0;
   int num = 0;
@@ -328,14 +316,14 @@
              break;
            }
 
-         longarg = (char *) grub_strdup (arg);
-         if (! longarg)
-           goto fail;
+         option = grub_strchr (arg, '=');
+         if (option) {
+           arglen = option - arg - 2;
+           option++;
+         } else
+           arglen = grub_strlen (arg) - 2;
 
-         option = find_long_option (longarg);
-         arg = longarg;
-
-         opt = find_long (cmd->options, arg + 2);
+         opt = find_long (cmd->options, arg + 2, arglen);
          if (! opt)
            {
              grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown argument `%s'\n", 
arg);
@@ -402,8 +390,6 @@
          if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
            goto fail;
        }
-      grub_free (longarg);
-      longarg = 0;
     }
 
   complete = 1;
@@ -412,7 +398,5 @@
   *argnum = num;
 
  fail:
-  grub_free (longarg);
-
   return complete;
 }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]