* build-packet.c (string_to_notation): Add ability to indicate a notation
authorDavid Shaw <dshaw@jabberwocky.com>
Thu, 9 Mar 2006 19:43:29 +0000 (19:43 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Thu, 9 Mar 2006 19:43:29 +0000 (19:43 +0000)
to be deleted with a '-' prefix.

* keyedit.c (menu_set_notation): Use it here to allow deleting a notation
marked with '-'.  This works with either "-notation" or "-notation=value".

g10/ChangeLog
g10/build-packet.c
g10/keyedit.c

index cb3245b..85da8f2 100644 (file)
@@ -1,3 +1,12 @@
+2006-03-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (string_to_notation): Add ability to indicate a
+       notation to be deleted with a '-' prefix.
+
+       * keyedit.c (menu_set_notation): Use it here to allow deleting a
+       notation marked with '-'.  This works with either "-notation" or
+       "-notation=value".
+
 2006-03-08  David Shaw  <dshaw@jabberwocky.com>
 
        * keyedit.c (menu_set_notation): New function to set notations on
index 2ffc758..5c239b7 100644 (file)
@@ -891,12 +891,18 @@ build_attribute_subpkt(PKT_user_id *uid,byte type,
 struct notation *
 string_to_notation(const char *string,int is_utf8)
 {
-  const char *s,*i;
-  int saw_at=0,highbit=0;
+  const char *s;
+  int saw_at=0;
   struct notation *notation;
 
   notation=xmalloc_clear(sizeof(*notation));
 
+  if(*string=='-')
+    {
+      notation->flags.ignore=1;
+      string++;
+    }
+
   if(*string=='!')
     {
       notation->flags.critical=1;
@@ -911,6 +917,10 @@ string_to_notation(const char *string,int is_utf8)
       if( *s=='@')
        saw_at++;
 
+      /* -notationname is legal without an = sign */
+      if(!*s && notation->flags.ignore)
+       break;
+
       if( !*s || !isascii (*s) || (!isgraph(*s) && !isspace(*s)) )
        {
          log_error(_("a notation name must have only printable characters"
@@ -936,26 +946,30 @@ string_to_notation(const char *string,int is_utf8)
       goto fail;
     }
 
-  i=s+1;
-
-  /* we only support printable text - therefore we enforce the use of
-     only printable characters (an empty value is valid) */
-  for(s++; *s ; s++ )
+  if(*s)
     {
-      if ( !isascii (*s) )
-       highbit=1;
-      else if (iscntrl(*s))
+      const char *i=s+1;
+      int highbit=0;
+
+      /* we only support printable text - therefore we enforce the use
+        of only printable characters (an empty value is valid) */
+      for(s++; *s ; s++ )
        {
-         log_error(_("a notation value must not use any"
-                     " control characters\n"));
-         goto fail;
+         if ( !isascii (*s) )
+           highbit=1;
+         else if (iscntrl(*s))
+           {
+             log_error(_("a notation value must not use any"
+                         " control characters\n"));
+             goto fail;
+           }
        }
-    }
 
-  if(!highbit || is_utf8)
-    notation->value=xstrdup(i);
-  else
-    notation->value=native_to_utf8(i);
+      if(!highbit || is_utf8)
+       notation->value=xstrdup(i);
+      else
+       notation->value=native_to_utf8(i);
+    }
 
   return notation;
 
index 913bee6..fcee1b7 100644 (file)
@@ -4178,7 +4178,8 @@ menu_set_notation(const char *string,KBNODE pub_keyblock,KBNODE sec_keyblock)
        }
     }
 
-  if(ascii_strcasecmp(answer,"none")==0)
+  if(ascii_strcasecmp(answer,"none")==0
+     || ascii_strcasecmp(answer,"-")==0)
     notation=NULL; /* delete them all */
   else
     {
@@ -4238,7 +4239,7 @@ menu_set_notation(const char *string,KBNODE pub_keyblock,KBNODE sec_keyblock)
                    {
                      tty_printf("Current notations for user ID \"%s\":\n",
                                 user);
-                     tty_print_notations(-10,sig);
+                     tty_print_notations(-9,sig);
                    }
                  else
                    {
@@ -4253,39 +4254,61 @@ menu_set_notation(const char *string,KBNODE pub_keyblock,KBNODE sec_keyblock)
 
                  if(notation)
                    {
-                     struct notation *n,*list=sig_to_notation(sig);
-                     notation->next=list;
+                     struct notation *n;
+                     int deleting=0;
+
+                     notation->next=sig_to_notation(sig);
 
-                     for(n=list;n;n=n->next)
+                     for(n=notation->next;n;n=n->next)
                        if(strcmp(n->name,notation->name)==0)
                          {
-                           if(strcmp(n->value,notation->value)==0)
+                           if(notation->value)
                              {
-                               /* Adding the same notation twice, so
-                                  don't add it at all. */
-                               skip=1;
-                               tty_printf("Skipping notation: %s=%s\n",
-                                          notation->name,notation->value);
-                               notation->flags.ignore=1;
-                               break;
+                               if(strcmp(n->value,notation->value)==0)
+                                 {
+                                   if(notation->flags.ignore)
+                                     {
+                                       /* Value match with a delete
+                                          flag. */
+                                       n->flags.ignore=1;
+                                       deleting=1;
+                                     }
+                                   else
+                                     {
+                                       /* Adding the same notation
+                                          twice, so don't add it at
+                                          all. */
+                                       skip=1;
+                                       tty_printf("Skipping notation:"
+                                                  " %s=%s\n",
+                                                  notation->name,
+                                                  notation->value);
+                                       break;
+                                     }
+                                 }
                              }
-                           else if(notation->value[0]=='\0')
+                           else
                              {
-                               /* No value, so we don't replace this
-                                  notation with anything. */
+                               /* No value, so it means delete. */
                                n->flags.ignore=1;
-                               notation->flags.ignore=1;
-                               addonly=0;
+                               deleting=1;
                              }
 
                            if(n->flags.ignore)
-                             tty_printf("Removing notation: %s=%s\n",
-                                        n->name,n->value);
+                             {
+                               tty_printf("Removing notation: %s=%s\n",
+                                          n->name,n->value);
+                               addonly=0;
+                             }
                          }
 
-                     if(!notation->flags.ignore)
+                     if(!notation->flags.ignore && !skip)
                        tty_printf("Adding notation: %s=%s\n",
                                   notation->name,notation->value);
+
+                     /* We tried to delete, but had no matches */
+                     if(notation->flags.ignore && !deleting)
+                       continue;
                    }
                  else
                    {