[svn] GnuPG - r4060 - trunk/g10

svn author dshaw cvs at cvs.gnupg.org
Thu Mar 9 20:43:32 CET 2006


Author: dshaw
Date: 2006-03-09 20:43:29 +0100 (Thu, 09 Mar 2006)
New Revision: 4060

Modified:
   trunk/g10/ChangeLog
   trunk/g10/build-packet.c
   trunk/g10/keyedit.c
Log:
* 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".


Modified: trunk/g10/ChangeLog
===================================================================
--- trunk/g10/ChangeLog	2006-03-09 19:24:59 UTC (rev 4059)
+++ trunk/g10/ChangeLog	2006-03-09 19:43:29 UTC (rev 4060)
@@ -1,3 +1,12 @@
+2006-03-09  David Shaw  <dshaw at 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 at jabberwocky.com>
 
 	* keyedit.c (menu_set_notation): New function to set notations on

Modified: trunk/g10/build-packet.c
===================================================================
--- trunk/g10/build-packet.c	2006-03-09 19:24:59 UTC (rev 4059)
+++ trunk/g10/build-packet.c	2006-03-09 19:43:29 UTC (rev 4060)
@@ -891,12 +891,18 @@
 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 @@
       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,27 +946,31 @@
       goto fail;
     }
 
-  i=s+1;
+  if(*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++ )
-    {
-      if ( !isascii (*s) )
-	highbit=1;
-      else if (iscntrl(*s))
+      /* 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;
 
  fail:

Modified: trunk/g10/keyedit.c
===================================================================
--- trunk/g10/keyedit.c	2006-03-09 19:24:59 UTC (rev 4059)
+++ trunk/g10/keyedit.c	2006-03-09 19:43:29 UTC (rev 4060)
@@ -4178,7 +4178,8 @@
 	}
     }
 
-  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 @@
 		    {
 		      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 @@
 
 		  if(notation)
 		    {
-		      struct notation *n,*list=sig_to_notation(sig);
-		      notation->next=list;
+		      struct notation *n;
+		      int deleting=0;
 
-		      for(n=list;n;n=n->next)
+		      notation->next=sig_to_notation(sig);
+
+		      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
 		    {




More information about the Gnupg-commits mailing list