grub-devel
[Top][All Lists]
Advanced

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

argp module import


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: argp module import
Date: Sat, 03 Apr 2010 00:48:41 +0200
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20091109)

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

=== 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: signature.asc
Description: OpenPGP digital signature


reply via email to

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