From 2936e539ccbfaad6622eeda16b6117562f2b872b Mon Sep 17 00:00:00 2001
From: David Shaw <dshaw@jabberwocky.com>
Date: Fri, 16 Apr 2004 02:57:20 +0000
Subject: [PATCH] * main.h, misc.c (argsplit): Refactor argsep into argsplit
 and argsep so they can be called separately.

---
 g10/ChangeLog |  3 ++
 g10/main.h    |  1 +
 g10/misc.c    | 87 ++++++++++++++++++++++++++++++++-------------------
 3 files changed, 59 insertions(+), 32 deletions(-)

diff --git a/g10/ChangeLog b/g10/ChangeLog
index 4be3895a5..8db74fdec 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -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.
diff --git a/g10/main.h b/g10/main.h
index bbc971970..08b925084 100644
--- a/g10/main.h
+++ b/g10/main.h
@@ -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);
diff --git a/g10/misc.c b/g10/misc.c
index e8bce52f5..150ed6438 100644
--- a/g10/misc.c
+++ b/g10/misc.c
@@ -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)