aboutsummaryrefslogtreecommitdiffstats
path: root/g10/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/misc.c')
-rw-r--r--g10/misc.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/g10/misc.c b/g10/misc.c
index 2a8e29211..01f34b4a9 100644
--- a/g10/misc.c
+++ b/g10/misc.c
@@ -669,13 +669,72 @@ compliance_failure(void)
opt.compliance=CO_GNUPG;
}
+char *
+argsep(char **stringp,char **arg)
+{
+ char *tok,*next;
+
+ tok=*stringp;
+ *arg=NULL;
+
+ if(tok)
+ {
+ next=strpbrk(tok," ,=");
+
+ if(next)
+ {
+ int sawequals=0;
+
+ 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 =
+ sign, then there is an argument. */
+
+ while(*next)
+ {
+ if(*next=='=')
+ sawequals=1;
+ else if(*next!=' ')
+ break;
+ next++;
+ }
+
+ /* At this point, *next is either an empty string, or the
+ beginning of the next token (which is an argument if
+ sawequals is true). */
+
+ if(sawequals)
+ {
+ *arg=next;
+ next=strpbrk(*arg," ,");
+ if(next)
+ {
+ *next++='\0';
+ *stringp=next;
+ }
+ else
+ *stringp=NULL;
+ }
+ }
+ else
+ *stringp=NULL;
+ }
+
+ return tok;
+}
+
int
parse_options(char *str,unsigned int *options,
struct parse_options *opts,int noisy)
{
- char *tok;
+ char *tok,*arg;
- while((tok=strsep(&str," ,")))
+ while((tok=argsep(&str,&arg)))
{
int i,rev=0;
char *otok=tok;
@@ -715,6 +774,8 @@ parse_options(char *str,unsigned int *options,
*options&=~opts[i].bit;
else
*options|=opts[i].bit;
+ if(opts[i].value)
+ *opts[i].value=arg?m_strdup(arg):NULL;
break;
}
}