Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PATCH: zsh-4.2.1: unset does not follow spec



On Wed, 22 Sep 2004, Sean C. Farley wrote:

Recently, I read that FreeBSD's /bin/sh fails:
http://www.freebsd.org/cgi/query-pr.cgi?pr=standards/45738
the IEEE Std 1003.1-2001:
http://www.opengroup.org/onlinepubs/007904975/utilities/unset.html
when it comes to the builtin unset.  tcsh and bash do follow it.

I don't see how zsh "fails" this specification.

EXIT STATUS

    0
       All name operands were successfully unset.
   >0
       At least one name could not be unset.

It appears to me that FreeBSD and Zsh are interpreting "could not be unset" to include variables that were not set in the first place. After all, if it isn't set, you can't UNset it, can you? It doesn't say "0 if
all name operands end up unset after this is finished, regardless of their
previous state" (which is how bash and tcsh appear to interpret it).

I'm going to ask about this on the austin-group list. It'll give them something to discuss that they might actually come to agreement on.
--- Src/builtin.c.orig	Fri Aug 13 05:22:42 2004
+++ Src/builtin.c	Wed Sep 22 09:44:04 2004
@@ -2638,9 +2638,9 @@
 		returnval = 1;
 	    }
 	}
-	/* If we didn't match anything, we return 1. */
+	/* If we didn't match anything, we return 0. */
 	if (!match)
-	    returnval = 1;
+	    returnval = 0;
 	return returnval;
     }
 
@@ -2661,7 +2661,7 @@
 		      gethashnode2(paramtab, s) :
 		      paramtab->getnode(paramtab, s));
 	if (!pm)
-	    returnval = 1;
+	    returnval = 0;
 	else if ((pm->flags & PM_RESTRICTED) && isset(RESTRICTED)) {
 	    zerrnam(name, "%s: restricted", pm->nam, 0);
 	    returnval = 1;
@@ -3056,9 +3056,17 @@
 		returnval = 1;
 	    }
 	}
-	/* If we didn't match anything, we return 1. */
-	if (!match)
-	    returnval = 1;
+	/*
+	 * If we didn't match anything, we return 0 for functions and 1 for
+	 * all other hash types.
+	 */
+	if (!match) {
+	    if (OPT_ISSET(ops,'f')) {
+		returnval = 0;
+	    } else {
+		returnval = 1;
+	    }
+	}
 	return returnval;
     }
 
@@ -3069,7 +3077,11 @@
 	    ht->freenode(hn);
 	} else {
 	    zwarnnam(name, "no such hash table element: %s", *argv, 0);
-	    returnval = 1;
+	    if (OPT_ISSET(ops,'f')) {
+		returnval = 0;
+	    } else {
+		returnval = 1;
+	    }
 	}
     }
     unqueue_signals();


Messages sorted by: Reverse Date, Date, Thread, Author