* main.h, misc.c (argsplit): Refactor argsep into argsplit and argsep so
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 16 Apr 2004 02:57:20 +0000 (02:57 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Fri, 16 Apr 2004 02:57:20 +0000 (02:57 +0000)
they can be called separately.

g10/ChangeLog
g10/main.h
g10/misc.c

index 4be3895..8db74fd 100644 (file)
@@ -1,5 +1,8 @@
 2004-04-15  David Shaw  <dshaw@jabberwocky.com>
 
+       * main.h, misc.c (argsplit): Refactor argsep into argsplit and
+       argsep so they can be called separately.
+
        * options.h, keyserver.c (parse_keyserver_options): Remove
        duplicate code from parse_keyserver_options by calling the generic
        parse_options.
index bbc9719..08b9250 100644 (file)
@@ -108,6 +108,7 @@ struct parse_options
   char **value;
 };
 
+char *argsplit(char **stringp);
 char *argsep(char **stringp,char **arg);
 int parse_options(char *str,unsigned int *options,
                  struct parse_options *opts,int noisy);
index e8bce52..150ed64 100644 (file)
@@ -644,57 +644,46 @@ compliance_failure(void)
   opt.compliance=CO_GNUPG;
 }
 
+/* Break a string into option pieces.  Accepts single word options and
+   key=value argument options. */
 char *
-argsep(char **stringp,char **arg)
+argsplit(char **stringp)
 {
-  char *tok,*next;
+  char *tok,*end;
 
   tok=*stringp;
-  *arg=NULL;
-
   if(tok)
     {
-      next=strpbrk(tok," ,=");
-
-      if(next)
+      end=strpbrk(tok," ,=");
+      if(end)
        {
          int sawequals=0;
+         char *ptr=end;
 
-         if(*next=='=')
-           sawequals=1;
-
-         *next++='\0';
-         *stringp=next;
-
-         /* what we need to do now is scan along starting with *next.
-            If the next character we see (ignoring spaces) is a =
+         /* what we need to do now is scan along starting with *end,
+            If the next character we see (ignoring spaces) is an =
             sign, then there is an argument. */
 
-         while(*next)
+         while(*ptr)
            {
-             if(*next=='=')
+             if(*ptr=='=')
                sawequals=1;
-             else if(*next!=' ')
+             else if(*ptr!=' ')
                break;
-             next++;
+             ptr++;
            }
 
-         /* At this point, *next is either an empty string, or the
-            beginning of the next token (which is an argument if
-            sawequals is true). */
-
+         /* There is an argument, so grab that too. */
          if(sawequals)
+           end=strpbrk(ptr," ,");
+
+         if(end)
            {
-             *arg=next;
-             next=strpbrk(*arg," ,");
-             if(next)
-               {
-                 *next++='\0';
-                 *stringp=next;
-               }
-             else
-               *stringp=NULL;
+             *end='\0';
+             *stringp=end+1;
            }
+         else
+           *stringp=NULL;
        }
       else
        *stringp=NULL;
@@ -703,6 +692,40 @@ argsep(char **stringp,char **arg)
   return tok;
 }
 
+/* Break an option or key=value option into key and value */
+char *
+argsep(char **stringp,char **arg)
+{
+  char *tok;
+
+  *arg=NULL;
+
+  tok=argsplit(stringp);
+  if(tok)
+    {
+      char *equals;
+      equals=strchr(tok,'=');
+      if(equals)
+       {
+         char *space;
+
+         space=strchr(tok,' ');
+         if(space)
+           *space='\0';
+         else
+           *equals='\0';
+
+         space=strrchr(equals+1,' ');
+         if(space)
+           *arg=space+1;
+         else
+           *arg=NULL;
+       }
+    }
+
+  return tok;
+}
+
 int
 parse_options(char *str,unsigned int *options,
              struct parse_options *opts,int noisy)