All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: argp module import
Date: Sat, 03 Apr 2010 00:48:41 +0200	[thread overview]
Message-ID: <4BB67449.9070809@gmail.com> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 205 bytes --]

Hello, all. I've just imported argp module. I attach the patch to make
grub-fstest argp-based. Can someone familiar with argp have a look at it?

-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: fstest_argp.diff --]
[-- Type: text/x-diff; name="fstest_argp.diff", Size: 9713 bytes --]

=== modified file 'util/grub-fstest.c'
--- util/grub-fstest.c	2010-01-27 01:49:11 +0000
+++ util/grub-fstest.c	2010-04-02 22:47:13 +0000
@@ -39,9 +39,9 @@
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
-#include <getopt.h>
 
 #include "progname.h"
+#include "argp.h"
 
 void
 grub_putchar (int c)
@@ -275,8 +275,17 @@ cmd_crc (char *pathname)
   printf ("%08x\n", crc);
 }
 
+static char *root = NULL;
+static int args_count = 0;
+static int nparm = 0;
+static int num_disks = 1;
+static char **images = NULL;
+static int cmd = 0;
+static char *debug_str = NULL;
+static char **args = NULL;
+
 static void
-fstest (char **images, int num_disks, int cmd, int n, char **args)
+fstest (int n, char **args)
 {
   char *host_file;
   char *loop_name;
@@ -350,202 +359,166 @@ fstest (char **images, int num_disks, in
     }
 }
 
