about summary refs log tree commit diff
path: root/Src/builtin.c
diff options
context:
space:
mode:
authorPeter Stephenson <p.stephenson@samsung.com>2018-05-17 09:32:26 +0100
committerPeter Stephenson <p.stephenson@samsung.com>2018-05-17 09:32:26 +0100
commitee7dda7806db51016f9fe8d84f7ac3edb594eff0 (patch)
treed2c109fd251ff291a673ed548a23bece8459bf81 /Src/builtin.c
parentb066cc3ea99fbb2d5b2c5882d17a679c52f2114b (diff)
downloadzsh-ee7dda7806db51016f9fe8d84f7ac3edb594eff0.tar.gz
zsh-ee7dda7806db51016f9fe8d84f7ac3edb594eff0.tar.xz
zsh-ee7dda7806db51016f9fe8d84f7ac3edb594eff0.zip
42785: Allow redefining math function to work silently.
Previously it failed with an error message that the function
was already defined.  This is inconsistent with most other
aspects of shell usage.
Diffstat (limited to 'Src/builtin.c')
-rw-r--r--Src/builtin.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 931605c6e..1cba97dec 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3199,7 +3199,7 @@ bin_functions(char *name, char **argv, Options ops, int func)
 	pflags |= PRINT_NAMEONLY;
 
     if (OPT_MINUS(ops,'M') || OPT_PLUS(ops,'M')) {
-	MathFunc p, q;
+	MathFunc p, q, prev;
 	/*
 	 * Add/remove/list function as mathematical.
 	 */
@@ -3331,15 +3331,10 @@ bin_functions(char *name, char **argv, Options ops, int func)
 	    p->maxargs = maxargs;
 
 	    queue_signals();
-	    for (q = mathfuncs; q; q = q->next) {
+	    for (q = mathfuncs, prev = NULL; q; prev = q, q = q->next) {
 		if (!strcmp(q->name, funcname)) {
-		    unqueue_signals();
-		    zwarnnam(name, "-M %s: function already exists",
-			     funcname);
-		    zsfree(p->name);
-		    zsfree(p->module);
-		    zfree(p, sizeof(struct mathfunc));
-		    return 1;
+		    removemathfunc(prev, q);
+		    break;
 		}
 	    }