* keyserver.c (keyserver_search_prompt): Make sure the search string is
[gnupg.git] / g10 / misc.c
index 229436c..c2dfe35 100644 (file)
@@ -1,5 +1,6 @@
 /* misc.c -  miscellaneous functions
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2004 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include "options.h"
 #include "i18n.h"
 
-
-const char *g10m_revision_string(int);
-const char *g10c_revision_string(int);
-const char *g10u_revision_string(int);
-
-#ifdef __GNUC__
-volatile
-#endif
-        void
-pull_in_libs(void)
-{
-    g10m_revision_string(0);
-    g10c_revision_string(0);
-    g10u_revision_string(0);
-}
-
-
 #if defined(__linux__) && defined(__alpha__) && __GLIBC__ < 2
 static int
 setsysinfo(unsigned long op, void *buffer, unsigned long size,
@@ -179,9 +163,9 @@ print_cipher_algo_note( int algo )
             || algo == CIPHER_ALGO_CAST5
             || algo == CIPHER_ALGO_BLOWFISH
             || algo == CIPHER_ALGO_TWOFISH
-            || algo == CIPHER_ALGO_RIJNDAEL
-            || algo == CIPHER_ALGO_RIJNDAEL192
-            || algo == CIPHER_ALGO_RIJNDAEL256
+            || algo == CIPHER_ALGO_AES
+            || algo == CIPHER_ALGO_AES192
+            || algo == CIPHER_ALGO_AES256
           )
        ;
     else {
@@ -272,9 +256,6 @@ openpgp_pk_algo_usage ( int algo )
       case PUBKEY_ALGO_DSA:  
           use = PUBKEY_USAGE_SIG | PUBKEY_USAGE_AUTH;
           break;
-      case PUBKEY_ALGO_ELGAMAL:
-          use = PUBKEY_USAGE_SIG | PUBKEY_USAGE_ENC | PUBKEY_USAGE_AUTH;
-          break;
       default:
           break;
     }
@@ -495,31 +476,6 @@ pct_expando(const char *string,struct expando_args *args)
   return NULL;
 }
 
-int
-hextobyte( const char *s )
-{
-    int c;
-
-    if( *s >= '0' && *s <= '9' )
-       c = 16 * (*s - '0');
-    else if( *s >= 'A' && *s <= 'F' )
-       c = 16 * (10 + *s - 'A');
-    else if( *s >= 'a' && *s <= 'f' )
-       c = 16 * (10 + *s - 'a');
-    else
-       return -1;
-    s++;
-    if( *s >= '0' && *s <= '9' )
-       c += *s - '0';
-    else if( *s >= 'A' && *s <= 'F' )
-       c += 10 + *s - 'A';
-    else if( *s >= 'a' && *s <= 'f' )
-       c += 10 + *s - 'a';
-    else
-       return -1;
-    return c;
-}
-
 void
 deprecated_warning(const char *configname,unsigned int configlineno,
                   const char *option,const char *repl1,const char *repl2)
@@ -544,7 +500,7 @@ deprecated_warning(const char *configname,unsigned int configlineno,
 const char *
 compress_algo_to_string(int algo)
 {
-  const char *s="?";
+  const char *s=NULL;
 
   switch(algo)
     {
@@ -688,13 +644,130 @@ compliance_failure(void)
   opt.compliance=CO_GNUPG;
 }
 
+/* Break a string into successive option pieces.  Accepts single word
+   options and key=value argument options. */
+char *
+optsep(char **stringp)
+{
+  char *tok,*end;
+
+  tok=*stringp;
+  if(tok)
+    {
+      end=strpbrk(tok," ,=");
+      if(end)
+       {
+         int sawequals=0;
+         char *ptr=end;
+
+         /* 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(*ptr)
+           {
+             if(*ptr=='=')
+               sawequals=1;
+             else if(*ptr!=' ')
+               break;
+             ptr++;
+           }
+
+         /* There is an argument, so grab that too.  At this point,
+            ptr points to the first character of the argument. */
+         if(sawequals)
+           {
+             /* Is it a quoted argument? */
+             if(*ptr=='"')
+               {
+                 ptr++;
+                 end=strchr(ptr,'"');
+                 if(end)
+                   end++;
+               }
+             else
+               end=strpbrk(ptr," ,");
+           }
+
+         if(end && *end)
+           {
+             *end='\0';
+             *stringp=end+1;
+           }
+         else
+           *stringp=NULL;
+       }
+      else
+       *stringp=NULL;
+    }
+
+  return tok;
+}
+
+/* Breaks an option value into key and value.  Returns NULL if there
+   is no value.  Note that "string" is modified to remove the =value
+   part. */
+char *
+argsplit(char *string)
+{
+  char *equals,*arg=NULL;
+
+  equals=strchr(string,'=');
+  if(equals)
+    {
+      char *quote,*space;
+
+      *equals='\0';
+      arg=equals+1;
+
+      /* Quoted arg? */
+      quote=strchr(arg,'"');
+      if(quote)
+       {
+         arg=quote+1;
+
+         quote=strchr(arg,'"');
+         if(quote)
+           *quote='\0';
+       }
+      else
+       {
+         size_t spaces;
+
+         /* Trim leading spaces off of the arg */
+         spaces=strspn(arg," ");
+         arg+=spaces;
+       }
+
+      /* Trim tailing spaces off of the tag */
+      space=strchr(string,' ');
+      if(space)
+       *space='\0';
+    }
+
+  return arg;
+}
+
+/* Return the length of the initial token, leaving off any
+   argument. */
+static size_t
+optlen(const char *s)
+{
+  char *end=strpbrk(s," =");
+
+  if(end)
+    return end-s;
+  else
+    return strlen(s);
+}
+
 int
 parse_options(char *str,unsigned int *options,
              struct parse_options *opts,int noisy)
 {
   char *tok;
 
-  while((tok=strsep(&str," ,")))
+  while((tok=optsep(&str)))
     {
       int i,rev=0;
       char *otok=tok;
@@ -710,7 +783,7 @@ parse_options(char *str,unsigned int *options,
 
       for(i=0;opts[i].name;i++)
        {
-         size_t toklen=strlen(tok);
+         size_t toklen=optlen(tok);
 
          if(ascii_strncasecmp(opts[i].name,tok,toklen)==0)
            {
@@ -731,9 +804,17 @@ parse_options(char *str,unsigned int *options,
                }
 
              if(rev)
-               *options&=~opts[i].bit;
+               {
+                 *options&=~opts[i].bit;
+                 if(opts[i].value)
+                   *opts[i].value=NULL;
+               }
              else
-               *options|=opts[i].bit;
+               {
+                 *options|=opts[i].bit;
+                 if(opts[i].value)
+                   *opts[i].value=argsplit(tok);
+               }
              break;
            }
        }