-static struct option options[] = {
-  {"root", required_argument, 0, 'r'},
-  {"skip", required_argument, 0, 's'},
-  {"length", required_argument, 0, 'n'},
-  {"diskcount", required_argument, 0, 'c'},
-  {"debug", required_argument, 0, 'd'},
-  {"help", no_argument, 0, 'h'},
-  {"version", no_argument, 0, 'V'},
-  {"verbose", no_argument, 0, 'v'},
-  {0, 0, 0, 0}
+static struct argp_option options[] = {
+  {0,          0, 0      , OPTION_DOC, "Commands:", 1},
+  {"ls PATH",  0, 0      , OPTION_DOC, "List files in PATH.", 1},
+  {"cp FILE LOCAL",  0, 0, OPTION_DOC, "Copy FILE to local file LOCAL.", 1},
+  {"cmp FILE LOCAL", 0, 0, OPTION_DOC, "Compare FILE with local file LOCAL.", 1},
+  {"hex FILE", 0, 0      , OPTION_DOC, "Hex dump FILE.", 1},
+  {"crc FILE", 0, 0     , OPTION_DOC, "Get crc32 checksum of FILE.", 1},
+  {"blocklist FILE", 0, 0, OPTION_DOC, "Display blocklist of FILE.", 1},
+
+  {"root",      'r', "DEVICE_NAME", 0, "Set root device.",                 2},
+  {"skip",      's', "N",           0, "Skip N bytes from output file.",   2},
+  {"length",    'n', "N",           0, "Handle N bytes in output file.",   2},
+  {"diskcount", 'c', "N",           0, "N input files.",                   2},
+  {"debug",     'd', "S",           0, "Set debug environment variable.",  2},
+  {"verbose",   'v', NULL, OPTION_ARG_OPTIONAL, "Print verbose messages.", 2},
+  {0, 0, 0, 0, 0, 0}
 };
 
-static void
-usage (int status)
+error_t 
+argp_parser (int key, char *arg, struct argp_state *state)
 {
-  if (status)
-    fprintf (stderr, "Try `%s --help' for more information.\n", program_name);
-  else
-    printf ("\
-Usage: %s [OPTION]... IMAGE_PATH COMMANDS\n\
-\n\
-Debug tool for filesystem driver.\n\
-\nCommands:\n\
-  ls PATH                   list files in PATH\n\
-  cp FILE LOCAL             copy FILE to local file LOCAL\n\
-  cmp FILE LOCAL            compare FILE with local file LOCAL\n\
-  hex FILE                  Hex dump FILE\n\
-  crc FILE                  Get crc32 checksum of FILE\n\
-  blocklist FILE            display blocklist of FILE\n\
-\nOptions:\n\
-  -r, --root=DEVICE_NAME    set root device\n\
-  -s, --skip=N              skip N bytes from output file\n\
-  -n, --length=N            handle N bytes in output file\n\
-  -c, --diskcount=N         N input files\n\
-  -d, --debug=S             Set debug environment variable\n\
-  -h, --help                display this message and exit\n\
-  -V, --version             print version information and exit\n\
-  -v, --verbose             print verbose messages\n\
-\n\
-Report bugs to <%s>.\n", program_name, PACKAGE_BUGREPORT);
-
-  exit (status);
-}
+  char *p;
 
-int
-main (int argc, char *argv[])
-{
-  char *debug_str = NULL, *root = NULL, *default_root, *alloc_root;
-  int i, cmd, num_opts, image_index, num_disks = 1;
-
-  set_program_name (argv[0]);
-
-  grub_util_init_nls ();
-
-  /* Find the first non option entry.  */
-  for (num_opts = 1; num_opts < argc; num_opts++)
-    if (argv[num_opts][0] == '-')
-      {
-        if ((argv[num_opts][2] == 0) && (num_opts < argc - 1) &&
-            ((argv[num_opts][1] == 'r') ||
-             (argv[num_opts][1] == 's') ||
-             (argv[num_opts][1] == 'n') ||
-             (argv[num_opts][1] == 'c') ||
-             (argv[num_opts][1] == 'd')))
-            num_opts++;
-      }
-    else
-      break;
-
-  /* Check for options.  */
-  while (1)
+  switch (key)
     {
-      int c = getopt_long (num_opts, argv, "r:s:n:c:d:hVv", options, 0);
-      char *p;
-
-      if (c == -1)
-	break;
-      else
-	switch (c)
-	  {
-	  case 'r':
-	    root = optarg;
-	    break;
-
-	  case 's':
-	    skip = grub_strtoul (optarg, &p, 0);
-            if (*p == 's')
-              skip <<= GRUB_DISK_SECTOR_BITS;
-	    break;
-
-	  case 'n':
-	    leng = grub_strtoul (optarg, &p, 0);
-            if (*p == 's')
-              leng <<= GRUB_DISK_SECTOR_BITS;
-	    break;
-
-          case 'c':
-            num_disks = grub_strtoul (optarg, NULL, 0);
-            if (num_disks < 1)
-              {
-                fprintf (stderr, "Invalid disk count.\n");
-                usage (1);
-              }
-            break;
-
-          case 'd':
-            debug_str = optarg;
-            break;
+    case 'r':
+      root = arg;
+      return 0;
+
+    case 's':
+      skip = grub_strtoul (arg, &p, 0);
+      if (*p == 's')
+	skip <<= GRUB_DISK_SECTOR_BITS;
+      return 0;
+
+    case 'n':
+      leng = grub_strtoul (arg, &p, 0);
+      if (*p == 's')
+	leng <<= GRUB_DISK_SECTOR_BITS;
+      return 0;
+
+    case 'c':
+      num_disks = grub_strtoul (arg, NULL, 0);
+      if (num_disks < 1)
+	{
+	  fprintf (stderr, "Invalid disk count.\n");
+	  argp_usage (state);
+	}
+      if (args_count != 0)
+	{
+	  fprintf (stderr, "Disk count must precede disks list.\n");
+	  argp_usage (state);
+	}
+      return 0;
 
-	  case 'h':
-	    usage (0);
-	    break;
+    case 'd':
+      debug_str = arg;
+      return 0;
+
+    case 'v':
+      verbosity++;
+      return 0;
 
-	  case 'V':
-	    printf ("%s (%s) %s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION);
-	    return 0;
+    case ARGP_KEY_END:
+      if (args_count < num_disks)
+	{
+	  fprintf (stderr, "No command is specified.\n");
+	  argp_usage (state);
+	}
+      if (args_count - 1 - num_disks < nparm)
+	{
+	  fprintf (stderr, "Not enough parameters to command.\n");
+	  argp_usage (state);
+	}
+      return 0;
 
-	  case 'v':
-	    verbosity++;
-	    break;
+    case ARGP_KEY_ARG:
+      break;
 
-	  default:
-	    usage (1);
-	    break;
-	  }
+    default:
+      return ARGP_ERR_UNKNOWN;
     }
 
-  /* Obtain PATH.  */
-  if (optind + num_disks - 1 >= argc)
+  if (args_count < num_disks)
     {
-      fprintf (stderr, "Not enough pathname.\n");
-      usage (1);
+      if (arg[0] != '/')
+	{
+	  fprintf (stderr, "Must use absolute path.\n");
+	  argp_usage (state);
+	}
+      if (args_count == 0)
+	images = xmalloc (num_disks * sizeof (images[0]));
+      images[args_count] = xstrdup (arg);
+      args_count++;
+      return 0;
     }
 
-  image_index = optind;
-  for (i = 0; i < num_disks; i++, optind++)
-    if (argv[optind][0] != '/')
-      {
-        fprintf (stderr, "Must use absolute path.\n");
-        usage (1);
-      }
-
-  cmd = 0;
-  if (optind < argc)
+  if (args_count == num_disks)
     {
-      int nparm = 0;
-
-      if (!grub_strcmp (argv[optind], "ls"))
+      if (!grub_strcmp (arg, "ls"))
         {
           cmd = CMD_LS;
         }
-      else if (!grub_strcmp (argv[optind], "cp"))
+      else if (!grub_strcmp (arg, "cp"))
 	{
 	  cmd = CMD_CP;
           nparm = 2;
 	}
-      else if (!grub_strcmp (argv[optind], "cmp"))
+      else if (!grub_strcmp (arg, "cmp"))
 	{
 	  cmd = CMD_CMP;
           nparm = 2;
 	}
-      else if (!grub_strcmp (argv[optind], "hex"))
+      else if (!grub_strcmp (arg, "hex"))
 	{
 	  cmd = CMD_HEX;
           nparm = 1;
 	}
-      else if (!grub_strcmp (argv[optind], "crc"))
+      else if (!grub_strcmp (arg, "crc"))
 	{
 	  cmd = CMD_CRC;
           nparm = 1;
 	}
-      else if (!grub_strcmp (argv[optind], "blocklist"))
+      else if (!grub_strcmp (arg, "blocklist"))
 	{
 	  cmd = CMD_BLOCKLIST;
           nparm = 1;
 	}
       else
 	{
-	  fprintf (stderr, "Invalid command %s.\n", argv[optind]);
-	  usage (1);
+	  fprintf (stderr, "Invalid command %s.\n", arg);
+	  argp_usage (state);
 	}
+      args_count++;
+      return 0;
+    }
 
-      if (optind + 1 + nparm > argc)
-	{
-	  fprintf (stderr, "Invalid parameter for command %s.\n",
-		   argv[optind]);
-	  usage (1);
-	}
+  args[args_count - 1 - num_disks] = xstrdup (arg);
+  args_count++;
+  return 0;
+}
 
-      optind++;
-    }
-  else
-    {
-      fprintf (stderr, "No command is specified.\n");
-      usage (1);
-    }
+struct argp argp = {
+  options, argp_parser, "IMAGE_PATH COMMANDS",
+  "Debug tool for filesystem driver.", 
+  NULL, NULL, NULL
+};
+
+int
+main (int argc, char *argv[])
+{
+  char *default_root, *alloc_root;
+
+  set_program_name (argv[0]);
+
+  grub_util_init_nls ();
+
+  args = xmalloc (argc * sizeof (args[0]));
+
+  argp_parse (&argp, argc, argv, 0, 0, 0);
 
   /* Initialize all modules. */
   grub_init_all ();
@@ -574,7 +547,7 @@ main (int argc, char *argv[])
     free (alloc_root);
 
   /* Do it.  */
-  fstest (argv + image_index, num_disks, cmd, argc - optind, argv + optind);
+  fstest (args_count - 1 - num_disks, args);
 
   /* Free resources.  */
   grub_fini_all ();


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 293 bytes --]

                 reply	other threads:[~2010-04-02 22:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BB67449.9070809@gmail.com \
    --to=phcoder@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.