All of lore.kernel.org
 help / color / mirror / Atom feed
* Completion for arguments
@ 2005-08-26 22:11 Marco Gerards
  2005-08-28 12:37 ` Yoshinori K. Okuji
  0 siblings, 1 reply; 3+ messages in thread
From: Marco Gerards @ 2005-08-26 22:11 UTC (permalink / raw)
  To: grub-devel

Hi,

Here is a patch that makes it possible to complete arguments.  If no
one objects, I will apply it on Sunday.

Thanks,
Marco



2005-08-27  Marco Gerards  <metgerards@student.han.nl>

	* include/grub/normal.h (enum grub_completion_type): Added
	`GRUB_COMPLETION_TYPE_ARGUMENT'.

	* normal/cmdline.c (print_completion): Handle
	the `GRUB_COMPLETION_TYPE_ARGUMENT' type.
	* normal/menu_entry.c (store_completion): Likewise.

	* normal/completion.c (complete_arguments): New function.
	(grub_normal_do_completion): Call `complete_arguments' when the
	current words start with a dash.



Index: include/grub/normal.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/normal.h,v
retrieving revision 1.21
diff -u -p -u -p -r1.21 normal.h
--- include/grub/normal.h	20 Aug 2005 07:49:01 -0000	1.21
+++ include/grub/normal.h	26 Aug 2005 22:02:28 -0000
@@ -51,6 +51,7 @@ enum grub_completion_type
     GRUB_COMPLETION_TYPE_DEVICE,
     GRUB_COMPLETION_TYPE_PARTITION,
     GRUB_COMPLETION_TYPE_FILE,
+    GRUB_COMPLETION_TYPE_ARGUMENT
   };
 typedef enum grub_completion_type grub_completion_type_t;
 
Index: normal/cmdline.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/cmdline.c,v
retrieving revision 1.18
diff -u -p -u -p -r1.18 cmdline.c
--- normal/cmdline.c	18 Aug 2005 03:14:38 -0000	1.18
+++ normal/cmdline.c	26 Aug 2005 22:02:28 -0000
@@ -187,6 +187,9 @@ print_completion (const char *item, grub
 	case GRUB_COMPLETION_TYPE_PARTITION:
 	  what = "partitions";
 	  break;
+	case GRUB_COMPLETION_TYPE_ARGUMENT:
+	  what = "arguments";
+	  break;
 	default:
 	  what = "things";
 	  break;
Index: normal/completion.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/completion.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 completion.c
--- normal/completion.c	18 Aug 2005 03:14:38 -0000	1.2
+++ normal/completion.c	26 Aug 2005 22:02:28 -0000
@@ -303,6 +303,61 @@ complete_file (void)
   return ret;
 }
 
+/* Complete an argument.  */
+static int
+complete_arguments (char *command)
+{
+  grub_command_t cmd;
+  struct grub_arg_option *option;
+  char shortarg[] = "- ";
+
+  cmd = grub_command_find (command); 
+
+  if (!cmd || !cmd->options)
+    return 0;
+
+  if (add_completion ("-u", " ", GRUB_COMPLETION_TYPE_ARGUMENT))
+    return 1;
+
+  /* Add the short arguments.  */
+  for (option = cmd->options; option->doc; option++)
+    {
+      if (!option->shortarg)
+	continue;
+
+      shortarg[1] = option->shortarg;
+      if (add_completion (shortarg, " ", GRUB_COMPLETION_TYPE_ARGUMENT))
+	return 1;
+
+    }
+
+  /* First add the built-in arguments.  */
+  if (add_completion ("--help", " ", GRUB_COMPLETION_TYPE_ARGUMENT))
+    return 1;
+  if (add_completion ("--usage", " ", GRUB_COMPLETION_TYPE_ARGUMENT))
+    return 1;
+
+  /* Add the long arguments.  */
+  for (option = cmd->options; option->doc; option++)
+    {
+      char *longarg;
+      if (!option->longarg)
+	continue;
+
+      longarg = grub_malloc (grub_strlen (option->longarg));
+      grub_sprintf (longarg, "--%s", option->longarg);
+
+      if (add_completion (longarg, " ", GRUB_COMPLETION_TYPE_ARGUMENT))
+	{
+	  grub_free (longarg);
+	  return 1;
+	}
+      grub_free (longarg);
+    }
+
+  return 0;
+}
+
 /* Try to complete the string in BUF. Return the characters that
    should be added to the string.  This command outputs the possible
    completions by calling HOOK, in that case set RESTORE to 1 so the
@@ -342,7 +397,12 @@ grub_normal_do_completion (char *buf, in
     {
       current_word++;
       
-      if (*current_word == '(' && ! grub_strchr (current_word, ')'))
+      if (*current_word == '-')
+	{
+	  if (complete_arguments (buf))
+	    goto fail;
+	}
+      else if (*current_word == '(' && ! grub_strchr (current_word, ')'))
 	{
 	  /* Complete a device.  */
 	  if (complete_device ())
Index: normal/menu_entry.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/menu_entry.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 menu_entry.c
--- normal/menu_entry.c	18 Aug 2005 03:14:38 -0000	1.3
+++ normal/menu_entry.c	26 Aug 2005 22:02:28 -0000
@@ -840,6 +840,9 @@ store_completion (const char *item, grub
 	case GRUB_COMPLETION_TYPE_PARTITION:
 	  what = "partitions";
 	  break;
+	case GRUB_COMPLETION_TYPE_ARGUMENT:
+	  what = "arguments";
+	  break;
 	default:
 	  what = "things";
 	  break;




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Completion for arguments
  2005-08-26 22:11 Completion for arguments Marco Gerards
@ 2005-08-28 12:37 ` Yoshinori K. Okuji
  2005-08-29 15:27   ` Marco Gerards
  0 siblings, 1 reply; 3+ messages in thread
From: Yoshinori K. Okuji @ 2005-08-28 12:37 UTC (permalink / raw)
  To: The development of GRUB 2

On Saturday 27 August 2005 00:11, Marco Gerards wrote:
> +  /* Add the short arguments.  */
> +  for (option = cmd->options; option->doc; option++)
> +    {
> +      if (!option->shortarg)
> +	continue;

This should be:

  if (! grub_isgraph (option->shortarg))
    continue;

because we sometimes want to specify non-graph short arguments for 
convenience.

Okuji



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Completion for arguments
  2005-08-28 12:37 ` Yoshinori K. Okuji
@ 2005-08-29 15:27   ` Marco Gerards
  0 siblings, 0 replies; 3+ messages in thread
From: Marco Gerards @ 2005-08-29 15:27 UTC (permalink / raw)
  To: The development of GRUB 2

"Yoshinori K. Okuji" <okuji@enbug.org> writes:

> On Saturday 27 August 2005 00:11, Marco Gerards wrote:
>> +  /* Add the short arguments.  */
>> +  for (option = cmd->options; option->doc; option++)
>> +    {
>> +      if (!option->shortarg)
>> +	continue;
>
> This should be:
>
>   if (! grub_isgraph (option->shortarg))
>     continue;
>
> because we sometimes want to specify non-graph short arguments for 
> convenience.

You are right, I will fix this next time when I commit a patch.

Thanks,
Marco




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-08-29 15:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-26 22:11 Completion for arguments Marco Gerards
2005-08-28 12:37 ` Yoshinori K. Okuji
2005-08-29 15:27   ` Marco Gerards

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.