[2400] 2009-07-07 Pavel Roskin <[email protected]>

Pavel Roskin <[email protected]> Tue, 07 Jul 2009 19:54:19 +0000
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
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  <[email protected]>

	* 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  <[email protected]>
+
+	* 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  <[email protected]>
 
 	* 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;
 }